Fettle Frameworks Custom Bicycle Frames AI website prompt
A workshop site for a made-to-measure frame builder. An animated intro loader, a pinned hero with rising frame-type panels, a self-drawing "how it's made" morph, a live frame-geometry sizing tool, and a rotating 3D wall of owner rides — all scroll-driven with GSAP.
Now put it in WordPress
You have a site. Now make it yours.
An AI build hands you a front end and stops there. No CMS, no client login, no real ownership: you cannot hand it over, and you cannot change it without going back and re-prompting. UiChemy turns that build into native, editable WordPress you own, in the builder you already use.
Bolt to WordPressClaude to WordPressCodex to WordPressCursor to WordPressLovable to WordPressv0 to WordPressAI to WordPress
Get Started
More prompts
Showing 6 prompts
Frequently asked questions
What does the Fettle Frameworks Custom Bicycle Frames prompt build?
A workshop site for a made-to-measure frame builder. An animated intro loader, a pinned hero with rising frame-type panels, a self-drawing "how it's made" morph, a live frame-geometry sizing tool, and a rotating 3D wall of owner rides — all scroll-driven with GSAP.
Which AI tools does the Fettle Frameworks Custom Bicycle Frames prompt work with?
It's written for Claude. Paste the whole prompt into Claude and it builds the complete site for you, then bring the result into WordPress with UiChemy. This prompt also has a WordPress version: with the UiChemy MCP connected, Claude builds the page straight into WordPress.
How do I turn the result into a WordPress site?
After the AI builds your site, UiChemy Composer rebuilds it as native, editable WordPress in Elementor or Gutenberg (Bricks coming soon) — you own it and edit it in your builder. See AI to WordPress.
Is the Fettle Frameworks Custom Bicycle Frames prompt free?
Yes — it's free to copy, no account needed.
Can I edit the website after it's built?
Yes. Once it's in WordPress with UiChemy, every section is native and editable — no re-prompting, no lock-in.
Copy prompt
Copy code
Coming soon
Copy SKILL.md
Coming soon
Fettle Frameworks Custom Bicycle Frames · Section prompt
# MASTER PROMPT — Fettle Frameworks — Custom Bicycle Frames · v2
### Plain HTML, CSS and JavaScript. No WordPress, no page builder, no framework, no build step.
## ▶ HOW TO USE THIS PROMPT
**Paste this whole document into Claude. Nothing to attach.** It carries the complete source of the page — including its own copies of GSAP, ScrollTrigger, CustomEase, DrawSVG and Lenis — plus the address of every image and font, so Claude can assemble a folder that owns all of its assets and hand it back as a zip that runs with the network off.
**INSTRUCTION TO CLAUDE — BUILD IT, DO NOT ASK.** Every decision is already made in this document. Do not stop to ask the user questions, do not offer options, and do not ask for confirmation before starting. Write the files, download the media, zip the folder, hand over the archive, then report what you built.
1. Create a folder named `fettle` and write out every file in the appendix below **exactly as written**, at the path shown in its heading (keep the `css/`, `js/` and `js/vendor/` folders). Do not reformat, rename, shorten, reorder or "improve" anything.
2. **Download the 39 images into `images/` and the 6 fonts into `fonts/`.** The code already points at `images/…` and `../fonts/…` — nothing in it references a remote host. Run this from inside the folder:
```bash
mkdir -p images fonts
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-hero-lug.jpg' -o 'images/hero-lug.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-01.jpg' -o 'images/loader-01.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-02.jpg' -o 'images/loader-02.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-03.jpg' -o 'images/loader-03.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-04.jpg' -o 'images/loader-04.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-01.jpg' -o 'images/log-01.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-02.jpg' -o 'images/log-02.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-03.jpg' -o 'images/log-03.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-04.jpg' -o 'images/log-04.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-05.jpg' -o 'images/log-05.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-06.jpg' -o 'images/log-06.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-07.jpg' -o 'images/log-07.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-08.jpg' -o 'images/log-08.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-09.jpg' -o 'images/log-09.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-10.jpg' -o 'images/log-10.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-11.jpg' -o 'images/log-11.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-12.jpg' -o 'images/log-12.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-gravel.jpg' -o 'images/panel-gravel.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-road.jpg' -o 'images/panel-road.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-track.jpg' -o 'images/panel-track.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-tour.jpg' -o 'images/panel-tour.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-01.jpg' -o 'images/ride-01.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-02.jpg' -o 'images/ride-02.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-03.jpg' -o 'images/ride-03.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-04.jpg' -o 'images/ride-04.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-05.jpg' -o 'images/ride-05.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-06.jpg' -o 'images/ride-06.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-07.jpg' -o 'images/ride-07.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-08.jpg' -o 'images/ride-08.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-09.jpg' -o 'images/ride-09.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-10.jpg' -o 'images/ride-10.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-11.jpg' -o 'images/ride-11.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-12.jpg' -o 'images/ride-12.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-13.jpg' -o 'images/ride-13.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-14.jpg' -o 'images/ride-14.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-15.jpg' -o 'images/ride-15.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-16.jpg' -o 'images/ride-16.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-17.jpg' -o 'images/ride-17.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-18.jpg' -o 'images/ride-18.jpg'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-extra-condensed-latin.woff2' -o 'fonts/sofia-sans-extra-condensed-latin.woff2'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-extra-condensed-latin-ext.woff2' -o 'fonts/sofia-sans-extra-condensed-latin-ext.woff2'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-latin.woff2' -o 'fonts/sofia-sans-latin.woff2'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-latin-ext.woff2' -o 'fonts/sofia-sans-latin-ext.woff2'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-azeret-mono-latin.woff2' -o 'fonts/azeret-mono-latin.woff2'
curl -fsSL 'https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-azeret-mono-latin-ext.woff2' -o 'fonts/azeret-mono-latin-ext.woff2'
```
Then check every file arrived and none is a zero-byte or HTML error page:
```bash
ls images | wc -l # expect 39
ls fonts | wc -l # expect 6
find images fonts -size -1k # expect no output
```
If any download fails, retry it — the host is occasionally slow. Do **not** fall back to hotlinking the remote URL: the whole point is a folder that works offline.
3. **Zip that folder and give the user the archive.** Its shape:
```
fettle/
index.html
css/style.css
js/data.js js/geometry.js js/main.js js/shapes.js
js/vendor/ (gsap, ScrollTrigger, CustomEase, DrawSVGPlugin, lenis + lenis.css)
fonts/ (6 woff2)
images/ (39 jpg)
```
```bash
zip -r fettle.zip fettle -x '*.DS_Store'
```
Then hand over `fettle.zip` as a file the user can download, not as text in the chat.
4. Before handing it over, serve the folder and confirm it runs:
```bash
cd fettle && python3 -m http.server 8000 # then open http://localhost:8000
```
Check the intro loader plays and hands off to the hero, the frame panels rise on scroll, the process drawing morphs, the build-log photos cross-fade, the size sliders redraw the frame, and the owner-ride ring turns — all with the network offline. Then check it at 390, 768, 1024 and 1440 px wide: nothing overlaps, there is no horizontal scroll, and every nav link scrolls to its section.
The finished folder needs no network at all — images, fonts and every library are inside it.
Do not rebuild the design from the description below. The description is there so a person can understand and edit the code. The appendix is the deliverable.
---
## ▶ WHAT YOU GET
Fettle Frameworks builds made-to-measure steel and titanium bicycle frames in Ghent. This is its one-page site.
**A `fettle/` folder — HTML, CSS, six scripts, five vendored libraries, 6 fonts and 39 images — delivered as `fettle.zip`, fully offline.**
| File | What it is |
| `index.html` | the page, 19 KB |
| `css/style.css` | the stylesheet + `@font-face`, 29 KB |
| `js/main.js` | intro, hero, process, build log, size sketch, owner-ride wall, navigation |
| `js/shapes.js` · `js/geometry.js` · `js/data.js` | the frame-outline morph, the live geometry engine, the page content |
| `js/vendor/` | GSAP, ScrollTrigger, CustomEase, DrawSVGPlugin, Lenis (+ `lenis.css`) |
| `fonts/` · `images/` | 6 woff2 and 39 photos, downloaded at build time |
**Sections:** the intro loader · hero + frame types (`#frames`) · how it's made (`#process`) · build log (`#log`) · your size (`#size`) · owner rides (`#rides`) · footer (`#start`).
---
## ▶ HOW THE PAGE MOVES
- **Intro loader.** A four-image grid resolves from the centre while a counter runs 000 → 100 mm; the last frame flies to the hero photo's place and the page reveals (logo, nav, marquee, chip). `?skip-intro` and reduced motion skip it.
- **Hero → frame types.** The hero pins; scrolling shrinks the hero card and raises four frame-type panels (Road · Gravel · Track · Tour), each with its symbol, title and description staggered in.
- **How it's made.** A pinned stage: four step cards grow with scroll while a single outline travels along a ruler, morphing through six bike-part shapes (a hand-written point-by-point morph, no plugin).
- **Build log.** Twelve recent frames as a list; hover or tap a name to cross-fade its photo and note, and filter by Steel / Titanium with a sliding indicator.
- **Your size.** Two sliders (height, inseam) drive a live side-view frame sketch — stack, reach, seat tube, top tube, wheelbase — stroked in with DrawSVG.
- **Owner rides.** A rotating 3-D ring of eighteen owner photos, pitch nudged by scroll, behind a heading whose last word scrambles between Rain · Gravel · Traffic · The Alps · January.
Smooth scrolling is Lenis; the motion is GSAP + ScrollTrigger with CustomEase and DrawSVG. All of them ship inside the zip under `js/vendor/`.
---
## ▶ WHERE THE MEDIA COMES FROM
The 39 images live in `images/` and the 6 fonts in `fonts/`, exactly where the markup, CSS and scripts already point. Once assembled, the folder owns everything: no CDN, no media library, no external host.
Images and fonts are fetched **once, at build time**, from the WordPress media library on `https://demo.uichemy.com` — the same `fettle__` files the WordPress build of this page uses. That is only how they travel into the folder; nothing in the delivered code points back at that host. The libraries under `js/vendor/` are shipped verbatim in the appendix, so the site needs no network at all once built.
---
## ▶ WHAT THIS PROMPT DELIBERATELY DOES NOT CONTAIN
- No WordPress, no page builder, and none of the wrapper classes or compatibility CSS a builder needs. The WordPress build is a separate prompt.
- No framework, no TypeScript, no bundler, no `package.json`.
- No backend. The "Start a frame" links open a `mailto:`; nothing posts anywhere.
- No external host at runtime — images, fonts and libraries all ship inside the zip.
---
# APPENDIX · VERBATIM SOURCE
Transcribe every file exactly, at the path in its heading. The image and font paths already read `images/…` and `../fonts/…`; do not change them.
## `index.html`
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fettle Frameworks</title>
<meta name="description" content="A four-person workshop by the river in Ghent building about sixty made-to-measure steel and titanium bicycle frames a year. Fillet-brazed and lugged, each fitted to one rider.">
<meta name="theme-color" content="#FFFFFF">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%23D4FF00'/%3E%3Cpath fill='%23000000' fill-rule='evenodd' d='M3 16 9.5 7H27a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H9.5ZM14 11v11h3v-4h5v-3h-5v-1h6v-3Z'/%3E%3C/svg%3E">
<link rel="stylesheet" href="js/vendor/lenis.css">
<link rel="stylesheet" href="css/style.css">
<script>
// Decide before first paint whether the intro plays, so there is never a flash of the un-revealed hero.
(function () {
var q = location.search || '';
var rm = window.matchMedia && matchMedia('(prefers-reduced-motion: reduce)').matches;
document.documentElement.className += (/skip-intro/.test(q) || rm) ? ' no-intro' : ' has-intro';
})();
</script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
<symbol id="fettle-mark" viewBox="0 0 32 32">
<path fill="currentColor" fill-rule="evenodd" d="M3 16 9.5 7H27a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H9.5ZM14 11v11h3v-4h5v-3h-5v-1h6v-3Z"/>
</symbol>
<symbol id="arrow-r" viewBox="0 0 28 10">
<path d="M0 5h26M21.5 1 26 5l-4.5 4" fill="none" stroke="currentColor" stroke-width="1"/>
</symbol>
</svg>
<!-- 0 · Intro loader -->
<div class="loader" id="loader" aria-hidden="true">
<div class="ld-bg"></div>
<div class="ld-frames">
<div class="ld-grid">
<div class="ld-frame"><img src="images/loader-01.jpg" alt="Steel tubes cut to length on the workshop bench" width="800" height="800" decoding="async"></div>
<div class="ld-frame"><img src="images/loader-02.jpg" alt="Tape measure laid along a rider's inseam during a fit" width="800" height="800" decoding="async"></div>
<div class="ld-frame"><img src="images/loader-03.jpg" alt="Brazing torch flame on a bottom bracket shell" width="800" height="800" decoding="async"></div>
<div class="ld-frame"><img src="images/loader-04.jpg" alt="Hand file smoothing a fillet on a steel joint" width="800" height="800" decoding="async"></div>
</div>
<div class="ld-frame ld-frame--f"><img src="images/hero-lug.jpg" alt="A freshly brazed lug with the flux still glassy" width="1200" height="1200" decoding="async"></div>
</div>
<p class="ld-tag mono">Fettle Frameworks<br>Ghent · workshop open</p>
<div class="ld-counter">
<div class="ld-mask">
<div class="ld-num mono">
<span class="ld-digit"><span class="ld-strip"><b>0</b><b>1</b><b>2</b><b>3</b><b>4</b><b>5</b><b>6</b><b>7</b><b>8</b><b>9</b></span></span><span class="ld-digit"><span class="ld-strip"><b>0</b><b>1</b><b>2</b><b>3</b><b>4</b><b>5</b><b>6</b><b>7</b><b>8</b><b>9</b></span></span><span class="ld-digit"><span class="ld-strip"><b>0</b><b>1</b><b>2</b><b>3</b><b>4</b><b>5</b><b>6</b><b>7</b><b>8</b><b>9</b></span></span><span class="ld-unit">mm</span>
</div>
</div>
</div>
</div>
<!-- Fixed actions (bottom right) -->
<div class="nav-actions" id="navActions">
<a class="btn btn--sprint" href="#start">Start a frame</a>
<button class="menu-btn" type="button" aria-label="Open menu" aria-expanded="false" aria-controls="menu"><i></i><i></i></button>
</div>
<!-- Fixed bar: appears once the hero has been scrolled past; solid white with a hairline so nothing shows through -->
<header class="bar" id="bar">
<a class="bar-word" href="#top" data-go="top" aria-label="Fettle Frameworks, home">FETTLE</a>
<nav class="bar-nav" aria-label="Sections">
<a href="#frames" data-go="frames">Frames</a>
<a href="#process" data-go="process">How it’s made</a>
<a href="#log" data-go="log">Build log</a>
<a href="#size" data-go="size">Your size</a>
</nav>
<div class="bar-right">
<a class="btn btn--sprint btn--sm" href="#start">Start a frame</a>
<button class="menu-btn menu-btn--sm" type="button" aria-label="Open menu" aria-expanded="false" aria-controls="menu"><i></i><i></i></button>
</div>
</header>
<!-- Menu overlay -->
<div class="menu" id="menu" role="dialog" aria-modal="true" aria-label="Site menu" hidden>
<div class="menu-inner">
<div class="menu-top">
<span class="menu-word">FETTLE</span>
<button class="menu-close mono" type="button">Close</button>
</div>
<nav class="menu-nav" aria-label="Menu">
<a href="#frames" data-go="frames">Frames</a>
<a href="#process" data-go="process">How it’s made</a>
<a href="#log" data-go="log">Build log</a>
<a href="#size" data-go="size">Your size</a>
<a href="#start" data-go="start">Start a frame</a>
</nav>
<p class="menu-foot mono">Werkplaats 4, Ghent · [email protected]</p>
</div>
</div>
<main id="main">
<!-- 1 · Hero marquee → four frame lines -->
<section class="hero" id="top" aria-label="Fettle Frameworks">
<div class="hero-pin">
<div class="panels" id="frames" aria-label="Frame types">
<article class="panel panel--road">
<div class="panel-field">
<svg class="panel-sym" aria-hidden="true"><use href="#fettle-mark"/></svg>
<p class="panel-desc">Steel or Ti. 28–32 mm tyres. Rim or disc.</p>
<h3 class="panel-title"><span>Road</span></h3>
</div>
<figure class="panel-photo"><img src="images/panel-road.jpg" alt="Black steel road frame leaning on a brick wall by the river at dawn" width="1200" height="720" decoding="async"></figure>
</article>
<article class="panel panel--gravel">
<div class="panel-field">
<svg class="panel-sym" aria-hidden="true"><use href="#fettle-mark"/></svg>
<p class="panel-desc">Clearance for 50 mm. Three bottle mounts. Mud-proof.</p>
<h3 class="panel-title"><span>Gravel</span></h3>
</div>
<figure class="panel-photo"><img src="images/panel-gravel.jpg" alt="Chartreuse gravel frame with wide tyres on a chalk farm track" width="1200" height="720" decoding="async"></figure>
</article>
<article class="panel panel--track">
<div class="panel-field">
<svg class="panel-sym" aria-hidden="true"><use href="#fettle-mark"/></svg>
<p class="panel-desc">Fixed. Stiff. Nothing to rattle.</p>
<h3 class="panel-title"><span>Track</span></h3>
</div>
<figure class="panel-photo"><img src="images/panel-track.jpg" alt="Bare steel track frame on the wooden banking of an indoor velodrome" width="1200" height="720" decoding="async"></figure>
</article>
<article class="panel panel--tour">
<div class="panel-field">
<svg class="panel-sym" aria-hidden="true"><use href="#fettle-mark"/></svg>
<p class="panel-desc">Racks, lights, dynamo routing. Built for the long way round.</p>
<h3 class="panel-title"><span>Tour</span></h3>
</div>
<figure class="panel-photo"><img src="images/panel-tour.jpg" alt="Loaded touring bike with front and rear racks on a mountain road" width="1200" height="720" decoding="async"></figure>
</article>
</div>
<div class="hero-card">
<header class="topbar">
<a class="logo" href="#top" aria-label="Fettle Frameworks, home"><span class="logo-in">FETTLE</span></a>
<svg class="topbar-mark" aria-hidden="true"><use href="#fettle-mark"/></svg>
<nav class="topnav" aria-label="Primary">
<span class="topnav-in">
<a href="#frames" data-go="frames">Frames</a>
<a href="#process" data-go="process">How it’s made</a>
<a href="#log" data-go="log">Build log</a>
<a href="#size" data-go="size">Your size</a>
</span>
</nav>
</header>
<div class="marquee" aria-hidden="true">
<div class="marquee-reveal">
<div class="marquee-scroll">
<span class="mq-unit">Measured twice — Brazed once — </span><span class="mq-unit">Measured twice — Brazed once — </span><span class="mq-unit">Measured twice — Brazed once — </span>
</div>
</div>
</div>
<h1 class="sr-only">Fettle Frameworks: measured twice, brazed once. Made-to-measure steel and titanium bicycle frames from Ghent.</h1>
<figure class="hero-photo"><img src="images/hero-lug.jpg" alt="A freshly brazed lug on a steel frame, the flux still glassy" width="1200" height="1200" decoding="async" fetchpriority="high"></figure>
<div class="hero-copy">
<p class="hero-lede"><span class="sl"><span>Made-to-measure steel & titanium frames.</span></span><span class="sl"><span>Ghent, since 2011.</span></span></p>
<p class="chip mono"><span class="chip-t">From € 2,900 frame only</span><i class="cb cb-t"></i><i class="cb cb-r"></i><i class="cb cb-b"></i><i class="cb cb-l"></i></p>
</div>
<p class="hero-foot mono"><span class="sl"><span>Werkplaats 4, Ghent · about 60 frames a year</span></span></p>
<i class="card-edge" aria-hidden="true"></i>
</div>
</div>
</section>
<!-- 2 · How a frame is made -->
<section class="process" id="process" aria-labelledby="process-title">
<div class="process-sticky">
<div class="process-head">
<div class="ph-left mono">
<span class="ph-route">Fit <svg class="ph-arrow" aria-hidden="true"><use href="#arrow-r"/></svg> Finish</span>
<span class="ph-week">Week <b class="ph-wk">00</b> / 11</span>
</div>
<p class="ph-mid">Eleven weeks, four people, one frame. Nobody else touches it.</p>
<h2 class="ph-right mono" id="process-title">How it’s made</h2>
</div>
<div class="process-stage">
<p class="ps-ghost" aria-hidden="true">One frame</p>
<div class="pcards">
<article class="pc pc--1">
<span class="pc-num mono">01</span>
<div class="pc-art" aria-hidden="true"></div>
<div class="pc-body"><h3 class="pc-title">Fit</h3><p class="pc-desc">Two hours on the jig. We take 23 measurements and ask how you actually ride.</p></div>
</article>
<article class="pc pc--2">
<span class="pc-num mono">02</span>
<div class="pc-art" aria-hidden="true"></div>
<div class="pc-body"><h3 class="pc-title">Mitre</h3><p class="pc-desc">Every tube cut to the tenth of a millimetre, by hand, then filed until it kisses.</p></div>
</article>
<article class="pc pc--3">
<span class="pc-num mono">03</span>
<div class="pc-art" aria-hidden="true"></div>
<div class="pc-body"><h3 class="pc-title">Braze</h3><p class="pc-desc">Brass or silver, 900 °C, one joint at a time. Then we file the fillets smooth.</p></div>
</article>
<article class="pc pc--4">
<span class="pc-num mono">04</span>
<div class="pc-art" aria-hidden="true"></div>
<div class="pc-body"><h3 class="pc-title">Finish</h3><p class="pc-desc">Powder, wet paint or bare titanium. Your name under the top tube, if you ask.</p></div>
</article>
</div>
<svg class="pdraw" aria-hidden="true" focusable="false">
<defs>
<pattern id="rulerW" class="ruler-pat" patternUnits="userSpaceOnUse" width="40" height="16">
<rect x="0" y="0" width="1" height="14" class="rp-w"/><rect x="8" y="0" width="1" height="6" class="rp-w"/><rect x="16" y="0" width="1" height="6" class="rp-w"/><rect x="24" y="0" width="1" height="6" class="rp-w"/><rect x="32" y="0" width="1" height="6" class="rp-w"/>
</pattern>
<pattern id="rulerK" class="ruler-pat" patternUnits="userSpaceOnUse" width="40" height="16">
<rect x="0" y="0" width="1" height="14" class="rp-k"/><rect x="8" y="0" width="1" height="6" class="rp-k"/><rect x="16" y="0" width="1" height="6" class="rp-k"/><rect x="24" y="0" width="1" height="6" class="rp-k"/><rect x="32" y="0" width="1" height="6" class="rp-k"/>
</pattern>
<clipPath id="pcClipW"><rect class="pcr pcr-0"/><rect class="pcr pcr-1"/><rect class="pcr pcr-3"/></clipPath>
<clipPath id="pcClipK"><rect class="pcr pcr-2"/></clipPath>
</defs>
<g clip-path="url(#pcClipW)" class="pd-layer pd-w">
<line class="pd-dash"/><line class="pd-base"/><rect class="pd-ruler" fill="url(#rulerW)"/>
<g class="pd-nums"></g><g class="pd-shape"><path class="pd-path"/></g><circle class="pd-dot" r="2.5"/>
</g>
<g clip-path="url(#pcClipK)" class="pd-layer pd-k">
<line class="pd-dash"/><line class="pd-base"/><rect class="pd-ruler" fill="url(#rulerK)"/>
<g class="pd-nums"></g><g class="pd-shape"><path class="pd-path"/></g><circle class="pd-dot" r="2.5"/>
</g>
</svg>
</div>
</div>
</section>
<!-- 3 · Build log -->
<section class="log" id="log" aria-labelledby="log-title">
<header class="log-head">
<h2 class="sec-title" id="log-title">Build log</h2>
<p class="log-intro">The last twelve frames out of the door, and who rode off on them. Hover a name. Or tap it, if you’re on a phone at the café.</p>
<div class="tabs" role="tablist" aria-label="Filter by material">
<button class="tab mono is-on" role="tab" aria-selected="true" data-f="all">All <sup>12</sup></button>
<button class="tab mono" role="tab" aria-selected="false" data-f="steel">Steel <sup>7</sup></button>
<button class="tab mono" role="tab" aria-selected="false" data-f="titanium">Titanium <sup>5</sup></button>
<i class="tabs-line" aria-hidden="true"></i>
</div>
</header>
<div class="log-body">
<i class="log-bar" aria-hidden="true"></i>
<ol class="log-list" id="logList"></ol>
<figure class="log-photo">
<div class="log-stack" id="logStack"></div>
<figcaption class="log-note" id="logNote"></figcaption>
</figure>
</div>
</section>
<!-- 4 · Your size (signature) -->
<section class="size" id="size" aria-labelledby="size-title">
<div class="size-head">
<h2 class="sec-title" id="size-title">Your size, roughly</h2>
<p class="size-intro">Two numbers are enough for a first sketch. Slide them and watch the tubes move. Everything else, we measure in person.</p>
</div>
<div class="size-grid">
<div class="size-sketch">
<svg class="geo" id="geo" role="img" aria-labelledby="geo-desc">
<desc id="geo-desc">Side-view line drawing of a bicycle frame that redraws for the chosen rider height and inseam, with dimension lines for stack, reach, seat tube, top tube and wheelbase.</desc>
</svg>
<p class="sketch-tag mono"><span>Sketch no. <b id="sketchNo">178/84</b></span><span>Scale 1:10 (ish)</span></p>
</div>
<div class="size-ctrl">
<div class="field">
<div class="field-top"><label class="mono" for="rHeight">Rider height</label><output class="field-val" id="oHeight" for="rHeight">178<small>cm</small></output></div>
<input class="range" type="range" id="rHeight" min="150" max="205" step="1" value="178">
<div class="field-scale mono" aria-hidden="true"><span>150</span><span>205</span></div>
</div>
<div class="field">
<div class="field-top"><label class="mono" for="rInseam">Inseam</label><output class="field-val" id="oInseam" for="rInseam">84<small>cm</small></output></div>
<input class="range" type="range" id="rInseam" min="68" max="98" step="1" value="84">
<div class="field-scale mono" aria-hidden="true"><span>68</span><button class="relink mono" type="button" id="relink" aria-pressed="true">Auto · height × 0.47</button><span>98</span></div>
</div>
<dl class="geo-list" id="geoList">
<div><dt class="mono">Stack</dt><dd data-k="stack">579</dd></div>
<div><dt class="mono">Reach</dt><dd data-k="reach">392</dd></div>
<div><dt class="mono">Seat tube</dt><dd data-k="st">559</dd></div>
<div><dt class="mono">Top tube</dt><dd data-k="ett">565</dd></div>
<div><dt class="mono">Wheelbase</dt><dd data-k="wb">1003</dd></div>
<div><dt class="mono">Head / seat</dt><dd>72°<span>/</span>73.5°</dd></div>
</dl>
<p class="caption mono">This is a sketch, not a fit. A fit takes two hours and a coffee.</p>
<a class="btn btn--sprint btn--wide" href="#start">Book a fit in Ghent</a>
</div>
</div>
</section>
<!-- 5 · Out riding -->
<section class="rides" id="rides" aria-labelledby="rides-title">
<div class="rides-stage">
<h2 class="rides-title" id="rides-title"><span class="rt-fixed">Ridden in</span> <span class="rt-word-wrap"><span class="rt-word" aria-live="off">Rain</span></span></h2>
<div class="wall" aria-hidden="true"><div class="ring" id="ring"></div></div>
<p class="rides-sub">Photos from owners. We ask for one a year.</p>
<p class="rides-meta mono"><span>18 owners</span><span>9 countries</span><span>0 frames retired</span></p>
</div>
</section>
</main>
<!-- Footer -->
<footer class="foot" id="start">
<div class="foot-top">
<div class="foot-cta">
<p class="foot-lede">Tell us how tall you are, how you ride and where. We’ll write back within two working days, usually with questions.</p>
<a class="btn btn--sprint btn--big" href="mailto:[email protected]?subject=Start%20a%20frame">Start a frame</a>
</div>
<div class="foot-cols">
<div class="foot-col">
<p class="mono foot-k">Workshop</p>
<p>Werkplaats 4, Ghent</p>
<p>Open Tue–Sat · fits by appointment</p>
</div>
<div class="foot-col">
<p class="mono foot-k">Write</p>
<p><a href="mailto:[email protected]">[email protected]</a></p>
<p>Current wait: 14 weeks</p>
</div>
<div class="foot-col">
<p class="mono foot-k">Pages</p>
<p><a href="#frames" data-go="frames">Frames</a></p>
<p><a href="#process" data-go="process">How it’s made</a></p>
<p><a href="#log" data-go="log">Build log</a></p>
<p><a href="#size" data-go="size">Your size</a></p>
</div>
</div>
</div>
<div class="foot-wordwrap"><p class="foot-word" aria-hidden="true">FETTLE</p></div>
<div class="foot-base mono">
<span>© 2026 Fettle Frameworks</span>
<span>Steel · Titanium · Brass · Patience</span>
<a href="#top" data-go="top">Back up the climb ↑</a>
</div>
</footer>
<script src="js/vendor/gsap.min.js"></script>
<script src="js/vendor/ScrollTrigger.min.js"></script>
<script src="js/vendor/CustomEase.min.js"></script>
<script src="js/vendor/DrawSVGPlugin.min.js"></script>
<script src="js/vendor/lenis.min.js"></script>
<script src="js/data.js"></script>
<script src="js/shapes.js"></script>
<script src="js/geometry.js"></script>
<script src="js/main.js"></script>
</body>
</html>
```
## `css/style.css`
```css
/* FETTLE Frameworks · page styles
Palette: white field, black type, rgba() of each, and one accent (Sprint chartreuse) used only as a fill with black type. */
@font-face { font-family: 'Sofia Sans Extra Condensed'; font-style: normal; font-weight: 800; font-display: swap;
src: url(../fonts/sofia-sans-extra-condensed-latin.woff2) format('woff2');
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; }
@font-face { font-family: 'Sofia Sans Extra Condensed'; font-style: normal; font-weight: 800; font-display: swap;
src: url(../fonts/sofia-sans-extra-condensed-latin-ext.woff2) format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, 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: 'Sofia Sans'; font-style: normal; font-weight: 400 500; font-display: swap;
src: url(../fonts/sofia-sans-latin.woff2) format('woff2');
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; }
@font-face { font-family: 'Sofia Sans'; font-style: normal; font-weight: 400 500; font-display: swap;
src: url(../fonts/sofia-sans-latin-ext.woff2) format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, 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: 'Azeret Mono'; font-style: normal; font-weight: 400 500; font-display: swap;
src: url(../fonts/azeret-mono-latin.woff2) format('woff2');
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; }
@font-face { font-family: 'Azeret Mono'; font-style: normal; font-weight: 400 500; font-display: swap;
src: url(../fonts/azeret-mono-latin-ext.woff2) format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, 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; }
:root {
--white: #FFFFFF;
--black: #000000;
--sprint: #D4FF00; /* house paint: fill only, always with black type */
--k-60: rgba(0, 0, 0, .6); /* secondary text */
--k-35: rgba(0, 0, 0, .35); /* extension lines, faint marks */
--k-12: rgba(0, 0, 0, .12); /* hairlines */
--w-66: rgba(255, 255, 255, .66);
--w-45: rgba(255, 255, 255, .45);
--w-20: rgba(255, 255, 255, .2);
--f-cond: 'Sofia Sans Extra Condensed', 'Arial Narrow', sans-serif;
--f-sans: 'Sofia Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
--f-mono: 'Azeret Mono', ui-monospace, Menlo, Consolas, monospace;
--edge: 4.24vw; /* 61 px at 1440: outer margin of the hero and its panels */
--gut: 20px; /* page gutter for the lower sections */
--ease-out: cubic-bezier(.22, .61, .36, 1);
}
*, *::before, *::after { box-sizing: border-box; }
html { overflow-x: clip; -webkit-text-size-adjust: 100%; }
body { margin: 0; background: var(--white); color: var(--black); font: 400 16px/1.45 var(--f-sans); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
img { display: block; max-width: 100%; color: transparent; font-size: 0; }
img.is-broken { visibility: hidden; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
figure, h1, h2, h3, p, ol, dl, dd { margin: 0; padding: 0; }
ol { list-style: none; }
.mono { font-family: var(--f-mono); font-weight: 400; font-size: 11px; line-height: 1.5; letter-spacing: .06em; text-transform: uppercase; }
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.skip-link { position: fixed; left: 12px; top: -60px; z-index: 300; background: var(--sprint); color: var(--black); padding: 10px 14px; font-weight: 500; }
.skip-link:focus { top: 12px; }
:focus-visible { outline: 2px solid var(--black); outline-offset: 3px; }
.sec-title { font: 800 clamp(56px, 7.2vw, 128px)/.86 var(--f-cond); text-transform: uppercase; letter-spacing: -.01em; }
/* ---------- buttons ---------- */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; height: 46px; padding: 0 22px; font: 500 15px/1 var(--f-sans); white-space: nowrap; transition: transform .35s var(--ease-out); }
.btn--sprint { background: var(--sprint); color: var(--black); }
.btn--sprint:hover { transform: translateY(-2px); }
.btn--wide { width: 100%; height: 54px; font-size: 16px; }
.btn--big { height: 64px; padding: 0 34px; font-size: 18px; }
/* ---------- 0 · intro loader ---------- */
.loader { position: fixed; inset: 0; z-index: 200; pointer-events: none; }
.no-intro .loader { display: none; }
.ld-bg { position: absolute; inset: 0; background: var(--black); }
.ld-frames { position: fixed; --s: 18.95vw; width: var(--s); height: var(--s); left: calc(50% - var(--s) / 2); top: calc(50% - var(--s) / 2); }
.ld-grid { position: absolute; inset: 0; display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 4px; }
.ld-frame { position: relative; overflow: hidden; clip-path: inset(50% 50% 50% 50%); background: var(--black); }
.ld-frame img { width: 100%; height: 100%; object-fit: cover; transform: scale(1.5); }
.ld-frame--f { position: absolute; inset: 0; }
.ld-tag { position: absolute; left: var(--edge); bottom: 6.78vh; color: var(--white); }
.ld-counter { position: absolute; right: var(--edge); bottom: 6.78vh; color: var(--white); }
.ld-mask { overflow: hidden; clip-path: inset(0% 0% 0% 0%); }
.ld-num { display: flex; align-items: flex-end; font-size: clamp(44px, 6.2vw, 96px); line-height: 1; letter-spacing: -.02em; opacity: 0; }
.ld-digit { display: block; height: 1em; overflow: hidden; }
.ld-strip { display: flex; flex-direction: column; }
.ld-strip b { display: block; height: 1em; font-weight: 400; }
.ld-unit { font-size: 11px; line-height: 1; letter-spacing: .06em; margin: 0 0 .5em .7em; }
/* ---------- fixed actions + menu ---------- */
.nav-actions { position: fixed; right: var(--edge); bottom: 6.78vh; z-index: 60; display: flex; gap: 8px; }
.has-intro .nav-actions { visibility: hidden; opacity: 0; }
.menu-btn { width: 52px; height: 46px; background: var(--black); display: grid; place-content: center; gap: 5px; box-shadow: inset 0 0 0 1px var(--w-45); }
.menu-btn i { display: block; width: 18px; height: 1.5px; background: var(--white); }
.menu-btn i + i { width: 11px; }
.bar { position: fixed; left: 0; right: 0; top: 0; z-index: 70; height: 56px; padding: 0 var(--gut); display: flex; align-items: center; gap: 28px; background: var(--white); box-shadow: 0 1px 0 var(--k-12); transform: translateY(-101%); visibility: hidden; transition: transform .3s var(--ease-out), visibility 0s .3s; }
.bar.is-on { transform: none; visibility: visible; transition: transform .3s var(--ease-out), visibility 0s 0s; }
.bar-word { font: 800 26px/1 var(--f-cond); letter-spacing: -.01em; margin-right: auto; }
.bar-nav { display: flex; gap: 26px; font-size: 15px; font-weight: 500; }
.bar-nav a { position: relative; }
.bar-nav a::after { content: ''; position: absolute; left: 0; right: 0; bottom: -3px; height: 1px; background: var(--black); transform: scaleX(0); transform-origin: right; transition: transform .35s var(--ease-out); }
.bar-nav a:hover::after { transform: scaleX(1); transform-origin: left; }
.bar-right { display: flex; gap: 6px; }
.btn--sm { height: 38px; padding: 0 16px; font-size: 14px; }
.menu-btn--sm { width: 44px; height: 38px; box-shadow: none; }
.menu { position: fixed; inset: 0; z-index: 150; background: var(--white); color: var(--black); clip-path: inset(0% 0% 100% 0%); }
.menu[hidden] { display: none; }
.menu-inner { height: 100%; display: flex; flex-direction: column; padding: 28px var(--edge) 6.78vh; }
.menu-top { display: flex; justify-content: space-between; align-items: center; }
.menu-word { font: 800 32px/1 var(--f-cond); letter-spacing: -.01em; }
.menu-close { height: 40px; padding: 0 16px; background: var(--sprint); color: var(--black); }
.menu-nav { margin: auto 0; display: flex; flex-direction: column; }
.menu-nav a { display: block; font: 800 clamp(48px, 8.4vw, 132px)/.95 var(--f-cond); text-transform: uppercase; letter-spacing: -.01em; border-top: 1px solid var(--k-12); padding: .06em 0; transition: padding .35s var(--ease-out); }
.menu-nav a:hover { padding-left: 18px; }
.menu-foot { color: var(--k-60); }
/* ---------- 1 · hero ---------- */
.hero { position: relative; height: 100vh; }
.hero-pin { position: relative; height: 100vh; overflow: hidden; background: var(--white); }
.hero-card { position: absolute; inset: 0; background: var(--white); transform-origin: 50% 100%; z-index: 1; will-change: transform; overflow: hidden; }
.card-edge { position: absolute; inset: 0; box-shadow: inset 0 0 0 2.25px var(--black); opacity: 0; pointer-events: none; }
.topbar { position: absolute; left: var(--edge); right: var(--edge); top: 48px; display: flex; align-items: center; justify-content: space-between; z-index: 3; }
.logo { display: block; overflow: hidden; padding: 2px 0; }
.logo-in { display: block; font: 800 clamp(28px, 2.5vw, 40px)/.9 var(--f-cond); letter-spacing: -.01em; }
.topbar-mark { position: absolute; left: 50%; top: 50%; width: 30px; height: 30px; margin: -15px 0 0 -15px; color: var(--black); }
.topnav { overflow: visible; }
.topnav-in { display: flex; gap: 30px; font-size: 15px; font-weight: 500; }
.topnav a { position: relative; }
.topnav a::after { content: ''; position: absolute; left: 0; right: 0; bottom: -3px; height: 1px; background: var(--black); transform: scaleX(0); transform-origin: right; transition: transform .35s var(--ease-out); }
.topnav a:hover::after { transform: scaleX(1); transform-origin: left; }
.marquee { position: absolute; left: 0; right: 0; top: calc(25.8vh + 9.475vw); transform: translateY(-50%); z-index: 1; }
.marquee-reveal { overflow: visible; }
.marquee-scroll { display: flex; width: max-content; white-space: nowrap; will-change: transform; }
.mq-unit { font: 800 15.16vw/1 var(--f-cond); letter-spacing: -.02em; text-transform: uppercase; padding-top: .02em; }
.hero-photo { position: absolute; z-index: 2; left: calc(50% - 9.475vw); top: 25.8vh; width: 18.95vw; height: 18.95vw; overflow: hidden; background: var(--black); }
.hero-photo img { width: 100%; height: 100%; object-fit: cover; }
.has-intro .hero-photo { visibility: hidden; }
.hero-copy { position: absolute; left: 0; right: 0; top: 73.6vh; display: flex; flex-direction: column; align-items: center; gap: 2.2vh; z-index: 2; text-align: center; }
.hero-lede { font-size: clamp(17px, 1.53vw, 24px); line-height: 1.32; font-weight: 500; letter-spacing: -.005em; }
.sl { display: block; }
.sl > span { display: inline-block; }
.chip { position: relative; padding: 7px 13px 6px; }
.cb { position: absolute; background: var(--black); }
.cb-t { left: 0; right: 0; top: 0; height: 1px; transform-origin: 0 50%; }
.cb-r { top: 0; bottom: 0; right: 0; width: 1px; transform-origin: 50% 0; }
.cb-b { left: 0; right: 0; bottom: 0; height: 1px; transform-origin: 100% 50%; }
.cb-l { top: 0; bottom: 0; left: 0; width: 1px; transform-origin: 50% 100%; }
.hero-foot { position: absolute; left: var(--edge); bottom: calc(6.78vh + 14px); z-index: 2; }
.panels { position: absolute; left: 0; right: 0; top: 6.78vh; height: 68.2vh; padding: 0 var(--edge); display: flex; gap: 2.5vw; z-index: 2; pointer-events: none; }
.panel { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; opacity: 0; pointer-events: none; }
.hero.is-panels .panel { pointer-events: auto; }
.no-js .panel { opacity: 1; transform: none; }
.panel-field { position: relative; flex: 1 1 auto; padding: 1.8vw; overflow: hidden; }
.panel-photo { flex: 0 0 20vh; overflow: hidden; background: var(--black); }
.panel-photo img { width: 100%; height: 100%; object-fit: cover; transition: transform .9s var(--ease-out); }
.panel:hover .panel-photo img { transform: scale(1.04); }
.panel-sym { width: 34px; height: 34px; display: block; }
.panel-desc { position: absolute; left: 1.8vw; bottom: 1.8vw; right: calc(1.2vw + 3.2vw + 18px); font-size: clamp(12px, .97vw, 15px); line-height: 1.32; }
.panel-title { position: absolute; right: 1.2vw; bottom: 1.5vw; font: 800 clamp(30px, 3.2vw, 60px)/.8 var(--f-cond); text-transform: uppercase; letter-spacing: -.01em; }
.panel-title span { display: block; writing-mode: vertical-rl; transform: rotate(180deg); }
.panel--road .panel-field, .panel--tour .panel-field { background: var(--black); color: var(--white); }
.panel--gravel .panel-field { background: var(--sprint); color: var(--black); }
.panel--track { box-shadow: inset 0 0 0 1px var(--black); }
.panel--track .panel-field { background: var(--white); color: var(--black); box-shadow: inset 1px 1px 0 var(--black), inset -1px 0 0 var(--black); }
.panel--track .panel-photo { border: 1px solid var(--black); border-top: 0; }
/* ---------- 2 · process ---------- */
.process { position: relative; height: 600vh; background: var(--white); overflow: clip; }
.process-sticky { position: sticky; top: 0; height: 100vh; overflow: hidden; }
.process-head { position: absolute; left: var(--gut); right: var(--gut); top: 80px; display: grid; grid-template-columns: 1fr 1fr; align-items: start; }
.ph-left { display: flex; flex-direction: column; gap: 4px; padding-top: 30px; }
.ph-route { display: inline-flex; align-items: center; gap: 12px; }
.ph-arrow { width: 28px; height: 10px; }
.ph-week { color: var(--k-60); }
.ph-week b { font-weight: 400; color: var(--black); }
.ph-mid { font-size: clamp(17px, 1.39vw, 22px); line-height: 1.25; font-weight: 500; max-width: 17em; }
.ph-right { position: absolute; right: 0; top: 30px; }
.process-stage { position: absolute; left: var(--gut); right: var(--gut); bottom: 20px; height: calc(100vh - 183px); }
.ps-ghost { position: absolute; left: 0; right: 0; top: 36%; transform: translateY(-50%); text-align: center; font: 800 clamp(120px, 17vw, 300px)/.8 var(--f-cond); text-transform: uppercase; letter-spacing: -.02em; color: var(--black); white-space: nowrap; }
.pcards { position: absolute; inset: 0; display: flex; gap: 12px; }
.pc { position: relative; flex: 1 1 0; min-width: 0; height: 100%; background: var(--black); color: var(--white); clip-path: inset(100% 0 0 0); }
.pc--3 { background: var(--sprint); color: var(--black); }
.pc-num { position: absolute; left: 20px; top: 22px; font-size: 12px; }
.pc-body { position: absolute; left: 20px; right: 20px; bottom: 28px; }
.pc-title { font: 800 clamp(44px, 3.9vw, 72px)/.86 var(--f-cond); text-transform: uppercase; letter-spacing: -.01em; margin-bottom: 14px; }
.pc-desc { font-size: clamp(14px, 1.04vw, 16px); line-height: 1.38; max-width: 22em; color: var(--w-66); }
.pc--3 .pc-desc { color: var(--black); }
.pc-art { display: none; }
.pdraw { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
.pd-path { fill: none; stroke-width: 1; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
.pd-dash { stroke-width: 1; stroke-dasharray: 5 7; }
.pd-base { stroke-width: 1; }
.pd-w .pd-path, .pd-w .pd-dash, .pd-w .pd-base { stroke: var(--white); }
.pd-k .pd-path, .pd-k .pd-dash, .pd-k .pd-base { stroke: var(--black); }
.pd-w .pd-dot { fill: var(--white); }
.pd-k .pd-dot { fill: var(--black); }
.rp-w { fill: var(--w-66); }
.rp-k { fill: var(--black); }
.pd-num { font-family: var(--f-mono); font-size: 9px; letter-spacing: .06em; }
.pd-w .pd-num { fill: var(--w-66); }
.pd-k .pd-num { fill: var(--black); }
/* ---------- 3 · build log ---------- */
.log { position: relative; padding: 16vh var(--gut) 18vh; background: var(--white); overflow: clip; }
.log-head { display: grid; grid-template-columns: 1fr 1fr; gap: 20px 4vw; align-items: end; margin-bottom: 7vh; }
.log-intro { max-width: 30em; font-size: clamp(16px, 1.25vw, 19px); line-height: 1.4; color: var(--k-60); justify-self: end; }
.tabs { grid-column: 1 / -1; position: relative; display: flex; gap: 34px; border-bottom: 1px solid var(--k-12); padding-bottom: 12px; }
.tab { position: relative; color: var(--k-60); transition: color .3s; }
.tab.is-on, .tab:hover { color: var(--black); }
.tab sup { font-size: 9px; vertical-align: top; margin-left: 2px; }
.tabs-line { position: absolute; left: 0; bottom: -1px; height: 2px; width: 40px; background: var(--black); }
.log-body { position: relative; min-height: calc(12 * clamp(38px, 3.54vw, 64px)); }
.log-bar { position: absolute; left: calc(-1 * var(--gut)); right: calc(-1 * var(--gut)); top: 0; height: clamp(38px, 3.54vw, 64px); background: var(--sprint); transform-origin: 50% 50%; pointer-events: none; }
.log-list { position: relative; z-index: 1; }
.log-row { position: relative; }
.log-btn { position: relative; display: block; width: 100%; height: clamp(38px, 3.54vw, 64px); text-align: left; font-family: var(--f-mono); font-size: 11px; letter-spacing: .06em; text-transform: uppercase; }
.log-btn span { position: absolute; top: 50%; transform: translateY(-50%); white-space: nowrap; }
.lr-no { left: 0; }
.lr-name { left: 5.56vw; }
.lr-type { left: 22.8vw; color: var(--k-60); }
.lr-wk { left: 76vw; color: var(--k-60); }
.lr-city { right: 0; }
.log-row.is-on .lr-type, .log-row.is-on .lr-wk { color: var(--black); }
.log-row.is-off { opacity: .22; }
.log-row.is-off .log-btn { cursor: default; }
.lr-more { display: none; }
.log-photo { position: absolute; z-index: 2; left: calc(51.7vw - var(--gut)); top: 50%; width: 18.06vw; transform: translateY(-50%); pointer-events: none; }
.log-stack { position: relative; width: 100%; height: 25vw; overflow: hidden; background: var(--black); }
.log-stack img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; }
.log-stack img.is-on { opacity: 1; }
.log-note { position: absolute; left: 0; top: calc(100% + 14px); width: calc(100% + 4vw); font-size: 15px; line-height: 1.35; color: var(--k-60); }
.log-note b { display: block; font: 400 11px/1.5 var(--f-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--black); margin-bottom: 4px; }
/* ---------- 4 · your size ---------- */
.size { position: relative; padding: 14vh var(--gut) 16vh; border-top: 1px solid var(--k-12); overflow: clip; }
.size-head { display: grid; grid-template-columns: 58fr 42fr; gap: 4vw; align-items: end; margin-bottom: 6vh; }
.size-intro { font-size: clamp(16px, 1.25vw, 19px); line-height: 1.4; color: var(--k-60); max-width: 26em; }
.size-grid { display: grid; grid-template-columns: 58fr 42fr; gap: 4vw; align-items: start; }
.size-sketch { position: relative; border: 1px solid var(--k-12); padding: 2vw 1.4vw 1.4vw; }
.geo { display: block; width: 100%; height: auto; aspect-ratio: 2000 / 1350; overflow: visible; }
.g-ground { stroke: var(--k-12); stroke-width: 1; vector-effect: non-scaling-stroke; fill: none; }
.g-wheel { fill: none; stroke: var(--black); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.g-rim, .g-hub { fill: none; stroke: var(--k-35); stroke-width: 1; vector-effect: non-scaling-stroke; }
.g-tube { fill: none; stroke: var(--black); stroke-width: 2.5; stroke-linecap: round; vector-effect: non-scaling-stroke; }
.g-head { stroke-width: 4.5; }
.g-bb { fill: var(--white); stroke: var(--black); stroke-width: 2; vector-effect: non-scaling-stroke; }
.g-aux { fill: none; stroke: var(--k-35); stroke-width: 1.2; stroke-dasharray: 4 4; vector-effect: non-scaling-stroke; }
.g-saddle, .g-bar { fill: none; stroke: var(--black); stroke-width: 2.5; stroke-linecap: round; vector-effect: non-scaling-stroke; }
.g-arc { fill: none; stroke: var(--k-60); stroke-width: 1; vector-effect: non-scaling-stroke; }
.g-ang { font-family: var(--f-mono); letter-spacing: .06em; fill: var(--k-60); }
.g-ext { fill: none; stroke: var(--k-35); stroke-width: 1; stroke-dasharray: 3 3; vector-effect: non-scaling-stroke; }
.g-dline { fill: none; stroke: var(--black); stroke-width: 1; vector-effect: non-scaling-stroke; }
.g-arrow { fill: var(--black); }
.g-tag-bg { fill: var(--white); }
.g-tag-txt { font-family: var(--f-mono); letter-spacing: .06em; fill: var(--black); }
.sketch-tag { display: flex; justify-content: space-between; margin-top: 10px; color: var(--k-60); }
.sketch-tag b { font-weight: 400; color: var(--black); }
.size-ctrl { display: flex; flex-direction: column; gap: 34px; }
.field-top { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 14px; }
.field-val { font: 800 clamp(56px, 5.6vw, 96px)/.8 var(--f-cond); letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
.field-val small { font: 400 11px/1 var(--f-mono); letter-spacing: .06em; text-transform: uppercase; margin-left: 6px; vertical-align: top; }
.field-scale { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; color: var(--k-60); }
.relink { padding: 4px 8px; background: var(--sprint); color: var(--black); }
.relink[aria-pressed="false"] { background: transparent; box-shadow: inset 0 0 0 1px var(--k-12); color: var(--k-60); }
.range { -webkit-appearance: none; appearance: none; width: 100%; height: 30px; background: transparent; margin: 0; cursor: pointer; }
.range::-webkit-slider-runnable-track { height: 2px; background: var(--black); }
.range::-moz-range-track { height: 2px; background: var(--black); }
.range::-webkit-slider-thumb { -webkit-appearance: none; width: 16px; height: 30px; margin-top: -14px; background: var(--sprint); border: 1px solid var(--black); border-radius: 0; }
.range::-moz-range-thumb { width: 14px; height: 28px; background: var(--sprint); border: 1px solid var(--black); border-radius: 0; }
.range:focus-visible { outline: 2px solid var(--black); outline-offset: 6px; }
.geo-list { display: grid; grid-template-columns: 1fr 1fr; border-top: 1px solid var(--k-12); }
.geo-list > div { display: flex; justify-content: space-between; align-items: baseline; padding: 12px 0; border-bottom: 1px solid var(--k-12); }
.geo-list > div:nth-child(odd) { padding-right: 16px; }
.geo-list > div:nth-child(even) { padding-left: 16px; border-left: 1px solid var(--k-12); }
.geo-list dt { color: var(--k-60); }
.geo-list dd { font: 800 28px/1 var(--f-cond); font-variant-numeric: tabular-nums; }
.geo-list dd span { margin: 0 3px; color: var(--k-35); }
.caption { color: var(--black); max-width: 34em; }
/* ---------- 5 · rides ---------- */
.rides { position: relative; height: 130vh; background: var(--white); overflow: clip; }
.rides-stage { position: sticky; top: 0; height: 100vh; }
.rides-title { position: absolute; z-index: 3; left: 0; right: 0; top: 12vh; text-align: center; font: 800 clamp(52px, 6.6vw, 120px)/.9 var(--f-cond); text-transform: uppercase; letter-spacing: -.01em; white-space: nowrap; }
.rt-word-wrap { display: inline-block; text-align: left; vertical-align: top; }
.rt-word { display: inline-block; white-space: nowrap; }
.wall { position: absolute; left: 0; right: 0; top: 47vh; height: 0; transform-style: preserve-3d; }
.ring { position: absolute; left: 50%; top: 0; width: 0; height: 0; transform-style: preserve-3d; will-change: transform; }
.tile { position: absolute; left: 0; top: 0; backface-visibility: hidden; -webkit-backface-visibility: hidden; overflow: hidden; background: var(--black); }
.tile img { width: 100%; height: 100%; object-fit: cover; }
.rides-sub { position: absolute; z-index: 3; left: 0; right: 0; top: 74vh; text-align: center; font-size: clamp(17px, 1.39vw, 22px); font-weight: 500; }
.rides-meta { position: absolute; z-index: 3; left: 0; right: 0; top: calc(74vh + 44px); display: flex; justify-content: center; gap: 28px; color: var(--k-60); }
/* ---------- footer ---------- */
.foot { position: relative; padding: 14vh var(--gut) 24px; border-top: 1px solid var(--k-12); overflow: hidden; }
.foot-top { display: grid; grid-template-columns: 1.1fr 1fr; gap: 4vw; }
.foot-cta { display: flex; flex-direction: column; align-items: flex-start; gap: 30px; }
.foot-lede { font-size: clamp(22px, 2.1vw, 34px); line-height: 1.18; font-weight: 500; letter-spacing: -.01em; max-width: 19em; }
.foot-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.foot-col p { font-size: 15px; line-height: 1.6; }
.foot-col a { border-bottom: 1px solid var(--k-12); transition: border-color .3s; }
.foot-col a:hover { border-color: var(--black); }
.foot-k { color: var(--k-60); margin-bottom: 10px; font-size: 11px !important; }
.foot-wordwrap { container-type: inline-size; margin: 9vh 0 3vh; }
.foot-word { font: 800 calc(100cqw / 2.1)/.78 var(--f-cond); letter-spacing: -.02em; margin-left: -.02em; white-space: nowrap; }
.foot-base { display: flex; justify-content: space-between; gap: 20px; padding-top: 16px; border-top: 1px solid var(--k-12); color: var(--k-60); }
.foot-base a:hover { color: var(--black); }
/* ---------- mobile (< 768) ---------- */
@media (max-width: 767px) {
:root { --edge: 16px; --gut: 16px; }
.btn { height: 44px; padding: 0 18px; font-size: 14px; }
.nav-actions { right: 16px; bottom: 16px; }
.menu-btn { width: 48px; height: 44px; }
.bar { height: 52px; gap: 12px; }
.bar-nav { display: none; }
.bar-word { font-size: 24px; }
.menu-btn--sm { width: 42px; height: 36px; }
.btn--sm { height: 36px; padding: 0 14px; font-size: 13px; }
.ld-frames { --s: min(38vw, 34vh); }
.ld-tag, .ld-counter { bottom: 24px; }
.topbar { top: 22px; }
.topnav, .topbar-mark { display: none; }
.hero-card { --ph: min(38vw, 34vh); }
.marquee { top: calc(26vh + var(--ph) / 2); }
.mq-unit { font-size: 22vw; }
.hero-photo { left: calc(50% - var(--ph) / 2); top: 26vh; width: var(--ph); height: var(--ph); }
.hero-copy { top: max(62vh, calc(26vh + var(--ph) + 44px)); gap: 16px; padding: 0 16px; }
.hero-lede { font-size: 17px; }
.hero-foot { bottom: 80px; left: 16px; }
.panels { top: 16px; height: auto; bottom: auto; flex-direction: column; gap: 10px; padding: 0 16px; }
.panel { flex: 0 0 19vh; flex-direction: row; }
.panel-field { flex: 0 0 60%; padding: 14px; }
.panel-photo { flex: 1 1 auto; }
.panel-sym { position: absolute; right: 14px; top: 14px; width: 22px; height: 22px; }
.panel-title { position: static; font-size: 44px; line-height: .86; }
.panel-title span { writing-mode: horizontal-tb; transform: none; }
.panel-desc { left: 14px; right: 14px; bottom: 12px; max-width: none; font-size: 13px; }
.panel-title { font-size: 44px; }
.panel--track .panel-field { box-shadow: inset 1px 1px 0 var(--black), inset 0 -1px 0 var(--black); }
.panel--track .panel-photo { border: 1px solid var(--black); border-left: 0; }
.process { height: auto; padding: 12vh 0 6vh; }
.process-sticky { position: relative; height: auto; overflow: visible; }
.process-head { position: relative; left: auto; right: auto; top: auto; padding: 0 16px; grid-template-columns: 1fr; gap: 14px; margin-bottom: 28px; }
.ph-left { padding-top: 0; }
.ph-right { position: static; order: -1; font: 800 56px/.86 var(--f-cond); letter-spacing: -.01em; }
.ph-week { display: none; }
.process-stage { position: relative; left: auto; right: auto; bottom: auto; height: auto; padding: 0 16px; }
.ps-ghost, .pdraw { display: none; }
.pcards { position: relative; flex-direction: column; gap: 12px; }
.pc { height: 70vh; flex: 0 0 auto; }
.pc-art { display: block; position: absolute; inset: 0; }
.pc-art svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.pc-title { font-size: 52px; }
.log { padding: 12vh 16px 12vh; }
.log-head { grid-template-columns: 1fr; margin-bottom: 28px; }
.log-intro { justify-self: start; }
.tabs { gap: 24px; }
.log-body { min-height: 0; }
.log-bar, .log-photo { display: none; }
.log-row { border-bottom: 1px solid var(--k-12); }
.log-btn { height: auto; display: grid; grid-template-columns: 52px 1fr auto; grid-template-rows: auto auto; column-gap: 8px; row-gap: 2px; padding: 14px 0; }
.log-btn span { position: static; transform: none; }
.lr-no { grid-row: 1 / 3; }
.lr-name { grid-column: 2; }
.lr-type { grid-column: 2; grid-row: 2; }
.lr-city { grid-column: 3; grid-row: 1; text-align: right; }
.lr-wk { grid-column: 3; grid-row: 2; text-align: right; }
.log-row.is-on .log-btn { background: var(--sprint); margin: 0 -16px; padding: 14px 16px; width: calc(100% + 32px); grid-template-columns: 52px 1fr auto; }
.lr-more { display: block; height: 0; overflow: hidden; }
.lr-more-in { padding: 4px 0 20px 60px; }
.lr-more img { width: 100%; height: auto; aspect-ratio: 4 / 5; object-fit: cover; background: var(--black); }
.lr-more p { margin-top: 10px; font-size: 15px; line-height: 1.35; color: var(--k-60); }
.size { padding: 12vh 16px 12vh; }
.size-head, .size-grid { grid-template-columns: 1fr; }
.size-sketch { padding: 12px 8px 8px; }
.size-ctrl { gap: 28px; }
.geo-list dd { font-size: 24px; }
.rides { height: 100vh; }
.rides-title { top: auto; bottom: calc(50vh + var(--band, 180px) / 2 + 28px); font-size: 13.4vw; }
.wall { top: 50vh; }
.rides-sub { top: calc(50vh + var(--band, 180px) / 2 + 30px); padding: 0 16px; font-size: 17px; }
.rides-meta { top: calc(50vh + var(--band, 180px) / 2 + 64px); gap: 14px; flex-wrap: wrap; padding: 0 16px; }
.foot { padding-top: 10vh; }
.foot-top { grid-template-columns: 1fr; gap: 48px; }
.foot-cols { grid-template-columns: 1fr 1fr; }
.foot-base { flex-direction: column; gap: 6px; }
}
@media (min-width: 768px) and (max-width: 1100px) {
.topnav-in { gap: 18px; font-size: 14px; }
.lr-type { left: 21vw; }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { transition-duration: .01ms !important; }
}
```
## `js/data.js`
```js
/* FETTLE · page content that the scripts render (build log rows, ride tiles). */
window.FETTLE_DATA = {
log: [
{ no: 218, name: 'Marta', type: 'Gravel', mat: 'Steel', city: 'Porto', wk: 11, note: 'Wanted it to feel like her old one, only it fits.', alt: 'Rider in a rain jacket holding a matt grey steel gravel frame outside a tiled Porto doorway' },
{ no: 221, name: 'Joost', type: 'Tour', mat: 'Steel', city: 'Utrecht', wk: 13, note: 'Racks front and back. He leaves for Istanbul in May.', alt: 'Black steel touring bike with front and rear racks against a canal railing' },
{ no: 224, name: 'Amara', type: 'Road', mat: 'Titanium', city: 'Lyon', wk: 9, note: 'Six foot four. First bike that never needed a 140 mm stem.', alt: 'Tall rider standing beside a brushed titanium road frame on a stone bridge' },
{ no: 227, name: 'Pieter', type: 'Track', mat: 'Steel', city: 'Ghent', wk: 8, note: 'Rides the velodrome on Wednesdays. Asked for nothing shiny.', alt: 'Bare steel track frame hanging on a wall hook in the workshop' },
{ no: 230, name: 'Sigrid', type: 'Gravel', mat: 'Titanium', city: 'Bergen', wk: 12, note: 'Mudguards and 45s. Norway is wet, apparently.', alt: 'Titanium gravel bike with full mudguards on a wet harbour quay' },
{ no: 233, name: 'Tomás', type: 'Road', mat: 'Steel', city: 'Bilbao', wk: 10, note: 'Climbs every morning. We slackened the head angle half a degree.', alt: 'White steel road frame on a hillside road above a city in morning haze' },
{ no: 236, name: 'Inge', type: 'Tour', mat: 'Titanium', city: 'Malmö', wk: 14, note: 'Bare titanium, brushed by hand. She will never paint it.', alt: 'Close view of a hand-brushed titanium top tube with a small engraved name' },
{ no: 239, name: 'Kofi', type: 'Gravel', mat: 'Steel', city: 'Antwerp', wk: 11, note: 'Painted Sprint. Strangers wave at him more now.', alt: 'Chartreuse painted steel gravel frame leaning on a dockside bollard' },
{ no: 242, name: 'Elena', type: 'Road', mat: 'Titanium', city: 'Turin', wk: 9, note: 'Short legs, long back. The fit was the whole job.', alt: 'Rider adjusting the saddle of a titanium road bike under an arcade' },
{ no: 245, name: 'Bram', type: 'Track', mat: 'Steel', city: 'Rotterdam', wk: 8, note: 'Fixed, flat bars, one brake. It is for the city, mostly.', alt: 'Black fixed-gear steel frame with flat bars locked to a street rack' },
{ no: 248, name: 'Hanna', type: 'Tour', mat: 'Steel', city: 'Leipzig', wk: 13, note: 'Dynamo lights, kickstand plate, room for a basket. Practical.', alt: 'Steel touring bike with dynamo light and front basket outside a bakery' },
{ no: 251, name: 'Oskar', type: 'Gravel', mat: 'Titanium', city: 'Zürich', wk: 12, note: 'Clearance for 50s and a third bottle under the down tube.', alt: 'Titanium gravel frame with wide tyres on a forest trail above a lake' }
],
rides: [
'Gravel bike on a wet farm track under low cloud',
'Rider climbing a switchback road in the Alps at first light',
'Touring bike loaded with bags beside a mountain lake',
'Commuter in city traffic at dusk, rear light glowing',
'Chartreuse frame propped against a hay bale in January frost',
'Track bike on the banking of an indoor velodrome',
'Rider under a bridge sheltering from heavy rain',
'Road bike on cobbles in a quiet Flemish village',
'Titanium frame at a café table by a harbour',
'Gravel riders crossing a ford, water spraying',
'Steel road bike on a coastal road with sea spray',
'Tourer parked outside a tent at a campsite at dawn',
'Rider in snow on a forest trail, breath visible',
'Bike on a train platform with panniers',
'Close-up of a muddy down tube and bottle cage',
'Rider descending a mountain pass in the wet',
'Fixed-gear bike leaning on a shop window at night',
'Two riders on a straight polder road under big sky'
]
};
```
## `js/geometry.js`
```js
/* FETTLE · "Your size, roughly" — a live side-view frame sketch driven by rider height and inseam.
World units are millimetres, origin at the bottom bracket, y up. Our own rule-of-thumb formulas:
seat tube (c-t) = inseam × 0.665 stack = height × 0.325 reach = height × 0.22
effective top tube = reach + stack × 0.3 head angle 72° seat angle 73.5°
wheelbase = 980 + (height − 175) × 1.6
Chainstays are fixed at 410 mm; the fork blade's rake absorbs the difference so the drawn wheelbase
always equals the number. */
(function () {
var NS = 'http://www.w3.org/2000/svg';
var D2R = Math.PI / 180, HA = 72 * D2R, SA = 73.5 * D2R;
var DROP = 70, CS = 410, WHEEL = 336, RIM = 300, A2C = 375;
var VB = { x0: -820, x1: 1180, y0: -420, y1: 930 }; // fixed so the frame visibly grows and shrinks
var VW = VB.x1 - VB.x0, VH = VB.y1 - VB.y0;
function geom(hcm, icm) {
var hmm = hcm * 10, imm = icm * 10;
var g = {};
g.st = imm * 0.665; g.stack = hmm * 0.325; g.reach = hmm * 0.22; g.ett = g.reach + g.stack * 0.3;
var tanH = Math.tan(HA);
function axisX(y) { return g.reach + (g.stack - y) / tanH; }
g.axisX = axisX;
// wheelbase from our formula; chainstays stay 410 mm and the fork rake takes up the difference
g.wb = 980 + (hcm - 175) * 1.6;
g.rear = { x: -Math.sqrt(CS * CS - DROP * DROP), y: DROP };
g.front = { x: g.rear.x + g.wb, y: DROP };
var yHB = DROP + A2C * Math.sin(HA), ht = (g.stack - yHB) / Math.sin(HA);
if (ht < 95) { ht = 95; yHB = g.stack - ht * Math.sin(HA); }
g.ht = ht;
g.htTop = { x: g.reach, y: g.stack };
g.htBot = { x: axisX(yHB), y: yHB };
g.stTop = { x: -g.st * Math.cos(SA), y: g.st * Math.sin(SA) };
g.cluster = { x: -(g.st - 18) * Math.cos(SA), y: (g.st - 18) * Math.sin(SA) };
g.ttFront = { x: axisX(g.stack - 22), y: g.stack - 22 };
g.dtFront = { x: axisX(yHB + 26), y: yHB + 26 };
var sad = imm * 0.883;
g.saddle = { x: -sad * Math.cos(SA), y: sad * Math.sin(SA) };
return g;
}
function el(tag, attrs, parent) {
var e = document.createElementNS(NS, tag);
for (var k in attrs) e.setAttribute(k, attrs[k]);
if (parent) parent.appendChild(e);
return e;
}
function X(x) { return (x - VB.x0).toFixed(1); }
function Y(y) { return (VB.y1 - y).toFixed(1); }
function L(a, b) { return 'M' + X(a.x) + ' ' + Y(a.y) + 'L' + X(b.x) + ' ' + Y(b.y); }
function circ(c, r) { // circle as a path (so the stroke can be drawn in), starting at the top
var cx = +X(c.x), cy = +Y(c.y);
return 'M' + cx + ' ' + (cy - r) + 'A' + r + ' ' + r + ' 0 1 1 ' + cx + ' ' + (cy + r) + 'A' + r + ' ' + r + ' 0 1 1 ' + cx + ' ' + (cy - r);
}
function create(svg) {
svg.setAttribute('viewBox', '0 0 ' + VW + ' ' + VH);
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
var root = el('g', { class: 'geo-root' }, svg);
var E = {};
E.ground = el('path', { class: 'g-ground' }, root);
E.dimsBack = el('g', { class: 'g-dims' }, root);
E.rimR = el('path', { class: 'g-rim' }, root);
E.rimF = el('path', { class: 'g-rim' }, root);
E.wheelR = el('path', { class: 'g-wheel g-draw' }, root);
E.wheelF = el('path', { class: 'g-wheel g-draw' }, root);
E.hubR = el('path', { class: 'g-hub' }, root);
E.hubF = el('path', { class: 'g-hub' }, root);
E.post = el('path', { class: 'g-aux' }, root);
E.saddle = el('path', { class: 'g-saddle g-draw' }, root);
E.stem = el('path', { class: 'g-aux' }, root);
E.bar = el('path', { class: 'g-bar g-draw' }, root);
['cs', 'ss', 'st', 'tt', 'dt', 'fk'].forEach(function (k) { E[k] = el('path', { class: 'g-tube g-draw' }, root); });
E.ht = el('path', { class: 'g-tube g-head g-draw' }, root);
E.bb = el('path', { class: 'g-bb g-draw' }, root);
E.arcs = el('path', { class: 'g-arc' }, root);
E.dims = {};
['reach', 'ett', 'stack', 'st', 'wb'].forEach(function (k) {
var g = el('g', { class: 'g-dim' }, root);
E.dims[k] = {
ext: el('path', { class: 'g-ext' }, g),
line: el('path', { class: 'g-dline' }, g),
head: el('path', { class: 'g-arrow' }, g),
tag: el('g', { class: 'g-tag' }, g)
};
E.dims[k].bg = el('rect', { class: 'g-tag-bg' }, E.dims[k].tag);
E.dims[k].txt = el('text', { class: 'g-tag-txt', 'text-anchor': 'middle', 'dominant-baseline': 'central' }, E.dims[k].tag);
});
E.angH = el('text', { class: 'g-ang', 'dominant-baseline': 'central' }, root);
E.angS = el('text', { class: 'g-ang', 'text-anchor': 'end', 'dominant-baseline': 'central' }, root);
return E;
}
// measure the mono advance once (Azeret Mono is fixed-width)
var ADV = 0.62;
function measure() {
try {
var c = document.createElement('canvas').getContext('2d');
c.font = '400 100px "Azeret Mono", ui-monospace, monospace';
ADV = c.measureText('0000000000').width / 1000 || 0.62;
} catch (e) { ADV = 0.62; }
}
function arrowPath(ax, ay, bx, by, len, wid) { // two filled arrowheads, pointing outward at a and b (viewBox coords)
var dx = bx - ax, dy = by - ay, d = Math.hypot(dx, dy) || 1, ux = dx / d, uy = dy / d, px = -uy, py = ux;
function head(tx, ty, sx, sy) { return 'M' + tx.toFixed(1) + ' ' + ty.toFixed(1) + 'L' + (tx + sx * len + px * wid).toFixed(1) + ' ' + (ty + sy * len + py * wid).toFixed(1) + 'L' + (tx + sx * len - px * wid).toFixed(1) + ' ' + (ty + sy * len - py * wid).toFixed(1) + 'Z'; }
return head(ax, ay, ux, uy) + head(bx, by, -ux, -uy);
}
function draw(E, g, px) {
// px = viewBox units per screen pixel
var fs = (window.innerWidth < 768 ? 9.5 : 11) * px;
var arrowL = 8 * px, arrowW = 2.6 * px;
E.ground.setAttribute('d', 'M' + X(VB.x0 + 20) + ' ' + Y(DROP - WHEEL) + 'H' + X(VB.x1 - 20));
E.wheelR.setAttribute('d', circ(g.rear, WHEEL));
E.wheelF.setAttribute('d', circ(g.front, WHEEL));
E.rimR.setAttribute('d', circ(g.rear, RIM));
E.rimF.setAttribute('d', circ(g.front, RIM));
E.hubR.setAttribute('d', circ(g.rear, 16));
E.hubF.setAttribute('d', circ(g.front, 16));
E.cs.setAttribute('d', L({ x: 0, y: 0 }, g.rear));
E.ss.setAttribute('d', L(g.cluster, g.rear));
E.st.setAttribute('d', L({ x: 0, y: 0 }, g.stTop));
E.tt.setAttribute('d', L(g.stTop.y > g.cluster.y ? { x: g.cluster.x - 4 * Math.cos(SA), y: g.cluster.y + 4 * Math.sin(SA) } : g.cluster, g.ttFront));
E.dt.setAttribute('d', L({ x: 0, y: 0 }, g.dtFront));
E.ht.setAttribute('d', L(g.htTop, g.htBot));
// fork: short steerer section, then a gently raked blade to the axle
var crown = { x: g.axisX(g.htBot.y - 24), y: g.htBot.y - 24 };
var ctrl = { x: g.axisX(DROP + 90), y: DROP + 90 };
E.fk.setAttribute('d', L(g.htBot, crown) + 'Q' + X(ctrl.x) + ' ' + Y(ctrl.y) + ' ' + X(g.front.x) + ' ' + Y(g.front.y));
E.bb.setAttribute('d', circ({ x: 0, y: 0 }, 22));
E.post.setAttribute('d', L(g.stTop, g.saddle));
E.saddle.setAttribute('d', 'M' + X(g.saddle.x - 140) + ' ' + Y(g.saddle.y + 4) + 'L' + X(g.saddle.x + 110) + ' ' + Y(g.saddle.y));
var stemEnd = { x: g.htTop.x + 100 * Math.cos(8 * D2R) - 20 * Math.cos(HA), y: g.htTop.y + 30 + 100 * Math.sin(8 * D2R) };
var stemStart = { x: g.axisX(g.htTop.y + 30), y: g.htTop.y + 30 };
E.stem.setAttribute('d', L(g.htTop, stemStart) + L(stemStart, stemEnd));
// drop bar: forward reach, then the drop curling back
var b0 = stemEnd;
E.bar.setAttribute('d', 'M' + X(b0.x) + ' ' + Y(b0.y) + 'C' + X(b0.x + 90) + ' ' + Y(b0.y + 4) + ' ' + X(b0.x + 110) + ' ' + Y(b0.y - 90) + ' ' + X(b0.x + 40) + ' ' + Y(b0.y - 120) + 'L' + X(b0.x - 20) + ' ' + Y(b0.y - 116));
// angle marks: head angle at the crown, seat angle at the bottom bracket
var r1 = 78, hb = g.htBot, a0 = -HA; // axis direction pointing down-forward (world): angle -72°
var ha = { x: hb.x + r1 * Math.cos(a0), y: hb.y + r1 * Math.sin(a0) }, hbF = { x: hb.x + r1, y: hb.y };
var r2 = 96, sa0 = Math.PI - SA; // seat tube direction (world angle 106.5°)
var s1 = { x: r2 * Math.cos(sa0), y: r2 * Math.sin(sa0) }, s2 = { x: -r2, y: 0 };
E.arcs.setAttribute('d',
'M' + X(hb.x) + ' ' + Y(hb.y) + 'L' + X(hb.x + r1 + 26) + ' ' + Y(hb.y) +
'M' + X(hbF.x) + ' ' + Y(hbF.y) + 'A' + r1 + ' ' + r1 + ' 0 0 1 ' + X(ha.x) + ' ' + Y(ha.y) +
'M' + X(0) + ' ' + Y(0) + 'L' + X(-r2 - 26) + ' ' + Y(0) +
'M' + X(s2.x) + ' ' + Y(s2.y) + 'A' + r2 + ' ' + r2 + ' 0 0 1 ' + X(s1.x) + ' ' + Y(s1.y));
E.angH.setAttribute('x', X(hb.x + r1 + 34)); E.angH.setAttribute('y', Y(hb.y - 34)); E.angH.setAttribute('font-size', fs.toFixed(1)); E.angH.textContent = '72°';
E.angS.setAttribute('x', X(-r2 - 34)); E.angS.setAttribute('y', Y(34)); E.angS.setAttribute('font-size', fs.toFixed(1)); E.angS.textContent = '73.5°';
// dimensions (world coordinates)
var yReach = g.stack + 80, yEtt = g.stack + 170, xStack = g.front.x + WHEEL + 80, yWb = DROP - WHEEL - 80;
var nx = -Math.sin(SA), ny = -Math.cos(SA), off = 100; // seat-tube dimension sits behind the tube
var ettL = g.reach - g.ett;
var dims = {
reach: { a: { x: 0, y: yReach }, b: { x: g.reach, y: yReach }, label: 'Reach ' + Math.round(g.reach),
ext: L({ x: 0, y: 40 }, { x: 0, y: yReach + 24 }) + L({ x: g.reach, y: g.stack + 16 }, { x: g.reach, y: yEtt + 24 }) },
ett: { a: { x: ettL, y: yEtt }, b: { x: g.reach, y: yEtt }, label: 'Top tube ' + Math.round(g.ett),
ext: L({ x: ettL, y: Math.min(g.stack, g.saddle.y) + 10 }, { x: ettL, y: yEtt + 24 }) },
stack: { a: { x: xStack, y: 0 }, b: { x: xStack, y: g.stack }, label: 'Stack ' + Math.round(g.stack), rot: -90,
ext: L({ x: 34, y: 0 }, { x: xStack + 24, y: 0 }) + L({ x: g.reach + 26, y: g.stack }, { x: xStack + 24, y: g.stack }) },
st: { a: { x: nx * off, y: ny * off }, b: { x: g.stTop.x + nx * off, y: g.stTop.y + ny * off }, label: 'Seat tube ' + Math.round(g.st), rot: 73.5,
ext: L({ x: nx * 30, y: ny * 30 }, { x: nx * (off + 22), y: ny * (off + 22) }) + L({ x: g.stTop.x + nx * 18, y: g.stTop.y + ny * 18 }, { x: g.stTop.x + nx * (off + 22), y: g.stTop.y + ny * (off + 22) }) },
wb: { a: { x: g.rear.x, y: yWb }, b: { x: g.front.x, y: yWb }, label: 'Wheelbase ' + Math.round(g.wb),
ext: L({ x: g.rear.x, y: DROP - 24 }, { x: g.rear.x, y: yWb - 24 }) + L({ x: g.front.x, y: DROP - 24 }, { x: g.front.x, y: yWb - 24 }) }
};
for (var k in dims) {
var d = dims[k], D = E.dims[k];
var ax = +X(d.a.x), ay = +Y(d.a.y), bx = +X(d.b.x), by = +Y(d.b.y);
D.ext.setAttribute('d', d.ext);
D.line.setAttribute('d', 'M' + ax + ' ' + ay + 'L' + bx + ' ' + by);
D.head.setAttribute('d', arrowPath(ax, ay, bx, by, arrowL, arrowW));
var txt = d.label.toUpperCase();
D.txt.textContent = txt;
D.txt.setAttribute('font-size', fs.toFixed(1));
var tw = txt.length * (ADV + 0.06) * fs, th = fs * 1.9, pad = fs * 0.7;
D.bg.setAttribute('x', (-tw / 2 - pad).toFixed(1)); D.bg.setAttribute('y', (-th / 2).toFixed(1));
D.bg.setAttribute('width', (tw + pad * 2).toFixed(1)); D.bg.setAttribute('height', th.toFixed(1));
D.txt.setAttribute('x', (fs * 0.03).toFixed(1)); D.txt.setAttribute('y', '0');
D.tag.setAttribute('transform', 'translate(' + ((ax + bx) / 2).toFixed(1) + ' ' + ((ay + by) / 2).toFixed(1) + ') rotate(' + (d.rot || 0) + ')');
}
}
function init(opts) {
var svg = opts.svg; if (!svg) return null;
measure();
var E = create(svg);
var state = { h: opts.h, i: opts.i };
var px = 1;
function sizePx() { var w = svg.getBoundingClientRect().width || 800; var h = svg.getBoundingClientRect().height || 500; px = Math.max(VW / w, VH / h); }
function render() { var g = geom(state.h, state.i); draw(E, g, px); if (opts.onRender) opts.onRender(g, state); }
sizePx(); render();
return {
set: function (h, i, instant) {
if (instant || !window.gsap) { state.h = h; state.i = i; render(); return; }
gsap.to(state, { h: h, i: i, duration: 0.4, ease: 'power2.out', overwrite: true, onUpdate: render });
},
resize: function () { measure(); sizePx(); render(); },
drawables: function () { return svg.querySelectorAll('.g-draw'); },
fades: function () { return svg.querySelectorAll('.g-dim, .g-aux, .g-rim, .g-hub, .g-arc, .g-ang, .g-ground'); },
geom: geom
};
}
window.FETTLE_GEO = { init: init, geom: geom };
})();
```
## `js/main.js`
```js
/* FETTLE Frameworks · page choreography
Plain script, UMD globals (gsap, ScrollTrigger, CustomEase, DrawSVGPlugin, Lenis). Works on file:// and http. */
(function () {
'use strict';
var $ = function (s, r) { return (r || document).querySelector(s); };
var $$ = function (s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); };
var clamp = function (v, a, b) { return Math.max(a, Math.min(b, v)); };
var root = document.documentElement;
var RM = window.matchMedia && matchMedia('(prefers-reduced-motion: reduce)').matches;
var INTRO = root.classList.contains('has-intro');
var isMob = function () { return window.innerWidth < 768; };
if (!window.gsap) { root.classList.add('no-js'); return; }
gsap.registerPlugin(ScrollTrigger, CustomEase);
if (window.DrawSVGPlugin) gsap.registerPlugin(DrawSVGPlugin);
// Panel rise curve, fitted to 50 sampled frames of the reference transition (rms error 0.0012):
// near-linear start, a surge between 30 and 40 %, then a long settling tail.
CustomEase.create('panelRise', 'M0,0 C0.185,0.167 0.327,0.326 0.376,0.664 C0.414,0.928 0.514,0.995 1,1');
if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
if (INTRO) window.scrollTo(0, 0);
/* ---------- images: retry once, never show alt text on a broken image ---------- */
function guardImg(img) {
img.addEventListener('error', function onErr() {
if (!img.dataset.retried) { img.dataset.retried = '1'; var s = img.getAttribute('src'); img.src = s + (s.indexOf('?') < 0 ? '?r=1' : '&r=1'); }
else { img.classList.add('is-broken'); img.removeEventListener('error', onErr); }
});
}
/* ---------- smooth scroll ---------- */
var lenis = null;
if (!RM && window.Lenis) {
try {
lenis = new Lenis({ lerp: 0.1, wheelMultiplier: 1, smoothWheel: true });
lenis.on('scroll', ScrollTrigger.update);
gsap.ticker.add(function (t) { lenis.raf(t * 1000); });
gsap.ticker.lagSmoothing(0);
} catch (e) { lenis = null; }
}
function scrollToY(y, dur) {
if (lenis) lenis.scrollTo(y, { duration: dur || 1.4, easing: function (t) { return 1 - Math.pow(1 - t, 3); } });
else window.scrollTo({ top: y, behavior: RM ? 'auto' : 'smooth' });
}
function lock(on) { if (lenis) { on ? lenis.stop() : lenis.start(); } document.body.style.overflow = on ? 'hidden' : ''; }
/* ---------- content: build log rows + ride tiles ---------- */
var DATA = window.FETTLE_DATA || { log: [], rides: [] };
var pad = function (n, l) { n = String(n); while (n.length < l) n = '0' + n; return n; };
(function renderLog() {
var list = $('#logList'), stack = $('#logStack');
if (!list) return;
DATA.log.forEach(function (r, i) {
var li = document.createElement('li');
li.className = 'log-row'; li.dataset.i = i; li.dataset.mat = r.mat.toLowerCase();
li.innerHTML =
'<button class="log-btn" type="button">' +
'<span class="lr-no">#' + r.no + '</span><span class="lr-name">' + r.name + '</span>' +
'<span class="lr-type">' + r.type + ' · ' + r.mat + '</span><span class="lr-wk">' + r.wk + ' wk</span>' +
'<span class="lr-city">' + r.city + '</span>' +
'</button>' +
'<div class="lr-more"><div class="lr-more-in"><img src="images/log-' + pad(i + 1, 2) + '.jpg" alt="' + r.alt + '" width="780" height="1080" loading="eager" decoding="async"><p>“' + r.note + '”</p></div></div>';
list.appendChild(li);
var img = document.createElement('img');
img.src = 'images/log-' + pad(i + 1, 2) + '.jpg'; img.alt = r.alt; img.width = 780; img.height = 1080; img.loading = 'eager'; img.decoding = 'async';
if (i === 0) img.className = 'is-on';
stack.appendChild(img);
});
})();
$$('img').forEach(guardImg);
/* =========================================================
0 · Intro loader + 1 · Hero reveal
========================================================= */
var hero = $('.hero'), card = $('.hero-card'), navActions = $('#navActions');
var logo = $('.logo'), topMark = $('.topbar-mark'), topnavIn = $('.topnav-in');
var copyLines = $$('.hero-lede .sl > span').concat($$('.hero-foot .sl > span'));
var chip = $('.chip'), cbs = { t: $('.cb-t'), r: $('.cb-r'), b: $('.cb-b'), l: $('.cb-l') };
var mqReveal = $('.marquee-reveal'), mqScroll = $('.marquee-scroll'), mqUnit = $('.mq-unit');
var heroPhoto = $('.hero-photo');
// marquee: −93.75 vw every 14.0625 s, linear, forever (6.67 vw/s); loops on one text unit
var mqTween = null;
function startMarquee() {
if (RM || !mqUnit) return;
var p = mqTween ? mqTween.progress() : 0;
if (mqTween) mqTween.kill();
var w = mqUnit.getBoundingClientRect().width;
var speed = 0.9375 * window.innerWidth / 14.0625;
mqTween = gsap.fromTo(mqScroll, { x: 0 }, { x: -w, duration: w / speed, ease: 'none', repeat: -1 });
mqTween.progress(p);
}
var heroReveal = gsap.timeline({ paused: true });
function buildHeroReveal() {
var SL0 = { yPercent: 100, skewY: -1, clipPath: 'inset(0% 0% 100% 0%)' };
var SL1 = { yPercent: 0, skewY: 0, clipPath: 'inset(-40% 0% -28% 0%)', duration: 0.8, ease: 'power2.out' };
gsap.set(logo, { yPercent: 115, skewY: -1, clipPath: 'inset(0% 0% 100% 0%)' });
gsap.set(navActions, { autoAlpha: 0, yPercent: 16, scale: 0.92, transformOrigin: '50% 50%' });
gsap.set(topMark, { scale: 0, transformOrigin: '50% 50%' });
gsap.set([topnavIn].concat(copyLines), SL0);
gsap.set(chip, { autoAlpha: 0 });
gsap.set([cbs.t, cbs.b], { scaleX: 0 }); gsap.set([cbs.r, cbs.l], { scaleY: 0 });
gsap.set(mqReveal, { yPercent: 140, skewY: -1, clipPath: 'inset(0% 0% 100% 0%)' });
heroReveal
.to(logo, { yPercent: 0, skewY: 0, clipPath: 'inset(0% 0% 0% 0%)', duration: 0.8, ease: 'power2.out' }, 0.6)
.to(navActions, { autoAlpha: 1, yPercent: 0, scale: 1, duration: 0.7, ease: 'power3.out' }, 0.6)
.to(topMark, { scale: 1, duration: 0.75, ease: 'power3.out' }, 0.7)
.to(topnavIn, SL1, 0.6)
.to(copyLines, Object.assign({ stagger: 0.09 }, SL1), 0.84)
.to(chip, { autoAlpha: 1, duration: 0.22, ease: 'power2.out' }, 1.38)
.to(cbs.t, { scaleX: 1, duration: 0.28, ease: 'power2.inOut' }, 1.38)
.to(cbs.r, { scaleY: 1, duration: 0.28, ease: 'power2.inOut' }, 1.54)
.to(cbs.b, { scaleX: 1, duration: 0.28, ease: 'power2.inOut' }, 1.70)
.to(cbs.l, { scaleY: 1, duration: 0.28, ease: 'power2.inOut' }, 1.86)
.to(mqReveal, { yPercent: 0, skewY: 0, clipPath: 'inset(0% 0% -20% 0%)', duration: 1, ease: 'power2.out' }, 0.6)
.add(startMarquee, 0.62);
}
function runIntro() {
var loader = $('#loader');
var group = $('.ld-frames'), frames = $$('.ld-grid .ld-frame'), frameF = $('.ld-frame--f');
var num = $('.ld-num'), mask = $('.ld-mask'), strips = $$('.ld-strip'), bg = $('.ld-bg');
lock(true);
buildHeroReveal();
gsap.set(num, { yPercent: 100, opacity: 1 });
function setCount(n) {
var s = pad(n, 3);
strips.forEach(function (st, k) { gsap.to(st, { yPercent: -10 * (+s[k]), duration: 0.6, ease: 'expo.out', overwrite: 'auto' }); });
}
function target() { var r = heroPhoto.getBoundingClientRect(); return r; }
var tl = gsap.timeline({ delay: 0.15 });
tl.to(num, { yPercent: 0, duration: 0.85, ease: 'power4.out' }, 0)
.fromTo(frames, { clipPath: 'inset(50% 50% 50% 50%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: 1.5, ease: 'power4.out' }, 0)
.fromTo(frames.map(function (f) { return f.firstElementChild; }), { scale: 1.5 }, { scale: 1, duration: 1.5, ease: 'power4.out' }, 0);
[[0.22, 8], [0.46, 23], [0.7, 41], [0.92, 57], [1.14, 74], [1.38, 88], [1.62, 100]].forEach(function (s) { tl.add(function () { setCount(s[1]); }, s[0]); });
tl.to(num, { yPercent: -100, duration: 0.95, ease: 'power3.in' }, 2)
.to(mask, { clipPath: 'inset(100% 0% 0% 0%)', duration: 0.95, ease: 'power3.in' }, 2)
.fromTo(frameF, { clipPath: 'inset(50% 50% 50% 50%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: 1.5, ease: 'power4.out' }, 2)
.fromTo(frameF.firstElementChild, { scale: 1.5 }, { scale: 1, duration: 1.5, ease: 'power4.out' }, 2)
.to($('.ld-tag'), { autoAlpha: 0, duration: 0.5, ease: 'power2.out' }, 2)
.to(bg, { clipPath: 'inset(0% 0% 100% 0%)', duration: 1.2, ease: 'power3.inOut' }, 2.5)
.add(function () { heroReveal.play(0); }, 2.5)
.to(group, {
top: function () { return target().top; }, left: function () { return target().left; },
width: function () { return target().width; }, height: function () { return target().height; },
duration: 0.8, ease: 'power2.inOut'
}, 2.6)
.add(function () {
root.classList.remove('has-intro'); root.classList.add('intro-done');
loader.style.display = 'none';
lock(false);
ScrollTrigger.refresh();
}, 3.72);
}
function skipIntro() {
gsap.set(navActions, { autoAlpha: 1 });
startMarquee();
}
/* =========================================================
1 · Hero → four frame lines (time-based, fired a few px into the pin)
========================================================= */
var panels = $$('.panel');
var heroTL = null;
function buildHeroTL(mob) {
var tl = gsap.timeline({ paused: true });
// desktop: 0.445 and +23.45 vh (card top sits one panel-gap under the panels)
// mobile: 0.36, card top sits 12 px under the four rows
tl.fromTo(card, { scale: 1, y: 0 }, {
scale: mob ? 0.36 : 0.445,
y: function () {
if (!mob) return window.innerHeight * 0.2345;
var last = panels[panels.length - 1].getBoundingClientRect();
var rowsBottom = $('.panels').offsetTop + $('.panels').offsetHeight;
return rowsBottom + 12 - window.innerHeight * (1 - 0.36);
},
duration: 1, ease: 'power1.out'
}, 0)
.fromTo($('.card-edge'), { opacity: 0 }, { opacity: 1, duration: 1, ease: 'power1.out' }, 0)
.fromTo(panels, { yPercent: 110, opacity: 0 }, { yPercent: 0, opacity: 1, duration: 0.86, stagger: 0.0467, ease: 'panelRise' }, 0)
.to(navActions, { autoAlpha: 0, yPercent: 50, duration: 0.55, ease: 'power2.out' }, 0);
panels.forEach(function (p, i) {
var t0 = i * 0.0467;
tl.fromTo($('.panel-sym', p), { opacity: 0, y: 12 }, { opacity: 1, y: 0, duration: 0.602, ease: 'panelRise' }, t0 + 0.05)
.fromTo($('.panel-title', p), { opacity: 0, x: 20 }, { opacity: 1, x: 0, duration: 0.645, ease: 'panelRise' }, t0 + 0.085)
.fromTo($('.panel-desc', p), { opacity: 0, y: 16 }, { opacity: 1, y: 0, duration: 0.645, ease: 'panelRise' }, t0 + 0.12);
});
if (RM) tl.timeScale(40);
return tl;
}
var mm = gsap.matchMedia();
mm.add({ mob: '(max-width: 767px)', desk: '(min-width: 768px)' }, function (ctx) {
var mob = ctx.conditions.mob;
heroTL = buildHeroTL(mob);
// Fires once the scroll is a few px into the pin; reverses when back at the top.
var fired = false;
function check(y) {
var on = y > 4;
if (on === fired) return;
fired = on;
if (on) heroTL.play(); else heroTL.reverse();
hero.classList.toggle('is-panels', on);
}
ScrollTrigger.create({
trigger: hero, start: 'top top', end: '+=100%', pin: true, pinSpacing: true, anticipatePin: 1,
onUpdate: function (s) { check(s.scroll()); },
onLeave: function () { check(99999); setCorner(true); },
onEnterBack: function (s) { check(s.scroll()); setCorner(false); },
onLeaveBack: function () { check(0); }
});
if (window.scrollY > 4) { fired = true; heroTL.progress(1); hero.classList.add('is-panels'); }
return function () { if (heroTL) { heroTL.progress(0).kill(); } gsap.set(panels, { clearProps: 'all' }); gsap.set(card, { clearProps: 'transform' }); };
});
ScrollTrigger.addEventListener('refreshInit', function () { if (heroTL && heroTL.progress() > 0) { var p = heroTL.progress(); heroTL.invalidate(); heroTL.progress(p); } });
// After the hero, a solid fixed bar takes over navigation
var bar = document.getElementById('bar');
function setCorner(on) { if (bar) bar.classList.toggle('is-on', !!on); }
/* =========================================================
2 · How a frame is made
========================================================= */
var SH = window.FETTLE_SHAPES;
var K = [1, 1.5, 2, 2.5];
mm.add('(min-width: 768px)', function () {
var stage = $('.process-stage'), cards = $$('.pc'), svg = $('.pdraw'), ghost = $('.ps-ghost'), wk = $('.ph-wk');
var rects = [0, 1, 2, 3].map(function (i) { return $('.pcr-' + i, svg); });
var layers = $$('.pd-layer', svg).map(function (g) {
return { dash: $('.pd-dash', g), base: $('.pd-base', g), ruler: $('.pd-ruler', g), nums: $('.pd-nums', g), shape: $('.pd-shape', g), path: $('.pd-path', g), dot: $('.pd-dot', g) };
});
var W = 0, H = 0, lastWk = -1, gTop = 0, gBot = 0;
function layout() {
W = stage.clientWidth; H = stage.clientHeight;
var sr = stage.getBoundingClientRect(), gr = ghost.getBoundingClientRect(); gTop = gr.top - sr.top; gBot = gr.bottom - sr.top;
svg.setAttribute('viewBox', '0 0 ' + W + ' ' + H);
cards.forEach(function (c, i) { rects[i].setAttribute('x', c.offsetLeft); rects[i].setAttribute('width', c.offsetWidth); });
var yDash = Math.round(H * 0.375) + 0.5, yRule = Math.round(H * 0.6) + 0.5;
layers.forEach(function (L) {
L.dash.setAttribute('x1', 0); L.dash.setAttribute('x2', W); L.dash.setAttribute('y1', yDash); L.dash.setAttribute('y2', yDash);
L.base.setAttribute('x1', 0); L.base.setAttribute('x2', W); L.base.setAttribute('y1', yRule - 0.5); L.base.setAttribute('y2', yRule - 0.5);
L.ruler.setAttribute('x', 0); L.ruler.setAttribute('y', yRule); L.ruler.setAttribute('width', W); L.ruler.setAttribute('height', 16);
// a number every 80 px (ten ticks) along the rule
var t = ''; for (var x = 80, n = 1; x < W; x += 80, n++) t += '<text class="pd-num" x="' + (x + 3) + '" y="' + (yRule + 24) + '">' + n + '</text>';
L.nums.innerHTML = t;
});
}
function render(p) {
// card heights: linear, h_i = H * clamp((p - 0.135) / (0.314 * k_i)), k = 1, 1.5, 2, 2.5
for (var i = 0; i < 4; i++) {
var h = H * clamp((p - 0.135) / (0.314 * K[i]), 0, 1);
cards[i].style.clipPath = 'inset(' + (H - h).toFixed(1) + 'px 0px 0px 0px)';
rects[i].setAttribute('y', (H - h).toFixed(1)); rects[i].setAttribute('height', h.toFixed(1));
}
// travelling outline: x linear in p, six shapes in five equal linear segments, rotation 0 → 450° linear
var q = clamp((p - 0.435) / 0.6, 0, 1), m = clamp((p - 0.435) / 0.47, 0, 1);
var cx = q * W, cy = H * 0.375, size = H * 0.3264, s = size / 220;
var d = SH.at(m), tr = 'translate(' + cx.toFixed(1) + ' ' + cy.toFixed(1) + ') rotate(' + (m * 450).toFixed(2) + ') scale(' + s.toFixed(4) + ') translate(-110 -110)';
layers.forEach(function (L) { L.path.setAttribute('d', d); L.shape.setAttribute('transform', tr); L.dot.setAttribute('cx', cx.toFixed(1)); L.dot.setAttribute('cy', cy.toFixed(1)); });
// the big word is wiped away from below by the tallest card's top edge
var top1 = H - H * clamp((p - 0.135) / 0.314, 0, 1);
ghost.style.clipPath = 'inset(0px 0px ' + clamp(gBot - top1, 0, gBot - gTop + 2).toFixed(1) + 'px 0px)';
var w = Math.round(clamp((p - 0.135) / (0.92 - 0.135), 0, 1) * 11);
if (w !== lastWk) { wk.textContent = pad(w, 2); lastWk = w; }
}
layout(); render(0);
var st = ScrollTrigger.create({
trigger: '.process', start: 'top top', end: 'bottom bottom',
onUpdate: function (self) { render(self.progress); },
onRefresh: function (self) { layout(); render(self.progress); }
});
return function () { cards.forEach(function (c) { c.style.clipPath = ''; }); ghost.style.clipPath = ''; };
});
mm.add('(max-width: 767px)', function () {
var cards = $$('.pc'), pick = [0, 2, 3, 5];
cards.forEach(function (c, i) {
var art = $('.pc-art', c);
function draw() {
var w = c.clientWidth, h = c.clientHeight, dark = i !== 2;
var col = dark ? 'var(--white)' : 'var(--black)', col2 = dark ? 'var(--w-66)' : 'var(--black)';
var size = Math.min(h * 0.36, w * 0.62), s = size / 220, cx = w * 0.5, cy = h * 0.375, yR = Math.round(h * 0.6) + 0.5;
var ticks = '';
for (var x = 0; x <= w; x += 8) ticks += '<rect x="' + x + '" y="' + yR + '" width="1" height="' + (x % 40 === 0 ? 14 : 6) + '" style="fill:' + col2 + '"/>';
art.innerHTML = '<svg viewBox="0 0 ' + w + ' ' + h + '" aria-hidden="true">' +
'<line x1="0" x2="' + w + '" y1="' + (Math.round(cy) + 0.5) + '" y2="' + (Math.round(cy) + 0.5) + '" style="stroke:' + col + ';stroke-dasharray:5 7"/>' +
'<line x1="0" x2="' + w + '" y1="' + (yR - 0.5) + '" y2="' + (yR - 0.5) + '" style="stroke:' + col + '"/>' + ticks +
'<g transform="translate(' + cx + ' ' + cy + ') rotate(' + (i * 90) + ') scale(' + s.toFixed(4) + ') translate(-110 -110)"><path d="' + SH.shape(pick[i]) + '" style="fill:none;stroke:' + col + '" vector-effect="non-scaling-stroke"/></g>' +
'<circle cx="' + cx + '" cy="' + cy + '" r="2.5" style="fill:' + col + '"/></svg>';
}
draw();
gsap.fromTo(c, { clipPath: 'inset(100% 0% 0% 0%)' }, { clipPath: 'inset(0% 0% 0% 0%)', ease: 'none', scrollTrigger: { trigger: c, start: 'top bottom', end: 'top 30%', scrub: true, onRefresh: draw } });
});
return function () { cards.forEach(function (c) { $('.pc-art', c).innerHTML = ''; c.style.clipPath = ''; }); };
});
/* =========================================================
3 · Build log: one centred photo that swaps to the hovered row
========================================================= */
(function setupLog() {
var rows = $$('.log-row'), bar = $('.log-bar'), imgs = $$('#logStack img'), note = $('#logNote');
var tabs = $$('.tab'), line = $('.tabs-line');
if (!rows.length) return;
var active = -1, filter = 'all';
function setNote(i) {
var r = DATA.log[i];
note.innerHTML = '<b>#' + r.no + ' · ' + r.name + ', ' + r.city + '</b>“' + r.note + '”';
}
function activate(i, instant) {
if (i === active) return;
var prev = active; active = i;
rows.forEach(function (r, k) { r.classList.toggle('is-on', k === i); });
if (!isMob()) {
gsap.to(bar, { y: rows[i].offsetTop, duration: instant ? 0 : 0.35, ease: 'power2.out', overwrite: true });
if (prev > -1) gsap.to(imgs[prev], { opacity: 0, duration: 0.25, ease: 'power2.out', overwrite: true });
imgs.forEach(function (im, k) { im.classList.toggle('is-on', k === i); });
gsap.fromTo(imgs[i], { opacity: instant ? 1 : 0, scale: instant ? 1 : 1.04 }, { opacity: 1, scale: 1, duration: instant ? 0 : 0.25, ease: 'power2.out', overwrite: true });
if (instant) setNote(i);
else gsap.fromTo(note, { opacity: 0 }, { opacity: 1, duration: 0.25, ease: 'power2.out', overwrite: true, onStart: function () { setNote(i); } });
}
}
function matches(r) { return filter === 'all' || r.dataset.mat === filter; }
// mobile: tap to expand inline photo and note
function toggleMobile(i) {
var row = rows[i], more = $('.lr-more', row), open = row.classList.contains('is-open');
rows.forEach(function (r, k) {
if (r.classList.contains('is-open') && k !== i) { r.classList.remove('is-open', 'is-on'); $('.log-btn', r).setAttribute('aria-expanded', 'false'); gsap.to($('.lr-more', r), { height: 0, duration: 0.4, ease: 'power2.inOut', onComplete: function () { ScrollTrigger.refresh(); } }); }
});
row.classList.toggle('is-open', !open); row.classList.toggle('is-on', !open);
$('.log-btn', row).setAttribute('aria-expanded', String(!open));
gsap.to(more, { height: open ? 0 : 'auto', duration: 0.45, ease: 'power2.inOut', onComplete: function () { ScrollTrigger.refresh(); } });
active = open ? -1 : i;
}
rows.forEach(function (r, i) {
var btn = $('.log-btn', r);
r.addEventListener('mouseenter', function () { if (!isMob() && matches(r)) activate(i); });
btn.addEventListener('focus', function () { if (!isMob() && matches(r)) activate(i); });
btn.addEventListener('click', function () { if (!matches(r)) return; if (isMob()) toggleMobile(i); else activate(i); });
});
function moveLine(t, instant) { gsap.to(line, { x: t.offsetLeft, width: t.offsetWidth, duration: instant ? 0 : 0.35, ease: 'power2.out', overwrite: true }); }
tabs.forEach(function (t) {
t.addEventListener('click', function () {
filter = t.dataset.f;
tabs.forEach(function (x) { var on = x === t; x.classList.toggle('is-on', on); x.setAttribute('aria-selected', String(on)); });
moveLine(t);
rows.forEach(function (r) { var ok = matches(r); r.classList.toggle('is-off', !ok); $('.log-btn', r).tabIndex = ok ? 0 : -1; });
if (active < 0 || !matches(rows[active])) { var first = rows.findIndex(matches); if (!isMob()) { active = active; activate(first); } }
});
});
function init() { moveLine($('.tab.is-on'), true); if (!isMob()) { active = -1; activate(0, true); } else { rows.forEach(function (r) { r.classList.remove('is-on'); }); } }
init();
window.addEventListener('resize', function () { moveLine($('.tab.is-on'), true); if (!isMob() && active > -1) gsap.set(bar, { y: rows[active].offsetTop }); });
})();
/* =========================================================
4 · Your size (signature): live geometry sketch
========================================================= */
(function setupSize() {
var svg = $('#geo'); if (!svg || !window.FETTLE_GEO) return;
var rH = $('#rHeight'), rI = $('#rInseam'), oH = $('#oHeight'), oI = $('#oInseam'), relink = $('#relink'), no = $('#sketchNo');
var dd = {}; $$('#geoList dd[data-k]').forEach(function (d) { dd[d.dataset.k] = d; });
var linked = true;
var geo = FETTLE_GEO.init({
svg: svg, h: +rH.value, i: +rI.value,
onRender: function (g, s) {
oH.firstChild.nodeValue = Math.round(s.h); oI.firstChild.nodeValue = Math.round(s.i);
dd.stack.textContent = Math.round(g.stack); dd.reach.textContent = Math.round(g.reach); dd.st.textContent = Math.round(g.st);
dd.ett.textContent = Math.round(g.ett); dd.wb.textContent = Math.round(g.wb);
no.textContent = Math.round(s.h) + '/' + Math.round(s.i);
}
});
// DrawSVG reads vector-effect from the attribute
$$('.g-draw', svg).forEach(function (p) { p.setAttribute('vector-effect', 'non-scaling-stroke'); });
function autoInseam() { return clamp(Math.round(+rH.value * 0.47), 68, 98); }
function setLinked(on) { linked = on; relink.setAttribute('aria-pressed', String(on)); relink.textContent = on ? 'Auto · height × 0.47' : 'Set by you · relink'; }
rH.addEventListener('input', function () { if (linked) rI.value = autoInseam(); geo.set(+rH.value, +rI.value); });
rI.addEventListener('input', function () { if (linked) setLinked(false); geo.set(+rH.value, +rI.value); });
relink.addEventListener('click', function () { if (linked) return; setLinked(true); rI.value = autoInseam(); geo.set(+rH.value, +rI.value); });
window.addEventListener('resize', function () { geo.resize(); });
if (document.fonts && document.fonts.ready) document.fonts.ready.then(function () { geo.resize(); });
// draw-in on enter: 1.2 s power2.out stroke reveal
var drawables = geo.drawables(), fades = geo.fades();
if (!RM && window.DrawSVGPlugin) {
gsap.set(drawables, { drawSVG: '0%' });
gsap.set(fades, { opacity: 0 });
ScrollTrigger.create({
trigger: '.size-sketch', start: 'top 72%', once: true,
onEnter: function () {
gsap.to(drawables, { drawSVG: '100%', duration: 1.2, ease: 'power2.out', stagger: 0.035, onComplete: function () { drawables.forEach(function (p) { p.style.strokeDasharray = ''; p.style.strokeDashoffset = ''; }); } });
gsap.to(fades, { opacity: 1, duration: 0.6, ease: 'power2.out', delay: 0.55, stagger: 0.03 });
}
});
}
})();
/* =========================================================
5 · Out riding: concave cylinder wall, slow drift, scroll pitch
========================================================= */
(function setupWall() {
var ringEl = $('#ring'), wall = $('.wall'), rides = $('.rides');
if (!ringEl) return;
var tiles = [], N = 0, R = 0, f = 0, Dc = 0, angle = 0, pitch = 0, running = false, built = '';
var OMEGA = 11; // deg/s, left → right: edge tiles travel ~120–140 px/s at 1440 × 900
function build() {
var mob = isMob(), key = (mob ? 'm' : 'd') + window.innerWidth + 'x' + window.innerHeight;
if (key === built) return; built = key;
N = mob ? 16 : 18;
var s = mob ? Math.min(window.innerWidth / 490, window.innerHeight / 700) : Math.min(window.innerWidth / 1440, window.innerHeight / 820);
f = 310 * s; R = 1000 * s; Dc = 1040 * s;
// phones: taller tiles so the narrow slice of the ring still reads as a wall
var tw = 2 * R * Math.sin(Math.PI / N) * 0.93, th = 546 * s * (mob ? 1.7 : 1);
wall.style.perspective = f.toFixed(1) + 'px';
// height of the band at the screen edge, so the heading and subline can hug it on phones
var band = 0, half = window.innerWidth / 2;
for (var a = 0; a < 170; a += 0.5) { var r = a * Math.PI / 180, Z = Dc + R * Math.cos(r); if (Z <= 0) break; var x = f * R * Math.sin(r) / Z; if (x > half) break; band = f * th / Z; }
rides.style.setProperty('--band', band.toFixed(0) + 'px');
if (tiles.length !== N) {
ringEl.innerHTML = ''; tiles = [];
for (var i = 0; i < N; i++) {
var t = document.createElement('div'); t.className = 'tile';
var k = i % 18;
t.innerHTML = '<img src="images/ride-' + pad(k + 1, 2) + '.jpg" alt="' + (DATA.rides[k] || 'Owner ride photo') + '" width="900" height="1200" loading="eager" decoding="async">';
guardImg(t.firstChild);
ringEl.appendChild(t); tiles.push(t);
}
}
tiles.forEach(function (t, i) {
t.style.width = tw.toFixed(1) + 'px'; t.style.height = th.toFixed(1) + 'px';
t.style.marginLeft = (-tw / 2).toFixed(1) + 'px'; t.style.marginTop = (-th / 2).toFixed(1) + 'px';
t.dataset.a = (360 / N) * i;
t.style.transform = 'rotateY(' + ((360 / N) * i).toFixed(3) + 'deg) translateZ(' + (-R).toFixed(1) + 'px)';
});
apply();
}
function apply() {
ringEl.style.transform = 'translateZ(' + (f - Dc).toFixed(1) + 'px) rotateX(' + pitch.toFixed(3) + 'deg) rotateY(' + angle.toFixed(3) + 'deg)';
for (var i = 0; i < tiles.length; i++) {
var a = ((+tiles[i].dataset.a + angle) % 360 + 540) % 360 - 180; // −180..180, 0 = back wall
var vis = Math.abs(a) < 150;
if (tiles[i]._v !== vis) { tiles[i].style.visibility = vis ? 'visible' : 'hidden'; tiles[i]._v = vis; }
}
}
build();
angle = -8;
apply();
ScrollTrigger.create({
trigger: rides, start: 'top bottom', end: 'bottom top',
onUpdate: function (self) { if (isMob() || RM) return; pitch = (self.progress - 0.5) * 16; if (!running) apply(); }
});
if ('IntersectionObserver' in window) {
new IntersectionObserver(function (es) { running = es[0].isIntersecting; }, { rootMargin: '100px' }).observe(rides);
} else running = true;
gsap.ticker.add(function (t, dt) {
if (!running || RM) return;
angle += OMEGA * Math.min(dt, 50) / 1000;
apply();
});
window.addEventListener('resize', function () { build(); });
// scrambling word, every 2.4 s
var words = ['Rain', 'Gravel', 'Traffic', 'The Alps', 'January'], wi = 0;
var wEl = $('.rt-word'), wrap = $('.rt-word-wrap');
var meas = document.createElement('span'); meas.className = 'rt-word'; meas.style.cssText = 'position:absolute;visibility:hidden;left:-9999px;top:0';
$('.rides-title').appendChild(meas);
function widthOf(w) { meas.textContent = w; return meas.getBoundingClientRect().width; }
function fitWrap() { wrap.style.width = widthOf(words[wi]) + 'px'; }
var GLYPHS = 'ABCDEFGHIJKLMNOPRSTUVWXYZ0123456789';
function scrambleTo(word) {
var from = wEl.textContent.toUpperCase(), to = word.toUpperCase(), len = Math.max(from.length, to.length);
gsap.to(wrap, { width: widthOf(word), duration: 0.5, ease: 'power2.inOut' });
if (RM) { wEl.textContent = word; return; }
var o = { t: 0 };
gsap.to(o, {
t: 1, duration: 0.8, ease: 'none',
onUpdate: function () {
var out = '';
for (var i = 0; i < len; i++) {
var reveal = 0.25 + 0.75 * (i / len);
var c = to[i] || '';
if (o.t >= reveal) out += c;
else if (c === ' ' || (!c && o.t > 0.5)) out += c;
else out += GLYPHS[(Math.random() * GLYPHS.length) | 0];
}
wEl.textContent = out;
},
onComplete: function () { wEl.textContent = word; }
});
}
function cycle() { if (running) { wi = (wi + 1) % words.length; scrambleTo(words[wi]); } gsap.delayedCall(2.4, cycle); }
if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitWrap); else fitWrap();
window.addEventListener('resize', fitWrap);
gsap.delayedCall(2.4, cycle);
})();
/* =========================================================
Navigation + menu
========================================================= */
var menu = $('#menu'), menuBtns = $$('.menu-btn'), menuBtn = menuBtns[0], menuOpen = false;
function openMenu() {
if (menuOpen) return; menuOpen = true; menu.hidden = false; menuBtn = this && this.nodeType ? this : menuBtns[0];
menuBtns.forEach(function (b) { b.setAttribute('aria-expanded', 'true'); }); lock(true);
gsap.fromTo(menu, { clipPath: 'inset(0% 0% 100% 0%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: RM ? 0 : 0.7, ease: 'power3.inOut' });
gsap.fromTo($$('.menu-nav a'), { yPercent: 60, opacity: 0 }, { yPercent: 0, opacity: 1, duration: RM ? 0 : 0.6, ease: 'power3.out', stagger: 0.05, delay: RM ? 0 : 0.25 });
setTimeout(function () { var c = $('.menu-close'); if (c) c.focus(); }, 50);
}
function closeMenu(cb) {
if (!menuOpen) { if (cb) cb(); return; } menuOpen = false; menuBtns.forEach(function (b) { b.setAttribute('aria-expanded', 'false'); });
gsap.to(menu, { clipPath: 'inset(100% 0% 0% 0%)', duration: RM ? 0 : 0.6, ease: 'power3.inOut', onComplete: function () { menu.hidden = true; lock(false); menuBtn.focus({ preventScroll: true }); if (cb) cb(); } });
}
menuBtns.forEach(function (b) { b.addEventListener('click', openMenu); });
$('.menu-close').addEventListener('click', function () { closeMenu(); });
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeMenu(); });
function goTo(key) {
var y = 0;
if (key === 'top') y = 0;
else if (key === 'frames') y = Math.round(window.innerHeight * 0.5);
else { var t = document.getElementById(key); if (!t) return; y = t.getBoundingClientRect().top + window.scrollY; }
scrollToY(y);
}
$$('[data-go]').forEach(function (a) {
a.addEventListener('click', function (e) { e.preventDefault(); var k = a.dataset.go; closeMenu(function () { goTo(k); }); });
});
$$('a[href="#start"]').forEach(function (a) { if (!a.dataset.go) a.addEventListener('click', function (e) { e.preventDefault(); closeMenu(function () { goTo('start'); }); }); });
/* ---------- boot ---------- */
function boot() {
if (INTRO) runIntro(); else skipIntro();
ScrollTrigger.refresh();
}
var booted = false;
function once() { if (booted) return; booted = true; boot(); }
if (document.fonts && document.fonts.ready) { document.fonts.ready.then(once); setTimeout(once, 1500); } else once();
window.addEventListener('resize', function () { if (booted && mqTween) startMarquee(); });
})();
```
## `js/shapes.js`
```js
/* FETTLE · outline shapes for the travelling drawing in "How it's made".
Six closed outlines in a 220 × 220 box, all resampled to the same point count so they can be
interpolated point-by-point (our own morph; no morph plugin). */
(function () {
var N = 120;
function quad(p0, p1, p2, steps) { // sample a quadratic curve (excluding p0)
var out = [];
for (var i = 1; i <= steps; i++) {
var t = i / steps, m = 1 - t;
out.push([m * m * p0[0] + 2 * m * t * p1[0] + t * t * p2[0], m * m * p0[1] + 2 * m * t * p1[1] + t * t * p2[1]]);
}
return out;
}
function arc(cx, cy, r, a0, a1, steps) {
var out = [];
for (var i = 0; i <= steps; i++) { var a = a0 + (a1 - a0) * i / steps; out.push([cx + r * Math.cos(a), cy + r * Math.sin(a)]); }
return out;
}
// 1 · diamond frame outline: rear dropout, seat cluster, head tube top, head tube bottom, bottom bracket
var diamond = [[14, 152], [80, 44], [192, 54], [204, 100], [100, 170]];
// 2 · rear triangle: dropout, seat cluster, bottom bracket
var rear = [[20, 156], [124, 34], [184, 162]];
// 3 · fish-mouth cope: a tube end with a concave saddle cut
var fish = [[26, 66], [192, 66]].concat(quad([192, 66], [128, 110], [192, 154], 24)).concat([[26, 154]]);
// 4 · lug sleeve with flared points
var lug = [[12, 110]]
.concat(quad([12, 110], [42, 76], [66, 74], 10))
.concat([[154, 74]])
.concat(quad([154, 74], [178, 76], [208, 110], 10))
.concat(quad([208, 110], [178, 144], [154, 146], 10))
.concat([[66, 146]])
.concat(quad([66, 146], [42, 144], [12, 110], 10));
// 5 · horizontal dropout: a plate with the axle slot open to the rear
var hook = [[18, 98], [138, 98]]
.concat(arc(140, 111, 13, -Math.PI / 2, Math.PI / 2, 14))
.concat([[18, 124], [18, 156], [168, 164], [206, 112], [170, 58], [18, 66]]);
// 6 · wheel
var wheel = arc(110, 110, 100, 0, Math.PI * 2, 96);
function perim(pts) {
var L = [0];
for (var i = 1; i <= pts.length; i++) {
var a = pts[i - 1], b = pts[i % pts.length];
L.push(L[i - 1] + Math.hypot(b[0] - a[0], b[1] - a[1]));
}
return L;
}
function signedArea(pts) { var s = 0; for (var i = 0; i < pts.length; i++) { var a = pts[i], b = pts[(i + 1) % pts.length]; s += a[0] * b[1] - b[0] * a[1]; } return s / 2; }
function resample(pts) {
if (signedArea(pts) < 0) pts = pts.slice().reverse(); // same winding for every shape
var L = perim(pts), total = L[L.length - 1], out = [], j = 0;
for (var i = 0; i < N; i++) {
var d = total * i / N;
while (L[j + 1] < d) j++;
var a = pts[j], b = pts[(j + 1) % pts.length], t = (d - L[j]) / ((L[j + 1] - L[j]) || 1);
out.push([a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]);
}
// align the start: the sample whose direction from the centroid is closest to "3 o'clock"
var cx = 0, cy = 0; out.forEach(function (p) { cx += p[0]; cy += p[1]; }); cx /= N; cy /= N;
var best = 0, bestA = 9;
out.forEach(function (p, k) { var a = Math.abs(Math.atan2(p[1] - cy, p[0] - cx)); if (a < bestA) { bestA = a; best = k; } });
return out.slice(best).concat(out.slice(0, best));
}
var SHAPES = [diamond, rear, fish, lug, hook, wheel].map(resample);
function lerpShape(a, b, t) { var o = new Array(N); for (var i = 0; i < N; i++) o[i] = [a[i][0] + (b[i][0] - a[i][0]) * t, a[i][1] + (b[i][1] - a[i][1]) * t]; return o; }
function toPath(pts) { var s = 'M' + pts[0][0].toFixed(2) + ' ' + pts[0][1].toFixed(2); for (var i = 1; i < pts.length; i++) s += 'L' + pts[i][0].toFixed(2) + ' ' + pts[i][1].toFixed(2); return s + 'Z'; }
// m in [0,1] runs through the six shapes in five equal linear segments
function at(m) {
m = Math.max(0, Math.min(1, m));
var seg = Math.min(4, Math.floor(m * 5)), t = m * 5 - seg;
return toPath(lerpShape(SHAPES[seg], SHAPES[seg + 1], t));
}
window.FETTLE_SHAPES = { at: at, shape: function (k) { return toPath(SHAPES[k]); }, count: SHAPES.length };
})();
```
## `js/vendor/lenis.css`
```css
html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-property:overflow;transition-duration:1ms;transition-behavior:allow-discrete}
```
## `js/vendor/CustomEase.min.js`
```js
/*!
* CustomEase 3.13.0
* https://gsap.com
*
* @license Copyright 2025, GreenSock. All rights reserved.
* Subject to the terms at https://gsap.com/standard-license.
* @author: Jack Doyle, [email protected]
*/
!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 m(e){return Math.round(1e5*e)/1e5||0}var b=/[achlmqstvz]|(-?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi,w=/[\+\-]?\d*\.?\d+e[\+\-]?\d+/gi,Y=Math.PI/180,k=Math.sin,B=Math.cos,F=Math.abs,J=Math.sqrt;function arcToSegment(e,t,n,s,a,r,i,o,h){if(e!==o||t!==h){n=F(n),s=F(s);var u=a%360*Y,c=B(u),f=k(u),l=Math.PI,g=2*l,x=(e-o)/2,d=(t-h)/2,m=c*x+f*d,p=-f*x+c*d,y=m*m,M=p*p,v=y/(n*n)+M/(s*s);1<v&&(n=J(v)*n,s=J(v)*s);var C=n*n,E=s*s,b=(C*E-C*M-E*y)/(C*M+E*y);b<0&&(b=0);var w=(r===i?-1:1)*J(b),P=n*p/s*w,S=-s*m/n*w,N=c*P-f*S+(e+o)/2,D=f*P+c*S+(t+h)/2,T=(m-P)/n,V=(p-S)/s,_=(-m-P)/n,q=(-p-S)/s,A=T*T+V*V,R=(V<0?-1:1)*Math.acos(T/J(A)),G=(T*q-V*_<0?-1:1)*Math.acos((T*_+V*q)/J(A*(_*_+q*q)));isNaN(G)&&(G=l),!i&&0<G?G-=g:i&&G<0&&(G+=g),R%=g,G%=g;var L,O=Math.ceil(F(G)/(g/4)),j=[],z=G/O,I=4/3*k(z/2)/(1+B(z/2)),H=c*n,Q=f*n,Z=f*-s,U=c*s;for(L=0;L<O;L++)m=B(a=R+L*z),p=k(a),T=B(a+=z),V=k(a),j.push(m-I*p,p+I*m,T+I*V,V-I*T,T,V);for(L=0;L<j.length;L+=2)m=j[L],p=j[L+1],j[L]=m*H+p*Z+N,j[L+1]=m*Q+p*U+D;return j[L-2]=o,j[L-1]=h,j}}function stringToRawPath(e){function db(e,t,n,s){c=(n-e)/3,f=(s-t)/3,o.push(e+c,t+f,n-c,s-f,n,s)}var t,n,s,a,r,i,o,h,u,c,f,l,g,x,d,m=(e+"").replace(w,function(e){var t=+e;return t<1e-4&&-1e-4<t?0:t}).match(b)||[],p=[],y=0,M=0,v=m.length,C=0,E="ERROR: malformed path: "+e;if(!e||!isNaN(m[0])||isNaN(m[1]))return console.log(E),p;for(t=0;t<v;t++)if(g=r,isNaN(m[t])?i=(r=m[t].toUpperCase())!==m[t]:t--,s=+m[t+1],a=+m[t+2],i&&(s+=y,a+=M),t||(h=s,u=a),"M"===r)o&&(o.length<8?--p.length:C+=o.length),y=h=s,M=u=a,o=[s,a],p.push(o),t+=2,r="L";else if("C"===r)i||(y=M=0),(o=o||[0,0]).push(s,a,y+1*m[t+3],M+1*m[t+4],y+=1*m[t+5],M+=1*m[t+6]),t+=6;else if("S"===r)c=y,f=M,"C"!==g&&"S"!==g||(c+=y-o[o.length-4],f+=M-o[o.length-3]),i||(y=M=0),o.push(c,f,s,a,y+=1*m[t+3],M+=1*m[t+4]),t+=4;else if("Q"===r)c=y+2/3*(s-y),f=M+2/3*(a-M),i||(y=M=0),y+=1*m[t+3],M+=1*m[t+4],o.push(c,f,y+2/3*(s-y),M+2/3*(a-M),y,M),t+=4;else if("T"===r)c=y-o[o.length-4],f=M-o[o.length-3],o.push(y+c,M+f,s+2/3*(y+1.5*c-s),a+2/3*(M+1.5*f-a),y=s,M=a),t+=2;else if("H"===r)db(y,M,y=s,M),t+=1;else if("V"===r)db(y,M,y,M=s+(i?M-y:0)),t+=1;else if("L"===r||"Z"===r)"Z"===r&&(s=h,a=u,o.closed=!0),("L"===r||.5<F(y-s)||.5<F(M-a))&&(db(y,M,s,a),"L"===r&&(t+=2)),y=s,M=a;else if("A"===r){if(x=m[t+4],d=m[t+5],c=m[t+6],f=m[t+7],n=7,1<x.length&&(x.length<3?(f=c,c=d,n--):(f=d,c=x.substr(2),n-=2),d=x.charAt(1),x=x.charAt(0)),l=arcToSegment(y,M,+m[t+1],+m[t+2],+m[t+3],+x,+d,(i?y:0)+1*c,(i?M:0)+1*f),t+=n,l)for(n=0;n<l.length;n++)o.push(l[n]);y=o[o.length-2],M=o[o.length-1]}else console.log(E);return(t=o.length)<6?(p.pop(),t=0):o[0]===o[t-2]&&o[1]===o[t-1]&&(o.closed=!0),p.totalPoints=C+t,p}function p(){return M||"undefined"!=typeof window&&(M=window.gsap)&&M.registerPlugin&&M}function q(){(M=p())?(M.registerEase("_CE",n.create),a=1):console.warn("Please gsap.registerPlugin(CustomEase)")}function s(e){return~~(1e3*e+(e<0?-.5:.5))/1e3}function x(e,t,n,s,a,r,i,o,h,u,c){var f,l=(e+n)/2,g=(t+s)/2,d=(n+a)/2,m=(s+r)/2,p=(a+i)/2,y=(r+o)/2,M=(l+d)/2,v=(g+m)/2,C=(d+p)/2,E=(m+y)/2,b=(M+C)/2,w=(v+E)/2,P=i-e,S=o-t,N=Math.abs((n-i)*S-(s-o)*P),D=Math.abs((a-i)*S-(r-o)*P);return u||(u=[{x:e,y:t},{x:i,y:o}],c=1),u.splice(c||u.length-1,0,{x:b,y:w}),h*(P*P+S*S)<(N+D)*(N+D)&&(f=u.length,x(e,t,l,g,M,v,b,w,h,u,c),x(b,w,C,E,p,y,i,o,h,u,c+1+(u.length-f))),u}var M,a,t,y=/[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/gi,v=/[cLlsSaAhHvVtTqQ]/g,n=((t=CustomEase.prototype).setData=function setData(e,t){t=t||{};var n,s,a,r,i,o,h,u,c,f=(e=e||"0,0,1,1").match(y),l=1,g=[],d=[],m=t.precision||1,p=m<=1;if(this.data=e,(v.test(e)||~e.indexOf("M")&&e.indexOf("C")<0)&&(f=stringToRawPath(e)[0]),4===(n=f.length))f.unshift(0,0),f.push(1,1),n=8;else if((n-2)%6)throw"Invalid CustomEase";for(0==+f[0]&&1==+f[n-2]||function _normalize(e,t,n){n||0===n||(n=Math.max(+e[e.length-1],+e[1]));var s,a=-1*e[0],r=-n,i=e.length,o=1/(+e[i-2]+a),h=-t||(Math.abs(e[i-1]-e[1])<.01*(e[i-2]-e[0])?function _findMinimum(e){var t,n=e.length,s=1e20;for(t=1;t<n;t+=6)+e[t]<s&&(s=+e[t]);return s}(e)+r:+e[i-1]+r);for(h=h?1/h:-o,s=0;s<i;s+=2)e[s]=(+e[s]+a)*o,e[s+1]=(+e[s+1]+r)*h}(f,t.height,t.originY),this.segment=f,r=2;r<n;r+=6)s={x:+f[r-2],y:+f[r-1]},a={x:+f[r+4],y:+f[r+5]},g.push(s,a),x(s.x,s.y,+f[r],+f[r+1],+f[r+2],+f[r+3],a.x,a.y,1/(2e5*m),g,g.length-1);for(n=g.length,r=0;r<n;r++)h=g[r],u=g[r-1]||h,(h.x>u.x||u.y!==h.y&&u.x===h.x||h===u)&&h.x<=1?(u.cx=h.x-u.x,u.cy=h.y-u.y,u.n=h,u.nx=h.x,p&&1<r&&2<Math.abs(u.cy/u.cx-g[r-2].cy/g[r-2].cx)&&(p=0),u.cx<l&&(u.cx?l=u.cx:(u.cx=.001,r===n-1&&(u.x-=.001,l=Math.min(l,.001),p=0)))):(g.splice(r--,1),n--);if(i=1/(n=1/l+1|0),h=g[o=0],p){for(r=0;r<n;r++)c=r*i,h.nx<c&&(h=g[++o]),s=h.y+(c-h.x)/h.cx*h.cy,d[r]={x:c,cx:i,y:s,cy:0,nx:9},r&&(d[r-1].cy=s-d[r-1].y);o=g[g.length-1],d[n-1].cy=o.y-s,d[n-1].cx=o.x-d[d.length-1].x}else{for(r=0;r<n;r++)h.nx<r*i&&(h=g[++o]),d[r]=h;o<g.length-1&&(d[r-1]=g[g.length-2])}return this.ease=function(e){var t=d[e*n|0]||d[n-1];return t.nx<e&&(t=t.n),t.y+(e-t.x)/t.cx*t.cy},(this.ease.custom=this).id&&M&&M.registerEase(this.id,this.ease),this},t.getSVGData=function getSVGData(e){return CustomEase.getSVGData(this,e)},CustomEase.create=function create(e,t,n){return new CustomEase(e,t,n).ease},CustomEase.register=function register(e){M=e,q()},CustomEase.get=function get(e){return M.parseEase(e)},CustomEase.getSVGData=function getSVGData(e,t){var n,a,r,i,o,h,u,c,f,l,g=(t=t||{}).width||100,x=t.height||100,d=t.x||0,p=(t.y||0)+x,y=M.utils.toArray(t.path)[0];if(t.invert&&(x=-x,p=0),"string"==typeof e&&(e=M.parseEase(e)),e.custom&&(e=e.custom),e instanceof CustomEase)n=function rawPathToString(e){!function _isNumber(e){return"number"==typeof e}(e[0])||(e=[e]);var t,n,s,a,r="",i=e.length;for(n=0;n<i;n++){for(a=e[n],r+="M"+m(a[0])+","+m(a[1])+" C",t=a.length,s=2;s<t;s++)r+=m(a[s++])+","+m(a[s++])+" "+m(a[s++])+","+m(a[s++])+" "+m(a[s++])+","+m(a[s])+" ";a.closed&&(r+="z")}return r}(function transformRawPath(e,t,n,s,a,r,i){for(var o,h,u,c,f,l=e.length;-1<--l;)for(h=(o=e[l]).length,u=0;u<h;u+=2)c=o[u],f=o[u+1],o[u]=c*t+f*s+r,o[u+1]=c*n+f*a+i;return e._dirty=1,e}([e.segment],g,0,0,-x,d,p));else{for(n=[d,p],i=1/(u=Math.max(5,200*(t.precision||1))),c=5/(u+=2),f=s(d+i*g),a=((l=s(p+e(i)*-x))-p)/(f-d),r=2;r<u;r++)o=s(d+r*i*g),h=s(p+e(r*i)*-x),(Math.abs((h-l)/(o-f)-a)>c||r===u-1)&&(n.push(f,l),a=(h-l)/(o-f)),f=o,l=h;n="M"+n.join(",")}return y&&y.setAttribute("d",n),n},CustomEase);function CustomEase(e,t,n){a||q(),this.id=e,this.setData(t,n)}n.version="3.13.0",n.headless=!0,p()&&M.registerPlugin(n),e.CustomEase=n,e.default=n;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
```
## `js/vendor/DrawSVGPlugin.min.js`
```js
/*!
* DrawSVGPlugin 3.13.0
* https://gsap.com
*
* @license Copyright 2025, GreenSock. All rights reserved.
* Subject to the terms at https://gsap.com/standard-license.
* @author: Jack Doyle, [email protected]
*/
!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 l(){return"undefined"!=typeof window}function m(){return t||l()&&(t=window.gsap)&&t.registerPlugin&&t}function p(e){return Math.round(1e4*e)/1e4}function q(e){return parseFloat(e)||0}function r(e,t){var r=q(e);return~e.indexOf("%")?r/100*t:r}function s(e,t){return q(e.getAttribute(t))}function u(e,t,r,n,s,i){return D(Math.pow((q(r)-q(e))*s,2)+Math.pow((q(n)-q(t))*i,2))}function v(e){return console.warn(e)}function w(e){return"non-scaling-stroke"===e.getAttribute("vector-effect")}function z(e){if(!(e=k(e)[0]))return 0;var t,r,n,i,o,a,f,h=e.tagName.toLowerCase(),l=e.style,d=1,c=1;w(e)&&(c=e.getScreenCTM(),d=D(c.a*c.a+c.b*c.b),c=D(c.d*c.d+c.c*c.c));try{r=e.getBBox()}catch(e){v("Some browsers won't measure invisible elements (like display:none or masks inside defs).")}var g=r||{x:0,y:0,width:0,height:0},_=g.x,y=g.y,x=g.width,m=g.height;if(r&&(x||m)||!M[h]||(x=s(e,M[h][0]),m=s(e,M[h][1]),"rect"!==h&&"line"!==h&&(x*=2,m*=2),"line"===h&&(_=s(e,"x1"),y=s(e,"y1"),x=Math.abs(x-_),m=Math.abs(m-y))),"path"===h)i=l.strokeDasharray,l.strokeDasharray="none",t=e.getTotalLength()||0,p(d)!==p(c)&&!b&&(b=1)&&v("Warning: <path> length cannot be measured when vector-effect is non-scaling-stroke and the element isn't proportionally scaled."),t*=(d+c)/2,l.strokeDasharray=i;else if("rect"===h)t=2*x*d+2*m*c;else if("line"===h)t=u(_,y,_+x,y+m,d,c);else if("polyline"===h||"polygon"===h)for(n=e.getAttribute("points").match(P)||[],"polygon"===h&&n.push(n[0],n[1]),t=0,o=2;o<n.length;o+=2)t+=u(n[o-2],n[o-1],n[o],n[o+1],d,c)||0;else"circle"!==h&&"ellipse"!==h||(a=x/2*d,f=m/2*c,t=Math.PI*(3*(a+f)-D((3*a+f)*(a+3*f))));return t||0}function A(e,t){if(!(e=k(e)[0]))return[0,0];t=t||z(e)+1;var r=f.getComputedStyle(e),n=r.strokeDasharray||"",s=q(r.strokeDashoffset),i=n.indexOf(",");return i<0&&(i=n.indexOf(" ")),t<(n=i<0?t:q(n.substr(0,i)))&&(n=t),[-s||0,n-s||0]}function B(){l()&&(f=window,d=t=m(),k=t.utils.toArray,c=t.core.getStyleSaver,g=t.core.reverting||function(){},h=-1!==((f.navigator||{}).userAgent||"").indexOf("Edge"))}var t,k,f,h,d,b,c,g,P=/[-+=\.]*\d+[\.e\-\+]*\d*[e\-\+]*\d*/gi,M={rect:["width","height"],circle:["r","r"],ellipse:["rx","ry"],line:["x2","y2"]},D=Math.sqrt,n={version:"3.13.0",name:"drawSVG",register:function register(e){t=e,B()},init:function init(e,t,n){if(!e.getBBox)return!1;d||B();var s,i,o,a=z(e);return this.styles=c&&c(e,"strokeDashoffset,strokeDasharray,strokeMiterlimit"),this.tween=n,this._style=e.style,this._target=e,t+""=="true"?t="0 100%":t?-1===(t+"").indexOf(" ")&&(t="0 "+t):t="0 0",i=function _parse(e,t,n){var s,i,o=e.indexOf(" ");return i=o<0?(s=void 0!==n?n+"":e,e):(s=e.substr(0,o),e.substr(o+1)),s=r(s,t),(i=r(i,t))<s?[i,s]:[s,i]}(t,a,(s=A(e,a))[0]),this._length=p(a),this._dash=p(s[1]-s[0]),this._offset=p(-s[0]),this._dashPT=this.add(this,"_dash",this._dash,p(i[1]-i[0]),0,0,0,0,0,1),this._offsetPT=this.add(this,"_offset",this._offset,p(-i[0]),0,0,0,0,0,1),h&&(o=f.getComputedStyle(e)).strokeLinecap!==o.strokeLinejoin&&(i=q(o.strokeMiterlimit),this.add(e.style,"strokeMiterlimit",i,i+.01)),this._live=w(e)||~(t+"").indexOf("live"),this._nowrap=~(t+"").indexOf("nowrap"),this._props.push("drawSVG"),1},render:function render(e,t){if(t.tween._time||!g()){var r,n,s,i,o=t._pt,a=t._style;if(o){for(t._live&&(r=z(t._target))!==t._length&&(n=r/t._length,t._length=r,t._offsetPT&&(t._offsetPT.s*=n,t._offsetPT.c*=n),t._dashPT?(t._dashPT.s*=n,t._dashPT.c*=n):t._dash*=n);o;)o.r(e,o.d),o=o._next;s=t._dash||e&&1!==e&&1e-4||0,r=t._length-s+.1,i=t._offset,s&&i&&s+Math.abs(i%t._length)>t._length-.05&&(i+=i<0?.005:-.005)&&(r+=.005),a.strokeDashoffset=s?i:i+.001,a.strokeDasharray=r<.1?"none":s?s+"px,"+(t._nowrap?999999:r)+"px":"0px, 999999px"}}else t.styles.revert()},getLength:z,getPosition:A};m()&&t.registerPlugin(n),e.DrawSVGPlugin=n,e.default=n;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
```
## `js/vendor/ScrollTrigger.min.js`
```js
/*!
* ScrollTrigger 3.13.0
* https://gsap.com
*
* @license Copyright 2025, GreenSock. All rights reserved.
* Subject to the terms at https://gsap.com/standard-license.
* @author: Jack Doyle, [email protected]
*/
!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~Ye.indexOf(e)&&Ye[Ye.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||ze.cache++}function G(r,n){function ed(e){if(e||0===e){i&&(Te.history.scrollRestoration="manual");var t=Re&&Re.isPressed;e=ed.v=Math.round(e)||(Re&&Re.iOS?1:0),r(e),ed.cacheID=ze.cache,t&&o("ss",e)}else(n||ze.cache!==ed.cacheID||o("ref"))&&(ed.cacheID=ze.cache,ed.v=r());return ed.v+ed.offset}return ed.offset=0,r&&ed}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=Ce.scrollingElement||Me);var i=ze.indexOf(t),o=n===qe.sc?1:2;~i||(i=ze.push(t)-1),ze[i+o]||B(t,"scroll",F);var a=ze[i+o],s=a||(ze[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 Gd(e,t){var r=Le();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=Le(),l=s,n=t||50,c=Math.max(500,3*n);return{update:Gd,reset:function reset(){a=o=i?0:o,l=s=0},getVelocity:function getVelocity(e){var t=l,r=a,n=Le();return!e&&0!==e||e===o||Gd(e),s===l||c<n-l?0:(o+(i?r:-r))/((i?n:s)-t)*1e3}}}function N(e,t){return t&&!e._gsapAllow&&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,ze),n.push.apply(n,Ye),ze=t,Ye=n,o=function _bridge(e,t){return r[e](t)}}()}function Q(e){return Se=e||r(),!ke&&Se&&"undefined"!=typeof document&&document.body&&(Te=window,Me=(Ce=document).documentElement,Ee=Ce.body,t=[Te,Ce,Me,Ee],Se.utils.clamp,Be=Se.core.context||function(){},Oe="onpointerenter"in Ee?"pointer":"mouse",Pe=E.isTouch=Te.matchMedia&&Te.matchMedia("(hover: none), (pointer: coarse)").matches?1:"ontouchstart"in Te||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints?2:0,De=E.eventTypes=("ontouchstart"in Me?"touchstart,touchmove,touchcancel,touchend":"onpointerdown"in Me?"pointerdown,pointermove,pointercancel,pointerup":"mousedown,mousemove,mouseup,mouseup").split(","),setTimeout(function(){return i=0},500),P(),ke=1),ke}var Se,ke,Te,Ce,Me,Ee,Pe,Oe,Ae,t,Re,De,Be,i=1,Ie=[],ze=[],Ye=[],Le=Date.now,o=function _bridge(e,t){return t},n="scrollLeft",a="scrollTop",He={s:n,p:"left",p2:"Left",os:"right",os2:"Right",d:"width",d2:"Width",a:"x",sc:G(function(e){return arguments.length?Te.scrollTo(e,qe.sc()):Te.pageXOffset||Ce[n]||Me[n]||Ee[n]||0})},qe={s:a,p:"top",p2:"Top",os:"bottom",os2:"Bottom",d:"height",d2:"Height",a:"y",op:He,sc:G(function(e){return arguments.length?Te.scrollTo(He.sc(),e):Te.pageYOffset||Ce[a]||Me[a]||Ee[a]||0})};He.op=qe,ze.cache=0;var E=(Observer.prototype.init=function init(e){ke||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,k=e.onChange,T=e.onToggleX,E=e.onToggleY,R=e.onHover,D=e.onHoverEnd,I=e.onMove,z=e.ignoreCheck,Y=e.isNormalizer,H=e.onGestureStart,q=e.onGestureEnd,X=e.onWheel,U=e.onEnable,W=e.onDisable,G=e.onClick,V=e.scrollSpeed,K=e.capture,j=e.allowClicks,Z=e.lockAxis,$=e.onLockAxis;function gf(){return xe=Le()}function hf(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||z&&z(e,t)}function kf(){var e=se.deltaX=O(me),t=se.deltaY=O(ye),r=Math.abs(e)>=i,n=Math.abs(t)>=i;k&&(r||n)&&k(se,e,t,me,ye),r&&(m&&0<se.deltaX&&m(se),y&&se.deltaX<0&&y(se),w&&w(se),T&&se.deltaX<0!=le<0&&T(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)&&(I&&I(se),re&&(p&&1===re&&p(se),h&&h(se),re=0),ne=!1),oe&&!(oe=!1)&&$&&$(se),ie&&(X(se),ie=!1),ee=0}function lf(e,t,r){me[r]+=e,ye[r]+=t,se._vx.update(e),se._vy.update(t),n?ee=ee||requestAnimationFrame(kf):kf()}function mf(e,t){Z&&!ae&&(se.axis=ae=Math.abs(e)>Math.abs(t)?"x":"y",oe=!0),"y"!==ae&&(me[2]+=e,se._vx.update(e,!0)),"x"!==ae&&(ye[2]+=t,se._vy.update(t,!0)),n?ee=ee||requestAnimationFrame(kf):kf()}function nf(e){if(!hf(e,1)){var t=(e=N(e,s)).clientX,r=e.clientY,n=t-se.x,i=r-se.y,o=se.isDragging;se.x=t,se.y=r,(o||(n||i)&&(Math.abs(se.startX-t)>=a||Math.abs(se.startY-r)>=a))&&(re=o?2:1,o||(se.isDragging=!0),mf(n,i))}}function qf(e){return e.touches&&1<e.touches.length&&(se.isGesturing=!0)&&H(e,se.isDragging)}function rf(){return(se.isGesturing=!1)||q(se)}function sf(e){if(!hf(e)){var t=fe(),r=de();lf((t-pe)*V,(r-ge)*V,1),pe=t,ge=r,l&&te.restart(!0)}}function tf(e){if(!hf(e)){e=N(e,s),X&&(ie=!0);var t=(1===e.deltaMode?r:2===e.deltaMode?Te.innerHeight:1)*f;lf(e.deltaX*t,e.deltaY*t,0),l&&!Y&&te.restart(!0)}}function uf(e){if(!hf(e)){var t=e.clientX,r=e.clientY,n=t-se.x,i=r-se.y;se.x=t,se.y=r,ne=!0,l&&te.restart(!0),(n||i)&&mf(n,i)}}function vf(e){se.event=e,R(se)}function wf(e){se.event=e,D(se)}function xf(e){return hf(e)||N(e,s)&&G(se)}this.target=o=J(o)||Me,this.vars=e,u=u&&Se.utils.toArray(u),i=i||1e-9,a=a||0,f=f||1,V=V||1,t=t||"wheel,touch,pointer",n=!1!==n,r=r||parseFloat(Te.getComputedStyle(Ee).lineHeight)||22;var ee,te,re,ne,ie,oe,ae,se=this,le=0,ce=0,ue=e.passive||!s&&!1!==e.passive,fe=L(o,He),de=L(o,qe),pe=fe(),ge=de(),he=~t.indexOf("touch")&&!~t.indexOf("pointer")&&"pointerdown"===De[0],ve=A(o),be=o.ownerDocument||Ce,me=[0,0,0],ye=[0,0,0],xe=0,_e=se.onPress=function(e){hf(e,1)||e&&e.button||(se.axis=ae=null,te.pause(),se.isPressed=!0,e=N(e),le=ce=0,se.startX=se.x=e.clientX,se.startY=se.y=e.clientY,se._vx.reset(),se._vy.reset(),B(Y?o:be,De[1],nf,ue,!0),se.deltaX=se.deltaY=0,v&&v(se))},we=se.onRelease=function(t){if(!hf(t,1)){C(Y?o:be,De[1],nf,!0);var e=!isNaN(se.y-se.startY),r=se.isDragging,n=r&&(3<Math.abs(se.x-se.startX)||3<Math.abs(se.y-se.startY)),i=N(t);!n&&e&&(se._vx.reset(),se._vy.reset(),s&&j&&Se.delayedCall(.08,function(){if(300<Le()-xe&&!t.defaultPrevented)if(t.target.click)t.target.click();else if(be.createEvent){var e=be.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,Te,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(e)}})),se.isDragging=se.isGesturing=se.isPressed=!1,l&&r&&!Y&&te.restart(!0),re&&kf(),g&&r&&g(se),b&&b(se,n)}};te=se._dc=Se.delayedCall(c||.25,function onStopFunc(){se._vx.reset(),se._vy.reset(),te.pause(),l&&l(se)}).pause(),se.deltaX=se.deltaY=0,se._vx=M(0,50,!0),se._vy=M(0,50,!0),se.scrollX=fe,se.scrollY=de,se.isDragging=se.isGesturing=se.isPressed=!1,Be(this),se.enable=function(e){return se.isEnabled||(B(ve?be:o,"scroll",F),0<=t.indexOf("scroll")&&B(ve?be:o,"scroll",sf,ue,K),0<=t.indexOf("wheel")&&B(o,"wheel",tf,ue,K),(0<=t.indexOf("touch")&&Pe||0<=t.indexOf("pointer"))&&(B(o,De[0],_e,ue,K),B(be,De[2],we),B(be,De[3],we),j&&B(o,"click",gf,!0,!0),G&&B(o,"click",xf),H&&B(be,"gesturestart",qf),q&&B(be,"gestureend",rf),R&&B(o,Oe+"enter",vf),D&&B(o,Oe+"leave",wf),I&&B(o,Oe+"move",uf)),se.isEnabled=!0,se.isDragging=se.isGesturing=se.isPressed=ne=re=!1,se._vx.reset(),se._vy.reset(),pe=fe(),ge=de(),e&&e.type&&_e(e),U&&U(se)),se},se.disable=function(){se.isEnabled&&(Ie.filter(function(e){return e!==se&&A(e.target)}).length||C(ve?be:o,"scroll",F),se.isPressed&&(se._vx.reset(),se._vy.reset(),C(Y?o:be,De[1],nf,!0)),C(ve?be:o,"scroll",sf,K),C(o,"wheel",tf,K),C(o,De[0],_e,K),C(be,De[2],we),C(be,De[3],we),C(o,"click",gf,!0),C(o,"click",xf),C(be,"gesturestart",qf),C(be,"gestureend",rf),C(o,Oe+"enter",vf),C(o,Oe+"leave",wf),C(o,Oe+"move",uf),se.isEnabled=se.isPressed=se.isDragging=!1,W&&W(se))},se.kill=se.revert=function(){se.disable();var e=Ie.indexOf(se);0<=e&&Ie.splice(e,1),Re===se&&(Re=0)},Ie.push(se),Y&&A(o)&&(Re=se),se.enable(d)},function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}(Observer,[{key:"velocityX",get:function get(){return this._vx.getVelocity()}},{key:"velocityY",get:function get(){return this._vy.getVelocity()}}]),Observer);function Observer(e){this.init(e)}E.version="3.13.0",E.create=function(e){return new E(e)},E.register=Q,E.getAll=function(){return Ie.slice()},E.getById=function(t){return Ie.filter(function(e){return e.vars.id===t})[0]},r()&&Se.registerPlugin(E);function Da(e,t,r){var n=ct(e)&&("clamp("===e.substr(0,6)||-1<e.indexOf("max"));return(r["_"+t+"Clamp"]=n)?e.substr(6,e.length-7):e}function Ea(e,t){return!t||ct(e)&&"clamp("===e.substr(0,6)?e:"clamp("+e+")"}function Ga(){return Qe=1}function Ha(){return Qe=0}function Ia(e){return e}function Ja(e){return Math.round(1e5*e)/1e5||0}function Ka(){return"undefined"!=typeof window}function La(){return Ne||Ka()&&(Ne=window.gsap)&&Ne.registerPlugin&&Ne}function Ma(e){return!!~l.indexOf(e)}function Na(e){return("Height"===e?S:Xe["inner"+e])||Ue["client"+e]||We["client"+e]}function Oa(e){return z(e,"getBoundingClientRect")||(Ma(e)?function(){return Ot.width=Xe.innerWidth,Ot.height=S,Ot}:function(){return _t(e)})}function Ra(e,t){var r=t.s,n=t.d2,i=t.d,o=t.a;return Math.max(0,(r="scroll"+n)&&(o=z(e,r))?o()-Oa(e)()[i]:Ma(e)?(Ue[r]||We[r])-Na(n):e[r]-e["offset"+n])}function Sa(e,t){for(var r=0;r<g.length;r+=3)t&&!~t.indexOf(g[r+1])||e(g[r],g[r+1],g[r+2])}function Ua(e){return"function"==typeof e}function Va(e){return"number"==typeof e}function Wa(e){return"object"==typeof e}function Xa(e,t,r){return e&&e.progress(t?0:1)&&r&&e.pause()}function Ya(e,t){if(e.enabled){var r=e._ctx?e._ctx.add(function(){return t(e)}):t(e);r&&r.totalTime&&(e.callbackAnimation=r)}}function nb(e){return Xe.getComputedStyle(e)}function pb(e,t){for(var r in t)r in e||(e[r]=t[r]);return e}function rb(e,t){var r=t.d2;return e["offset"+r]||e["client"+r]||0}function sb(e){var t,r=[],n=e.labels,i=e.duration();for(t in n)r.push(n[t]/i);return r}function ub(i){var o=Ne.utils.snap(i),a=Array.isArray(i)&&i.slice(0).sort(function(e,t){return e-t});return a?function(e,t,r){var n;if(void 0===r&&(r=.001),!t)return o(e);if(0<t){for(e-=r,n=0;n<a.length;n++)if(a[n]>=e)return a[n];return a[n-1]}for(n=a.length,e+=r;n--;)if(a[n]<=e)return a[n];return a[0]}:function(e,t,r){void 0===r&&(r=.001);var n=o(e);return!t||Math.abs(n-e)<r||n-e<0==t<0?n:o(t<0?e-i:e+i)}}function wb(t,r,e,n){return e.split(",").forEach(function(e){return t(r,e,n)})}function xb(e,t,r,n,i){return e.addEventListener(t,r,{passive:!n,capture:!!i})}function yb(e,t,r,n){return e.removeEventListener(t,r,!!n)}function zb(e,t,r){(r=r&&r.wheelHandler)&&(e(t,"wheel",r),e(t,"touchmove",r))}function Db(e,t){if(ct(e)){var r=e.indexOf("="),n=~r?(e.charAt(r-1)+1)*parseFloat(e.substr(r+1)):0;~r&&(e.indexOf("%")>r&&(n*=t/100),e=e.substr(0,r-1)),e=n+(e in q?q[e]*t:~e.indexOf("%")?parseFloat(e)*t/100:parseFloat(e)||0)}return e}function Eb(e,t,r,n,i,o,a,s){var l=i.startColor,c=i.endColor,u=i.fontSize,f=i.indent,d=i.fontWeight,p=Fe.createElement("div"),g=Ma(r)||"fixed"===z(r,"pinType"),h=-1!==e.indexOf("scroller"),v=g?We:r,b=-1!==e.indexOf("start"),m=b?l:c,y="border-color:"+m+";font-size:"+u+";color:"+m+";font-weight:"+d+";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;";return y+="position:"+((h||s)&&g?"fixed;":"absolute;"),!h&&!s&&g||(y+=(n===qe?I:Y)+":"+(o+parseFloat(f))+"px;"),a&&(y+="box-sizing:border-box;text-align:left;width:"+a.offsetWidth+"px;"),p._isStart=b,p.setAttribute("class","gsap-marker-"+e+(t?" marker-"+t:"")),p.style.cssText=y,p.innerText=t||0===t?e+"-"+t:e,v.children[0]?v.insertBefore(p,v.children[0]):v.appendChild(p),p._offset=p["offset"+n.op.d2],X(p,0,n,b),p}function Jb(){return 34<at()-st&&(T=T||requestAnimationFrame(Z))}function Kb(){v&&v.isPressed&&!(v.startX>We.clientWidth)||(ze.cache++,v?T=T||requestAnimationFrame(Z):Z(),st||V("scrollStart"),st=at())}function Lb(){y=Xe.innerWidth,m=Xe.innerHeight}function Mb(e){ze.cache++,!0!==e&&(Ke||h||Fe.fullscreenElement||Fe.webkitFullscreenElement||b&&y===Xe.innerWidth&&!(Math.abs(Xe.innerHeight-m)>.25*Xe.innerHeight))||c.restart(!0)}function Pb(){return yb(ne,"scrollEnd",Pb)||Mt(!0)}function Sb(e){for(var t=0;t<K.length;t+=5)(!e||K[t+4]&&K[t+4].query===e)&&(K[t].style.cssText=K[t+1],K[t].getBBox&&K[t].setAttribute("transform",K[t+2]||""),K[t+3].uncache=1)}function Tb(e,t){var r;for(je=0;je<kt.length;je++)!(r=kt[je])||t&&r._ctx!==t||(e?r.kill(1):r.revert(!0,!0));k=!0,t&&Sb(t),t||V("revert")}function Ub(e,t){ze.cache++,!t&&rt||ze.forEach(function(e){return Ua(e)&&e.cacheID++&&(e.rec=0)}),ct(e)&&(Xe.history.scrollRestoration=_=e)}function Zb(){We.appendChild(w),S=!v&&w.offsetHeight||Xe.innerHeight,We.removeChild(w)}function $b(t){return Je(".gsap-marker-start, .gsap-marker-end, .gsap-marker-scroller-start, .gsap-marker-scroller-end").forEach(function(e){return e.style.display=t?"none":"block"})}function hc(e,t,r,n){if(!e._gsap.swappedIn){for(var i,o=$.length,a=t.style,s=e.style;o--;)a[i=$[o]]=r[i];a.position="absolute"===r.position?"absolute":"relative","inline"===r.display&&(a.display="inline-block"),s[Y]=s[I]="auto",a.flexBasis=r.flexBasis||"auto",a.overflow="visible",a.boxSizing="border-box",a[ft]=rb(e,He)+xt,a[dt]=rb(e,qe)+xt,a[bt]=s[mt]=s.top=s.left="0",Pt(n),s[ft]=s.maxWidth=r[ft],s[dt]=s.maxHeight=r[dt],s[bt]=r[bt],e.parentNode!==t&&(e.parentNode.insertBefore(t,e),t.appendChild(e)),e._gsap.swappedIn=!0}}function kc(e){for(var t=ee.length,r=e.style,n=[],i=0;i<t;i++)n.push(ee[i],r[ee[i]]);return n.t=e,n}function nc(e,t,r,n,i,o,a,s,l,c,u,f,d,p){Ua(e)&&(e=e(s)),ct(e)&&"max"===e.substr(0,3)&&(e=f+("="===e.charAt(4)?Db("0"+e.substr(3),r):0));var g,h,v,b=d?d.time():0;if(d&&d.seek(0),isNaN(e)||(e=+e),Va(e))d&&(e=Ne.utils.mapRange(d.scrollTrigger.start,d.scrollTrigger.end,0,f,e)),a&&X(a,r,n,!0);else{Ua(t)&&(t=t(s));var m,y,x,_,w=(e||"0").split(" ");v=J(t,s)||We,(m=_t(v)||{})&&(m.left||m.top)||"none"!==nb(v).display||(_=v.style.display,v.style.display="block",m=_t(v),_?v.style.display=_:v.style.removeProperty("display")),y=Db(w[0],m[n.d]),x=Db(w[1]||"0",r),e=m[n.p]-l[n.p]-c+y+i-x,a&&X(a,x,n,r-x<20||a._isStart&&20<x),r-=r-x}if(p&&(s[p]=e||-.001,e<0&&(e=0)),o){var S=e+r,k=o._isStart;g="scroll"+n.d2,X(o,S,n,k&&20<S||!k&&(u?Math.max(We[g],Ue[g]):o.parentNode[g])<=S+1),u&&(l=_t(a),u&&(o.style[n.op.p]=l[n.op.p]-n.op.m-o._offset+xt))}return d&&v&&(g=_t(v),d.seek(f),h=_t(v),d._caScrollDist=g[n.p]-h[n.p],e=e/d._caScrollDist*f),d&&d.seek(b),d?e:Math.round(e)}function pc(e,t,r,n){if(e.parentNode!==t){var i,o,a=e.style;if(t===We){for(i in e._stOrig=a.cssText,o=nb(e))+i||re.test(i)||!o[i]||"string"!=typeof a[i]||"0"===i||(a[i]=o[i]);a.top=r,a.left=n}else a.cssText=e._stOrig;Ne.core.getCache(e).uncache=1,t.appendChild(e)}}function qc(r,e,n){var i=e,o=i;return function(e){var t=Math.round(r());return t!==i&&t!==o&&3<Math.abs(t-i)&&3<Math.abs(t-o)&&(e=t,n&&n()),o=i,i=Math.round(e)}}function rc(e,t,r){var n={};n[t.p]="+="+r,Ne.set(e,n)}function sc(c,e){function Hk(e,t,r,n,i){var o=Hk.tween,a=t.onComplete,s={};r=r||u();var l=qc(u,r,function(){o.kill(),Hk.tween=0});return i=n&&i||0,n=n||e-r,o&&o.kill(),t[f]=e,t.inherit=!1,(t.modifiers=s)[f]=function(){return l(r+n*o.ratio+i*o.ratio*o.ratio)},t.onUpdate=function(){ze.cache++,Hk.tween&&Z()},t.onComplete=function(){Hk.tween=0,a&&a.call(o)},o=Hk.tween=Ne.to(c,t)}var u=L(c,e),f="_scroll"+e.p2;return(c[f]=u).wheelHandler=function(){return Hk.tween&&Hk.tween.kill()&&(Hk.tween=0)},xb(c,"wheel",u.wheelHandler),ne.isTouch&&xb(c,"touchmove",u.wheelHandler),Hk}var Ne,s,Xe,Fe,Ue,We,l,c,Je,Ge,Ve,u,Ke,Qe,f,je,d,p,g,Ze,$e,h,v,b,m,y,R,x,_,w,S,k,et,tt,T,rt,nt,it,ot=1,at=Date.now,D=at(),st=0,lt=0,ct=function _isString(e){return"string"==typeof e},ut=Math.abs,I="right",Y="bottom",ft="width",dt="height",pt="Right",gt="Left",ht="Top",vt="Bottom",bt="padding",mt="margin",yt="Width",H="Height",xt="px",_t=function _getBounds(e,t){var r=t&&"matrix(1, 0, 0, 1, 0, 0)"!==nb(e)[f]&&Ne.to(e,{x:0,y:0,xPercent:0,yPercent:0,rotation:0,rotationX:0,rotationY:0,scale:1,skewX:0,skewY:0}).progress(1),n=e.getBoundingClientRect();return r&&r.progress(0).kill(),n},wt={startColor:"green",endColor:"red",indent:0,fontSize:"16px",fontWeight:"normal"},St={toggleActions:"play",anticipatePin:0},q={top:0,left:0,center:.5,bottom:1,right:1},X=function _positionMarker(e,t,r,n){var i={display:"block"},o=r[n?"os2":"p2"],a=r[n?"p2":"os2"];e._isFlipped=n,i[r.a+"Percent"]=n?-100:0,i[r.a]=n?"1px":0,i["border"+o+yt]=1,i["border"+a+yt]=0,i[r.p]=t+"px",Ne.set(e,i)},kt=[],Tt={},U={},W=[],V=function _dispatch(e){return U[e]&&U[e].map(function(e){return e()})||W},K=[],Ct=0,Mt=function _refreshAll(e,t){if(Ue=Fe.documentElement,We=Fe.body,l=[Xe,Fe,Ue,We],!st||e||k){Zb(),rt=ne.isRefreshing=!0,ze.forEach(function(e){return Ua(e)&&++e.cacheID&&(e.rec=e())});var r=V("refreshInit");Ze&&ne.sort(),t||Tb(),ze.forEach(function(e){Ua(e)&&(e.smooth&&(e.target.style.scrollBehavior="auto"),e(0))}),kt.slice(0).forEach(function(e){return e.refresh()}),k=!1,kt.forEach(function(e){if(e._subPinOffset&&e.pin){var t=e.vars.horizontal?"offsetWidth":"offsetHeight",r=e.pin[t];e.revert(!0,1),e.adjustPinSpacing(e.pin[t]-r),e.refresh()}}),et=1,$b(!0),kt.forEach(function(e){var t=Ra(e.scroller,e._dir),r="max"===e.vars.end||e._endClamp&&e.end>t,n=e._startClamp&&e.start>=t;(r||n)&&e.setPositions(n?t-1:e.start,r?Math.max(n?t:e.start+1,t):e.end,!0)}),$b(!1),et=0,r.forEach(function(e){return e&&e.render&&e.render(-1)}),ze.forEach(function(e){Ua(e)&&(e.smooth&&requestAnimationFrame(function(){return e.target.style.scrollBehavior="smooth"}),e.rec&&e(e.rec))}),Ub(_,1),c.pause(),Ct++,Z(rt=2),kt.forEach(function(e){return Ua(e.vars.onRefresh)&&e.vars.onRefresh(e)}),rt=ne.isRefreshing=!1,V("refresh")}else xb(ne,"scrollEnd",Pb)},j=0,Et=1,Z=function _updateAll(e){if(2===e||!rt&&!k){ne.isUpdating=!0,it&&it.update(0);var t=kt.length,r=at(),n=50<=r-D,i=t&&kt[0].scroll();if(Et=i<j?-1:1,rt||(j=i),n&&(st&&!Qe&&200<r-st&&(st=0,V("scrollEnd")),Ve=D,D=r),Et<0){for(je=t;0<je--;)kt[je]&&kt[je].update(0,n);Et=1}else for(je=0;je<t;je++)kt[je]&&kt[je].update(0,n);ne.isUpdating=!1}T=0},$=["left","top",Y,I,mt+vt,mt+pt,mt+ht,mt+gt,"display","flexShrink","float","zIndex","gridColumnStart","gridColumnEnd","gridRowStart","gridRowEnd","gridArea","justifySelf","alignSelf","placeSelf","order"],ee=$.concat([ft,dt,"boxSizing","max"+yt,"max"+H,"position",mt,bt,bt+ht,bt+pt,bt+vt,bt+gt]),te=/([A-Z])/g,Pt=function _setState(e){if(e){var t,r,n=e.t.style,i=e.length,o=0;for((e.t._gsap||Ne.core.getCache(e.t)).uncache=1;o<i;o+=2)r=e[o+1],t=e[o],r?n[t]=r:n[t]&&n.removeProperty(t.replace(te,"-$1").toLowerCase())}},Ot={left:0,top:0},re=/(webkit|moz|length|cssText|inset)/i,ne=(ScrollTrigger.prototype.init=function init(P,O){if(this.progress=this.start=0,this.vars&&this.kill(!0,!0),lt){var A,n,p,R,D,B,I,Y,H,q,N,e,X,F,U,W,G,V,t,K,b,Q,j,m,Z,y,$,x,r,_,w,ee,i,g,te,re,ne,S,o,k=(P=pb(ct(P)||Va(P)||P.nodeType?{trigger:P}:P,St)).onUpdate,T=P.toggleClass,a=P.id,C=P.onToggle,ie=P.onRefresh,M=P.scrub,oe=P.trigger,ae=P.pin,se=P.pinSpacing,le=P.invalidateOnRefresh,E=P.anticipatePin,s=P.onScrubComplete,h=P.onSnapComplete,ce=P.once,ue=P.snap,fe=P.pinReparent,l=P.pinSpacer,de=P.containerAnimation,pe=P.fastScrollEnd,ge=P.preventOverlaps,he=P.horizontal||P.containerAnimation&&!1!==P.horizontal?He:qe,ve=!M&&0!==M,be=J(P.scroller||Xe),c=Ne.core.getCache(be),me=Ma(be),ye="fixed"===("pinType"in P?P.pinType:z(be,"pinType")||me&&"fixed"),xe=[P.onEnter,P.onLeave,P.onEnterBack,P.onLeaveBack],_e=ve&&P.toggleActions.split(" "),we="markers"in P?P.markers:St.markers,Se=me?0:parseFloat(nb(be)["border"+he.p2+yt])||0,ke=this,Te=P.onRefreshInit&&function(){return P.onRefreshInit(ke)},Ce=function _getSizeFunc(e,t,r){var n=r.d,i=r.d2,o=r.a;return(o=z(e,"getBoundingClientRect"))?function(){return o()[n]}:function(){return(t?Na(i):e["client"+i])||0}}(be,me,he),Me=function _getOffsetsFunc(e,t){return!t||~Ye.indexOf(e)?Oa(e):function(){return Ot}}(be,me),Ee=0,Pe=0,Oe=0,Ae=L(be,he);if(ke._startClamp=ke._endClamp=!1,ke._dir=he,E*=45,ke.scroller=be,ke.scroll=de?de.time.bind(de):Ae,R=Ae(),ke.vars=P,O=O||P.animation,"refreshPriority"in P&&(Ze=1,-9999===P.refreshPriority&&(it=ke)),c.tweenScroll=c.tweenScroll||{top:sc(be,qe),left:sc(be,He)},ke.tweenTo=A=c.tweenScroll[he.p],ke.scrubDuration=function(e){(i=Va(e)&&e)?ee?ee.duration(e):ee=Ne.to(O,{ease:"expo",totalProgress:"+=0",inherit:!1,duration:i,paused:!0,onComplete:function onComplete(){return s&&s(ke)}}):(ee&&ee.progress(1).kill(),ee=0)},O&&(O.vars.lazy=!1,O._initted&&!ke.isReverted||!1!==O.vars.immediateRender&&!1!==P.immediateRender&&O.duration()&&O.render(0,!0,!0),ke.animation=O.pause(),(O.scrollTrigger=ke).scrubDuration(M),_=0,a=a||O.vars.id),ue&&(Wa(ue)&&!ue.push||(ue={snapTo:ue}),"scrollBehavior"in We.style&&Ne.set(me?[We,Ue]:be,{scrollBehavior:"auto"}),ze.forEach(function(e){return Ua(e)&&e.target===(me?Fe.scrollingElement||Ue:be)&&(e.smooth=!1)}),p=Ua(ue.snapTo)?ue.snapTo:"labels"===ue.snapTo?function _getClosestLabel(t){return function(e){return Ne.utils.snap(sb(t),e)}}(O):"labelsDirectional"===ue.snapTo?function _getLabelAtDirection(r){return function(e,t){return ub(sb(r))(e,t.direction)}}(O):!1!==ue.directional?function(e,t){return ub(ue.snapTo)(e,at()-Pe<500?0:t.direction)}:Ne.utils.snap(ue.snapTo),g=ue.duration||{min:.1,max:2},g=Wa(g)?Ge(g.min,g.max):Ge(g,g),te=Ne.delayedCall(ue.delay||i/2||.1,function(){var e=Ae(),t=at()-Pe<500,r=A.tween;if(!(t||Math.abs(ke.getVelocity())<10)||r||Qe||Ee===e)ke.isActive&&Ee!==e&&te.restart(!0);else{var n,i,o=(e-B)/F,a=O&&!ve?O.totalProgress():o,s=t?0:(a-w)/(at()-Ve)*1e3||0,l=Ne.utils.clamp(-o,1-o,ut(s/2)*s/.185),c=o+(!1===ue.inertia?0:l),u=ue.onStart,f=ue.onInterrupt,d=ue.onComplete;if(n=p(c,ke),Va(n)||(n=c),i=Math.max(0,Math.round(B+n*F)),e<=I&&B<=e&&i!==e){if(r&&!r._initted&&r.data<=ut(i-e))return;!1===ue.inertia&&(l=n-o),A(i,{duration:g(ut(.185*Math.max(ut(c-a),ut(n-a))/s/.05||0)),ease:ue.ease||"power3",data:ut(i-e),onInterrupt:function onInterrupt(){return te.restart(!0)&&f&&f(ke)},onComplete:function onComplete(){ke.update(),Ee=Ae(),O&&!ve&&(ee?ee.resetTo("totalProgress",n,O._tTime/O._tDur):O.progress(n)),_=w=O&&!ve?O.totalProgress():ke.progress,h&&h(ke),d&&d(ke)}},e,l*F,i-e-l*F),u&&u(ke,A.tween)}}}).pause()),a&&(Tt[a]=ke),o=(o=(oe=ke.trigger=J(oe||!0!==ae&&ae))&&oe._gsap&&oe._gsap.stRevert)&&o(ke),ae=!0===ae?oe:J(ae),ct(T)&&(T={targets:oe,className:T}),ae&&(!1===se||se===mt||(se=!(!se&&ae.parentNode&&ae.parentNode.style&&"flex"===nb(ae.parentNode).display)&&bt),ke.pin=ae,(n=Ne.core.getCache(ae)).spacer?U=n.pinState:(l&&((l=J(l))&&!l.nodeType&&(l=l.current||l.nativeElement),n.spacerIsNative=!!l,l&&(n.spacerState=kc(l))),n.spacer=V=l||Fe.createElement("div"),V.classList.add("pin-spacer"),a&&V.classList.add("pin-spacer-"+a),n.pinState=U=kc(ae)),!1!==P.force3D&&Ne.set(ae,{force3D:!0}),ke.spacer=V=n.spacer,r=nb(ae),m=r[se+he.os2],K=Ne.getProperty(ae),b=Ne.quickSetter(ae,he.a,xt),hc(ae,V,r),G=kc(ae)),we){e=Wa(we)?pb(we,wt):wt,q=Eb("scroller-start",a,be,he,e,0),N=Eb("scroller-end",a,be,he,e,0,q),t=q["offset"+he.op.d2];var u=J(z(be,"content")||be);Y=this.markerStart=Eb("start",a,u,he,e,t,0,de),H=this.markerEnd=Eb("end",a,u,he,e,t,0,de),de&&(S=Ne.quickSetter([Y,H],he.a,xt)),ye||Ye.length&&!0===z(be,"fixedMarkers")||(function _makePositionable(e){var t=nb(e).position;e.style.position="absolute"===t||"fixed"===t?t:"relative"}(me?We:be),Ne.set([q,N],{force3D:!0}),y=Ne.quickSetter(q,he.a,xt),x=Ne.quickSetter(N,he.a,xt))}if(de){var f=de.vars.onUpdate,d=de.vars.onUpdateParams;de.eventCallback("onUpdate",function(){ke.update(0,0,1),f&&f.apply(de,d||[])})}if(ke.previous=function(){return kt[kt.indexOf(ke)-1]},ke.next=function(){return kt[kt.indexOf(ke)+1]},ke.revert=function(e,t){if(!t)return ke.kill(!0);var r=!1!==e||!ke.enabled,n=Ke;r!==ke.isReverted&&(r&&(re=Math.max(Ae(),ke.scroll.rec||0),Oe=ke.progress,ne=O&&O.progress()),Y&&[Y,H,q,N].forEach(function(e){return e.style.display=r?"none":"block"}),r&&(Ke=ke).update(r),!ae||fe&&ke.isActive||(r?function _swapPinOut(e,t,r){Pt(r);var n=e._gsap;if(n.spacerIsNative)Pt(n.spacerState);else if(e._gsap.swappedIn){var i=t.parentNode;i&&(i.insertBefore(e,t),i.removeChild(t))}e._gsap.swappedIn=!1}(ae,V,U):hc(ae,V,nb(ae),Z)),r||ke.update(r),Ke=n,ke.isReverted=r)},ke.refresh=function(e,t,r,n){if(!Ke&&ke.enabled||t)if(ae&&e&&st)xb(ScrollTrigger,"scrollEnd",Pb);else{!rt&&Te&&Te(ke),Ke=ke,A.tween&&!r&&(A.tween.kill(),A.tween=0),ee&&ee.pause(),le&&O&&(O.revert({kill:!1}).invalidate(),O.getChildren&&O.getChildren(!0,!0,!1).forEach(function(e){return e.vars.immediateRender&&e.render(0,!0,!0)})),ke.isReverted||ke.revert(!0,!0),ke._subPinOffset=!1;var i,o,a,s,l,c,u,f,d,p,g,h,v,b=Ce(),m=Me(),y=de?de.duration():Ra(be,he),x=F<=.01||!F,_=0,w=n||0,S=Wa(r)?r.end:P.end,k=P.endTrigger||oe,T=Wa(r)?r.start:P.start||(0!==P.start&&oe?ae?"0 0":"0 100%":0),C=ke.pinnedContainer=P.pinnedContainer&&J(P.pinnedContainer,ke),M=oe&&Math.max(0,kt.indexOf(ke))||0,E=M;for(we&&Wa(r)&&(h=Ne.getProperty(q,he.p),v=Ne.getProperty(N,he.p));0<E--;)(c=kt[E]).end||c.refresh(0,1)||(Ke=ke),!(u=c.pin)||u!==oe&&u!==ae&&u!==C||c.isReverted||((p=p||[]).unshift(c),c.revert(!0,!0)),c!==kt[E]&&(M--,E--);for(Ua(T)&&(T=T(ke)),T=Da(T,"start",ke),B=nc(T,oe,b,he,Ae(),Y,q,ke,m,Se,ye,y,de,ke._startClamp&&"_startClamp")||(ae?-.001:0),Ua(S)&&(S=S(ke)),ct(S)&&!S.indexOf("+=")&&(~S.indexOf(" ")?S=(ct(T)?T.split(" ")[0]:"")+S:(_=Db(S.substr(2),b),S=ct(T)?T:(de?Ne.utils.mapRange(0,de.duration(),de.scrollTrigger.start,de.scrollTrigger.end,B):B)+_,k=oe)),S=Da(S,"end",ke),I=Math.max(B,nc(S||(k?"100% 0":y),k,b,he,Ae()+_,H,N,ke,m,Se,ye,y,de,ke._endClamp&&"_endClamp"))||-.001,_=0,E=M;E--;)(u=(c=kt[E]).pin)&&c.start-c._pinPush<=B&&!de&&0<c.end&&(i=c.end-(ke._startClamp?Math.max(0,c.start):c.start),(u===oe&&c.start-c._pinPush<B||u===C)&&isNaN(T)&&(_+=i*(1-c.progress)),u===ae&&(w+=i));if(B+=_,I+=_,ke._startClamp&&(ke._startClamp+=_),ke._endClamp&&!rt&&(ke._endClamp=I||-.001,I=Math.min(I,Ra(be,he))),F=I-B||(B-=.01)&&.001,x&&(Oe=Ne.utils.clamp(0,1,Ne.utils.normalize(B,I,re))),ke._pinPush=w,Y&&_&&((i={})[he.a]="+="+_,C&&(i[he.p]="-="+Ae()),Ne.set([Y,H],i)),!ae||et&&ke.end>=Ra(be,he)){if(oe&&Ae()&&!de)for(o=oe.parentNode;o&&o!==We;)o._pinOffset&&(B-=o._pinOffset,I-=o._pinOffset),o=o.parentNode}else i=nb(ae),s=he===qe,a=Ae(),Q=parseFloat(K(he.a))+w,!y&&1<I&&(g={style:g=(me?Fe.scrollingElement||Ue:be).style,value:g["overflow"+he.a.toUpperCase()]},me&&"scroll"!==nb(We)["overflow"+he.a.toUpperCase()]&&(g.style["overflow"+he.a.toUpperCase()]="scroll")),hc(ae,V,i),G=kc(ae),o=_t(ae,!0),f=ye&&L(be,s?He:qe)(),se?((Z=[se+he.os2,F+w+xt]).t=V,(E=se===bt?rb(ae,he)+F+w:0)&&(Z.push(he.d,E+xt),"auto"!==V.style.flexBasis&&(V.style.flexBasis=E+xt)),Pt(Z),C&&kt.forEach(function(e){e.pin===C&&!1!==e.vars.pinSpacing&&(e._subPinOffset=!0)}),ye&&Ae(re)):(E=rb(ae,he))&&"auto"!==V.style.flexBasis&&(V.style.flexBasis=E+xt),ye&&((l={top:o.top+(s?a-B:f)+xt,left:o.left+(s?f:a-B)+xt,boxSizing:"border-box",position:"fixed"})[ft]=l.maxWidth=Math.ceil(o.width)+xt,l[dt]=l.maxHeight=Math.ceil(o.height)+xt,l[mt]=l[mt+ht]=l[mt+pt]=l[mt+vt]=l[mt+gt]="0",l[bt]=i[bt],l[bt+ht]=i[bt+ht],l[bt+pt]=i[bt+pt],l[bt+vt]=i[bt+vt],l[bt+gt]=i[bt+gt],W=function _copyState(e,t,r){for(var n,i=[],o=e.length,a=r?8:0;a<o;a+=2)n=e[a],i.push(n,n in t?t[n]:e[a+1]);return i.t=e.t,i}(U,l,fe),rt&&Ae(0)),O?(d=O._initted,$e(1),O.render(O.duration(),!0,!0),j=K(he.a)-Q+F+w,$=1<Math.abs(F-j),ye&&$&&W.splice(W.length-2,2),O.render(0,!0,!0),d||O.invalidate(!0),O.parent||O.totalTime(O.totalTime()),$e(0)):j=F,g&&(g.value?g.style["overflow"+he.a.toUpperCase()]=g.value:g.style.removeProperty("overflow-"+he.a));p&&p.forEach(function(e){return e.revert(!1,!0)}),ke.start=B,ke.end=I,R=D=rt?re:Ae(),de||rt||(R<re&&Ae(re),ke.scroll.rec=0),ke.revert(!1,!0),Pe=at(),te&&(Ee=-1,te.restart(!0)),Ke=0,O&&ve&&(O._initted||ne)&&O.progress()!==ne&&O.progress(ne||0,!0).render(O.time(),!0,!0),(x||Oe!==ke.progress||de||le||O&&!O._initted)&&(O&&!ve&&(O._initted||Oe||!1!==O.vars.immediateRender)&&O.totalProgress(de&&B<-.001&&!Oe?Ne.utils.normalize(B,I,0):Oe,!0),ke.progress=x||(R-B)/F===Oe?0:Oe),ae&&se&&(V._pinOffset=Math.round(ke.progress*j)),ee&&ee.invalidate(),isNaN(h)||(h-=Ne.getProperty(q,he.p),v-=Ne.getProperty(N,he.p),rc(q,he,h),rc(Y,he,h-(n||0)),rc(N,he,v),rc(H,he,v-(n||0))),x&&!rt&&ke.update(),!ie||rt||X||(X=!0,ie(ke),X=!1)}},ke.getVelocity=function(){return(Ae()-D)/(at()-Ve)*1e3||0},ke.endAnimation=function(){Xa(ke.callbackAnimation),O&&(ee?ee.progress(1):O.paused()?ve||Xa(O,ke.direction<0,1):Xa(O,O.reversed()))},ke.labelToScroll=function(e){return O&&O.labels&&(B||ke.refresh()||B)+O.labels[e]/O.duration()*F||0},ke.getTrailing=function(t){var e=kt.indexOf(ke),r=0<ke.direction?kt.slice(0,e).reverse():kt.slice(e+1);return(ct(t)?r.filter(function(e){return e.vars.preventOverlaps===t}):r).filter(function(e){return 0<ke.direction?e.end<=B:e.start>=I})},ke.update=function(e,t,r){if(!de||r||e){var n,i,o,a,s,l,c,u=!0===rt?re:ke.scroll(),f=e?0:(u-B)/F,d=f<0?0:1<f?1:f||0,p=ke.progress;if(t&&(D=R,R=de?Ae():u,ue&&(w=_,_=O&&!ve?O.totalProgress():d)),E&&ae&&!Ke&&!ot&&st&&(!d&&B<u+(u-D)/(at()-Ve)*E?d=1e-4:1===d&&I>u+(u-D)/(at()-Ve)*E&&(d=.9999)),d!==p&&ke.enabled){if(a=(s=(n=ke.isActive=!!d&&d<1)!=(!!p&&p<1))||!!d!=!!p,ke.direction=p<d?1:-1,ke.progress=d,a&&!Ke&&(i=d&&!p?0:1===d?1:1===p?2:3,ve&&(o=!s&&"none"!==_e[i+1]&&_e[i+1]||_e[i],c=O&&("complete"===o||"reset"===o||o in O))),ge&&(s||c)&&(c||M||!O)&&(Ua(ge)?ge(ke):ke.getTrailing(ge).forEach(function(e){return e.endAnimation()})),ve||(!ee||Ke||ot?O&&O.totalProgress(d,!(!Ke||!Pe&&!e)):(ee._dp._time-ee._start!==ee._time&&ee.render(ee._dp._time-ee._start),ee.resetTo?ee.resetTo("totalProgress",d,O._tTime/O._tDur):(ee.vars.totalProgress=d,ee.invalidate().restart()))),ae)if(e&&se&&(V.style[se+he.os2]=m),ye){if(a){if(l=!e&&p<d&&u<I+1&&u+1>=Ra(be,he),fe)if(e||!n&&!l)pc(ae,V);else{var g=_t(ae,!0),h=u-B;pc(ae,We,g.top+(he===qe?h:0)+xt,g.left+(he===qe?0:h)+xt)}Pt(n||l?W:G),$&&d<1&&n||b(Q+(1!==d||l?0:j))}}else b(Ja(Q+j*d));!ue||A.tween||Ke||ot||te.restart(!0),T&&(s||ce&&d&&(d<1||!tt))&&Je(T.targets).forEach(function(e){return e.classList[n||ce?"add":"remove"](T.className)}),!k||ve||e||k(ke),a&&!Ke?(ve&&(c&&("complete"===o?O.pause().totalProgress(1):"reset"===o?O.restart(!0).pause():"restart"===o?O.restart(!0):O[o]()),k&&k(ke)),!s&&tt||(C&&s&&Ya(ke,C),xe[i]&&Ya(ke,xe[i]),ce&&(1===d?ke.kill(!1,1):xe[i]=0),s||xe[i=1===d?1:3]&&Ya(ke,xe[i])),pe&&!n&&Math.abs(ke.getVelocity())>(Va(pe)?pe:2500)&&(Xa(ke.callbackAnimation),ee?ee.progress(1):Xa(O,"reverse"===o?1:!d,1))):ve&&k&&!Ke&&k(ke)}if(x){var v=de?u/de.duration()*(de._caScrollDist||0):u;y(v+(q._isFlipped?1:0)),x(v)}S&&S(-u/de.duration()*(de._caScrollDist||0))}},ke.enable=function(e,t){ke.enabled||(ke.enabled=!0,xb(be,"resize",Mb),me||xb(be,"scroll",Kb),Te&&xb(ScrollTrigger,"refreshInit",Te),!1!==e&&(ke.progress=Oe=0,R=D=Ee=Ae()),!1!==t&&ke.refresh())},ke.getTween=function(e){return e&&A?A.tween:ee},ke.setPositions=function(e,t,r,n){if(de){var i=de.scrollTrigger,o=de.duration(),a=i.end-i.start;e=i.start+a*e/o,t=i.start+a*t/o}ke.refresh(!1,!1,{start:Ea(e,r&&!!ke._startClamp),end:Ea(t,r&&!!ke._endClamp)},n),ke.update()},ke.adjustPinSpacing=function(e){if(Z&&e){var t=Z.indexOf(he.d)+1;Z[t]=parseFloat(Z[t])+e+xt,Z[1]=parseFloat(Z[1])+e+xt,Pt(Z)}},ke.disable=function(e,t){if(ke.enabled&&(!1!==e&&ke.revert(!0,!0),ke.enabled=ke.isActive=!1,t||ee&&ee.pause(),re=0,n&&(n.uncache=1),Te&&yb(ScrollTrigger,"refreshInit",Te),te&&(te.pause(),A.tween&&A.tween.kill()&&(A.tween=0)),!me)){for(var r=kt.length;r--;)if(kt[r].scroller===be&&kt[r]!==ke)return;yb(be,"resize",Mb),me||yb(be,"scroll",Kb)}},ke.kill=function(e,t){ke.disable(e,t),ee&&!t&&ee.kill(),a&&delete Tt[a];var r=kt.indexOf(ke);0<=r&&kt.splice(r,1),r===je&&0<Et&&je--,r=0,kt.forEach(function(e){return e.scroller===ke.scroller&&(r=1)}),r||rt||(ke.scroll.rec=0),O&&(O.scrollTrigger=null,e&&O.revert({kill:!1}),t||O.kill()),Y&&[Y,H,q,N].forEach(function(e){return e.parentNode&&e.parentNode.removeChild(e)}),it===ke&&(it=0),ae&&(n&&(n.uncache=1),r=0,kt.forEach(function(e){return e.pin===ae&&r++}),r||(n.spacer=0)),P.onKill&&P.onKill(ke)},kt.push(ke),ke.enable(!1,!1),o&&o(ke),O&&O.add&&!F){var v=ke.update;ke.update=function(){ke.update=v,ze.cache++,B||I||ke.refresh()},Ne.delayedCall(.01,ke.update),F=.01,B=I=0}else ke.refresh();ae&&function _queueRefreshAll(){if(nt!==Ct){var e=nt=Ct;requestAnimationFrame(function(){return e===Ct&&Mt(!0)})}}()}else this.update=this.refresh=this.kill=Ia},ScrollTrigger.register=function register(e){return s||(Ne=e||La(),Ka()&&window.document&&ScrollTrigger.enable(),s=lt),s},ScrollTrigger.defaults=function defaults(e){if(e)for(var t in e)St[t]=e[t];return St},ScrollTrigger.disable=function disable(t,r){lt=0,kt.forEach(function(e){return e[r?"kill":"disable"](t)}),yb(Xe,"wheel",Kb),yb(Fe,"scroll",Kb),clearInterval(u),yb(Fe,"touchcancel",Ia),yb(We,"touchstart",Ia),wb(yb,Fe,"pointerdown,touchstart,mousedown",Ga),wb(yb,Fe,"pointerup,touchend,mouseup",Ha),c.kill(),Sa(yb);for(var e=0;e<ze.length;e+=3)zb(yb,ze[e],ze[e+1]),zb(yb,ze[e],ze[e+2])},ScrollTrigger.enable=function enable(){if(Xe=window,Fe=document,Ue=Fe.documentElement,We=Fe.body,Ne&&(Je=Ne.utils.toArray,Ge=Ne.utils.clamp,x=Ne.core.context||Ia,$e=Ne.core.suppressOverwrites||Ia,_=Xe.history.scrollRestoration||"auto",j=Xe.pageYOffset||0,Ne.core.globals("ScrollTrigger",ScrollTrigger),We)){lt=1,(w=document.createElement("div")).style.height="100vh",w.style.position="absolute",Zb(),function _rafBugFix(){return lt&&requestAnimationFrame(_rafBugFix)}(),E.register(Ne),ScrollTrigger.isTouch=E.isTouch,R=E.isTouch&&/(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent),b=1===E.isTouch,xb(Xe,"wheel",Kb),l=[Xe,Fe,Ue,We],Ne.matchMedia?(ScrollTrigger.matchMedia=function(e){var t,r=Ne.matchMedia();for(t in e)r.add(t,e[t]);return r},Ne.addEventListener("matchMediaInit",function(){return Tb()}),Ne.addEventListener("matchMediaRevert",function(){return Sb()}),Ne.addEventListener("matchMedia",function(){Mt(0,1),V("matchMedia")}),Ne.matchMedia().add("(orientation: portrait)",function(){return Lb(),Lb})):console.warn("Requires GSAP 3.11.0 or later"),Lb(),xb(Fe,"scroll",Kb);var e,t,r=We.hasAttribute("style"),n=We.style,i=n.borderTopStyle,o=Ne.core.Animation.prototype;for(o.revert||Object.defineProperty(o,"revert",{value:function value(){return this.time(-.01,!0)}}),n.borderTopStyle="solid",e=_t(We),qe.m=Math.round(e.top+qe.sc())||0,He.m=Math.round(e.left+He.sc())||0,i?n.borderTopStyle=i:n.removeProperty("border-top-style"),r||(We.setAttribute("style",""),We.removeAttribute("style")),u=setInterval(Jb,250),Ne.delayedCall(.5,function(){return ot=0}),xb(Fe,"touchcancel",Ia),xb(We,"touchstart",Ia),wb(xb,Fe,"pointerdown,touchstart,mousedown",Ga),wb(xb,Fe,"pointerup,touchend,mouseup",Ha),f=Ne.utils.checkPrefix("transform"),ee.push(f),s=at(),c=Ne.delayedCall(.2,Mt).pause(),g=[Fe,"visibilitychange",function(){var e=Xe.innerWidth,t=Xe.innerHeight;Fe.hidden?(d=e,p=t):d===e&&p===t||Mb()},Fe,"DOMContentLoaded",Mt,Xe,"load",Mt,Xe,"resize",Mb],Sa(xb),kt.forEach(function(e){return e.enable(0,1)}),t=0;t<ze.length;t+=3)zb(yb,ze[t],ze[t+1]),zb(yb,ze[t],ze[t+2])}},ScrollTrigger.config=function config(e){"limitCallbacks"in e&&(tt=!!e.limitCallbacks);var t=e.syncInterval;t&&clearInterval(u)||(u=t)&&setInterval(Jb,t),"ignoreMobileResize"in e&&(b=1===ScrollTrigger.isTouch&&e.ignoreMobileResize),"autoRefreshEvents"in e&&(Sa(yb)||Sa(xb,e.autoRefreshEvents||"none"),h=-1===(e.autoRefreshEvents+"").indexOf("resize"))},ScrollTrigger.scrollerProxy=function scrollerProxy(e,t){var r=J(e),n=ze.indexOf(r),i=Ma(r);~n&&ze.splice(n,i?6:2),t&&(i?Ye.unshift(Xe,t,We,t,Ue,t):Ye.unshift(r,t))},ScrollTrigger.clearMatchMedia=function clearMatchMedia(t){kt.forEach(function(e){return e._ctx&&e._ctx.query===t&&e._ctx.kill(!0,!0)})},ScrollTrigger.isInViewport=function isInViewport(e,t,r){var n=(ct(e)?J(e):e).getBoundingClientRect(),i=n[r?ft:dt]*t||0;return r?0<n.right-i&&n.left+i<Xe.innerWidth:0<n.bottom-i&&n.top+i<Xe.innerHeight},ScrollTrigger.positionInViewport=function positionInViewport(e,t,r){ct(e)&&(e=J(e));var n=e.getBoundingClientRect(),i=n[r?ft:dt],o=null==t?i/2:t in q?q[t]*i:~t.indexOf("%")?parseFloat(t)*i/100:parseFloat(t)||0;return r?(n.left+o)/Xe.innerWidth:(n.top+o)/Xe.innerHeight},ScrollTrigger.killAll=function killAll(e){if(kt.slice(0).forEach(function(e){return"ScrollSmoother"!==e.vars.id&&e.kill()}),!0!==e){var t=U.killAll||[];U={},t.forEach(function(e){return e()})}},ScrollTrigger);function ScrollTrigger(e,t){s||ScrollTrigger.register(Ne)||console.warn("Please gsap.registerPlugin(ScrollTrigger)"),x(this),this.init(e,t)}ne.version="3.13.0",ne.saveStyles=function(e){return e?Je(e).forEach(function(e){if(e&&e.style){var t=K.indexOf(e);0<=t&&K.splice(t,5),K.push(e,e.style.cssText,e.getBBox&&e.getAttribute("transform"),Ne.core.getCache(e),x())}}):K},ne.revert=function(e,t){return Tb(!e,t)},ne.create=function(e,t){return new ne(e,t)},ne.refresh=function(e){return e?Mb(!0):(s||ne.register())&&Mt(!0)},ne.update=function(e){return++ze.cache&&Z(!0===e?2:0)},ne.clearScrollMemory=Ub,ne.maxScroll=function(e,t){return Ra(e,t?He:qe)},ne.getScrollFunc=function(e,t){return L(J(e),t?He:qe)},ne.getById=function(e){return Tt[e]},ne.getAll=function(){return kt.filter(function(e){return"ScrollSmoother"!==e.vars.id})},ne.isScrolling=function(){return!!st},ne.snapDirectional=ub,ne.addEventListener=function(e,t){var r=U[e]||(U[e]=[]);~r.indexOf(t)||r.push(t)},ne.removeEventListener=function(e,t){var r=U[e],n=r&&r.indexOf(t);0<=n&&r.splice(n,1)},ne.batch=function(e,t){function Jp(e,t){var r=[],n=[],i=Ne.delayedCall(o,function(){t(r,n),r=[],n=[]}).pause();return function(e){r.length||i.restart(!0),r.push(e.trigger),n.push(e),a<=r.length&&i.progress(1)}}var r,n=[],i={},o=t.interval||.016,a=t.batchMax||1e9;for(r in t)i[r]="on"===r.substr(0,2)&&Ua(t[r])&&"onRefreshInit"!==r?Jp(0,t[r]):t[r];return Ua(a)&&(a=a(),xb(ne,"refresh",function(){return a=t.batchMax()})),Je(e).forEach(function(e){var t={};for(r in i)t[r]=i[r];t.trigger=e,n.push(ne.create(t))}),n};function uc(e,t,r,n){return n<t?e(n):t<0&&e(0),n<r?(n-t)/(r-t):r<0?t/(t-r):1}function vc(e,t){!0===t?e.style.removeProperty("touch-action"):e.style.touchAction=!0===t?"auto":t?"pan-"+t+(E.isTouch?" pinch-zoom":""):"none",e===Ue&&vc(We,t)}function xc(e){var t,r=e.event,n=e.target,i=e.axis,o=(r.changedTouches?r.changedTouches[0]:r).target,a=o._gsap||Ne.core.getCache(o),s=at();if(!a._isScrollT||2e3<s-a._isScrollT){for(;o&&o!==We&&(o.scrollHeight<=o.clientHeight&&o.scrollWidth<=o.clientWidth||!oe[(t=nb(o)).overflowY]&&!oe[t.overflowX]);)o=o.parentNode;a._isScroll=o&&o!==n&&!Ma(o)&&(oe[(t=nb(o)).overflowY]||oe[t.overflowX]),a._isScrollT=s}!a._isScroll&&"x"!==i||(r.stopPropagation(),r._gsapAllow=!0)}function yc(e,t,r,n){return E.create({target:e,capture:!0,debounce:!1,lockAxis:!0,type:t,onWheel:n=n&&xc,onPress:n,onDrag:n,onScroll:n,onEnable:function onEnable(){return r&&xb(Fe,E.eventTypes[0],se,!1,!0)},onDisable:function onDisable(){return yb(Fe,E.eventTypes[0],se,!0)}})}function Cc(e){function Gq(){return i=!1}function Jq(){o=Ra(p,qe),T=Ge(R?1:0,o),f&&(k=Ge(0,Ra(p,He))),l=Ct}function Kq(){v._gsap.y=Ja(parseFloat(v._gsap.y)+b.offset)+"px",v.style.transform="matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, "+parseFloat(v._gsap.y)+", 0, 1)",b.offset=b.cacheID=0}function Qq(){Jq(),a.isActive()&&a.vars.scrollY>o&&(b()>o?a.progress(1)&&b(o):a.resetTo("scrollY",o))}Wa(e)||(e={}),e.preventDefault=e.isNormalizer=e.allowClicks=!0,e.type||(e.type="wheel,touch"),e.debounce=!!e.debounce,e.id=e.id||"normalizer";var n,o,l,i,a,c,u,s,f=e.normalizeScrollX,t=e.momentum,r=e.allowNestedScroll,d=e.onRelease,p=J(e.target)||Ue,g=Ne.core.globals().ScrollSmoother,h=g&&g.get(),v=R&&(e.content&&J(e.content)||h&&!1!==e.content&&!h.smooth()&&h.content()),b=L(p,qe),m=L(p,He),y=1,x=(E.isTouch&&Xe.visualViewport?Xe.visualViewport.scale*Xe.visualViewport.width:Xe.outerWidth)/Xe.innerWidth,_=0,w=Ua(t)?function(){return t(n)}:function(){return t||2.8},S=yc(p,e.type,!0,r),k=Ia,T=Ia;return v&&Ne.set(v,{y:"+=0"}),e.ignoreCheck=function(e){return R&&"touchmove"===e.type&&function ignoreDrag(){if(i){requestAnimationFrame(Gq);var e=Ja(n.deltaY/2),t=T(b.v-e);if(v&&t!==b.v+b.offset){b.offset=t-b.v;var r=Ja((parseFloat(v&&v._gsap.y)||0)-b.offset);v.style.transform="matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, "+r+", 0, 1)",v._gsap.y=r+"px",b.cacheID=ze.cache,Z()}return!0}b.offset&&Kq(),i=!0}()||1.05<y&&"touchstart"!==e.type||n.isGesturing||e.touches&&1<e.touches.length},e.onPress=function(){i=!1;var e=y;y=Ja((Xe.visualViewport&&Xe.visualViewport.scale||1)/x),a.pause(),e!==y&&vc(p,1.01<y||!f&&"x"),c=m(),u=b(),Jq(),l=Ct},e.onRelease=e.onGestureStart=function(e,t){if(b.offset&&Kq(),t){ze.cache++;var r,n,i=w();f&&(n=(r=m())+.05*i*-e.velocityX/.227,i*=uc(m,r,n,Ra(p,He)),a.vars.scrollX=k(n)),n=(r=b())+.05*i*-e.velocityY/.227,i*=uc(b,r,n,Ra(p,qe)),a.vars.scrollY=T(n),a.invalidate().duration(i).play(.01),(R&&a.vars.scrollY>=o||o-1<=r)&&Ne.to({},{onUpdate:Qq,duration:i})}else s.restart(!0);d&&d(e)},e.onWheel=function(){a._ts&&a.pause(),1e3<at()-_&&(l=0,_=at())},e.onChange=function(e,t,r,n,i){if(Ct!==l&&Jq(),t&&f&&m(k(n[2]===t?c+(e.startX-e.x):m()+t-n[1])),r){b.offset&&Kq();var o=i[2]===r,a=o?u+e.startY-e.y:b()+r-i[1],s=T(a);o&&a!==s&&(u+=s-a),b(s)}(r||t)&&Z()},e.onEnable=function(){vc(p,!f&&"x"),ne.addEventListener("refresh",Qq),xb(Xe,"resize",Qq),b.smooth&&(b.target.style.scrollBehavior="auto",b.smooth=m.smooth=!1),S.enable()},e.onDisable=function(){vc(p,!0),yb(Xe,"resize",Qq),ne.removeEventListener("refresh",Qq),S.kill()},e.lockAxis=!1!==e.lockAxis,((n=new E(e)).iOS=R)&&!b()&&b(1),R&&Ne.ticker.add(Ia),s=n._dc,a=Ne.to(n,{ease:"power4",paused:!0,inherit:!1,scrollX:f?"+=0.1":"+=0",scrollY:"+=0.1",modifiers:{scrollY:qc(b,b(),function(){return a.pause()})},onUpdate:Z,onComplete:s.vars.onComplete}),n}var ie,oe={auto:1,scroll:1},ae=/(input|label|select|textarea)/i,se=function _captureInputs(e){var t=ae.test(e.target.tagName);(t||ie)&&(e._gsapAllow=!0,ie=t)};ne.sort=function(e){if(Ua(e))return kt.sort(e);var t=Xe.pageYOffset||0;return ne.getAll().forEach(function(e){return e._sortY=e.trigger?t+e.trigger.getBoundingClientRect().top:e.start+Xe.innerHeight}),kt.sort(e||function(e,t){return-1e6*(e.vars.refreshPriority||0)+(e.vars.containerAnimation?1e6:e._sortY)-((t.vars.containerAnimation?1e6:t._sortY)+-1e6*(t.vars.refreshPriority||0))})},ne.observe=function(e){return new E(e)},ne.normalizeScroll=function(e){if(void 0===e)return v;if(!0===e&&v)return v.enable();if(!1===e)return v&&v.kill(),void(v=e);var t=e instanceof E?e:Cc(e);return v&&v.target===t.target&&v.kill(),Ma(t.target)&&(v=t),t},ne.core={_getVelocityProp:M,_inputObserver:yc,_scrollers:ze,_proxies:Ye,bridge:{ss:function ss(){st||V("scrollStart"),st=at()},ref:function ref(){return Ke}}},La()&&Ne.registerPlugin(ne),e.ScrollTrigger=ne,e.default=ne;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
```
## `js/vendor/gsap.min.js`
```js
/*!
* GSAP 3.13.0
* https://gsap.com
*
* @license Copyright 2025, GreenSock. All rights reserved.
* Subject to the terms at https://gsap.com/standard-license.
* @author: Jack Doyle, [email protected]
*/
!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 P(t){return(i=yt(t,ot))&&ze}function Q(t,e){return console.warn("Invalid property",t,"set to",e,"Missing plugin? gsap.registerPlugin()")}function R(t,e){return!e&&console.warn(t)}function S(t,e){return t&&(ot[t]=e)&&i&&(i[t]=e)||ot}function T(){return 0}function ea(t){var e,r,i=t[0];if(v(i)||s(i)||(t=[t]),!(e=(i._gsap||{}).harness)){for(r=gt.length;r--&&!gt[r].targetTest(i););e=gt[r]}for(r=t.length;r--;)t[r]&&(t[r]._gsap||(t[r]._gsap=new Zt(t[r],e)))||t.splice(r,1);return t}function fa(t){return t._gsap||ea(Ot(t))[0]._gsap}function ga(t,e,r){return(r=t[e])&&s(r)?t[e]():u(r)&&t.getAttribute&&t.getAttribute(e)||r}function ha(t,e){return(t=t.split(",")).forEach(e)||t}function ia(t){return Math.round(1e5*t)/1e5||0}function ja(t){return Math.round(1e7*t)/1e7||0}function ka(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 la(t,e){for(var r=e.length,i=0;t.indexOf(e[i])<0&&++i<r;);return i<r}function ma(){var t,e,r=dt.length,i=dt.slice(0);for(ct={},t=dt.length=0;t<r;t++)(e=i[t])&&e._lazy&&(e.render(e._lazy[0],e._lazy[1],!0)._lazy=0)}function na(t){return!!(t._initted||t._startAt||t.add)}function oa(t,e,r,i){dt.length&&!L&&ma(),t.render(e,r,i||!!(L&&e<0&&na(t))),dt.length&&!L&&ma()}function pa(t){var e=parseFloat(t);return(e||0===e)&&(t+"").match(at).length<2?e:r(t)?t.trim():t}function qa(t){return t}function ra(t,e){for(var r in e)r in t||(t[r]=e[r]);return t}function ua(t,e){for(var r in e)"__proto__"!==r&&"constructor"!==r&&"prototype"!==r&&(t[r]=v(e[r])?ua(t[r]||(t[r]={}),e[r]):e[r]);return t}function va(t,e){var r,i={};for(r in t)r in e||(i[r]=t[r]);return i}function wa(t){var e=t.parent||I,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])}}($(t.keyframes)):ra;if(w(t.inherit))for(;e;)r(t,e.vars.defaults),e=e.parent||e._dp;return t}function ya(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 za(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 Aa(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Ba(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 Da(t,e,r,i){return t._startAt&&(L?t._startAt.revert(ht):t.vars.immediateRender&&!t.vars.autoRevert||t._startAt.render(e,!0,i))}function Fa(t){return t._repeat?Tt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ha(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ia(t){return t._end=ja(t._start+(t._tDur/Math.abs(t._ts||t._rts||U)||0))}function Ja(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=ja(r._time-(0<t._ts?e/t._ts:((t._dirty?t.totalDuration():t._tDur)-e)/-t._ts)),Ia(t),r._dirty||Ba(r,t)),t}function Ka(t,e){var r;if((e._time||!e._dur&&e._initted||e._start<t._time&&(e._dur||!e.add))&&(r=Ha(t.rawTime(),e),(!e._dur||Mt(0,e.totalDuration(),r)-e._tTime>U)&&e.render(r,!0)),Ba(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=-U}}function La(e,r,i,n){return r.parent&&Aa(r),r._start=ja((t(i)?i:i||e!==I?xt(e,i,r):e._time)+r._delay),r._end=ja(r._start+(r.totalDuration()/Math.abs(r.timeScale())||0)),ya(e,r,"_first","_last",e._sort?"_start":0),bt(r)||(e._recent=r),n||Ka(e,r),e._ts<0&&Ja(e,e._tTime),e}function Ma(t,e){return(ot.ScrollTrigger||Q("scrollTrigger",e))&&ot.ScrollTrigger.create(e,t)}function Na(t,e,r,i,n){return Wt(t,e,n),t._initted?!r&&t._pt&&!L&&(t._dur&&!1!==t.vars.lazy||!t._dur&&t.vars.lazy)&&f!==Rt.frame?(dt.push(t),t._lazy=[n,i],1):void 0:1}function Sa(t,e,r,i){var n=t._repeat,a=ja(e)||0,s=t._tTime/t._tDur;return s&&!i&&(t._time*=a/t._dur),t._dur=a,t._tDur=n?n<0?1e10:ja(a*(n+1)+t._rDelay*n):a,0<s&&!i&&Ja(t,t._tTime=t._tDur*s),t.parent&&Ia(t),r||Ba(t.parent,t),t}function Ta(t){return t instanceof Qt?Ba(t):Sa(t,t._dur)}function Wa(e,r,i){var n,a,s=t(r[1]),o=(s?2:1)+(e<2?0:1),u=r[o];if(s&&(u.duration=r[1]),u.parent=i,e){for(n=u,a=i;a&&!("immediateRender"in n);)n=a.vars.defaults||{},a=w(a.vars.inherit)&&a.parent;u.immediateRender=w(n.immediateRender),e<2?u.runBackwards=1:u.startAt=r[o-1]}return new Jt(r[0],u,r[1+o])}function Xa(t,e){return t||0===t?e(t):e}function Za(t,e){return r(t)&&(e=st.exec(t))?e[1]:""}function ab(t,e){return t&&v(t)&&"length"in t&&(!e&&!t.length||t.length-1 in t&&v(t[0]))&&!t.nodeType&&t!==h}function db(r){return r=Ot(r)[0]||R("Invalid scope")||{},function(t){var e=r.current||r.nativeElement||r;return Ot(t,e.querySelectorAll?e:e===r?R("Invalid scope")||a.createElement("div"):r)}}function eb(t){return t.sort(function(){return.5-Math.random()})}function fb(t){if(s(t))return t;var p=v(t)?t:{each:t},_=Yt(p.ease),m=p.from||0,g=parseFloat(p.base)||0,y={},e=0<m&&m<1,T=isNaN(m)||e,b=p.axis,w=m,x=m;return r(m)?w=x={center:.5,edges:.5,end:1}[m]||0:!e&&T&&(w=m[0],x=m[1]),function(t,e,r){var i,n,a,s,o,u,h,l,f,d=(r||p).length,c=y[d];if(!c){if(!(f="auto"===p.grid?0:(p.grid||[1,N])[1])){for(h=-N;h<(h=r[f++].getBoundingClientRect().left)&&f<d;);f<d&&f--}for(c=y[d]=[],i=T?Math.min(f,d)*w-.5:m%f,n=f===N?0:T?d*x/f-.5:m/f|0,l=N,u=h=0;u<d;u++)a=u%f-i,s=n-(u/f|0),c[u]=o=b?Math.abs("y"===b?s:a):G(a*a+s*s),h<o&&(h=o),o<l&&(l=o);"random"===m&&eb(c),c.max=h-l,c.min=l,c.v=d=(parseFloat(p.amount)||parseFloat(p.each)*(d<f?d-1:b?"y"===b?d/f:f:Math.max(f,d/f))||0)*("edges"===m?-1:1),c.b=d<0?g-d:g,c.u=Za(p.amount||p.each)||0,_=_&&d<0?jt(_):_}return d=(c[t]-c.min)/c.max||0,ja(c.b+(_?_(d):d)*c.v)+c.u}}function gb(i){var n=Math.pow(10,((i+"").split(".")[1]||"").length);return function(e){var r=ja(Math.round(parseFloat(e)/i)*i*n);return(r-r%1)/n+(t(e)?0:Za(e))}}function hb(h,e){var l,f,r=$(h);return!r&&v(h)&&(l=r=h.radius||N,h.values?(h=Ot(h.values),(f=!t(h[0]))&&(l*=l)):h=gb(h.increment)),Xa(e,r?s(h)?function(t){return f=h(t),Math.abs(f-t)<=l?f:t}:function(e){for(var r,i,n=parseFloat(f?e.x:e),a=parseFloat(f?e.y:0),s=N,o=0,u=h.length;u--;)(r=f?(r=h[u].x-n)*r+(i=h[u].y-a)*i:Math.abs(h[u]-n))<s&&(s=r,o=u);return o=!l||s<=l?h[o]:e,f||o===e||t(e)?o:o+Za(e)}:gb(h))}function ib(t,e,r,i){return Xa($(t)?!e:!0===r?!!(r=0):!i,function(){return $(t)?t[~~(Math.random()*t.length)]:(r=r||1e-5)&&(i=r<1?Math.pow(10,(r+"").length-2):1)&&Math.floor(Math.round((t-r/2+Math.random()*(e-t+.99*r))/r)*r*i)/i})}function mb(e,r,t){return Xa(t,function(t){return e[~~r(t)]})}function pb(t){for(var e,r,i,n,a=0,s="";~(e=t.indexOf("random(",a));)i=t.indexOf(")",e),n="["===t.charAt(e+7),r=t.substr(e+7,i-e-7).match(n?at:tt),s+=t.substr(a,e-a)+ib(n?r:+r[0],n?0:+r[1],+r[2]||1e-5),a=i+1;return s+t.substr(a,t.length-a)}function sb(t,e,r){var i,n,a,s=t.labels,o=N;for(i in s)(n=s[i]-e)<0==!!r&&n&&o>(n=Math.abs(n))&&(a=i,o=n);return a}function ub(t){return Aa(t),t.scrollTrigger&&t.scrollTrigger.kill(!!L),t.progress()<1&&Pt(t,"onInterrupt"),t}function xb(t){if(t)if(t=!t.name&&t.default||t,x()||t.headless){var e=t.name,r=s(t),i=e&&!r&&t.init?function(){this._props=[]}:t,n={init:T,render:ue,add:Vt,kill:de,modifier:he,rawVars:0},a={targetTest:0,get:0,getSetter:ie,aliases:{},register:0};if(Ft(),t!==i){if(pt[e])return;ra(i,ra(va(t,n),a)),yt(i.prototype,yt(n,va(t,a))),pt[i.prop=e]=i,t.targetTest&&(gt.push(i),ft[e]=1),e=("css"===e?"CSS":e.charAt(0).toUpperCase()+e.substr(1))+"Plugin"}S(e,i),t.register&&t.register(ze,i,ge)}else Ct.push(t)}function Ab(t,e,r){return(6*(t+=t<0?1:1<t?-1:0)<1?e+(r-e)*t*6:t<.5?r:3*t<2?e+(r-e)*(2/3-t)*6:e)*St+.5|0}function Bb(e,r,i){var n,a,s,o,u,h,l,f,d,c,p=e?t(e)?[e>>16,e>>8&St,e&St]:0:Dt.black;if(!p){if(","===e.substr(-1)&&(e=e.substr(0,e.length-1)),Dt[e])p=Dt[e];else if("#"===e.charAt(0)){if(e.length<6&&(e="#"+(n=e.charAt(1))+n+(a=e.charAt(2))+a+(s=e.charAt(3))+s+(5===e.length?e.charAt(4)+e.charAt(4):"")),9===e.length)return[(p=parseInt(e.substr(1,6),16))>>16,p>>8&St,p&St,parseInt(e.substr(7),16)/255];p=[(e=parseInt(e.substr(1),16))>>16,e>>8&St,e&St]}else if("hsl"===e.substr(0,3))if(p=c=e.match(tt),r){if(~e.indexOf("="))return p=e.match(et),i&&p.length<4&&(p[3]=1),p}else o=+p[0]%360/360,u=p[1]/100,n=2*(h=p[2]/100)-(a=h<=.5?h*(u+1):h+u-h*u),3<p.length&&(p[3]*=1),p[0]=Ab(o+1/3,n,a),p[1]=Ab(o,n,a),p[2]=Ab(o-1/3,n,a);else p=e.match(tt)||Dt.transparent;p=p.map(Number)}return r&&!c&&(n=p[0]/St,a=p[1]/St,s=p[2]/St,h=((l=Math.max(n,a,s))+(f=Math.min(n,a,s)))/2,l===f?o=u=0:(d=l-f,u=.5<h?d/(2-l-f):d/(l+f),o=l===n?(a-s)/d+(a<s?6:0):l===a?(s-n)/d+2:(n-a)/d+4,o*=60),p[0]=~~(o+.5),p[1]=~~(100*u+.5),p[2]=~~(100*h+.5)),i&&p.length<4&&(p[3]=1),p}function Cb(t){var r=[],i=[],n=-1;return t.split(zt).forEach(function(t){var e=t.match(rt)||[];r.push.apply(r,e),i.push(n+=e.length+1)}),r.c=i,r}function Db(t,e,r){var i,n,a,s,o="",u=(t+o).match(zt),h=e?"hsla(":"rgba(",l=0;if(!u)return t;if(u=u.map(function(t){return(t=Bb(t,e,1))&&h+(e?t[0]+","+t[1]+"%,"+t[2]+"%,"+t[3]:t.join(","))+")"}),r&&(a=Cb(t),(i=r.c).join(o)!==a.c.join(o)))for(s=(n=t.replace(zt,"1").split(rt)).length-1;l<s;l++)o+=n[l]+(~i.indexOf(l)?u.shift()||h+"0,0,0,0)":(a.length?a:u.length?u:r).shift());if(!n)for(s=(n=t.split(zt)).length-1;l<s;l++)o+=n[l]+u[l];return o+n[s]}function Gb(t){var e,r=t.join(" ");if(zt.lastIndex=0,zt.test(r))return e=Et.test(r),t[1]=Db(t[1],e),t[0]=Db(t[0],e,Cb(t[1])),!0}function Pb(t){var e=(t+"").split("("),r=Lt[e[0]];return r&&1<e.length&&r.config?r.config.apply(null,~t.indexOf("{")?[function _parseObjectInString(t){for(var e,r,i,n={},a=t.substr(1,t.length-3).split(":"),s=a[0],o=1,u=a.length;o<u;o++)r=a[o],e=o!==u-1?r.lastIndexOf(","):r.length,i=r.substr(0,e),n[s]=isNaN(i)?i.replace(Bt,"").trim():+i,s=r.substr(e+1).trim();return n}(e[1])]:function _valueInParentheses(t){var e=t.indexOf("(")+1,r=t.indexOf(")"),i=t.indexOf("(",e);return t.substring(e,~i&&i<r?t.indexOf(")",r+1):r)}(t).split(",").map(pa)):Lt._CE&&It.test(t)?Lt._CE("",t):r}function Rb(t,e){for(var r,i=t._first;i;)i instanceof Qt?Rb(i,e):!i.vars.yoyoEase||i._yoyo&&i._repeat||i._yoyo===e||(i.timeline?Rb(i.timeline,e):(r=i._ease,i._ease=i._yEase,i._yEase=r,i._yoyo=e)),i=i._next}function Tb(t,e,r,i){void 0===r&&(r=function easeOut(t){return 1-e(1-t)}),void 0===i&&(i=function easeInOut(t){return t<.5?e(2*t)/2:1-e(2*(1-t))/2});var n,a={easeIn:e,easeOut:r,easeInOut:i};return ha(t,function(t){for(var e in Lt[t]=ot[t]=a,Lt[n=t.toLowerCase()]=r,a)Lt[n+("easeIn"===e?".in":"easeOut"===e?".out":".inOut")]=Lt[t+"."+e]=a[e]}),a}function Ub(e){return function(t){return t<.5?(1-e(1-2*t))/2:.5+e(2*(t-.5))/2}}function Vb(r,t,e){function Lm(t){return 1===t?1:i*Math.pow(2,-10*t)*K((t-a)*n)+1}var i=1<=t?t:1,n=(e||(r?.3:.45))/(t<1?t:1),a=n/q*(Math.asin(1/i)||0),s="out"===r?Lm:"in"===r?function(t){return 1-Lm(1-t)}:Ub(Lm);return n=q/n,s.config=function(t,e){return Vb(r,t,e)},s}function Wb(e,r){function Tm(t){return t?--t*t*((r+1)*t+r)+1:0}void 0===r&&(r=1.70158);var t="out"===e?Tm:"in"===e?function(t){return 1-Tm(1-t)}:Ub(Tm);return t.config=function(t){return Wb(e,t)},t}var F,L,l,I,h,n,a,i,o,f,d,c,p,_,m,g,b,M,k,O,A,C,D,z,E,B,j,Y,X={autoSleep:120,force3D:"auto",nullTargetWarn:1,units:{lineHeight:""}},Z={duration:.5,overwrite:!1,delay:0},N=1e8,U=1/N,q=2*Math.PI,V=q/4,W=0,G=Math.sqrt,H=Math.cos,K=Math.sin,J="function"==typeof ArrayBuffer&&ArrayBuffer.isView||function(){},$=Array.isArray,tt=/(?:-?\.?\d|\.)+/gi,et=/[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g,rt=/[-+=.]*\d+[.e-]*\d*[a-z%]*/g,it=/[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi,nt=/[+-]=-?[.\d]+/,at=/[^,'"\[\]\s]+/gi,st=/^[+\-=e\s\d]*\d+[.\d]*([a-z]*|%)\s*$/i,ot={},ut={suppressEvents:!0,isStart:!0,kill:!1},ht={suppressEvents:!0,kill:!1},lt={suppressEvents:!0},ft={},dt=[],ct={},pt={},_t={},mt=30,gt=[],vt="",yt=function _merge(t,e){for(var r in e)t[r]=e[r];return t},Tt=function _animationCycle(t,e){var r=Math.floor(t=ja(t/e));return t&&r===t?r-1:r},bt=function _isFromOrFromStart(t){var e=t.data;return"isFromStart"===e||"isStart"===e},wt={_start:0,endTime:T,totalDuration:T},xt=function _parsePosition(t,e,i){var n,a,s,o=t.labels,u=t._recent||wt,h=t.duration()>=N?u.endTime(!1):t._dur;return r(e)&&(isNaN(e)||e in o)?(a=e.charAt(0),s="%"===e.substr(-1),n=e.indexOf("="),"<"===a||">"===a?(0<=n&&(e=e.replace(/=/,"")),("<"===a?u._start:u.endTime(0<=u._repeat))+(parseFloat(e.substr(1))||0)*(s?(n<0?u:i).totalDuration()/100:1)):n<0?(e in o||(o[e]=h),o[e]):(a=parseFloat(e.charAt(n-1)+e.substr(n+1)),s&&i&&(a=a/100*($(i)?i[0]:i).totalDuration()),1<n?_parsePosition(t,e.substr(0,n-1),i)+a:h+a)):null==e?h:+e},Mt=function _clamp(t,e,r){return r<t?t:e<r?e:r},kt=[].slice,Ot=function toArray(t,e,i){return l&&!e&&l.selector?l.selector(t):!r(t)||i||!n&&Ft()?$(t)?function _flatten(t,e,i){return void 0===i&&(i=[]),t.forEach(function(t){return r(t)&&!e||ab(t,1)?i.push.apply(i,Ot(t)):i.push(t)})||i}(t,i):ab(t)?kt.call(t,0):t?[t]:[]:kt.call((e||a).querySelectorAll(t),0)},At=function mapRange(e,t,r,i,n){var a=t-e,s=i-r;return Xa(n,function(t){return r+((t-e)/a*s||0)})},Pt=function _callback(t,e,r){var i,n,a,s=t.vars,o=s[e],u=l,h=t._ctx;if(o)return i=s[e+"Params"],n=s.callbackScope||t,r&&dt.length&&ma(),h&&(l=h),a=i?o.apply(n,i):o.call(n),l=u,a},Ct=[],St=255,Dt={aqua:[0,St,St],lime:[0,St,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,St],navy:[0,0,128],white:[St,St,St],olive:[128,128,0],yellow:[St,St,0],orange:[St,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[St,0,0],pink:[St,192,203],cyan:[0,St,St],transparent:[St,St,St,0]},zt=function(){var t,e="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b";for(t in Dt)e+="|"+t+"\\b";return new RegExp(e+")","gi")}(),Et=/hsl[a]?\(/,Rt=(k=Date.now,O=500,A=33,C=k(),D=C,E=z=1e3/240,g={time:0,frame:0,tick:function tick(){Al(!0)},deltaRatio:function deltaRatio(t){return b/(1e3/(t||60))},wake:function wake(){o&&(!n&&x()&&(h=n=window,a=h.document||{},ot.gsap=ze,(h.gsapVersions||(h.gsapVersions=[])).push(ze.version),P(i||h.GreenSockGlobals||!h.gsap&&h||{}),Ct.forEach(xb)),m="undefined"!=typeof requestAnimationFrame&&requestAnimationFrame,p&&g.sleep(),_=m||function(t){return setTimeout(t,E-1e3*g.time+1|0)},c=1,Al(2))},sleep:function sleep(){(m?cancelAnimationFrame:clearTimeout)(p),c=0,_=T},lagSmoothing:function lagSmoothing(t,e){O=t||1/0,A=Math.min(e||33,O)},fps:function fps(t){z=1e3/(t||240),E=1e3*g.time+z},add:function add(n,t,e){var a=t?function(t,e,r,i){n(t,e,r,i),g.remove(a)}:n;return g.remove(n),B[e?"unshift":"push"](a),Ft(),a},remove:function remove(t,e){~(e=B.indexOf(t))&&B.splice(e,1)&&e<=M&&M--},_listeners:B=[]}),Ft=function _wake(){return!c&&Rt.wake()},Lt={},It=/^[\d.\-M][\d.\-,\s]/,Bt=/["']/g,jt=function _invertEase(e){return function(t){return 1-e(1-t)}},Yt=function _parseEase(t,e){return t&&(s(t)?t:Lt[t]||Pb(t))||e};function Al(t){var e,r,i,n,a=k()-D,s=!0===t;if((O<a||a<0)&&(C+=a-A),(0<(e=(i=(D+=a)-C)-E)||s)&&(n=++g.frame,b=i-1e3*g.time,g.time=i/=1e3,E+=e+(z<=e?4:z-e),r=1),s||(p=_(Al)),r)for(M=0;M<B.length;M++)B[M](i,b,n,t)}function jn(t){return t<Y?j*t*t:t<.7272727272727273?j*Math.pow(t-1.5/2.75,2)+.75:t<.9090909090909092?j*(t-=2.25/2.75)*t+.9375:j*Math.pow(t-2.625/2.75,2)+.984375}ha("Linear,Quad,Cubic,Quart,Quint,Strong",function(t,e){var r=e<5?e+1:e;Tb(t+",Power"+(r-1),e?function(t){return Math.pow(t,r)}:function(t){return t},function(t){return 1-Math.pow(1-t,r)},function(t){return t<.5?Math.pow(2*t,r)/2:1-Math.pow(2*(1-t),r)/2})}),Lt.Linear.easeNone=Lt.none=Lt.Linear.easeIn,Tb("Elastic",Vb("in"),Vb("out"),Vb()),j=7.5625,Y=1/2.75,Tb("Bounce",function(t){return 1-jn(1-t)},jn),Tb("Expo",function(t){return Math.pow(2,10*(t-1))*t+t*t*t*t*t*t*(1-t)}),Tb("Circ",function(t){return-(G(1-t*t)-1)}),Tb("Sine",function(t){return 1===t?1:1-H(t*V)}),Tb("Back",Wb("in"),Wb("out"),Wb()),Lt.SteppedEase=Lt.steps=ot.SteppedEase={config:function config(t,e){void 0===t&&(t=1);var r=1/t,i=t+(e?0:1),n=e?1:0;return function(t){return((i*Mt(0,.99999999,t)|0)+n)*r}}},Z.ease=Lt["quad.out"],ha("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt",function(t){return vt+=t+","+t+"Params,"});var Xt,Zt=function GSCache(t,e){this.id=W++,(t._gsap=this).target=t,this.harness=e,this.get=e?e.get:ga,this.set=e?e.getSetter:ie},Nt=((Xt=Animation.prototype).delay=function delay(t){return t||0===t?(this.parent&&this.parent.smoothChildTiming&&this.startTime(this._start+t-this._delay),this._delay=t,this):this._delay},Xt.duration=function duration(t){return arguments.length?this.totalDuration(0<this._repeat?t+(t+this._rDelay)*this._repeat:t):this.totalDuration()&&this._dur},Xt.totalDuration=function totalDuration(t){return arguments.length?(this._dirty=0,Sa(this,this._repeat<0?t:(t-this._repeat*this._rDelay)/(this._repeat+1))):this._tDur},Xt.totalTime=function totalTime(t,e){if(Ft(),!arguments.length)return this._tTime;var r=this._dp;if(r&&r.smoothChildTiming&&this._ts){for(Ja(this,t),!r._dp||r.parent||Ka(r,this);r&&r.parent;)r.parent._time!==r._start+(0<=r._ts?r._tTime/r._ts:(r.totalDuration()-r._tTime)/-r._ts)&&r.totalTime(r._tTime,!0),r=r.parent;!this.parent&&this._dp.autoRemoveChildren&&(0<this._ts&&t<this._tDur||this._ts<0&&0<t||!this._tDur&&!t)&&La(this._dp,this,this._start-this._delay)}return(this._tTime!==t||!this._dur&&!e||this._initted&&Math.abs(this._zTime)===U||!t&&!this._initted&&(this.add||this._ptLookup))&&(this._ts||(this._pTime=t),oa(this,t,e)),this},Xt.time=function time(t,e){return arguments.length?this.totalTime(Math.min(this.totalDuration(),t+Fa(this))%(this._dur+this._rDelay)||(t?this._dur:0),e):this._time},Xt.totalProgress=function totalProgress(t,e){return arguments.length?this.totalTime(this.totalDuration()*t,e):this.totalDuration()?Math.min(1,this._tTime/this._tDur):0<=this.rawTime()&&this._initted?1:0},Xt.progress=function progress(t,e){return arguments.length?this.totalTime(this.duration()*(!this._yoyo||1&this.iteration()?t:1-t)+Fa(this),e):this.duration()?Math.min(1,this._time/this._dur):0<this.rawTime()?1:0},Xt.iteration=function iteration(t,e){var r=this.duration()+this._rDelay;return arguments.length?this.totalTime(this._time+(t-1)*r,e):this._repeat?Tt(this._tTime,r)+1:1},Xt.timeScale=function timeScale(t,e){if(!arguments.length)return this._rts===-U?0:this._rts;if(this._rts===t)return this;var r=this.parent&&this._ts?Ha(this.parent._time,this):this._tTime;return this._rts=+t||0,this._ts=this._ps||t===-U?0:this._rts,this.totalTime(Mt(-Math.abs(this._delay),this.totalDuration(),r),!1!==e),Ia(this),function _recacheAncestors(t){for(var e=t.parent;e&&e.parent;)e._dirty=1,e.totalDuration(),e=e.parent;return t}(this)},Xt.paused=function paused(t){return arguments.length?(this._ps!==t&&((this._ps=t)?(this._pTime=this._tTime||Math.max(-this._delay,this.rawTime()),this._ts=this._act=0):(Ft(),this._ts=this._rts,this.totalTime(this.parent&&!this.parent.smoothChildTiming?this.rawTime():this._tTime||this._pTime,1===this.progress()&&Math.abs(this._zTime)!==U&&(this._tTime-=U)))),this):this._ps},Xt.startTime=function startTime(t){if(arguments.length){this._start=t;var e=this.parent||this._dp;return!e||!e._sort&&this.parent||La(e,this,t-this._delay),this}return this._start},Xt.endTime=function endTime(t){return this._start+(w(t)?this.totalDuration():this.duration())/Math.abs(this._ts||1)},Xt.rawTime=function rawTime(t){var e=this.parent||this._dp;return e?t&&(!this._ts||this._repeat&&this._time&&this.totalProgress()<1)?this._tTime%(this._dur+this._rDelay):this._ts?Ha(e.rawTime(t),this):this._tTime:this._tTime},Xt.revert=function revert(t){void 0===t&&(t=lt);var e=L;return L=t,na(this)&&(this.timeline&&this.timeline.revert(t),this.totalTime(-.01,t.suppressEvents)),"nested"!==this.data&&!1!==t.kill&&this.kill(),L=e,this},Xt.globalTime=function globalTime(t){for(var e=this,r=arguments.length?t:e.rawTime();e;)r=e._start+r/(Math.abs(e._ts)||1),e=e._dp;return!this.parent&&this._sat?this._sat.globalTime(t):r},Xt.repeat=function repeat(t){return arguments.length?(this._repeat=t===1/0?-2:t,Ta(this)):-2===this._repeat?1/0:this._repeat},Xt.repeatDelay=function repeatDelay(t){if(arguments.length){var e=this._time;return this._rDelay=t,Ta(this),e?this.time(e):this}return this._rDelay},Xt.yoyo=function yoyo(t){return arguments.length?(this._yoyo=t,this):this._yoyo},Xt.seek=function seek(t,e){return this.totalTime(xt(this,t),w(e))},Xt.restart=function restart(t,e){return this.play().totalTime(t?-this._delay:0,w(e)),this._dur||(this._zTime=-U),this},Xt.play=function play(t,e){return null!=t&&this.seek(t,e),this.reversed(!1).paused(!1)},Xt.reverse=function reverse(t,e){return null!=t&&this.seek(t||this.totalDuration(),e),this.reversed(!0).paused(!1)},Xt.pause=function pause(t,e){return null!=t&&this.seek(t,e),this.paused(!0)},Xt.resume=function resume(){return this.paused(!1)},Xt.reversed=function reversed(t){return arguments.length?(!!t!==this.reversed()&&this.timeScale(-this._rts||(t?-U:0)),this):this._rts<0},Xt.invalidate=function invalidate(){return this._initted=this._act=0,this._zTime=-U,this},Xt.isActive=function isActive(){var t,e=this.parent||this._dp,r=this._start;return!(e&&!(this._ts&&this._initted&&e.isActive()&&(t=e.rawTime(!0))>=r&&t<this.endTime(!0)-U))},Xt.eventCallback=function eventCallback(t,e,r){var i=this.vars;return 1<arguments.length?(e?(i[t]=e,r&&(i[t+"Params"]=r),"onUpdate"===t&&(this._onUpdate=e)):delete i[t],this):i[t]},Xt.then=function then(t){var i=this;return new Promise(function(e){function Eo(){var t=i.then;i.then=null,s(r)&&(r=r(i))&&(r.then||r===i)&&(i.then=t),e(r),i.then=t}var r=s(t)?t:qa;i._initted&&1===i.totalProgress()&&0<=i._ts||!i._tTime&&i._ts<0?Eo():i._prom=Eo})},Xt.kill=function kill(){ub(this)},Animation);function Animation(t){this.vars=t,this._delay=+t.delay||0,(this._repeat=t.repeat===1/0?-2:t.repeat||0)&&(this._rDelay=t.repeatDelay||0,this._yoyo=!!t.yoyo||!!t.yoyoEase),this._ts=1,Sa(this,+t.duration,1,1),this.data=t.data,l&&(this._ctx=l).data.push(this),c||Rt.wake()}ra(Nt.prototype,{_time:0,_start:0,_end:0,_tTime:0,_tDur:0,_dirty:0,_repeat:0,_yoyo:!1,parent:null,_initted:!1,_rDelay:0,_ts:1,_dp:0,ratio:0,_zTime:-U,_prom:0,_ps:!1,_rts:1});var Qt=function(i){function Timeline(t,e){var r;return void 0===t&&(t={}),(r=i.call(this,t)||this).labels={},r.smoothChildTiming=!!t.smoothChildTiming,r.autoRemoveChildren=!!t.autoRemoveChildren,r._sort=w(t.sortChildren),I&&La(t.parent||I,_assertThisInitialized(r),e),t.reversed&&r.reverse(),t.paused&&r.paused(!0),t.scrollTrigger&&Ma(_assertThisInitialized(r),t.scrollTrigger),r}_inheritsLoose(Timeline,i);var e=Timeline.prototype;return e.to=function to(t,e,r){return Wa(0,arguments,this),this},e.from=function from(t,e,r){return Wa(1,arguments,this),this},e.fromTo=function fromTo(t,e,r,i){return Wa(2,arguments,this),this},e.set=function set(t,e,r){return e.duration=0,e.parent=this,wa(e).repeatDelay||(e.repeat=0),e.immediateRender=!!e.immediateRender,new Jt(t,e,xt(this,r),1),this},e.call=function call(t,e,r){return La(this,Jt.delayedCall(0,t,e),r)},e.staggerTo=function staggerTo(t,e,r,i,n,a,s){return r.duration=e,r.stagger=r.stagger||i,r.onComplete=a,r.onCompleteParams=s,r.parent=this,new Jt(t,r,xt(this,n)),this},e.staggerFrom=function staggerFrom(t,e,r,i,n,a,s){return r.runBackwards=1,wa(r).immediateRender=w(r.immediateRender),this.staggerTo(t,e,r,i,n,a,s)},e.staggerFromTo=function staggerFromTo(t,e,r,i,n,a,s,o){return i.startAt=r,wa(i).immediateRender=w(i.immediateRender),this.staggerTo(t,e,i,n,a,s,o)},e.render=function render(t,e,r){var i,n,a,s,o,u,h,l,f,d,c,p,_=this._time,m=this._dirty?this.totalDuration():this._tDur,g=this._dur,v=t<=0?0:ja(t),y=this._zTime<0!=t<0&&(this._initted||!g);if(this!==I&&m<v&&0<=t&&(v=m),v!==this._tTime||r||y){if(_!==this._time&&g&&(v+=this._time-_,t+=this._time-_),i=v,f=this._start,u=!(l=this._ts),y&&(g||(_=this._zTime),!t&&e||(this._zTime=t)),this._repeat){if(c=this._yoyo,o=g+this._rDelay,this._repeat<-1&&t<0)return this.totalTime(100*o+t,e,r);if(i=ja(v%o),v===m?(s=this._repeat,i=g):((s=~~(d=ja(v/o)))&&s===d&&(i=g,s--),g<i&&(i=g)),d=Tt(this._tTime,o),!_&&this._tTime&&d!==s&&this._tTime-d*o-this._dur<=0&&(d=s),c&&1&s&&(i=g-i,p=1),s!==d&&!this._lock){var T=c&&1&d,b=T===(c&&1&s);if(s<d&&(T=!T),_=T?0:v%g?g:v,this._lock=1,this.render(_||(p?0:ja(s*o)),e,!g)._lock=0,this._tTime=v,!e&&this.parent&&Pt(this,"onRepeat"),this.vars.repeatRefresh&&!p&&(this.invalidate()._lock=1),_&&_!==this._time||u!=!this._ts||this.vars.onRepeat&&!this.parent&&!this._act)return this;if(g=this._dur,m=this._tDur,b&&(this._lock=2,_=T?g:-1e-4,this.render(_,!0),this.vars.repeatRefresh&&!p&&this.invalidate()),this._lock=0,!this._ts&&!u)return this;Rb(this,p)}}if(this._hasPause&&!this._forcing&&this._lock<2&&(h=function _findNextPauseTween(t,e,r){var i;if(e<r)for(i=t._first;i&&i._start<=r;){if("isPause"===i.data&&i._start>e)return i;i=i._next}else for(i=t._last;i&&i._start>=r;){if("isPause"===i.data&&i._start<e)return i;i=i._prev}}(this,ja(_),ja(i)))&&(v-=i-(i=h._start)),this._tTime=v,this._time=i,this._act=!l,this._initted||(this._onUpdate=this.vars.onUpdate,this._initted=1,this._zTime=t,_=0),!_&&v&&!e&&!d&&(Pt(this,"onStart"),this._tTime!==v))return this;if(_<=i&&0<=t)for(n=this._first;n;){if(a=n._next,(n._act||i>=n._start)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0<n._ts?(i-n._start)*n._ts:(n._dirty?n.totalDuration():n._tDur)+(i-n._start)*n._ts,e,r),i!==this._time||!this._ts&&!u){h=0,a&&(v+=this._zTime=-U);break}}n=a}else{n=this._last;for(var w=t<0?t:i;n;){if(a=n._prev,(n._act||w<=n._end)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0<n._ts?(w-n._start)*n._ts:(n._dirty?n.totalDuration():n._tDur)+(w-n._start)*n._ts,e,r||L&&na(n)),i!==this._time||!this._ts&&!u){h=0,a&&(v+=this._zTime=w?-U:U);break}}n=a}}if(h&&!e&&(this.pause(),h.render(_<=i?0:-U)._zTime=_<=i?1:-1,this._ts))return this._start=f,Ia(this),this.render(t,e,r);this._onUpdate&&!e&&Pt(this,"onUpdate",!0),(v===m&&this._tTime>=this.totalDuration()||!v&&_)&&(f!==this._start&&Math.abs(l)===Math.abs(this._ts)||this._lock||(!t&&g||!(v===m&&0<this._ts||!v&&this._ts<0)||Aa(this,1),e||t<0&&!_||!v&&!_&&m||(Pt(this,v===m&&0<=t?"onComplete":"onReverseComplete",!0),!this._prom||v<m&&0<this.timeScale()||this._prom())))}return this},e.add=function add(e,i){var n=this;if(t(i)||(i=xt(this,i,e)),!(e instanceof Nt)){if($(e))return e.forEach(function(t){return n.add(t,i)}),this;if(r(e))return this.addLabel(e,i);if(!s(e))return this;e=Jt.delayedCall(0,e)}return this!==e?La(this,e,i):this},e.getChildren=function getChildren(t,e,r,i){void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===r&&(r=!0),void 0===i&&(i=-N);for(var n=[],a=this._first;a;)a._start>=i&&(a instanceof Jt?e&&n.push(a):(r&&n.push(a),t&&n.push.apply(n,a.getChildren(!0,e,r)))),a=a._next;return n},e.getById=function getById(t){for(var e=this.getChildren(1,1,1),r=e.length;r--;)if(e[r].vars.id===t)return e[r]},e.remove=function remove(t){return r(t)?this.removeLabel(t):s(t)?this.killTweensOf(t):(t.parent===this&&za(this,t),t===this._recent&&(this._recent=this._last),Ba(this))},e.totalTime=function totalTime(t,e){return arguments.length?(this._forcing=1,!this._dp&&this._ts&&(this._start=ja(Rt.time-(0<this._ts?t/this._ts:(this.totalDuration()-t)/-this._ts))),i.prototype.totalTime.call(this,t,e),this._forcing=0,this):this._tTime},e.addLabel=function addLabel(t,e){return this.labels[t]=xt(this,e),this},e.removeLabel=function removeLabel(t){return delete this.labels[t],this},e.addPause=function addPause(t,e,r){var i=Jt.delayedCall(0,e||T,r);return i.data="isPause",this._hasPause=1,La(this,i,xt(this,t))},e.removePause=function removePause(t){var e=this._first;for(t=xt(this,t);e;)e._start===t&&"isPause"===e.data&&Aa(e),e=e._next},e.killTweensOf=function killTweensOf(t,e,r){for(var i=this.getTweensOf(t,r),n=i.length;n--;)Ut!==i[n]&&i[n].kill(t,e);return this},e.getTweensOf=function getTweensOf(e,r){for(var i,n=[],a=Ot(e),s=this._first,o=t(r);s;)s instanceof Jt?la(s._targets,a)&&(o?(!Ut||s._initted&&s._ts)&&s.globalTime(0)<=r&&s.globalTime(s.totalDuration())>r:!r||s.isActive())&&n.push(s):(i=s.getTweensOf(a,r)).length&&n.push.apply(n,i),s=s._next;return n},e.tweenTo=function tweenTo(t,e){e=e||{};var r,i=this,n=xt(i,t),a=e.startAt,s=e.onStart,o=e.onStartParams,u=e.immediateRender,h=Jt.to(i,ra({ease:e.ease||"none",lazy:!1,immediateRender:!1,time:n,overwrite:"auto",duration:e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale())||U,onStart:function onStart(){if(i.pause(),!r){var t=e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale());h._dur!==t&&Sa(h,t,0,1).render(h._time,!0,!0),r=1}s&&s.apply(h,o||[])}},e));return u?h.render(0):h},e.tweenFromTo=function tweenFromTo(t,e,r){return this.tweenTo(e,ra({startAt:{time:xt(this,t)}},r))},e.recent=function recent(){return this._recent},e.nextLabel=function nextLabel(t){return void 0===t&&(t=this._time),sb(this,xt(this,t))},e.previousLabel=function previousLabel(t){return void 0===t&&(t=this._time),sb(this,xt(this,t),1)},e.currentLabel=function currentLabel(t){return arguments.length?this.seek(t,!0):this.previousLabel(this._time+U)},e.shiftChildren=function shiftChildren(t,e,r){void 0===r&&(r=0);for(var i,n=this._first,a=this.labels;n;)n._start>=r&&(n._start+=t,n._end+=t),n=n._next;if(e)for(i in a)a[i]>=r&&(a[i]+=t);return Ba(this)},e.invalidate=function invalidate(t){var e=this._first;for(this._lock=0;e;)e.invalidate(t),e=e._next;return i.prototype.invalidate.call(this,t)},e.clear=function clear(t){void 0===t&&(t=!0);for(var e,r=this._first;r;)e=r._next,this.remove(r),r=e;return this._dp&&(this._time=this._tTime=this._pTime=0),t&&(this.labels={}),Ba(this)},e.totalDuration=function totalDuration(t){var e,r,i,n=0,a=this,s=a._last,o=N;if(arguments.length)return a.timeScale((a._repeat<0?a.duration():a.totalDuration())/(a.reversed()?-t:t));if(a._dirty){for(i=a.parent;s;)e=s._prev,s._dirty&&s.totalDuration(),o<(r=s._start)&&a._sort&&s._ts&&!a._lock?(a._lock=1,La(a,s,r-s._delay,1)._lock=0):o=r,r<0&&s._ts&&(n-=r,(!i&&!a._dp||i&&i.smoothChildTiming)&&(a._start+=r/a._ts,a._time-=r,a._tTime-=r),a.shiftChildren(-r,!1,-Infinity),o=0),s._end>n&&s._ts&&(n=s._end),s=e;Sa(a,a===I&&a._time>n?a._time:n,1,1),a._dirty=0}return a._tDur},Timeline.updateRoot=function updateRoot(t){if(I._ts&&(oa(I,Ha(t,I)),f=Rt.frame),Rt.frame>=mt){mt+=X.autoSleep||120;var e=I._first;if((!e||!e._ts)&&X.autoSleep&&Rt._listeners.length<2){for(;e&&!e._ts;)e=e._next;e||Rt.sleep()}}},Timeline}(Nt);ra(Qt.prototype,{_lock:0,_hasPause:0,_forcing:0});function bc(t,e,i,n,a,o){var u,h,l,f;if(pt[t]&&!1!==(u=new pt[t]).init(a,u.rawVars?e[t]:function _processVars(t,e,i,n,a){if(s(t)&&(t=Gt(t,a,e,i,n)),!v(t)||t.style&&t.nodeType||$(t)||J(t))return r(t)?Gt(t,a,e,i,n):t;var o,u={};for(o in t)u[o]=Gt(t[o],a,e,i,n);return u}(e[t],n,a,o,i),i,n,o)&&(i._pt=h=new ge(i._pt,a,t,0,1,u.render,u,0,u.priority),i!==d))for(l=i._ptLookup[i._targets.indexOf(a)],f=u._props.length;f--;)l[u._props[f]]=h;return u}function hc(t,r,e,i){var n,a,s=r.ease||i||"power1.inOut";if($(r))a=e[t]||(e[t]=[]),r.forEach(function(t,e){return a.push({t:e/(r.length-1)*100,v:t,e:s})});else for(n in r)a=e[n]||(e[n]=[]),"ease"===n||a.push({t:parseFloat(t),v:r[n],e:s})}var Ut,qt,Vt=function _addPropTween(t,e,i,n,a,o,u,h,l,f){s(n)&&(n=n(a||0,t,o));var d,c=t[e],p="get"!==i?i:s(c)?l?t[e.indexOf("set")||!s(t["get"+e.substr(3)])?e:"get"+e.substr(3)](l):t[e]():c,_=s(c)?l?re:te:$t;if(r(n)&&(~n.indexOf("random(")&&(n=pb(n)),"="===n.charAt(1)&&(!(d=ka(p,n)+(Za(p)||0))&&0!==d||(n=d))),!f||p!==n||qt)return isNaN(p*n)||""===n?(c||e in t||Q(e,n),function _addComplexStringPropTween(t,e,r,i,n,a,s){var o,u,h,l,f,d,c,p,_=new ge(this._pt,t,e,0,1,oe,null,n),m=0,g=0;for(_.b=r,_.e=i,r+="",(c=~(i+="").indexOf("random("))&&(i=pb(i)),a&&(a(p=[r,i],t,e),r=p[0],i=p[1]),u=r.match(it)||[];o=it.exec(i);)l=o[0],f=i.substring(m,o.index),h?h=(h+1)%5:"rgba("===f.substr(-5)&&(h=1),l!==u[g++]&&(d=parseFloat(u[g-1])||0,_._pt={_next:_._pt,p:f||1===g?f:",",s:d,c:"="===l.charAt(1)?ka(d,l)-d:parseFloat(l)-d,m:h&&h<4?Math.round:0},m=it.lastIndex);return _.c=m<i.length?i.substring(m,i.length):"",_.fp=s,(nt.test(i)||c)&&(_.e=0),this._pt=_}.call(this,t,e,p,n,_,h||X.stringFilter,l)):(d=new ge(this._pt,t,e,+p||0,n-(p||0),"boolean"==typeof c?se:ne,0,_),l&&(d.fp=l),u&&d.modifier(u,this,t),this._pt=d)},Wt=function _initTween(t,e,r){var i,n,a,s,o,u,h,l,f,d,c,p,_,m=t.vars,g=m.ease,v=m.startAt,y=m.immediateRender,T=m.lazy,b=m.onUpdate,x=m.runBackwards,M=m.yoyoEase,k=m.keyframes,O=m.autoRevert,A=t._dur,P=t._startAt,C=t._targets,S=t.parent,D=S&&"nested"===S.data?S.vars.targets:C,z="auto"===t._overwrite&&!F,E=t.timeline;if(!E||k&&g||(g="none"),t._ease=Yt(g,Z.ease),t._yEase=M?jt(Yt(!0===M?g:M,Z.ease)):0,M&&t._yoyo&&!t._repeat&&(M=t._yEase,t._yEase=t._ease,t._ease=M),t._from=!E&&!!m.runBackwards,!E||k&&!m.stagger){if(p=(l=C[0]?fa(C[0]).harness:0)&&m[l.prop],i=va(m,ft),P&&(P._zTime<0&&P.progress(1),e<0&&x&&y&&!O?P.render(-1,!0):P.revert(x&&A?ht:ut),P._lazy=0),v){if(Aa(t._startAt=Jt.set(C,ra({data:"isStart",overwrite:!1,parent:S,immediateRender:!0,lazy:!P&&w(T),startAt:null,delay:0,onUpdate:b&&function(){return Pt(t,"onUpdate")},stagger:0},v))),t._startAt._dp=0,t._startAt._sat=t,e<0&&(L||!y&&!O)&&t._startAt.revert(ht),y&&A&&e<=0&&r<=0)return void(e&&(t._zTime=e))}else if(x&&A&&!P)if(e&&(y=!1),a=ra({overwrite:!1,data:"isFromStart",lazy:y&&!P&&w(T),immediateRender:y,stagger:0,parent:S},i),p&&(a[l.prop]=p),Aa(t._startAt=Jt.set(C,a)),t._startAt._dp=0,t._startAt._sat=t,e<0&&(L?t._startAt.revert(ht):t._startAt.render(-1,!0)),t._zTime=e,y){if(!e)return}else _initTween(t._startAt,U,U);for(t._pt=t._ptCache=0,T=A&&w(T)||T&&!A,n=0;n<C.length;n++){if(h=(o=C[n])._gsap||ea(C)[n]._gsap,t._ptLookup[n]=d={},ct[h.id]&&dt.length&&ma(),c=D===C?n:D.indexOf(o),l&&!1!==(f=new l).init(o,p||i,t,c,D)&&(t._pt=s=new ge(t._pt,o,f.name,0,1,f.render,f,0,f.priority),f._props.forEach(function(t){d[t]=s}),f.priority&&(u=1)),!l||p)for(a in i)pt[a]&&(f=bc(a,i,t,c,o,D))?f.priority&&(u=1):d[a]=s=Vt.call(t,o,a,"get",i[a],c,D,0,m.stringFilter);t._op&&t._op[n]&&t.kill(o,t._op[n]),z&&t._pt&&(Ut=t,I.killTweensOf(o,d,t.globalTime(e)),_=!t.parent,Ut=0),t._pt&&T&&(ct[h.id]=1)}u&&_e(t),t._onInit&&t._onInit(t)}t._onUpdate=b,t._initted=(!t._op||t._pt)&&!_,k&&e<=0&&E.render(N,!0,!0)},Gt=function _parseFuncOrString(t,e,i,n,a){return s(t)?t.call(e,i,n,a):r(t)&&~t.indexOf("random(")?pb(t):t},Ht=vt+"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert",Kt={};ha(Ht+",id,stagger,delay,duration,paused,scrollTrigger",function(t){return Kt[t]=1});var Jt=function(E){function Tween(e,r,i,n){var a;"number"==typeof r&&(i.duration=r,r=i,i=null);var s,o,u,h,l,f,d,c,p=(a=E.call(this,n?r:wa(r))||this).vars,_=p.duration,m=p.delay,g=p.immediateRender,T=p.stagger,b=p.overwrite,x=p.keyframes,M=p.defaults,k=p.scrollTrigger,O=p.yoyoEase,A=r.parent||I,P=($(e)||J(e)?t(e[0]):"length"in r)?[e]:Ot(e);if(a._targets=P.length?ea(P):R("GSAP target "+e+" not found. https://gsap.com",!X.nullTargetWarn)||[],a._ptLookup=[],a._overwrite=b,x||T||y(_)||y(m)){if(r=a.vars,(s=a.timeline=new Qt({data:"nested",defaults:M||{},targets:A&&"nested"===A.data?A.vars.targets:P})).kill(),s.parent=s._dp=_assertThisInitialized(a),s._start=0,T||y(_)||y(m)){if(h=P.length,d=T&&fb(T),v(T))for(l in T)~Ht.indexOf(l)&&((c=c||{})[l]=T[l]);for(o=0;o<h;o++)(u=va(r,Kt)).stagger=0,O&&(u.yoyoEase=O),c&&yt(u,c),f=P[o],u.duration=+Gt(_,_assertThisInitialized(a),o,f,P),u.delay=(+Gt(m,_assertThisInitialized(a),o,f,P)||0)-a._delay,!T&&1===h&&u.delay&&(a._delay=m=u.delay,a._start+=m,u.delay=0),s.to(f,u,d?d(o,f,P):0),s._ease=Lt.none;s.duration()?_=m=0:a.timeline=0}else if(x){wa(ra(s.vars.defaults,{ease:"none"})),s._ease=Yt(x.ease||r.ease||"none");var C,S,D,z=0;if($(x))x.forEach(function(t){return s.to(P,t,">")}),s.duration();else{for(l in u={},x)"ease"===l||"easeEach"===l||hc(l,x[l],u,x.easeEach);for(l in u)for(C=u[l].sort(function(t,e){return t.t-e.t}),o=z=0;o<C.length;o++)(D={ease:(S=C[o]).e,duration:(S.t-(o?C[o-1].t:0))/100*_})[l]=S.v,s.to(P,D,z),z+=D.duration;s.duration()<_&&s.to({},{duration:_-s.duration()})}}_||a.duration(_=s.duration())}else a.timeline=0;return!0!==b||F||(Ut=_assertThisInitialized(a),I.killTweensOf(P),Ut=0),La(A,_assertThisInitialized(a),i),r.reversed&&a.reverse(),r.paused&&a.paused(!0),(g||!_&&!x&&a._start===ja(A._time)&&w(g)&&function _hasNoPausedAncestors(t){return!t||t._ts&&_hasNoPausedAncestors(t.parent)}(_assertThisInitialized(a))&&"nested"!==A.data)&&(a._tTime=-U,a.render(Math.max(0,-m)||0)),k&&Ma(_assertThisInitialized(a),k),a}_inheritsLoose(Tween,E);var e=Tween.prototype;return e.render=function render(t,e,r){var i,n,a,s,o,u,h,l,f,d=this._time,c=this._tDur,p=this._dur,_=t<0,m=c-U<t&&!_?c:t<U?0:t;if(p){if(m!==this._tTime||!t||r||!this._initted&&this._tTime||this._startAt&&this._zTime<0!=_||this._lazy){if(i=m,l=this.timeline,this._repeat){if(s=p+this._rDelay,this._repeat<-1&&_)return this.totalTime(100*s+t,e,r);if(i=ja(m%s),m===c?(a=this._repeat,i=p):(a=~~(o=ja(m/s)))&&a===o?(i=p,a--):p<i&&(i=p),(u=this._yoyo&&1&a)&&(f=this._yEase,i=p-i),o=Tt(this._tTime,s),i===d&&!r&&this._initted&&a===o)return this._tTime=m,this;a!==o&&(l&&this._yEase&&Rb(l,u),this.vars.repeatRefresh&&!u&&!this._lock&&i!==s&&this._initted&&(this._lock=r=1,this.render(ja(s*a),!0).invalidate()._lock=0))}if(!this._initted){if(Na(this,_?t:i,r,e,m))return this._tTime=0,this;if(!(d===this._time||r&&this.vars.repeatRefresh&&a!==o))return this;if(p!==this._dur)return this.render(t,e,r)}if(this._tTime=m,this._time=i,!this._act&&this._ts&&(this._act=1,this._lazy=0),this.ratio=h=(f||this._ease)(i/p),this._from&&(this.ratio=h=1-h),!d&&m&&!e&&!o&&(Pt(this,"onStart"),this._tTime!==m))return this;for(n=this._pt;n;)n.r(h,n.d),n=n._next;l&&l.render(t<0?t:l._dur*l._ease(i/this._dur),e,r)||this._startAt&&(this._zTime=t),this._onUpdate&&!e&&(_&&Da(this,t,0,r),Pt(this,"onUpdate")),this._repeat&&a!==o&&this.vars.onRepeat&&!e&&this.parent&&Pt(this,"onRepeat"),m!==this._tDur&&m||this._tTime!==m||(_&&!this._onUpdate&&Da(this,t,0,!0),!t&&p||!(m===this._tDur&&0<this._ts||!m&&this._ts<0)||Aa(this,1),e||_&&!d||!(m||d||u)||(Pt(this,m===c?"onComplete":"onReverseComplete",!0),!this._prom||m<c&&0<this.timeScale()||this._prom()))}}else!function _renderZeroDurationTween(t,e,r,i){var n,a,s,o=t.ratio,u=e<0||!e&&(!t._start&&function _parentPlayheadIsBeforeStart(t){var e=t.parent;return e&&e._ts&&e._initted&&!e._lock&&(e.rawTime()<0||_parentPlayheadIsBeforeStart(e))}(t)&&(t._initted||!bt(t))||(t._ts<0||t._dp._ts<0)&&!bt(t))?0:1,h=t._rDelay,l=0;if(h&&t._repeat&&(l=Mt(0,t._tDur,e),a=Tt(l,h),t._yoyo&&1&a&&(u=1-u),a!==Tt(t._tTime,h)&&(o=1-u,t.vars.repeatRefresh&&t._initted&&t.invalidate())),u!==o||L||i||t._zTime===U||!e&&t._zTime){if(!t._initted&&Na(t,e,i,r,l))return;for(s=t._zTime,t._zTime=e||(r?U:0),r=r||e&&!s,t.ratio=u,t._from&&(u=1-u),t._time=0,t._tTime=l,n=t._pt;n;)n.r(u,n.d),n=n._next;e<0&&Da(t,e,0,!0),t._onUpdate&&!r&&Pt(t,"onUpdate"),l&&t._repeat&&!r&&t.parent&&Pt(t,"onRepeat"),(e>=t._tDur||e<0)&&t.ratio===u&&(u&&Aa(t,1),r||L||(Pt(t,u?"onComplete":"onReverseComplete",!0),t._prom&&t._prom()))}else t._zTime||(t._zTime=e)}(this,t,e,r);return this},e.targets=function targets(){return this._targets},e.invalidate=function invalidate(t){return t&&this.vars.runBackwards||(this._startAt=0),this._pt=this._op=this._onUpdate=this._lazy=this.ratio=0,this._ptLookup=[],this.timeline&&this.timeline.invalidate(t),E.prototype.invalidate.call(this,t)},e.resetTo=function resetTo(t,e,r,i,n){c||Rt.wake(),this._ts||this.play();var a,s=Math.min(this._dur,(this._dp._time-this._start)*this._ts);return this._initted||Wt(this,s),a=this._ease(s/this._dur),function _updatePropTweens(t,e,r,i,n,a,s,o){var u,h,l,f,d=(t._pt&&t._ptCache||(t._ptCache={}))[e];if(!d)for(d=t._ptCache[e]=[],l=t._ptLookup,f=t._targets.length;f--;){if((u=l[f][e])&&u.d&&u.d._pt)for(u=u.d._pt;u&&u.p!==e&&u.fp!==e;)u=u._next;if(!u)return qt=1,t.vars[e]="+=0",Wt(t,s),qt=0,o?R(e+" not eligible for reset"):1;d.push(u)}for(f=d.length;f--;)(u=(h=d[f])._pt||h).s=!i&&0!==i||n?u.s+(i||0)+a*u.c:i,u.c=r-u.s,h.e&&(h.e=ia(r)+Za(h.e)),h.b&&(h.b=u.s+Za(h.b))}(this,t,e,r,i,a,s,n)?this.resetTo(t,e,r,i,1):(Ja(this,0),this.parent||ya(this._dp,this,"_first","_last",this._dp._sort?"_start":0),this.render(0))},e.kill=function kill(t,e){if(void 0===e&&(e="all"),!(t||e&&"all"!==e))return this._lazy=this._pt=0,this.parent?ub(this):this.scrollTrigger&&this.scrollTrigger.kill(!!L),this;if(this.timeline){var i=this.timeline.totalDuration();return this.timeline.killTweensOf(t,e,Ut&&!0!==Ut.vars.overwrite)._first||ub(this),this.parent&&i!==this.timeline.totalDuration()&&Sa(this,this._dur*this.timeline._tDur/i,0,1),this}var n,a,s,o,u,h,l,f=this._targets,d=t?Ot(t):f,c=this._ptLookup,p=this._pt;if((!e||"all"===e)&&function _arraysMatch(t,e){for(var r=t.length,i=r===e.length;i&&r--&&t[r]===e[r];);return r<0}(f,d))return"all"===e&&(this._pt=0),ub(this);for(n=this._op=this._op||[],"all"!==e&&(r(e)&&(u={},ha(e,function(t){return u[t]=1}),e=u),e=function _addAliasesToVars(t,e){var r,i,n,a,s=t[0]?fa(t[0]).harness:0,o=s&&s.aliases;if(!o)return e;for(i in r=yt({},e),o)if(i in r)for(n=(a=o[i].split(",")).length;n--;)r[a[n]]=r[i];return r}(f,e)),l=f.length;l--;)if(~d.indexOf(f[l]))for(u in a=c[l],"all"===e?(n[l]=e,o=a,s={}):(s=n[l]=n[l]||{},o=e),o)(h=a&&a[u])&&("kill"in h.d&&!0!==h.d.kill(u)||za(this,h,"_pt"),delete a[u]),"all"!==s&&(s[u]=1);return this._initted&&!this._pt&&p&&ub(this),this},Tween.to=function to(t,e,r){return new Tween(t,e,r)},Tween.from=function from(t,e){return Wa(1,arguments)},Tween.delayedCall=function delayedCall(t,e,r,i){return new Tween(e,0,{immediateRender:!1,lazy:!1,overwrite:!1,delay:t,onComplete:e,onReverseComplete:e,onCompleteParams:r,onReverseCompleteParams:r,callbackScope:i})},Tween.fromTo=function fromTo(t,e,r){return Wa(2,arguments)},Tween.set=function set(t,e){return e.duration=0,e.repeatDelay||(e.repeat=0),new Tween(t,e)},Tween.killTweensOf=function killTweensOf(t,e,r){return I.killTweensOf(t,e,r)},Tween}(Nt);ra(Jt.prototype,{_targets:[],_lazy:0,_startAt:0,_op:0,_onInit:0}),ha("staggerTo,staggerFrom,staggerFromTo",function(r){Jt[r]=function(){var t=new Qt,e=kt.call(arguments,0);return e.splice("staggerFromTo"===r?5:4,0,0),t[r].apply(t,e)}});function pc(t,e,r){return t.setAttribute(e,r)}function xc(t,e,r,i){i.mSet(t,e,i.m.call(i.tween,r,i.mt),i)}var $t=function _setterPlain(t,e,r){return t[e]=r},te=function _setterFunc(t,e,r){return t[e](r)},re=function _setterFuncWithParam(t,e,r,i){return t[e](i.fp,r)},ie=function _getSetter(t,e){return s(t[e])?te:u(t[e])&&t.setAttribute?pc:$t},ne=function _renderPlain(t,e){return e.set(e.t,e.p,Math.round(1e6*(e.s+e.c*t))/1e6,e)},se=function _renderBoolean(t,e){return e.set(e.t,e.p,!!(e.s+e.c*t),e)},oe=function _renderComplexString(t,e){var r=e._pt,i="";if(!t&&e.b)i=e.b;else if(1===t&&e.e)i=e.e;else{for(;r;)i=r.p+(r.m?r.m(r.s+r.c*t):Math.round(1e4*(r.s+r.c*t))/1e4)+i,r=r._next;i+=e.c}e.set(e.t,e.p,i,e)},ue=function _renderPropTweens(t,e){for(var r=e._pt;r;)r.r(t,r.d),r=r._next},he=function _addPluginModifier(t,e,r,i){for(var n,a=this._pt;a;)n=a._next,a.p===i&&a.modifier(t,e,r),a=n},de=function _killPropTweensOf(t){for(var e,r,i=this._pt;i;)r=i._next,i.p===t&&!i.op||i.op===t?za(this,i,"_pt"):i.dep||(e=1),i=r;return!e},_e=function _sortPropTweensByPriority(t){for(var e,r,i,n,a=t._pt;a;){for(e=a._next,r=i;r&&r.pr>a.pr;)r=r._next;(a._prev=r?r._prev:n)?a._prev._next=a:i=a,(a._next=r)?r._prev=a:n=a,a=e}t._pt=i},ge=(PropTween.prototype.modifier=function modifier(t,e,r){this.mSet=this.mSet||this.set,this.set=xc,this.m=t,this.mt=r,this.tween=e},PropTween);function PropTween(t,e,r,i,n,a,s,o,u){this.t=e,this.s=i,this.c=n,this.p=r,this.r=a||ne,this.d=s||this,this.set=o||$t,this.pr=u||0,(this._next=t)&&(t._prev=this)}ha(vt+"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger",function(t){return ft[t]=1}),ot.TweenMax=ot.TweenLite=Jt,ot.TimelineLite=ot.TimelineMax=Qt,I=new Qt({sortChildren:!1,defaults:Z,autoRemoveChildren:!0,id:"root",smoothChildTiming:!0}),X.stringFilter=Gb;function Fc(t){return(be[t]||Me).map(function(t){return t()})}function Gc(){var t=Date.now(),o=[];2<t-Oe&&(Fc("matchMediaInit"),Te.forEach(function(t){var e,r,i,n,a=t.queries,s=t.conditions;for(r in a)(e=h.matchMedia(a[r]).matches)&&(i=1),e!==s[r]&&(s[r]=e,n=1);n&&(t.revert(),i&&o.push(t))}),Fc("matchMediaRevert"),o.forEach(function(e){return e.onMatch(e,function(t){return e.add(null,t)})}),Oe=t,Fc("matchMedia"))}var ve,Te=[],be={},Me=[],Oe=0,Ae=0,Pe=((ve=Context.prototype).add=function add(t,i,n){function Iw(){var t,e=l,r=a.selector;return e&&e!==a&&e.data.push(a),n&&(a.selector=db(n)),l=a,t=i.apply(a,arguments),s(t)&&a._r.push(t),l=e,a.selector=r,a.isReverted=!1,t}s(t)&&(n=i,i=t,t=s);var a=this;return a.last=Iw,t===s?Iw(a,function(t){return a.add(null,t)}):t?a[t]=Iw:Iw},ve.ignore=function ignore(t){var e=l;l=null,t(this),l=e},ve.getTweens=function getTweens(){var e=[];return this.data.forEach(function(t){return t instanceof Context?e.push.apply(e,t.getTweens()):t instanceof Jt&&!(t.parent&&"nested"===t.parent.data)&&e.push(t)}),e},ve.clear=function clear(){this._r.length=this.data.length=0},ve.kill=function kill(i,t){var n=this;if(i?function(){for(var t,e=n.getTweens(),r=n.data.length;r--;)"isFlip"===(t=n.data[r]).data&&(t.revert(),t.getChildren(!0,!0,!1).forEach(function(t){return e.splice(e.indexOf(t),1)}));for(e.map(function(t){return{g:t._dur||t._delay||t._sat&&!t._sat.vars.immediateRender?t.globalTime(0):-1/0,t:t}}).sort(function(t,e){return e.g-t.g||-1/0}).forEach(function(t){return t.t.revert(i)}),r=n.data.length;r--;)(t=n.data[r])instanceof Qt?"nested"!==t.data&&(t.scrollTrigger&&t.scrollTrigger.revert(),t.kill()):t instanceof Jt||!t.revert||t.revert(i);n._r.forEach(function(t){return t(i,n)}),n.isReverted=!0}():this.data.forEach(function(t){return t.kill&&t.kill()}),this.clear(),t)for(var e=Te.length;e--;)Te[e].id===this.id&&Te.splice(e,1)},ve.revert=function revert(t){this.kill(t||{})},Context);function Context(t,e){this.selector=e&&db(e),this.data=[],this._r=[],this.isReverted=!1,this.id=Ae++,t&&this.add(t)}var Ce,Se=((Ce=MatchMedia.prototype).add=function add(t,e,r){v(t)||(t={matches:t});var i,n,a,s=new Pe(0,r||this.scope),o=s.conditions={};for(n in l&&!s.selector&&(s.selector=l.selector),this.contexts.push(s),e=s.add("onMatch",e),s.queries=t)"all"===n?a=1:(i=h.matchMedia(t[n]))&&(Te.indexOf(s)<0&&Te.push(s),(o[n]=i.matches)&&(a=1),i.addListener?i.addListener(Gc):i.addEventListener("change",Gc));return a&&e(s,function(t){return s.add(null,t)}),this},Ce.revert=function revert(t){this.kill(t||{})},Ce.kill=function kill(e){this.contexts.forEach(function(t){return t.kill(e,!0)})},MatchMedia);function MatchMedia(t){this.contexts=[],this.scope=t,l&&l.data.push(this)}var De={registerPlugin:function registerPlugin(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];e.forEach(function(t){return xb(t)})},timeline:function timeline(t){return new Qt(t)},getTweensOf:function getTweensOf(t,e){return I.getTweensOf(t,e)},getProperty:function getProperty(i,t,e,n){r(i)&&(i=Ot(i)[0]);var a=fa(i||{}).get,s=e?qa:pa;return"native"===e&&(e=""),i?t?s((pt[t]&&pt[t].get||a)(i,t,e,n)):function(t,e,r){return s((pt[t]&&pt[t].get||a)(i,t,e,r))}:i},quickSetter:function quickSetter(r,e,i){if(1<(r=Ot(r)).length){var n=r.map(function(t){return ze.quickSetter(t,e,i)}),a=n.length;return function(t){for(var e=a;e--;)n[e](t)}}r=r[0]||{};var s=pt[e],o=fa(r),u=o.harness&&(o.harness.aliases||{})[e]||e,h=s?function(t){var e=new s;d._pt=0,e.init(r,i?t+i:t,d,0,[r]),e.render(1,e),d._pt&&ue(1,d)}:o.set(r,u);return s?h:function(t){return h(r,u,i?t+i:t,o,1)}},quickTo:function quickTo(t,i,e){function ay(t,e,r){return n.resetTo(i,t,e,r)}var r,n=ze.to(t,ra(((r={})[i]="+=0.1",r.paused=!0,r.stagger=0,r),e||{}));return ay.tween=n,ay},isTweening:function isTweening(t){return 0<I.getTweensOf(t,!0).length},defaults:function defaults(t){return t&&t.ease&&(t.ease=Yt(t.ease,Z.ease)),ua(Z,t||{})},config:function config(t){return ua(X,t||{})},registerEffect:function registerEffect(t){var i=t.name,n=t.effect,e=t.plugins,a=t.defaults,r=t.extendTimeline;(e||"").split(",").forEach(function(t){return t&&!pt[t]&&!ot[t]&&R(i+" effect requires "+t+" plugin.")}),_t[i]=function(t,e,r){return n(Ot(t),ra(e||{},a),r)},r&&(Qt.prototype[i]=function(t,e,r){return this.add(_t[i](t,v(e)?e:(r=e)&&{},this),r)})},registerEase:function registerEase(t,e){Lt[t]=Yt(e)},parseEase:function parseEase(t,e){return arguments.length?Yt(t,e):Lt},getById:function getById(t){return I.getById(t)},exportRoot:function exportRoot(t,e){void 0===t&&(t={});var r,i,n=new Qt(t);for(n.smoothChildTiming=w(t.smoothChildTiming),I.remove(n),n._dp=0,n._time=n._tTime=I._time,r=I._first;r;)i=r._next,!e&&!r._dur&&r instanceof Jt&&r.vars.onComplete===r._targets[0]||La(n,r,r._start-r._delay),r=i;return La(I,n,0),n},context:function context(t,e){return t?new Pe(t,e):l},matchMedia:function matchMedia(t){return new Se(t)},matchMediaRefresh:function matchMediaRefresh(){return Te.forEach(function(t){var e,r,i=t.conditions;for(r in i)i[r]&&(i[r]=!1,e=1);e&&t.revert()})||Gc()},addEventListener:function addEventListener(t,e){var r=be[t]||(be[t]=[]);~r.indexOf(e)||r.push(e)},removeEventListener:function removeEventListener(t,e){var r=be[t],i=r&&r.indexOf(e);0<=i&&r.splice(i,1)},utils:{wrap:function wrap(e,t,r){var i=t-e;return $(e)?mb(e,wrap(0,e.length),t):Xa(r,function(t){return(i+(t-e)%i)%i+e})},wrapYoyo:function wrapYoyo(e,t,r){var i=t-e,n=2*i;return $(e)?mb(e,wrapYoyo(0,e.length-1),t):Xa(r,function(t){return e+(i<(t=(n+(t-e)%n)%n||0)?n-t:t)})},distribute:fb,random:ib,snap:hb,normalize:function normalize(t,e,r){return At(t,e,0,1,r)},getUnit:Za,clamp:function clamp(e,r,t){return Xa(t,function(t){return Mt(e,r,t)})},splitColor:Bb,toArray:Ot,selector:db,mapRange:At,pipe:function pipe(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(t){return e.reduce(function(t,e){return e(t)},t)}},unitize:function unitize(e,r){return function(t){return e(parseFloat(t))+(r||Za(t))}},interpolate:function interpolate(e,i,t,n){var a=isNaN(e+i)?0:function(t){return(1-t)*e+t*i};if(!a){var s,o,u,h,l,f=r(e),d={};if(!0===t&&(n=1)&&(t=null),f)e={p:e},i={p:i};else if($(e)&&!$(i)){for(u=[],h=e.length,l=h-2,o=1;o<h;o++)u.push(interpolate(e[o-1],e[o]));h--,a=function func(t){t*=h;var e=Math.min(l,~~t);return u[e](t-e)},t=i}else n||(e=yt($(e)?[]:{},e));if(!u){for(s in i)Vt.call(d,e,s,"get",i[s]);a=function func(t){return ue(t,d)||(f?e.p:e)}}}return Xa(t,a)},shuffle:eb},install:P,effects:_t,ticker:Rt,updateRoot:Qt.updateRoot,plugins:pt,globalTimeline:I,core:{PropTween:ge,globals:S,Tween:Jt,Timeline:Qt,Animation:Nt,getCache:fa,_removeLinkedListItem:za,reverting:function reverting(){return L},context:function context(t){return t&&l&&(l.data.push(t),t._ctx=l),l},suppressOverwrites:function suppressOverwrites(t){return F=t}}};ha("to,from,fromTo,delayedCall,set,killTweensOf",function(t){return De[t]=Jt[t]}),Rt.add(Qt.updateRoot),d=De.to({},{duration:0});function Kc(t,e){for(var r=t._pt;r&&r.p!==e&&r.op!==e&&r.fp!==e;)r=r._next;return r}function Mc(t,a){return{name:t,headless:1,rawVars:1,init:function init(t,n,e){e._onInit=function(t){var e,i;if(r(n)&&(e={},ha(n,function(t){return e[t]=1}),n=e),a){for(i in e={},n)e[i]=a(n[i]);n=e}!function _addModifiers(t,e){var r,i,n,a=t._targets;for(r in e)for(i=a.length;i--;)(n=(n=t._ptLookup[i][r])&&n.d)&&(n._pt&&(n=Kc(n,r)),n&&n.modifier&&n.modifier(e[r],t,a[i],r))}(t,n)}}}}var ze=De.registerPlugin({name:"attr",init:function init(t,e,r,i,n){var a,s,o;for(a in this.tween=r,e)o=t.getAttribute(a)||"",(s=this.add(t,"setAttribute",(o||0)+"",e[a],i,n,0,0,a)).op=a,s.b=o,this._props.push(a)},render:function render(t,e){for(var r=e._pt;r;)L?r.set(r.t,r.p,r.b,r):r.r(t,r.d),r=r._next}},{name:"endArray",headless:1,init:function init(t,e){for(var r=e.length;r--;)this.add(t,r,t[r]||0,e[r],0,0,0,0,0,1)}},Mc("roundProps",gb),Mc("modifiers"),Mc("snap",hb))||De;Jt.version=Qt.version=ze.version="3.13.0",o=1,x()&&Ft();function wd(t,e){return e.set(e.t,e.p,Math.round(1e4*(e.s+e.c*t))/1e4+e.u,e)}function xd(t,e){return e.set(e.t,e.p,1===t?e.e:Math.round(1e4*(e.s+e.c*t))/1e4+e.u,e)}function yd(t,e){return e.set(e.t,e.p,t?Math.round(1e4*(e.s+e.c*t))/1e4+e.u:e.b,e)}function zd(t,e){var r=e.s+e.c*t;e.set(e.t,e.p,~~(r+(r<0?-.5:.5))+e.u,e)}function Ad(t,e){return e.set(e.t,e.p,t?e.e:e.b,e)}function Bd(t,e){return e.set(e.t,e.p,1!==t?e.b:e.e,e)}function Cd(t,e,r){return t.style[e]=r}function Dd(t,e,r){return t.style.setProperty(e,r)}function Ed(t,e,r){return t._gsap[e]=r}function Fd(t,e,r){return t._gsap.scaleX=t._gsap.scaleY=r}function Gd(t,e,r,i,n){var a=t._gsap;a.scaleX=a.scaleY=r,a.renderTransform(n,a)}function Hd(t,e,r,i,n){var a=t._gsap;a[e]=r,a.renderTransform(n,a)}function Kd(t,e){var r=this,i=this.target,n=i.style,a=i._gsap;if(t in sr&&n){if(this.tfm=this.tfm||{},"transform"===t)return cr.transform.split(",").forEach(function(t){return Kd.call(r,t,e)});if(~(t=cr[t]||t).indexOf(",")?t.split(",").forEach(function(t){return r.tfm[t]=Tr(i,t)}):this.tfm[t]=a.x?a[t]:Tr(i,t),t===_r&&(this.tfm.zOrigin=a.zOrigin),0<=this.props.indexOf(pr))return;a.svg&&(this.svgo=i.getAttribute("data-svg-origin"),this.props.push(_r,e,"")),t=pr}(n||e)&&this.props.push(t,e,n[t])}function Ld(t){t.translate&&(t.removeProperty("translate"),t.removeProperty("scale"),t.removeProperty("rotate"))}function Md(){var t,e,r=this.props,i=this.target,n=i.style,a=i._gsap;for(t=0;t<r.length;t+=3)r[t+1]?2===r[t+1]?i[r[t]](r[t+2]):i[r[t]]=r[t+2]:r[t+2]?n[r[t]]=r[t+2]:n.removeProperty("--"===r[t].substr(0,2)?r[t]:r[t].replace(lr,"-$1").toLowerCase());if(this.tfm){for(e in this.tfm)a[e]=this.tfm[e];a.svg&&(a.renderTransform(),i.setAttribute("data-svg-origin",this.svgo||"")),(t=Ye())&&t.isStart||n[pr]||(Ld(n),a.zOrigin&&n[_r]&&(n[_r]+=" "+a.zOrigin+"px",a.zOrigin=0,a.renderTransform()),a.uncache=1)}}function Nd(t,e){var r={target:t,props:[],revert:Md,save:Kd};return t._gsap||ze.core.getCache(t),e&&t.style&&t.nodeType&&e.split(",").forEach(function(t){return r.save(t)}),r}function Pd(t,e){var r=Re.createElementNS?Re.createElementNS((e||"http://www.w3.org/1999/xhtml").replace(/^https/,"http"),t):Re.createElement(t);return r&&r.style?r:Re.createElement(t)}function Qd(t,e,r){var i=getComputedStyle(t);return i[e]||i.getPropertyValue(e.replace(lr,"-$1").toLowerCase())||i.getPropertyValue(e)||!r&&Qd(t,gr(e)||e,1)||""}function Td(){(function _windowExists(){return"undefined"!=typeof window})()&&window.document&&(Ee=window,Re=Ee.document,Fe=Re.documentElement,Ie=Pd("div")||{style:{}},Pd("div"),pr=gr(pr),_r=pr+"Origin",Ie.style.cssText="border-width:0;line-height:0;position:absolute;padding:0",Xe=!!gr("perspective"),Ye=ze.core.reverting,Le=1)}function Ud(t){var e,r=t.ownerSVGElement,i=Pd("svg",r&&r.getAttribute("xmlns")||"http://www.w3.org/2000/svg"),n=t.cloneNode(!0);n.style.display="block",i.appendChild(n),Fe.appendChild(i);try{e=n.getBBox()}catch(t){}return i.removeChild(n),Fe.removeChild(i),e}function Vd(t,e){for(var r=e.length;r--;)if(t.hasAttribute(e[r]))return t.getAttribute(e[r])}function Wd(e){var r,i;try{r=e.getBBox()}catch(t){r=Ud(e),i=1}return r&&(r.width||r.height)||i||(r=Ud(e)),!r||r.width||r.x||r.y?r:{x:+Vd(e,["x","cx","x1"])||0,y:+Vd(e,["y","cy","y1"])||0,width:0,height:0}}function Xd(t){return!(!t.getCTM||t.parentNode&&!t.ownerSVGElement||!Wd(t))}function Yd(t,e){if(e){var r,i=t.style;e in sr&&e!==_r&&(e=pr),i.removeProperty?("ms"!==(r=e.substr(0,2))&&"webkit"!==e.substr(0,6)||(e="-"+e),i.removeProperty("--"===r?e:e.replace(lr,"-$1").toLowerCase())):i.removeAttribute(e)}}function Zd(t,e,r,i,n,a){var s=new ge(t._pt,e,r,0,1,a?Bd:Ad);return(t._pt=s).b=i,s.e=n,t._props.push(r),s}function ae(t,e,r,i){var n,a,s,o,u=parseFloat(r)||0,h=(r+"").trim().substr((u+"").length)||"px",l=Ie.style,f=fr.test(e),d="svg"===t.tagName.toLowerCase(),c=(d?"client":"offset")+(f?"Width":"Height"),p="px"===i,_="%"===i;if(i===h||!u||vr[i]||vr[h])return u;if("px"===h||p||(u=ae(t,e,r,"px")),o=t.getCTM&&Xd(t),(_||"%"===h)&&(sr[e]||~e.indexOf("adius")))return n=o?t.getBBox()[f?"width":"height"]:t[c],ia(_?u/n*100:u/100*n);if(l[f?"width":"height"]=100+(p?h:i),a="rem"!==i&&~e.indexOf("adius")||"em"===i&&t.appendChild&&!d?t:t.parentNode,o&&(a=(t.ownerSVGElement||{}).parentNode),a&&a!==Re&&a.appendChild||(a=Re.body),(s=a._gsap)&&_&&s.width&&f&&s.time===Rt.time&&!s.uncache)return ia(u/s.width*100);if(!_||"height"!==e&&"width"!==e)!_&&"%"!==h||yr[Qd(a,"display")]||(l.position=Qd(t,"position")),a===t&&(l.position="static"),a.appendChild(Ie),n=Ie[c],a.removeChild(Ie),l.position="absolute";else{var m=t.style[e];t.style[e]=100+i,n=t[c],m?t.style[e]=m:Yd(t,e)}return f&&_&&((s=fa(a)).time=Rt.time,s.width=a[c]),ia(p?n*u/100:n&&u?100/n*u:0)}function ce(t,e,r,i){if(!r||"none"===r){var n=gr(e,t,1),a=n&&Qd(t,n,1);a&&a!==r?(e=n,r=a):"borderColor"===e&&(r=Qd(t,"borderTopColor"))}var s,o,u,h,l,f,d,c,p,_,m,g=new ge(this._pt,t.style,e,0,1,oe),v=0,y=0;if(g.b=r,g.e=i,r+="","var(--"===(i+="").substring(0,6)&&(i=Qd(t,i.substring(4,i.indexOf(")")))),"auto"===i&&(f=t.style[e],t.style[e]=i,i=Qd(t,e)||i,f?t.style[e]=f:Yd(t,e)),Gb(s=[r,i]),i=s[1],u=(r=s[0]).match(rt)||[],(i.match(rt)||[]).length){for(;o=rt.exec(i);)d=o[0],p=i.substring(v,o.index),l?l=(l+1)%5:"rgba("!==p.substr(-5)&&"hsla("!==p.substr(-5)||(l=1),d!==(f=u[y++]||"")&&(h=parseFloat(f)||0,m=f.substr((h+"").length),"="===d.charAt(1)&&(d=ka(h,d)+m),c=parseFloat(d),_=d.substr((c+"").length),v=rt.lastIndex-_.length,_||(_=_||X.units[e]||m,v===i.length&&(i+=_,g.e+=_)),m!==_&&(h=ae(t,e,f,_)||0),g._pt={_next:g._pt,p:p||1===y?p:",",s:h,c:c-h,m:l&&l<4||"zIndex"===e?Math.round:0});g.c=v<i.length?i.substring(v,i.length):""}else g.r="display"===e&&"none"===i?Bd:Ad;return nt.test(i)&&(g.e=0),this._pt=g}function ee(t){var e=t.split(" "),r=e[0],i=e[1]||"50%";return"top"!==r&&"bottom"!==r&&"left"!==i&&"right"!==i||(t=r,r=i,i=t),e[0]=br[r]||r,e[1]=br[i]||i,e.join(" ")}function fe(t,e){if(e.tween&&e.tween._time===e.tween._dur){var r,i,n,a=e.t,s=a.style,o=e.u,u=a._gsap;if("all"===o||!0===o)s.cssText="",i=1;else for(n=(o=o.split(",")).length;-1<--n;)r=o[n],sr[r]&&(i=1,r="transformOrigin"===r?_r:pr),Yd(a,r);i&&(Yd(a,pr),u&&(u.svg&&a.removeAttribute("transform"),s.scale=s.rotate=s.translate="none",kr(a,1),u.uncache=1,Ld(s)))}}function je(t){return"matrix(1, 0, 0, 1, 0, 0)"===t||"none"===t||!t}function ke(t){var e=Qd(t,pr);return je(e)?xr:e.substr(7).match(et).map(ia)}function le(t,e){var r,i,n,a,s=t._gsap||fa(t),o=t.style,u=ke(t);return s.svg&&t.getAttribute("transform")?"1,0,0,1,0,0"===(u=[(n=t.transform.baseVal.consolidate().matrix).a,n.b,n.c,n.d,n.e,n.f]).join(",")?xr:u:(u!==xr||t.offsetParent||t===Fe||s.svg||(n=o.display,o.display="block",(r=t.parentNode)&&(t.offsetParent||t.getBoundingClientRect().width)||(a=1,i=t.nextElementSibling,Fe.appendChild(t)),u=ke(t),n?o.display=n:Yd(t,"display"),a&&(i?r.insertBefore(t,i):r?r.appendChild(t):Fe.removeChild(t))),e&&6<u.length?[u[0],u[1],u[4],u[5],u[12],u[13]]:u)}function me(t,e,r,i,n,a){var s,o,u,h=t._gsap,l=n||le(t,!0),f=h.xOrigin||0,d=h.yOrigin||0,c=h.xOffset||0,p=h.yOffset||0,_=l[0],m=l[1],g=l[2],v=l[3],y=l[4],T=l[5],b=e.split(" "),w=parseFloat(b[0])||0,x=parseFloat(b[1])||0;r?l!==xr&&(o=_*v-m*g)&&(u=w*(-m/o)+x*(_/o)-(_*T-m*y)/o,w=w*(v/o)+x*(-g/o)+(g*T-v*y)/o,x=u):(w=(s=Wd(t)).x+(~b[0].indexOf("%")?w/100*s.width:w),x=s.y+(~(b[1]||b[0]).indexOf("%")?x/100*s.height:x)),i||!1!==i&&h.smooth?(y=w-f,T=x-d,h.xOffset=c+(y*_+T*g)-y,h.yOffset=p+(y*m+T*v)-T):h.xOffset=h.yOffset=0,h.xOrigin=w,h.yOrigin=x,h.smooth=!!i,h.origin=e,h.originIsAbsolute=!!r,t.style[_r]="0px 0px",a&&(Zd(a,h,"xOrigin",f,w),Zd(a,h,"yOrigin",d,x),Zd(a,h,"xOffset",c,h.xOffset),Zd(a,h,"yOffset",p,h.yOffset)),t.setAttribute("data-svg-origin",w+" "+x)}function pe(t,e,r){var i=Za(e);return ia(parseFloat(e)+parseFloat(ae(t,"x",r+"px",i)))+i}function we(t,e,i,n,a){var s,o,u=360,h=r(a),l=parseFloat(a)*(h&&~a.indexOf("rad")?or:1)-n,f=n+l+"deg";return h&&("short"===(s=a.split("_")[1])&&(l%=u)!==l%180&&(l+=l<0?u:-u),"cw"===s&&l<0?l=(l+36e9)%u-~~(l/u)*u:"ccw"===s&&0<l&&(l=(l-36e9)%u-~~(l/u)*u)),t._pt=o=new ge(t._pt,e,i,n,l,xd),o.e=f,o.u="deg",t._props.push(i),o}function xe(t,e){for(var r in e)t[r]=e[r];return t}function ye(t,e,r){var i,n,a,s,o,u,h,l=xe({},r._gsap),f=r.style;for(n in l.svg?(a=r.getAttribute("transform"),r.setAttribute("transform",""),f[pr]=e,i=kr(r,1),Yd(r,pr),r.setAttribute("transform",a)):(a=getComputedStyle(r)[pr],f[pr]=e,i=kr(r,1),f[pr]=a),sr)(a=l[n])!==(s=i[n])&&"perspective,force3D,transformOrigin,svgOrigin".indexOf(n)<0&&(o=Za(a)!==(h=Za(s))?ae(r,n,a,h):parseFloat(a),u=parseFloat(s),t._pt=new ge(t._pt,i,n,o,u-o,wd),t._pt.u=h||0,t._props.push(n));xe(i,l)}var Ee,Re,Fe,Le,Ie,Be,Ye,Xe,Ze=Lt.Power0,Ne=Lt.Power1,Qe=Lt.Power2,Ue=Lt.Power3,qe=Lt.Power4,Ve=Lt.Linear,We=Lt.Quad,Ge=Lt.Cubic,He=Lt.Quart,Ke=Lt.Quint,Je=Lt.Strong,$e=Lt.Elastic,tr=Lt.Back,er=Lt.SteppedEase,rr=Lt.Bounce,ir=Lt.Sine,nr=Lt.Expo,ar=Lt.Circ,sr={},or=180/Math.PI,ur=Math.PI/180,hr=Math.atan2,lr=/([A-Z])/g,fr=/(left|right|width|margin|padding|x)/i,dr=/[\s,\(]\S/,cr={autoAlpha:"opacity,visibility",scale:"scaleX,scaleY",alpha:"opacity"},pr="transform",_r=pr+"Origin",mr="O,Moz,ms,Ms,Webkit".split(","),gr=function _checkPropPrefix(t,e,r){var i=(e||Ie).style,n=5;if(t in i&&!r)return t;for(t=t.charAt(0).toUpperCase()+t.substr(1);n--&&!(mr[n]+t in i););return n<0?null:(3===n?"ms":0<=n?mr[n]:"")+t},vr={deg:1,rad:1,turn:1},yr={grid:1,flex:1},Tr=function _get(t,e,r,i){var n;return Le||Td(),e in cr&&"transform"!==e&&~(e=cr[e]).indexOf(",")&&(e=e.split(",")[0]),sr[e]&&"transform"!==e?(n=kr(t,i),n="transformOrigin"!==e?n[e]:n.svg?n.origin:Or(Qd(t,_r))+" "+n.zOrigin+"px"):(n=t.style[e])&&"auto"!==n&&!i&&!~(n+"").indexOf("calc(")||(n=wr[e]&&wr[e](t,e,r)||Qd(t,e)||ga(t,e)||("opacity"===e?1:0)),r&&!~(n+"").trim().indexOf(" ")?ae(t,e,n,r)+r:n},br={top:"0%",bottom:"100%",left:"0%",right:"100%",center:"50%"},wr={clearProps:function clearProps(t,e,r,i,n){if("isFromStart"!==n.data){var a=t._pt=new ge(t._pt,e,r,0,0,fe);return a.u=i,a.pr=-10,a.tween=n,t._props.push(r),1}}},xr=[1,0,0,1,0,0],Mr={},kr=function _parseTransform(t,e){var r=t._gsap||new Zt(t);if("x"in r&&!e&&!r.uncache)return r;var i,n,a,s,o,u,h,l,f,d,c,p,_,m,g,v,y,T,b,w,x,M,k,O,A,P,C,S,D,z,E,R,F=t.style,L=r.scaleX<0,I="deg",B=getComputedStyle(t),j=Qd(t,_r)||"0";return i=n=a=u=h=l=f=d=c=0,s=o=1,r.svg=!(!t.getCTM||!Xd(t)),B.translate&&("none"===B.translate&&"none"===B.scale&&"none"===B.rotate||(F[pr]=("none"!==B.translate?"translate3d("+(B.translate+" 0 0").split(" ").slice(0,3).join(", ")+") ":"")+("none"!==B.rotate?"rotate("+B.rotate+") ":"")+("none"!==B.scale?"scale("+B.scale.split(" ").join(",")+") ":"")+("none"!==B[pr]?B[pr]:"")),F.scale=F.rotate=F.translate="none"),m=le(t,r.svg),r.svg&&(O=r.uncache?(A=t.getBBox(),j=r.xOrigin-A.x+"px "+(r.yOrigin-A.y)+"px",""):!e&&t.getAttribute("data-svg-origin"),me(t,O||j,!!O||r.originIsAbsolute,!1!==r.smooth,m)),p=r.xOrigin||0,_=r.yOrigin||0,m!==xr&&(T=m[0],b=m[1],w=m[2],x=m[3],i=M=m[4],n=k=m[5],6===m.length?(s=Math.sqrt(T*T+b*b),o=Math.sqrt(x*x+w*w),u=T||b?hr(b,T)*or:0,(f=w||x?hr(w,x)*or+u:0)&&(o*=Math.abs(Math.cos(f*ur))),r.svg&&(i-=p-(p*T+_*w),n-=_-(p*b+_*x))):(R=m[6],z=m[7],C=m[8],S=m[9],D=m[10],E=m[11],i=m[12],n=m[13],a=m[14],h=(g=hr(R,D))*or,g&&(O=M*(v=Math.cos(-g))+C*(y=Math.sin(-g)),A=k*v+S*y,P=R*v+D*y,C=M*-y+C*v,S=k*-y+S*v,D=R*-y+D*v,E=z*-y+E*v,M=O,k=A,R=P),l=(g=hr(-w,D))*or,g&&(v=Math.cos(-g),E=x*(y=Math.sin(-g))+E*v,T=O=T*v-C*y,b=A=b*v-S*y,w=P=w*v-D*y),u=(g=hr(b,T))*or,g&&(O=T*(v=Math.cos(g))+b*(y=Math.sin(g)),A=M*v+k*y,b=b*v-T*y,k=k*v-M*y,T=O,M=A),h&&359.9<Math.abs(h)+Math.abs(u)&&(h=u=0,l=180-l),s=ia(Math.sqrt(T*T+b*b+w*w)),o=ia(Math.sqrt(k*k+R*R)),g=hr(M,k),f=2e-4<Math.abs(g)?g*or:0,c=E?1/(E<0?-E:E):0),r.svg&&(O=t.getAttribute("transform"),r.forceCSS=t.setAttribute("transform","")||!je(Qd(t,pr)),O&&t.setAttribute("transform",O))),90<Math.abs(f)&&Math.abs(f)<270&&(L?(s*=-1,f+=u<=0?180:-180,u+=u<=0?180:-180):(o*=-1,f+=f<=0?180:-180)),e=e||r.uncache,r.x=i-((r.xPercent=i&&(!e&&r.xPercent||(Math.round(t.offsetWidth/2)===Math.round(-i)?-50:0)))?t.offsetWidth*r.xPercent/100:0)+"px",r.y=n-((r.yPercent=n&&(!e&&r.yPercent||(Math.round(t.offsetHeight/2)===Math.round(-n)?-50:0)))?t.offsetHeight*r.yPercent/100:0)+"px",r.z=a+"px",r.scaleX=ia(s),r.scaleY=ia(o),r.rotation=ia(u)+I,r.rotationX=ia(h)+I,r.rotationY=ia(l)+I,r.skewX=f+I,r.skewY=d+I,r.transformPerspective=c+"px",(r.zOrigin=parseFloat(j.split(" ")[2])||!e&&r.zOrigin||0)&&(F[_r]=Or(j)),r.xOffset=r.yOffset=0,r.force3D=X.force3D,r.renderTransform=r.svg?zr:Xe?Dr:Ar,r.uncache=0,r},Or=function _firstTwoOnly(t){return(t=t.split(" "))[0]+" "+t[1]},Ar=function _renderNon3DTransforms(t,e){e.z="0px",e.rotationY=e.rotationX="0deg",e.force3D=0,Dr(t,e)},Pr="0deg",Cr="0px",Sr=") ",Dr=function _renderCSSTransforms(t,e){var r=e||this,i=r.xPercent,n=r.yPercent,a=r.x,s=r.y,o=r.z,u=r.rotation,h=r.rotationY,l=r.rotationX,f=r.skewX,d=r.skewY,c=r.scaleX,p=r.scaleY,_=r.transformPerspective,m=r.force3D,g=r.target,v=r.zOrigin,y="",T="auto"===m&&t&&1!==t||!0===m;if(v&&(l!==Pr||h!==Pr)){var b,w=parseFloat(h)*ur,x=Math.sin(w),M=Math.cos(w);w=parseFloat(l)*ur,b=Math.cos(w),a=pe(g,a,x*b*-v),s=pe(g,s,-Math.sin(w)*-v),o=pe(g,o,M*b*-v+v)}_!==Cr&&(y+="perspective("+_+Sr),(i||n)&&(y+="translate("+i+"%, "+n+"%) "),!T&&a===Cr&&s===Cr&&o===Cr||(y+=o!==Cr||T?"translate3d("+a+", "+s+", "+o+") ":"translate("+a+", "+s+Sr),u!==Pr&&(y+="rotate("+u+Sr),h!==Pr&&(y+="rotateY("+h+Sr),l!==Pr&&(y+="rotateX("+l+Sr),f===Pr&&d===Pr||(y+="skew("+f+", "+d+Sr),1===c&&1===p||(y+="scale("+c+", "+p+Sr),g.style[pr]=y||"translate(0, 0)"},zr=function _renderSVGTransforms(t,e){var r,i,n,a,s,o=e||this,u=o.xPercent,h=o.yPercent,l=o.x,f=o.y,d=o.rotation,c=o.skewX,p=o.skewY,_=o.scaleX,m=o.scaleY,g=o.target,v=o.xOrigin,y=o.yOrigin,T=o.xOffset,b=o.yOffset,w=o.forceCSS,x=parseFloat(l),M=parseFloat(f);d=parseFloat(d),c=parseFloat(c),(p=parseFloat(p))&&(c+=p=parseFloat(p),d+=p),d||c?(d*=ur,c*=ur,r=Math.cos(d)*_,i=Math.sin(d)*_,n=Math.sin(d-c)*-m,a=Math.cos(d-c)*m,c&&(p*=ur,s=Math.tan(c-p),n*=s=Math.sqrt(1+s*s),a*=s,p&&(s=Math.tan(p),r*=s=Math.sqrt(1+s*s),i*=s)),r=ia(r),i=ia(i),n=ia(n),a=ia(a)):(r=_,a=m,i=n=0),(x&&!~(l+"").indexOf("px")||M&&!~(f+"").indexOf("px"))&&(x=ae(g,"x",l,"px"),M=ae(g,"y",f,"px")),(v||y||T||b)&&(x=ia(x+v-(v*r+y*n)+T),M=ia(M+y-(v*i+y*a)+b)),(u||h)&&(s=g.getBBox(),x=ia(x+u/100*s.width),M=ia(M+h/100*s.height)),s="matrix("+r+","+i+","+n+","+a+","+x+","+M+")",g.setAttribute("transform",s),w&&(g.style[pr]=s)};ha("padding,margin,Width,Radius",function(e,r){var t="Right",i="Bottom",n="Left",o=(r<3?["Top",t,i,n]:["Top"+n,"Top"+t,i+t,i+n]).map(function(t){return r<2?e+t:"border"+t+e});wr[1<r?"border"+e:e]=function(e,t,r,i,n){var a,s;if(arguments.length<4)return a=o.map(function(t){return Tr(e,t,r)}),5===(s=a.join(" ")).split(a[0]).length?a[0]:s;a=(i+"").split(" "),s={},o.forEach(function(t,e){return s[t]=a[e]=a[e]||a[(e-1)/2|0]}),e.init(t,s,n)}});var Er,Rr,Fr,Lr={name:"css",register:Td,targetTest:function targetTest(t){return t.style&&t.nodeType},init:function init(t,e,i,n,a){var s,o,u,h,l,f,d,c,p,_,m,g,v,y,T,b,w=this._props,x=t.style,M=i.vars.startAt;for(d in Le||Td(),this.styles=this.styles||Nd(t),b=this.styles.props,this.tween=i,e)if("autoRound"!==d&&(o=e[d],!pt[d]||!bc(d,e,i,n,t,a)))if(l=typeof o,f=wr[d],"function"===l&&(l=typeof(o=o.call(i,n,t,a))),"string"===l&&~o.indexOf("random(")&&(o=pb(o)),f)f(this,t,d,o,i)&&(T=1);else if("--"===d.substr(0,2))s=(getComputedStyle(t).getPropertyValue(d)+"").trim(),o+="",zt.lastIndex=0,zt.test(s)||(c=Za(s),p=Za(o)),p?c!==p&&(s=ae(t,d,s,p)+p):c&&(o+=c),this.add(x,"setProperty",s,o,n,a,0,0,d),w.push(d),b.push(d,0,x[d]);else if("undefined"!==l){if(M&&d in M?(s="function"==typeof M[d]?M[d].call(i,n,t,a):M[d],r(s)&&~s.indexOf("random(")&&(s=pb(s)),Za(s+"")||"auto"===s||(s+=X.units[d]||Za(Tr(t,d))||""),"="===(s+"").charAt(1)&&(s=Tr(t,d))):s=Tr(t,d),h=parseFloat(s),(_="string"===l&&"="===o.charAt(1)&&o.substr(0,2))&&(o=o.substr(2)),u=parseFloat(o),d in cr&&("autoAlpha"===d&&(1===h&&"hidden"===Tr(t,"visibility")&&u&&(h=0),b.push("visibility",0,x.visibility),Zd(this,x,"visibility",h?"inherit":"hidden",u?"inherit":"hidden",!u)),"scale"!==d&&"transform"!==d&&~(d=cr[d]).indexOf(",")&&(d=d.split(",")[0])),m=d in sr)if(this.styles.save(d),"string"===l&&"var(--"===o.substring(0,6)&&(o=Qd(t,o.substring(4,o.indexOf(")"))),u=parseFloat(o)),g||((v=t._gsap).renderTransform&&!e.parseTransform||kr(t,e.parseTransform),y=!1!==e.smoothOrigin&&v.smooth,(g=this._pt=new ge(this._pt,x,pr,0,1,v.renderTransform,v,0,-1)).dep=1),"scale"===d)this._pt=new ge(this._pt,v,"scaleY",v.scaleY,(_?ka(v.scaleY,_+u):u)-v.scaleY||0,wd),this._pt.u=0,w.push("scaleY",d),d+="X";else{if("transformOrigin"===d){b.push(_r,0,x[_r]),o=ee(o),v.svg?me(t,o,0,y,0,this):((p=parseFloat(o.split(" ")[2])||0)!==v.zOrigin&&Zd(this,v,"zOrigin",v.zOrigin,p),Zd(this,x,d,Or(s),Or(o)));continue}if("svgOrigin"===d){me(t,o,1,y,0,this);continue}if(d in Mr){we(this,v,d,h,_?ka(h,_+o):o);continue}if("smoothOrigin"===d){Zd(this,v,"smooth",v.smooth,o);continue}if("force3D"===d){v[d]=o;continue}if("transform"===d){ye(this,o,t);continue}}else d in x||(d=gr(d)||d);if(m||(u||0===u)&&(h||0===h)&&!dr.test(o)&&d in x)u=u||0,(c=(s+"").substr((h+"").length))!==(p=Za(o)||(d in X.units?X.units[d]:c))&&(h=ae(t,d,s,p)),this._pt=new ge(this._pt,m?v:x,d,h,(_?ka(h,_+u):u)-h,m||"px"!==p&&"zIndex"!==d||!1===e.autoRound?wd:zd),this._pt.u=p||0,c!==p&&"%"!==p&&(this._pt.b=s,this._pt.r=yd);else if(d in x)ce.call(this,t,d,s,_?_+o:o);else if(d in t)this.add(t,d,s||t[d],_?_+o:o,n,a);else if("parseTransform"!==d){Q(d,o);continue}m||(d in x?b.push(d,0,x[d]):"function"==typeof t[d]?b.push(d,2,t[d]()):b.push(d,1,s||t[d])),w.push(d)}T&&_e(this)},render:function render(t,e){if(e.tween._time||!Ye())for(var r=e._pt;r;)r.r(t,r.d),r=r._next;else e.styles.revert()},get:Tr,aliases:cr,getSetter:function getSetter(t,e,r){var i=cr[e];return i&&i.indexOf(",")<0&&(e=i),e in sr&&e!==_r&&(t._gsap.x||Tr(t,"x"))?r&&Be===r?"scale"===e?Fd:Ed:(Be=r||{})&&("scale"===e?Gd:Hd):t.style&&!u(t.style[e])?Cd:~e.indexOf("-")?Dd:ie(t,e)},core:{_removeProperty:Yd,_getMatrix:le}};ze.utils.checkPrefix=gr,ze.core.getStyleSaver=Nd,Fr=ha((Er="x,y,z,scale,scaleX,scaleY,xPercent,yPercent")+","+(Rr="rotation,rotationX,rotationY,skewX,skewY")+",transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective",function(t){sr[t]=1}),ha(Rr,function(t){X.units[t]="deg",Mr[t]=1}),cr[Fr[13]]=Er+","+Rr,ha("0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY",function(t){var e=t.split(":");cr[e[1]]=Fr[e[0]]}),ha("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective",function(t){X.units[t]="px"}),ze.registerPlugin(Lr);var Ir=ze.registerPlugin(Lr)||ze,Br=Ir.core.Tween;e.Back=tr,e.Bounce=rr,e.CSSPlugin=Lr,e.Circ=ar,e.Cubic=Ge,e.Elastic=$e,e.Expo=nr,e.Linear=Ve,e.Power0=Ze,e.Power1=Ne,e.Power2=Qe,e.Power3=Ue,e.Power4=qe,e.Quad=We,e.Quart=He,e.Quint=Ke,e.Sine=ir,e.SteppedEase=er,e.Strong=Je,e.TimelineLite=Qt,e.TimelineMax=Qt,e.TweenLite=Jt,e.TweenMax=Br,e.default=Ir,e.gsap=Ir;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
```
## `js/vendor/lenis.min.js`
```js
function t(t,e,i){return Math.max(t,Math.min(e,i))}var e=class{isRunning=!1;value=0;from=0;to=0;currentTime=0;lerp;duration;easing;onUpdate;advance(e){if(!this.isRunning)return;let i=!1;if(this.duration&&this.easing){this.currentTime+=e;const s=t(0,this.currentTime/this.duration,1);i=s>=1;const o=i?1:this.easing(s);this.value=this.from+(this.to-this.from)*o}else this.lerp?(this.value=function(t,e,i,s){return function(t,e,i){return(1-i)*t+i*e}(t,e,1-Math.exp(-i*s))}(this.value,this.to,60*this.lerp,e),Math.round(this.value)===this.to&&(this.value=this.to,i=!0)):(this.value=this.to,i=!0);i&&this.stop(),this.onUpdate?.(this.value,i)}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i,duration:s,easing:o,onStart:n,onUpdate:r}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,n?.(),this.onUpdate=r}};var i=class{constructor(t,e,{autoResize:i=!0,debounce:s=250}={}){this.wrapper=t,this.content=e,i&&(this.debouncedResize=function(t,e){let i;return function(...s){let o=this;clearTimeout(i),i=setTimeout((()=>{i=void 0,t.apply(o,s)}),e)}}(this.resize,s),this.wrapper instanceof Window?window.addEventListener("resize",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}width=0;height=0;scrollHeight=0;scrollWidth=0;debouncedResize;wrapperResizeObserver;contentResizeObserver;destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),this.wrapper===window&&this.debouncedResize&&window.removeEventListener("resize",this.debouncedResize,!1)}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}}},s=class{events={};emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t<s;t++)i[t]?.(...e)}on(t,e){return this.events[t]?.push(e)||(this.events[t]=[e]),()=>{this.events[t]=this.events[t]?.filter((t=>e!==t))}}off(t,e){this.events[t]=this.events[t]?.filter((t=>e!==t))}destroy(){this.events={}}},o=100/6,n={passive:!1},r=class{constructor(t,e={wheelMultiplier:1,touchMultiplier:1}){this.element=t,this.options=e,window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,n),this.element.addEventListener("touchstart",this.onTouchStart,n),this.element.addEventListener("touchmove",this.onTouchMove,n),this.element.addEventListener("touchend",this.onTouchEnd,n)}touchStart={x:0,y:0};lastDelta={x:0,y:0};window={width:0,height:0};emitter=new s;on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),window.removeEventListener("resize",this.onWindowResize,!1),this.element.removeEventListener("wheel",this.onWheel,n),this.element.removeEventListener("touchstart",this.onTouchStart,n),this.element.removeEventListener("touchmove",this.onTouchMove,n),this.element.removeEventListener("touchend",this.onTouchEnd,n)}onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0},this.emitter.emit("scroll",{deltaX:0,deltaY:0,event:t})};onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.options.touchMultiplier,o=-(i-this.touchStart.y)*this.options.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:o},this.emitter.emit("scroll",{deltaX:s,deltaY:o,event:t})};onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})};onWheel=t=>{let{deltaX:e,deltaY:i,deltaMode:s}=t;e*=1===s?o:2===s?this.window.width:1,i*=1===s?o:2===s?this.window.height:1,e*=this.options.wheelMultiplier,i*=this.options.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})};onWindowResize=()=>{this.window={width:window.innerWidth,height:window.innerHeight}}},l=t=>Math.min(1,1.001-Math.pow(2,-10*t)),Lenis=class{_isScrolling=!1;_isStopped=!1;_isLocked=!1;_preventNextNativeScrollEvent=!1;_resetVelocityTimeout=null;__rafID=null;isTouching;time=0;userData={};lastVelocity=0;velocity=0;direction=0;options;targetScroll;animatedScroll;animate=new e;emitter=new s;dimensions;virtualScroll;constructor({wrapper:t=window,content:e=document.documentElement,eventsTarget:s=t,smoothWheel:o=!0,syncTouch:n=!1,syncTouchLerp:h=.075,touchInertiaMultiplier:a=35,duration:c,easing:p,lerp:d=.1,infinite:u=!1,orientation:m="vertical",gestureOrientation:v="vertical",touchMultiplier:g=1,wheelMultiplier:w=1,autoResize:S=!0,prevent:f,virtualScroll:y,overscroll:E=!0,autoRaf:T=!1,anchors:z=!1,autoToggle:b=!1,allowNestedScroll:_=!1,__experimental__naiveDimensions:L=!1}={}){window.lenisVersion="1.3.4",t&&t!==document.documentElement||(t=window),"number"==typeof c&&"function"!=typeof p?p=l:"function"==typeof p&&"number"!=typeof c&&(c=1),this.options={wrapper:t,content:e,eventsTarget:s,smoothWheel:o,syncTouch:n,syncTouchLerp:h,touchInertiaMultiplier:a,duration:c,easing:p,lerp:d,infinite:u,gestureOrientation:v,orientation:m,touchMultiplier:g,wheelMultiplier:w,autoResize:S,prevent:f,virtualScroll:y,overscroll:E,autoRaf:T,anchors:z,autoToggle:b,allowNestedScroll:_,__experimental__naiveDimensions:L},this.dimensions=new i(t,e,{autoResize:S}),this.updateClassName(),this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.addEventListener("scrollend",this.onScrollEnd,{capture:!0}),this.options.anchors&&this.options.wrapper===window&&this.options.wrapper.addEventListener("click",this.onClick,!1),this.options.wrapper.addEventListener("pointerdown",this.onPointerDown,!1),this.virtualScroll=new r(s,{touchMultiplier:g,wheelMultiplier:w}),this.virtualScroll.on("scroll",this.onVirtualScroll),this.options.autoToggle&&this.rootElement.addEventListener("transitionend",this.onTransitionEnd,{passive:!0}),this.options.autoRaf&&(this.__rafID=requestAnimationFrame(this.raf))}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.removeEventListener("scrollend",this.onScrollEnd,{capture:!0}),this.options.wrapper.removeEventListener("pointerdown",this.onPointerDown,!1),this.options.anchors&&this.options.wrapper===window&&this.options.wrapper.removeEventListener("click",this.onClick,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName(),this.__rafID&&cancelAnimationFrame(this.__rafID)}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}onScrollEnd=t=>{t instanceof CustomEvent||"smooth"!==this.isScrolling&&!1!==this.isScrolling||t.stopPropagation()};dispatchScrollendEvent=()=>{this.options.wrapper.dispatchEvent(new CustomEvent("scrollend",{bubbles:this.options.wrapper===window,detail:{lenisScrollEnd:!0}}))};onTransitionEnd=t=>{if(t.propertyName.includes("overflow")){const t=this.isHorizontal?"overflow-x":"overflow-y",e=getComputedStyle(this.rootElement)[t];["hidden","clip"].includes(e)?this.stop():this.start()}};setScroll(t){this.isHorizontal?this.options.wrapper.scrollTo({left:t,behavior:"instant"}):this.options.wrapper.scrollTo({top:t,behavior:"instant"})}onClick=t=>{const e=t.composedPath().find((t=>t instanceof HTMLAnchorElement&&(t.getAttribute("href")?.startsWith("#")||t.getAttribute("href")?.startsWith("/#")||t.getAttribute("href")?.startsWith("./#"))));if(e){const t=e.getAttribute("href");if(t){const e="object"==typeof this.options.anchors&&this.options.anchors?this.options.anchors:void 0;let i=`#${t.split("#")[1]}`;["#","/#","./#","#top","/#top","./#top"].includes(t)&&(i=0),this.scrollTo(i,e)}}};onPointerDown=t=>{1===t.button&&this.reset()};onVirtualScroll=t=>{if("function"==typeof this.options.virtualScroll&&!1===this.options.virtualScroll(t))return;const{deltaX:e,deltaY:i,event:s}=t;if(this.emitter.emit("virtual-scroll",{deltaX:e,deltaY:i,event:s}),s.ctrlKey)return;if(s.lenisStopPropagation)return;const o=s.type.includes("touch"),n=s.type.includes("wheel");this.isTouching="touchstart"===s.type||"touchmove"===s.type;const r=0===e&&0===i;if(this.options.syncTouch&&o&&"touchstart"===s.type&&r&&!this.isStopped&&!this.isLocked)return void this.reset();const l="vertical"===this.options.gestureOrientation&&0===i||"horizontal"===this.options.gestureOrientation&&0===e;if(r||l)return;let h=s.composedPath();h=h.slice(0,h.indexOf(this.rootElement));const a=this.options.prevent;if(h.find((t=>t instanceof HTMLElement&&("function"==typeof a&&a?.(t)||t.hasAttribute?.("data-lenis-prevent")||o&&t.hasAttribute?.("data-lenis-prevent-touch")||n&&t.hasAttribute?.("data-lenis-prevent-wheel")||this.options.allowNestedScroll&&this.checkNestedScroll(t,{deltaX:e,deltaY:i})))))return;if(this.isStopped||this.isLocked)return void s.preventDefault();if(!(this.options.syncTouch&&o||this.options.smoothWheel&&n))return this.isScrolling="native",this.animate.stop(),void(s.lenisStopPropagation=!0);let c=i;"both"===this.options.gestureOrientation?c=Math.abs(i)>Math.abs(e)?i:e:"horizontal"===this.options.gestureOrientation&&(c=e),(!this.options.overscroll||this.options.infinite||this.options.wrapper!==window&&(this.animatedScroll>0&&this.animatedScroll<this.limit||0===this.animatedScroll&&i>0||this.animatedScroll===this.limit&&i<0))&&(s.lenisStopPropagation=!0),s.preventDefault();const p=o&&this.options.syncTouch,d=o&&"touchend"===s.type&&Math.abs(c)>5;d&&(c=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+c,{programmatic:!1,...p?{lerp:d?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}})};resize(){this.dimensions.resize(),this.animatedScroll=this.targetScroll=this.actualScroll,this.emit()}emit(){this.emitter.emit("scroll",this)}onNativeScroll=()=>{if(null!==this._resetVelocityTimeout&&(clearTimeout(this._resetVelocityTimeout),this._resetVelocityTimeout=null),this._preventNextNativeScrollEvent)this._preventNextNativeScrollEvent=!1;else if(!1===this.isScrolling||"native"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isStopped||(this.isScrolling="native"),this.emit(),0!==this.velocity&&(this._resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}};reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.reset(),this.isStopped=!1,this.emit())}stop(){this.isStopped||(this.reset(),this.isStopped=!0,this.emit())}raf=t=>{const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e),this.options.autoRaf&&(this.__rafID=requestAnimationFrame(this.raf))};scrollTo(e,{offset:i=0,immediate:s=!1,lock:o=!1,duration:n=this.options.duration,easing:r=this.options.easing,lerp:h=this.options.lerp,onStart:a,onComplete:c,force:p=!1,programmatic:d=!0,userData:u}={}){if(!this.isStopped&&!this.isLocked||p){if("string"==typeof e&&["top","left","start"].includes(e))e=0;else if("string"==typeof e&&["bottom","right","end"].includes(e))e=this.limit;else{let t;if("string"==typeof e?t=document.querySelector(e):e instanceof HTMLElement&&e?.nodeType&&(t=e),t){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();i-=this.isHorizontal?t.left:t.top}const s=t.getBoundingClientRect();e=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof e){if(e+=i,e=Math.round(e),this.options.infinite){if(d){this.targetScroll=this.animatedScroll=this.scroll;const t=e-this.animatedScroll;t>this.limit/2?e-=this.limit:t<-this.limit/2&&(e+=this.limit)}}else e=t(0,e,this.limit);if(e===this.targetScroll)return a?.(this),void c?.(this);if(this.userData=u??{},s)return this.animatedScroll=this.targetScroll=e,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),c?.(this),this.userData={},void requestAnimationFrame((()=>{this.dispatchScrollendEvent()}));d||(this.targetScroll=e),"number"==typeof n&&"function"!=typeof r?r=l:"function"==typeof r&&"number"!=typeof n&&(n=1),this.animate.fromTo(this.animatedScroll,e,{duration:n,easing:r,lerp:h,onStart:()=>{o&&(this.isLocked=!0),this.isScrolling="smooth",a?.(this)},onUpdate:(t,e)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),d&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),c?.(this),this.userData={},requestAnimationFrame((()=>{this.dispatchScrollendEvent()})),this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this._preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{this._preventNextNativeScrollEvent=!1}))}checkNestedScroll(t,{deltaX:e,deltaY:i}){const s=Date.now(),o=t._lenis??={};let n,r,l,h,a,c,p,d;const u=this.options.gestureOrientation;if(s-(o.time??0)>2e3){o.time=Date.now();const e=window.getComputedStyle(t);o.computedStyle=e;const i=e.overflowX,s=e.overflowY;if(n=["auto","overlay","scroll"].includes(i),r=["auto","overlay","scroll"].includes(s),o.hasOverflowX=n,o.hasOverflowY=r,!n&&!r)return!1;if("vertical"===u&&!r)return!1;if("horizontal"===u&&!n)return!1;a=t.scrollWidth,c=t.scrollHeight,p=t.clientWidth,d=t.clientHeight,l=a>p,h=c>d,o.isScrollableX=l,o.isScrollableY=h,o.scrollWidth=a,o.scrollHeight=c,o.clientWidth=p,o.clientHeight=d}else l=o.isScrollableX,h=o.isScrollableY,n=o.hasOverflowX,r=o.hasOverflowY,a=o.scrollWidth,c=o.scrollHeight,p=o.clientWidth,d=o.clientHeight;if(!n&&!r||!l&&!h)return!1;if(!("vertical"!==u||r&&h))return!1;if(!("horizontal"!==u||n&&l))return!1;let m,v,g,w,S,f;if("horizontal"===u)m="x";else if("vertical"===u)m="y";else{0!==e&&n&&l&&(m="x"),0!==i&&r&&h&&(m="y")}if(!m)return!1;if("x"===m)v=t.scrollLeft,g=a-p,w=e,S=n,f=l;else{if("y"!==m)return!1;v=t.scrollTop,g=c-d,w=i,S=r,f=h}return(w>0?v<g:v>0)&&S&&f}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){const t=this.options.wrapper;return this.isHorizontal?t.scrollX??t.scrollLeft:t.scrollY??t.scrollTop}get scroll(){return this.options.infinite?(t=this.animatedScroll,e=this.limit,(t%e+e)%e):this.animatedScroll;var t,e}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this._isScrolling}set isScrolling(t){this._isScrolling!==t&&(this._isScrolling=t,this.updateClassName())}get isStopped(){return this._isStopped}set isStopped(t){this._isStopped!==t&&(this._isStopped=t,this.updateClassName())}get isLocked(){return this._isLocked}set isLocked(t){this._isLocked!==t&&(this._isLocked=t,this.updateClassName())}get isSmooth(){return"smooth"===this.isScrolling}get className(){let t="lenis";return this.options.autoToggle&&(t+=" lenis-autoToggle"),this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),"smooth"===this.isScrolling&&(t+=" lenis-smooth"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\w+)?/g,"").trim()}};globalThis.Lenis=Lenis,globalThis.Lenis.prototype=Lenis.prototype;//# sourceMappingURL=lenis.min.js.map
```
---
## ▶ ASSET MANIFEST — source URL → local file
| Downloaded from (WP Media, `demo.uichemy.com`) | Saved as |
|---|---|
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-hero-lug.jpg` | `images/hero-lug.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-01.jpg` | `images/loader-01.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-02.jpg` | `images/loader-02.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-03.jpg` | `images/loader-03.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-loader-04.jpg` | `images/loader-04.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-01.jpg` | `images/log-01.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-02.jpg` | `images/log-02.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-03.jpg` | `images/log-03.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-04.jpg` | `images/log-04.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-05.jpg` | `images/log-05.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-06.jpg` | `images/log-06.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-07.jpg` | `images/log-07.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-08.jpg` | `images/log-08.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-09.jpg` | `images/log-09.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-10.jpg` | `images/log-10.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-11.jpg` | `images/log-11.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-log-12.jpg` | `images/log-12.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-gravel.jpg` | `images/panel-gravel.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-road.jpg` | `images/panel-road.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-track.jpg` | `images/panel-track.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-panel-tour.jpg` | `images/panel-tour.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-01.jpg` | `images/ride-01.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-02.jpg` | `images/ride-02.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-03.jpg` | `images/ride-03.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-04.jpg` | `images/ride-04.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-05.jpg` | `images/ride-05.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-06.jpg` | `images/ride-06.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-07.jpg` | `images/ride-07.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-08.jpg` | `images/ride-08.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-09.jpg` | `images/ride-09.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-10.jpg` | `images/ride-10.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-11.jpg` | `images/ride-11.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-12.jpg` | `images/ride-12.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-13.jpg` | `images/ride-13.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-14.jpg` | `images/ride-14.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-15.jpg` | `images/ride-15.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-16.jpg` | `images/ride-16.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-17.jpg` | `images/ride-17.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__images-ride-18.jpg` | `images/ride-18.jpg` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-extra-condensed-latin.woff2` | `fonts/sofia-sans-extra-condensed-latin.woff2` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-extra-condensed-latin-ext.woff2` | `fonts/sofia-sans-extra-condensed-latin-ext.woff2` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-latin.woff2` | `fonts/sofia-sans-latin.woff2` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-sofia-sans-latin-ext.woff2` | `fonts/sofia-sans-latin-ext.woff2` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-azeret-mono-latin.woff2` | `fonts/azeret-mono-latin.woff2` |
| `https://demo.uichemy.com/wp-content/uploads/2026/09/fettle__fonts-azeret-mono-latin-ext.woff2` | `fonts/azeret-mono-latin-ext.woff2` |