# Link Hub Template

> An editorial link-in-bio page for a fashion model and lifestyle creator: a Didone contents index whose covers follow the cursor and cross-fade as you move down the list, with a shipping four-palette persona switcher.

Canonical: https://gsapvault.com/templates/link-hub-template
Live demo: https://gsapvault.com/demos/link-hub-template/index.html

| Property | Value |
|----------|-------|
| Type | template |
| Tier | paid |
| Price | £10 |
| Difficulty | intermediate |
| Plugins | ScrollTrigger |
| Techniques | cursor-follow, magnetic, image-preview, spotlight, scroll-reveal, parallax, stagger |
| Uses Lenis | Yes |

## Overview

A complete, deployable one-page link hub for a fashion model and lifestyle creator: a fixed nav, a full-bleed portrait hero, an editorial link index, a Latest campaign block, a social row and a footer. The demo dresses it as Noor Vidal, a Milan-based model, but every word, link and photo is yours. It is styled like the contents page of a magazine, not a stack of rounded buttons: a high-contrast Bodoni Moda display over a clean Hanken Grotesk, on a glossy warm-black ground with a single champagne accent.

The index is the signature. On a laptop, a single cover photo follows your cursor down the list and cross-fades to whichever row you are over, that row's label slides toward the pointer, the other rows dim, and an underline sweeps in. On a phone, in reduced motion, or with JavaScript off, each row instead shows its cover as a small static thumbnail, so the whole index stays complete and tappable with none of the motion.

Making it yours is a photo swap and, if you like, a palette swap. Drop your campaign shots into the image slots (a bundled manifest bakes the grade so the set reads as one shoot), and rewrite the copy in your voice. The page ships four full palettes: Runway (the glossy near-black default), Neon (magenta nightlife), Editorial (a light cream print look) and Studio (calm greige). Pick one by setting data-palette on the html tag, or copy its values into the stylesheet's root.

With JavaScript off the page is a clean, readable document with every link reachable, and it deploys as static files with no build step.

## Features

- Complete deployable link page: fixed nav, portrait hero with bio and stats, a six-row link index, a Latest campaign block, a social row and a footer
- Signature hover index: on a fine pointer one cover photo follows the cursor and cross-fades to the hovered row, with a velocity-driven tilt and a settle lag that reads as a held photograph
- Magnetic labels and a spotlight: the hovered row's Bodoni label nudges toward the cursor, the other rows dim to 0.4, and an accent underline sweeps in
- A real touch fallback: on coarse pointers, reduced motion or no-JS, every row shows its cover as a static inline thumbnail instead of the floating preview, fully tappable and good-looking
- Four shipping palettes (Runway, Neon, Editorial, Studio), each a full token block with RGB triples, switched by one data-palette attribute - a persona picker for the buyer, not demo scaffolding
- Every colour token measured as used in all four palettes; the tightest pair on the site is 4.6:1 and it is recorded in the stylesheet header
- Hero portrait parallax on scroll, kept within an overscaled frame so no edge is ever uncovered
- Designed CSS placeholders behind every image slot: a per-palette graded gradient tile so the page looks finished before the real photos are dropped in, with a bundled manifest for baking them
- Keyboard parity: rows are real links that tab and open natively, and focus mirrors the hover spotlight and preview
- Flash-free: the JS gate is set synchronously in the head, every reveal target is pre-hidden under it, and a blocked CDN degrades to the plain document
- Reduced motion renders a complete static page via both a CSS media query and the matchMedia branch

## Use Cases

- Link-in-bio pages for models, influencers and lifestyle creators
- A single landing page linking a portfolio, shop edit, bookings and socials
- Photographers, stylists and makeup artists pointing to a book and a rate card
- Anyone replacing a rented link-list service with an editorial page they own
- Talent and agency profile pages that need to look like a campaign, not a form

## How It Works

### Structure

One script initialises everything inside a single gsap.context, with gsap.matchMedia branching on pointer type and reduced motion. Every querySelector is guarded, so the nav, hero, index, Latest block, social row and footer can each be deleted without breaking the rest. Lenis is wired in optionally and shares its clock with ScrollTrigger, so the reveals and parallax stay in step with smooth scroll.

### The hover index

On a fine pointer a single fixed cover follows the cursor through gsap.quickTo, cross-fading its stacked images by autoAlpha to whichever row you are over. The same pointer move drives a velocity tilt on the preview and a magnetic nudge on the active row's label, while a data attribute dims the other rows and sweeps in an underline. It is all quickTo and quickSetter work, so no extra plugin is needed beyond ScrollTrigger.

### The touch fallback

The floating preview only wakes in the fine-pointer, non-reduced branch, which is also where the inline thumbnails are hidden. On a phone, a coarse pointer, reduced motion or with no JavaScript, those thumbnails are what shows: each row carries its cover as a small static image, so the index is a complete, tappable list without any cursor work. Rows are real anchors, so they open on tap the same way they do on click.

### The palette switch

Four palettes ship as data-palette blocks in the stylesheet, each restating every colour token and its RGB triple. Because every translucent rule, scrim and placeholder gradient resolves from those triples, switching palette repaints the whole page, placeholders included, with no stale colour left behind. A buyer sets one attribute on the html tag, or copies a block into the root and deletes the rest.

### Reduced motion and no JavaScript

The JS gate is added synchronously in the head so reveal start states apply before first paint, and the script removes it if the GSAP CDN fails, degrading to the plain document. Reduced motion restores every pre-hidden reveal through both a CSS media query and the matchMedia branch, and renders the static thumbnail index. With JavaScript off the page is a clean, readable document with every link reachable.

## Integration Preview

How this effect integrates into a page. The full documentation (examples, events, programmatic API, customization guide) ships with the download.

### Quick Start

1. **Copy the folder.** Everything the page needs is in `index.html` and
   `assets/` (`style.css`, `script.js`). The CDN `<script>` tags for GSAP,
   ScrollTrigger and Lenis are already in `index.html`.

2. **Add your photos.** The page references eight images in `assets/img/`:

   | File | Size | Where |
   |------|------|-------|
   | `hero.webp` | 1600 x 2000 | the portrait hero |
   | `link-01.webp` … `link-06.webp` | 800 x 1000 each | the six link covers |
   | `feature.webp` | 1200 x 800 | the Latest campaign cover |

   Until they exist, a designed gradient placeholder (graded from the current
   palette) fills every slot, so the page looks finished from the first open.
   See **Images** below for the bundled bake pipeline, or just drop files with
   those exact names into `assets/img/`.

3. **Rewrite the copy.** Replace the brand name (`Noor Vidal`), handle, bio,
   stats, the six link labels/meta, the Latest block and the footer with yours.
   Point each `href="#"` at your real destination.

4. **Pick a palette** (optional). See **Palettes** below.

---

### Accessibility

- **Reduced motion.** With `prefers-reduced-motion: reduce`, all reveals and the
  parallax are disabled through both a CSS media query and the matchMedia branch,
  and the index renders as the static thumbnail list. Nothing is left hidden.
- **No JavaScript.** The page is a clean, readable document: nav, hero, all six
  links, the Latest block, the social row and the footer are present and
  reachable. The floating preview never appears, because nothing wakes it. The
  link rows are plain `<a>` elements, so they tab and open natively.
- **Touch.** The cursor preview is fine-pointer only; coarse pointers get the
  static thumbnail index, fully tappable.
- **Keyboard.** Every row is a real link. Focus mirrors the hover spotlight — the
  focused row lights its underline and arrow and, when the enhanced index is
  active, brings up its cover — so a keyboard user gets the same cue a mouse does.

---

### Dependencies

- [GSAP 3.14.2](https://gsap.com/) core + ScrollTrigger (CDN tags included)
- [Lenis 1.3.17](https://github.com/darkroomengineering/lenis) smooth scroll
  (optional; the page works without it)
- Fonts: [Bodoni Moda](https://fonts.google.com/specimen/Bodoni+Moda) (display)
  and [Hanken Grotesk](https://fonts.google.com/specimen/Hanken+Grotesk) (body),
  loaded from Google Fonts

No build step. No framework. Static HTML, CSS and one JavaScript file.

## What You Get

- `index.html`: working demo page
- `assets/script.js`: commented, readable source
- `assets/style.css`: effect styles
- `README.md`: full documentation with examples and framework integration notes
- `LICENSE.txt`: standard license terms
- Lifetime updates: re-download anytime from your library

## Get the Code

This is a premium template. The standard license costs £10 one-time and covers unlimited personal and commercial projects with no attribution required. The only restrictions: no redistribution of the code itself and no competing effect libraries.

- [Buy Link Hub Template](https://gsapvault.com/templates/link-hub-template)
- [Effects & Templates Vault (£39 one-time, best value): every current and future effect and template](https://gsapvault.com/effects)

---

From [GSAP Vault](https://gsapvault.com): production-ready GSAP animation effects. Full catalog for agents: https://gsapvault.com/llms-full.txt
