ToolsWaves
Free GSAP Landing Page Template ยท ToolsWaves ยท HR & Hiring

Free Hiring Platform Hero Template with Unicorn Sparkle Loader

Free hiring platform landing page template from ToolsWaves featuring a rainbow-arc unicorn loader with sparkles, bouncing emoji accents, person photo bubbles with float, a clickable unicorn that spins and bursts sparkles, and word-by-word title with color wobble. Free for any project.

PlayfulHiringUnicornBurstEmoji

About this ToolsWaves template

This is a deliberately playful free hiring platform landing page template offered through ToolsWaves. The loader features a rainbow arc with a sparkle unicorn โ€” immediately signaling that this is not an enterprise corporate tool. Person photos bounce with subtle float animations, bouncing emoji accents add personality, and the title reveals word by word with a slight color wobble. Click the unicorn and it spins while bursting sparkles in every direction.

Use this template for recruitment platforms, freelancer marketplaces, HR tools, or hiring brands that want to project warmth and approachability rather than enterprise gravitas. ToolsWaves offers this template completely free โ€” drop the three files (HTML, CSS, JS) into your project and rebrand at your pace. The playful elements work particularly well for brands targeting younger workers or creative-industry hiring; for a more reserved feel, the emoji and animations can be toned down via the GSAP timeline configuration.

Copy the code

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Free Hiring Platform Hero Template with Unicorn Sparkle Loader</title>
  <meta name="description" content="Free GSAP hiring platform landing page hero from ToolsWaves" />
  <meta name="generator" content="ToolsWaves - https://toolswaves.in/landing-pages" />

  <!-- Open Graph -->
  <meta property="og:title" content="Free Hiring Platform Hero Template with Unicorn Sparkle Loader" />
  <meta property="og:description" content="Free GSAP hiring platform landing page hero from ToolsWaves" />
  <meta property="og:type" content="website" />
  <meta property="og:image" content="https://toolswaves.in/og?title=Free%20Hiring%20Platform%20Hero%20Template%20with%20Unicorn%20Sparkle%20Loader&category=Landing%20Page&icon=%F0%9F%93%84" />

  <!-- Twitter -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="Free Hiring Platform Hero Template with Unicorn Sparkle Loader" />
  <meta name="twitter:description" content="Free GSAP hiring platform landing page hero from ToolsWaves" />
  <meta name="twitter:image" content="https://toolswaves.in/og?title=Free%20Hiring%20Platform%20Hero%20Template%20with%20Unicorn%20Sparkle%20Loader&category=Landing%20Page&icon=%F0%9F%93%84" />

  <!-- Bootstrap (used by template โ€” replace with your own framework if you prefer) -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" />

  <style>
* { margin: 0; padding: 0; box-sizing: border-box; }

:root {
    --bg:      #f4f4f7;
    --bg-2:    #eaeaf0;
    --ink:     #0a0a1a;
    --muted:   rgba(10, 10, 26, 0.55);
    --line:    rgba(10, 10, 26, 0.1);
    --purple:       #6c55ff;
    --purple-deep:  #5039e8;
    --purple-soft:  #9488ff;
    --pink:         #ff5ed7;
    --blue:         #3b9ff5;
    --yellow:       #ffd93b;
}

html, body {
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    background: var(--bg);
    color: var(--ink);
    overflow-x: hidden;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

.back-link {
    position: fixed;
    bottom: 0.75rem;
    left: 0.75rem;
    z-index: 1000;
    color: var(--ink);
    text-decoration: none;
    font-size: 0.65rem;
    font-weight: 600;
    letter-spacing: 0.12em;
    padding: 0.45rem 0.9rem;
    background: #fff;
    border-radius: 999px;
    box-shadow: 0 4px 12px rgba(10, 10, 26, 0.08);
    opacity: 0.85;
    transition: opacity 0.3s, transform 0.3s;
}
.back-link:hover { opacity: 1; transform: translateY(-2px); }

/* =========================================================
   LOADER โ€” Rainbow + sparkles
   ========================================================= */
.loader {
    position: fixed;
    inset: 0;
    z-index: 999;
    background: var(--bg);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2rem;
}
.loader__scene {
    position: relative;
    width: 320px;
    height: 220px;
}
.loader__rainbow {
    position: absolute;
    inset: 0;
    width: 100%; height: 100%;
}
.loader__rainbow .rb {
    stroke-dasharray: 500;
    stroke-dashoffset: 500;
}
.loader__unicorn {
    position: absolute;
    bottom: 5px;
    left: 50%;
    transform: translateX(-50%);
    font-size: 80px;
    z-index: 2;
    filter: drop-shadow(0 8px 15px rgba(108, 85, 255, 0.35));
    will-change: transform;
}
.loader__sparkles {
    position: absolute;
    inset: 0;
    pointer-events: none;
}
.loader__sparkles span {
    position: absolute;
    font-size: 16px;
    will-change: transform, opacity;
}

.loader__meta {
    display: flex;
    gap: 1.25rem;
    align-items: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 0.75rem;
    letter-spacing: 0.25em;
    color: var(--muted);
}
.loader__counter {
    color: var(--purple);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    min-width: 3ch;
}

/* =========================================================
   PLAYFUL SECTION
   ========================================================= */
.playful {
    position: relative;
    width: 100%;
    min-height: 100vh;
    overflow: hidden;
    background: var(--bg);
}

/* ---------- Top nav ---------- */
.topnav {
    position: relative;
    z-index: 30;
    display: flex;
    align-items: center;
    gap: 2rem;
    padding: 1.5rem 3rem;
}

.topnav__logo {
    display: inline-flex;
    align-items: flex-end;
    gap: 0.4rem;
    color: var(--ink);
    text-decoration: none;
    font-weight: 700;
    font-size: 1.4rem;
    letter-spacing: -0.02em;
    will-change: transform;
}
.topnav__logo-mark { width: 38px; height: 20px; }
.topnav__logo-mark svg { width: 100%; height: 100%; display: block; overflow: visible; }

.topnav__links {
    margin: 0 auto;
    display: flex;
    gap: 2.5rem;
}
.topnav__links a {
    position: relative;
    color: var(--ink);
    text-decoration: none;
    font-weight: 600;
    font-size: 1rem;
    padding: 0.3rem 0.1rem;
    will-change: transform;
}
.topnav__links a::after {
    content: '';
    position: absolute;
    left: 0; bottom: 0;
    width: 100%; height: 2px;
    background: var(--purple);
    transform: scaleX(0);
    transform-origin: right;
    border-radius: 2px;
    transition: transform 0.4s cubic-bezier(0.65, 0, 0.35, 1);
}
.topnav__links a:hover::after { transform: scaleX(1); transform-origin: left; }

.topnav__cta {
    background: #fff;
    color: var(--purple);
    text-decoration: none;
    padding: 0.9rem 1.8rem;
    border-radius: 30px;
    font-weight: 700;
    font-size: 1rem;
    box-shadow: 0 6px 20px rgba(10, 10, 26, 0.08);
    position: relative;
    will-change: transform;
    transition: box-shadow 0.3s;
}
.topnav__cta:hover { box-shadow: 0 10px 28px rgba(108, 85, 255, 0.25); }

/* ---------- Hero ---------- */
.hero {
    position: relative;
    z-index: 10;
    padding: 2rem 1.5rem 4rem;
    text-align: center;
    min-height: calc(100vh - 100px);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
}

.hero__rainbow {
    font-size: 42px;
    position: relative;
    z-index: 11;
    margin-bottom: -8px;
    transform-origin: center bottom;
    will-change: transform;
}

.hero__badge {
    background: #fff;
    padding: 0.8rem 1.75rem;
    border-radius: 40px;
    box-shadow: 0 8px 24px rgba(10, 10, 26, 0.08);
    font-size: 1.1rem;
    margin-bottom: 2rem;
    position: relative;
    z-index: 11;
    will-change: transform;
    cursor: default;
}
.hero__badge-text b { color: var(--ink); font-weight: 700; }
.hero__badge-text em {
    font-style: normal;
    color: var(--purple);
    font-weight: 600;
    background: linear-gradient(90deg, var(--purple), var(--pink));
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
}

/* ---------- Person bubbles ---------- */
.person {
    position: absolute;
    border-radius: 50%;
    overflow: hidden;
    box-shadow: 0 10px 20px rgba(10, 10, 26, 0.15);
    z-index: 8;
    cursor: pointer;
    will-change: transform;
    border: 4px solid #fff;
}
.person img { width: 100%; height: 100%; object-fit: cover; object-position: center 25%; user-select: none; }
.person--1 { top: 8%; right: 22%; width: 75px; height: 75px; }
.person--2 { top: 40%; left: 26%; width: 65px; height: 65px; }
.person--3 { top: 60%; left: 42%; width: 75px; height: 75px; }

/* ---------- Floating emojis ---------- */
.emoji {
    position: absolute;
    z-index: 7;
    font-size: 38px;
    cursor: pointer;
    user-select: none;
    will-change: transform;
}
.emoji--uni-sm    { top: 16%; left: 28%; font-size: 42px; }
.emoji--fire-1    { top: 44%; left: 32%; font-size: 30px; }
.emoji--fire-2    { top: 56%; right: 28%; font-size: 34px; }
.emoji--rainbow-2 { top: 44%; right: 28%; font-size: 38px; }
.emoji--sparkle   { top: 26%; right: 35%; font-size: 26px; }

/* ---------- Main unicorn stage ---------- */
.unicorn-stage {
    position: absolute;
    top: 22%;
    left: 50%;
    transform: translateX(-50%);
    width: 320px;
    height: 320px;
    z-index: 6;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: auto;
    will-change: transform;
}
.unicorn-platform {
    position: absolute;
    inset: 20% 10% 10% 10%;
    background: linear-gradient(135deg, var(--purple) 0%, var(--pink) 100%);
    border-radius: 40px;
    transform: rotate(-5deg);
    box-shadow: 0 20px 40px rgba(108, 85, 255, 0.3);
}
.unicorn-glow {
    position: absolute;
    inset: 0;
    background: radial-gradient(ellipse at center, rgba(108, 85, 255, 0.4) 0%, transparent 60%);
    filter: blur(20px);
    pointer-events: none;
}
.unicorn-main {
    position: relative;
    z-index: 2;
    font-size: 200px;
    transform: translateY(-10px);
    filter: drop-shadow(0 15px 25px rgba(0, 0, 0, 0.25));
    will-change: transform;
    user-select: none;
}

/* ---------- Title ---------- */
.hero__title {
    position: relative;
    z-index: 9;
    font-family: 'Inter', sans-serif;
    font-weight: 900;
    font-size: clamp(2.5rem, 9vw, 8rem);
    line-height: 1;
    letter-spacing: -0.04em;
    color: var(--ink);
    margin-top: 0.5rem;
    pointer-events: none;
}
.hero__line {
    display: flex;
    justify-content: center;
    gap: clamp(2rem, 16vw, 14rem);
    pointer-events: none;
}
.hero__word {
    display: inline-block;
    pointer-events: auto;
    will-change: transform, color;
    transition: color 0.3s ease;
}
.hero__word--right { /* right-side word alignment if needed */ }

/* ---------- Description ---------- */
.hero__desc {
    position: relative;
    z-index: 11;
    max-width: 620px;
    margin: 2rem auto 2rem;
    font-size: 1.1rem;
    line-height: 1.5;
    color: var(--muted);
}

/* ---------- Main CTA ---------- */
.cta-big {
    position: relative;
    z-index: 11;
    display: inline-flex;
    align-items: center;
    gap: 0.75rem;
    background: linear-gradient(135deg, var(--purple) 0%, var(--purple-deep) 100%);
    color: #fff;
    text-decoration: none;
    padding: 1.1rem 2.75rem 1.1rem 2rem;
    border-radius: 50px 35px 50px 35px / 50% 50% 50% 50%;
    font-weight: 700;
    font-size: 1.25rem;
    box-shadow: 0 12px 30px rgba(108, 85, 255, 0.35),
                0 4px 10px rgba(0, 0, 0, 0.1);
    will-change: transform;
    margin-bottom: 1.5rem;
    overflow: hidden;
}
.cta-big::before {
    content: '';
    position: absolute;
    top: -50%;
    left: -100%;
    width: 50%;
    height: 200%;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
    transform: skewX(-20deg);
    transition: left 0.6s;
}
.cta-big:hover::before { left: 150%; }
.cta-big__icon {
    width: 36px; height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.cta-big__icon svg { width: 100%; height: 100%; }
.cta-big__label { position: relative; z-index: 2; }

/* Secondary link */
.hero__secondary {
    position: relative;
    z-index: 11;
    color: var(--purple);
    text-decoration: underline;
    text-underline-offset: 4px;
    font-size: 0.95rem;
    font-weight: 600;
    margin-bottom: 3rem;
    will-change: transform;
}

/* ---------- Trusted by ---------- */
.trusted {
    position: relative;
    z-index: 11;
    width: 100%;
    max-width: 1100px;
}
.trusted__label {
    display: block;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.2em;
    color: var(--muted);
    text-align: left;
    margin-bottom: 1.5rem;
    padding-left: 1rem;
}
.trusted__logos {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 2rem;
}
.trusted__logo {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 1.2rem;
    font-weight: 700;
    color: var(--ink);
    letter-spacing: -0.01em;
    opacity: 0.5;
    filter: grayscale(1);
    cursor: pointer;
    will-change: transform;
    transition: filter 0.35s ease, opacity 0.35s ease;
}
.trusted__logo svg { width: 18px; height: 18px; }
.trusted__logo em { color: var(--purple); font-style: italic; font-weight: 600; }
.trusted__logo b { color: var(--purple); }
.trusted__logo:hover { opacity: 1; filter: grayscale(0); }

/* ---------- Scroll dot ---------- */
.scroll-dot {
    position: fixed;
    right: 1rem;
    top: 50%;
    transform: translateY(-50%);
    z-index: 20;
    display: flex;
    flex-direction: column;
    align-items: center;
    height: 260px;
}
.scroll-dot::before {
    content: '';
    flex: 1;
    width: 1px;
    background: linear-gradient(180deg, rgba(10,10,26,0.15), transparent);
}
.scroll-dot span {
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--purple);
    margin-top: 8px;
    will-change: transform;
}

/* ---------- Initial hidden states ---------- */
[data-magnetic], [data-link], [data-fade], [data-word], [data-badge], [data-float],
[data-person], [data-emoji], [data-unicorn], [data-logo], [data-scroll] {
    opacity: 0;
}

/* ---------- Responsive ---------- */
@media (max-width: 1024px) {
    .topnav { padding: 1rem 1.5rem; gap: 1rem; }
    .topnav__links { display: none; }
    .hero__line { gap: 8rem; }
    .unicorn-stage { width: 260px; height: 260px; top: 24%; }
    .unicorn-main { font-size: 160px; }
    .person--1 { right: 8%; }
    .person--2 { left: 8%; }
    .person--3 { left: 52%; }
    .scroll-dot { display: none; }
}
@media (max-width: 768px) {
    .hero__rainbow { font-size: 32px; }
    .hero__badge { font-size: 0.9rem; padding: 0.6rem 1.25rem; }
    .hero__title { font-size: clamp(2rem, 12vw, 4.5rem); }
    .hero__line { gap: 5rem; }
    .unicorn-stage { width: 180px; height: 180px; top: 26%; }
    .unicorn-main { font-size: 110px; }
    .person { border-width: 3px; }
    .person--1 { width: 50px; height: 50px; top: 14%; right: 4%; }
    .person--2 { width: 45px; height: 45px; left: 2%; top: 44%; }
    .person--3 { width: 50px; height: 50px; left: 5%; top: 64%; }
    .emoji { font-size: 24px !important; }
    .cta-big { font-size: 1.05rem; padding: 0.9rem 2rem; }
    .trusted__logos { gap: 1.25rem; }
    .trusted__logo { font-size: 0.9rem; }
}
@media (max-width: 480px) {
    .hero__line { gap: 3rem; }
    .unicorn-stage { width: 140px; height: 140px; top: 28%; }
    .unicorn-main { font-size: 80px; }
    .person--2, .emoji--sparkle, .emoji--rainbow-2 { display: none; }
    .topnav__cta { padding: 0.6rem 1.2rem; font-size: 0.85rem; }
    .trusted__label { padding-left: 0; text-align: center; }
}

  </style>
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Banner โ€” Talently</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@500;600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="banner-talent-playful.css">
</head>
<body>
    

    <!-- ========== LOADER โ€” Rainbow arc + sparkles + unicorn ========== -->
    <div class="loader" id="loader">
        <div class="loader__scene">
            <svg class="loader__rainbow" viewBox="0 0 320 200" aria-hidden="true">
                <defs>
                    <path id="arc7" d="M 20 170 A 140 140 0 0 1 300 170"/>
                    <path id="arc6" d="M 30 170 A 130 130 0 0 1 290 170"/>
                    <path id="arc5" d="M 40 170 A 120 120 0 0 1 280 170"/>
                    <path id="arc4" d="M 50 170 A 110 110 0 0 1 270 170"/>
                    <path id="arc3" d="M 60 170 A 100 100 0 0 1 260 170"/>
                    <path id="arc2" d="M 70 170 A 90 90 0 0 1 250 170"/>
                    <path id="arc1" d="M 80 170 A 80 80 0 0 1 240 170"/>
                </defs>
                <use href="#arc7" stroke="#ff3b3b" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc6" stroke="#ff8a3b" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc5" stroke="#ffd93b" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc4" stroke="#4fd16a" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc3" stroke="#3b9ff5" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc2" stroke="#6c55ff" stroke-width="10" fill="none" class="rb"/>
                <use href="#arc1" stroke="#c94bff" stroke-width="10" fill="none" class="rb"/>
            </svg>
            <div class="loader__unicorn">&#129412;</div>
            <div class="loader__sparkles" id="sparkles"></div>
        </div>
        <div class="loader__meta">
            <span class="loader__label" id="loader-label">GATHERING MAGIC</span>
            <span class="loader__counter" id="loader-counter">0%</span>
        </div>
    </div>

    <section class="playful" id="playful">

        <!-- ========== TOP NAV ========== -->
        <header class="topnav">
            <a href="#" class="topnav__logo" data-magnetic>
                <span class="topnav__logo-mark" id="logo-smile">
                    <svg viewBox="0 0 40 24" aria-hidden="true">
                        <path d="M4 6 Q 20 28 36 6" stroke="#6c55ff" stroke-width="4" stroke-linecap="round" fill="none"/>
                    </svg>
                </span>
                <span class="topnav__logo-text">Talently</span>
            </a>
            <nav class="topnav__links">
                <a href="#" data-magnetic data-link>Unicorns</a>
                <a href="#" data-magnetic data-link>Process</a>
                <a href="#" data-magnetic data-link>Pricing</a>
                <a href="#" data-magnetic data-link>About</a>
            </nav>
            <a href="#" class="topnav__cta" data-magnetic>
                <span>Start Hiring</span>
            </a>
        </header>

        <!-- ========== HERO ========== -->
        <div class="hero" id="hero">

            <!-- Rainbow above badge -->
            <span class="hero__rainbow" data-float>&#127752;</span>

            <!-- Badge -->
            <div class="hero__badge" data-badge>
                <span class="hero__badge-text"><b>Unicorn Talent</b> <em>at 70% less</em></span>
            </div>

            <!-- Floating person bubbles (Unsplash) -->
            <div class="person person--1" data-person>
                <img src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&fit=crop&w=200&q=75"
                     alt="" draggable="false" onerror="this.style.display='none'">
            </div>
            <div class="person person--2" data-person>
                <img src="https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&w=200&q=75"
                     alt="" draggable="false" onerror="this.style.display='none'">
            </div>
            <div class="person person--3" data-person>
                <img src="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?auto=format&fit=crop&w=200&q=75"
                     alt="" draggable="false" onerror="this.style.display='none'">
            </div>

            <!-- Small decorative emojis -->
            <span class="emoji emoji--uni-sm" data-emoji>&#129412;</span>
            <span class="emoji emoji--fire-1" data-emoji>&#128293;</span>
            <span class="emoji emoji--fire-2" data-emoji>&#128293;</span>
            <span class="emoji emoji--rainbow-2" data-emoji>&#127752;</span>
            <span class="emoji emoji--sparkle" data-emoji>&#10024;</span>

            <!-- Main unicorn stage -->
            <div class="unicorn-stage" data-unicorn>
                <div class="unicorn-platform"></div>
                <div class="unicorn-glow"></div>
                <span class="unicorn-main">&#129412;</span>
            </div>

            <!-- Title -->
            <h1 class="hero__title" aria-label="Scale Faster with Talent">
                <span class="hero__line">
                    <span class="hero__word" data-word>Scale</span>
                    <span class="hero__word hero__word--right" data-word>Faster</span>
                </span>
                <span class="hero__line">
                    <span class="hero__word" data-word>with</span>
                    <span class="hero__word hero__word--right" data-word>Talent</span>
                </span>
            </h1>

            <!-- Description -->
            <p class="hero__desc" data-fade>
                From scaling startups to serious growth, we deliver world-class
                Admin, Ops, Marketing, Support and niche offshore talent.
            </p>

            <!-- Main CTA -->
            <a href="#" class="cta-big" data-magnetic data-cta>
                <span class="cta-big__icon">
                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4">
                        <circle cx="12" cy="12" r="10"/>
                        <path d="M8 12h8M12 8l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/>
                    </svg>
                </span>
                <span class="cta-big__label">Start Hiring</span>
            </a>

            <!-- Secondary link -->
            <a href="#" class="hero__secondary" data-fade data-magnetic>
                <span>Become a Partner</span>
            </a>

            <!-- Trusted by -->
            <div class="trusted" data-fade>
                <span class="trusted__label">TRUSTED BY GROWING BUSINESSES &amp; INDUSTRY LEADERS</span>
                <div class="trusted__logos">
                    <span class="trusted__logo" data-logo>
                        <svg viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="12" r="10"/></svg>
                        brand&middot;one
                    </span>
                    <span class="trusted__logo" data-logo>
                        <em>second</em> brand
                    </span>
                    <span class="trusted__logo" data-logo>
                        <svg viewBox="0 0 24 24" fill="currentColor"><rect x="3" y="8" width="18" height="8" rx="2"/></svg>
                        Partner
                    </span>
                    <span class="trusted__logo" data-logo>
                        BRAND<b>FOUR</b>
                    </span>
                    <span class="trusted__logo" data-logo>
                        <svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 4h4v4H4zM10 4h4v4h-4zM16 4h4v4h-4zM4 10h4v4H4zM16 10h4v4h-4zM10 16h4v4h-4z"/></svg>
                        partner<em>v</em>
                    </span>
                </div>
            </div>
        </div>

        <!-- Scroll indicator -->
        <div class="scroll-dot" data-scroll>
            <span></span>
        </div>
    </section>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
    <script src="banner-talent-playful.js"></script>
</body>
</html>

</body>
</html>
JSbanner-talent-playful.jsโ€” GSAP animation timeline
(() => {
    const root = document.getElementById('playful');
    if (!root) return;

    // -------------------------------------------------------------------
    //  BUILD LOADER SPARKLES
    // -------------------------------------------------------------------
    const sparklesHost = document.getElementById('sparkles');
    const SPARKLE_EMOJIS = ['\u2728', '\u2B50', '\u{1F4AB}'];
    const SPARKLE_COUNT = 12;
    for (let i = 0; i < SPARKLE_COUNT; i++) {
        const s = document.createElement('span');
        s.textContent = SPARKLE_EMOJIS[i % SPARKLE_EMOJIS.length];
        const angle = (i / SPARKLE_COUNT) * Math.PI * 2;
        const r = 120;
        s.style.left = (160 + Math.cos(angle) * r * 0.6) + 'px';
        s.style.top  = (100 + Math.sin(angle) * r * 0.4) + 'px';
        sparklesHost.appendChild(s);
    }
    const sparkleEls = sparklesHost.querySelectorAll('span');

    // -------------------------------------------------------------------
    //  REFERENCES
    // -------------------------------------------------------------------
    const loader = document.getElementById('loader');
    const loaderCounter = document.getElementById('loader-counter');
    const loaderLabel = document.getElementById('loader-label');
    const rbPaths = loader.querySelectorAll('.rb');
    const loaderUnicorn = loader.querySelector('.loader__unicorn');

    const magnetics = root.querySelectorAll('[data-magnetic]');
    const fades = root.querySelectorAll('[data-fade]');
    const words = root.querySelectorAll('[data-word]');
    const badge = root.querySelector('[data-badge]');
    const rainbow = root.querySelector('[data-float]');
    const people = root.querySelectorAll('[data-person]');
    const emojis = root.querySelectorAll('[data-emoji]');
    const unicornStage = root.querySelector('[data-unicorn]');
    const unicornMain = root.querySelector('.unicorn-main');
    const unicornPlatform = root.querySelector('.unicorn-platform');
    const logos = root.querySelectorAll('[data-logo]');
    const scrollDot = root.querySelector('[data-scroll]');
    const logoSmile = document.getElementById('logo-smile');

    // -------------------------------------------------------------------
    //  INITIAL STATES
    // -------------------------------------------------------------------
    gsap.set(magnetics, { y: -15, opacity: 0 });
    gsap.set(rainbow, { scale: 0, opacity: 0, y: 20 });
    gsap.set(badge, { scale: 0, opacity: 0 });
    gsap.set(words, { yPercent: 120, opacity: 0 });
    gsap.set(fades, { y: 20, opacity: 0 });
    gsap.set(people, { scale: 0, opacity: 0 });
    gsap.set(emojis, { scale: 0, opacity: 0, rotation: -20 });
    gsap.set(unicornStage, { scale: 0, opacity: 0, rotation: -15 });
    gsap.set(logos, { y: 15, opacity: 0 });
    gsap.set(scrollDot, { opacity: 0 });
    gsap.set(sparkleEls, { scale: 0, opacity: 0 });

    // -------------------------------------------------------------------
    //  LOADER TIMELINE
    // -------------------------------------------------------------------
    const loaderTl = gsap.timeline({ onComplete: playScene });

    // Rainbow arcs draw in from inside-out
    rbPaths.forEach((p, i) => {
        loaderTl.to(p, {
            strokeDashoffset: 0,
            duration: 0.7,
            ease: 'power2.out',
        }, i * 0.06);
    });

    // Unicorn bounces in
    loaderTl.from(loaderUnicorn, {
        y: 40,
        opacity: 0,
        scale: 0.5,
        duration: 0.7,
        ease: 'back.out(2)',
    }, 0.3);

    // Unicorn bobbing idle
    gsap.to(loaderUnicorn, {
        y: -8,
        duration: 0.7,
        yoyo: true,
        repeat: -1,
        ease: 'sine.inOut',
    });

    // Sparkles pop + twinkle loop
    sparkleEls.forEach((s, i) => {
        loaderTl.to(s, {
            scale: 1, opacity: 1,
            duration: 0.3,
            ease: 'back.out(2)',
        }, 0.5 + i * 0.04);
        gsap.to(s, {
            scale: 1.4,
            rotation: 20,
            duration: 0.6 + Math.random() * 0.6,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
            delay: 0.5 + i * 0.08,
            transformOrigin: 'center',
        });
    });

    // Counter + labels
    const p = { v: 0 };
    loaderTl.to(p, {
        v: 100,
        duration: 2.2,
        ease: 'power1.inOut',
        onUpdate: () => {
            loaderCounter.textContent = Math.floor(p.v) + '%';
            if (p.v > 30 && loaderLabel.textContent === 'GATHERING MAGIC') loaderLabel.textContent = 'SUMMONING UNICORNS';
            if (p.v > 65 && loaderLabel.textContent === 'SUMMONING UNICORNS') loaderLabel.textContent = 'ALMOST THERE';
            if (p.v > 95 && loaderLabel.textContent === 'ALMOST THERE') loaderLabel.textContent = 'MAGIC READY';
        },
    }, 0.1);

    // Exit: sparkles burst outward, rainbow fades up
    loaderTl.to(sparkleEls, {
        x: (i) => (i - SPARKLE_COUNT / 2) * 30 + Math.random() * 40,
        y: () => -80 - Math.random() * 60,
        opacity: 0,
        rotation: 180,
        duration: 0.8,
        ease: 'power3.in',
        stagger: 0.02,
    }, '+=0.3');
    loaderTl.to([loaderUnicorn, loader.querySelector('.loader__rainbow')], {
        y: -50, scale: 1.1, opacity: 0, duration: 0.5, ease: 'power3.in',
    }, '-=0.7');
    loaderTl.to([loaderCounter, loaderLabel], {
        y: -10, opacity: 0, duration: 0.3, stagger: 0.05,
    }, '-=0.6');
    loaderTl.to(loader, {
        opacity: 0, duration: 0.4, ease: 'power2.inOut',
    }, '-=0.2');
    loaderTl.set(loader, { display: 'none' });

    // -------------------------------------------------------------------
    //  MAIN SCENE ENTRANCE
    // -------------------------------------------------------------------
    function playScene() {
        const tl = gsap.timeline({ defaults: { ease: 'power3.out' } });

        // Nav
        tl.to(magnetics, {
            y: 0, opacity: 1,
            duration: 0.6,
            stagger: 0.07,
        }, 0);

        // Rainbow + badge pop
        tl.to(rainbow, {
            scale: 1, opacity: 1, y: 0,
            duration: 0.7,
            ease: 'back.out(1.8)',
        }, 0.3);
        tl.to(badge, {
            scale: 1, opacity: 1,
            duration: 0.7,
            ease: 'back.out(1.8)',
        }, 0.45);

        // Unicorn stage with bounce
        tl.to(unicornStage, {
            scale: 1, opacity: 1, rotation: 0,
            duration: 1.1,
            ease: 'back.out(1.5)',
        }, 0.55);

        // Title words: big bouncy reveal
        tl.to(words, {
            yPercent: 0, opacity: 1,
            duration: 0.9,
            stagger: { each: 0.1, from: 'start' },
            ease: 'back.out(1.4)',
        }, 0.75);

        // Person bubbles bounce in (spring)
        tl.to(people, {
            scale: 1, opacity: 1,
            duration: 0.8,
            stagger: 0.1,
            ease: 'back.out(2)',
        }, 1);

        // Emojis pop in with rotation
        tl.to(emojis, {
            scale: 1, opacity: 1, rotation: 0,
            duration: 0.7,
            stagger: 0.08,
            ease: 'back.out(2)',
        }, 1.15);

        // Description + CTA + trusted
        tl.to(fades, {
            y: 0, opacity: 1,
            duration: 0.6,
            stagger: 0.12,
        }, 1.4);

        // Trusted logos
        tl.to(logos, {
            y: 0, opacity: 0.5,
            duration: 0.5,
            stagger: 0.08,
        }, 1.7);

        // Scroll dot
        tl.to(scrollDot, { opacity: 1, duration: 0.5 }, 1.9);

        tl.call(startContinuous, null, 1.9);
        tl.call(enableInteractions, null, 1.9);
    }

    // -------------------------------------------------------------------
    //  CONTINUOUS ANIMATIONS
    // -------------------------------------------------------------------
    function startContinuous() {
        // Main unicorn idle bounce + rotation
        gsap.to(unicornMain, {
            y: -15,
            rotation: 3,
            duration: 1.6,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
        });

        // Platform gentle tilt
        gsap.to(unicornPlatform, {
            rotation: -8,
            duration: 2.8,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
        });

        // Rainbow sway
        gsap.to(rainbow, {
            rotation: 8,
            duration: 2,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
            transformOrigin: 'center bottom',
        });

        // People bubbles idle float
        people.forEach((person, i) => {
            gsap.to(person, {
                y: `-=${10 + i * 2}`,
                duration: 2 + i * 0.3,
                yoyo: true,
                repeat: -1,
                ease: 'sine.inOut',
                delay: i * 0.2,
            });
        });

        // Emojis idle float (random)
        emojis.forEach((e, i) => {
            gsap.to(e, {
                y: '-=12',
                rotation: (i % 2 === 0 ? 10 : -10),
                duration: 2 + Math.random() * 1.5,
                yoyo: true,
                repeat: -1,
                ease: 'sine.inOut',
                delay: i * 0.15,
            });
        });

        // Scroll dot pulse
        gsap.to(scrollDot.querySelector('span'), {
            scale: 1.5,
            duration: 1,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
        });

        // Badge subtle shimmer
        gsap.to(badge, {
            y: -4,
            duration: 2.5,
            yoyo: true,
            repeat: -1,
            ease: 'sine.inOut',
        });
    }

    // -------------------------------------------------------------------
    //  INTERACTIONS
    // -------------------------------------------------------------------
    function enableInteractions() {

        // ---- Magnetic ----
        magnetics.forEach((el) => {
            const strength = el.classList.contains('cta-big') ? 0.3
                : el.classList.contains('topnav__cta') ? 0.3
                : el.classList.contains('topnav__logo') ? 0.18
                : 0.22;
            el.addEventListener('mousemove', (e) => {
                const r = el.getBoundingClientRect();
                const cx = r.left + r.width / 2;
                const cy = r.top + r.height / 2;
                gsap.to(el, {
                    x: (e.clientX - cx) * strength,
                    y: (e.clientY - cy) * strength,
                    duration: 0.4, ease: 'power3.out',
                });
            });
            el.addEventListener('mouseleave', () => {
                gsap.to(el, { x: 0, y: 0, duration: 0.6, ease: 'elastic.out(1, 0.4)' });
            });
        });

        // ---- Logo smile stretches on hover ----
        const logo = root.querySelector('.topnav__logo');
        logo.addEventListener('mouseenter', () => {
            gsap.fromTo(logoSmile,
                { scaleY: 1 },
                { scaleY: 1.6, duration: 0.3, yoyo: true, repeat: 1, ease: 'back.out(2)', transformOrigin: 'center top' }
            );
        });

        // ---- Title words: hover color shift + wobble ----
        words.forEach((w, i) => {
            const colors = ['#6c55ff', '#ff5ed7', '#3b9ff5', '#ffd93b'];
            w.addEventListener('mouseenter', () => {
                gsap.to(w, {
                    color: colors[i % colors.length],
                    rotation: i % 2 === 0 ? -3 : 3,
                    scale: 1.05,
                    duration: 0.3,
                    ease: 'back.out(2)',
                });
            });
            w.addEventListener('mouseleave', () => {
                gsap.to(w, {
                    color: '#0a0a1a',
                    rotation: 0,
                    scale: 1,
                    duration: 0.5,
                    ease: 'elastic.out(1, 0.4)',
                });
            });
        });

        // ---- Unicorn click: spin + launch sparkles ----
        unicornStage.addEventListener('click', () => {
            gsap.to(unicornMain, {
                rotation: '+=360',
                duration: 1,
                ease: 'power2.inOut',
            });
            // Spawn burst sparkles
            spawnBurst(unicornStage);
        });
        unicornStage.addEventListener('mouseenter', () => {
            gsap.to(unicornMain, { scale: 1.1, duration: 0.4, ease: 'back.out(2)' });
            gsap.to(unicornPlatform, { scale: 1.05, duration: 0.4 });
        });
        unicornStage.addEventListener('mouseleave', () => {
            gsap.to(unicornMain, { scale: 1, duration: 0.5, ease: 'elastic.out(1, 0.4)' });
            gsap.to(unicornPlatform, { scale: 1, duration: 0.5 });
        });

        // ---- Person bubbles: hover pop ----
        people.forEach((person) => {
            person.addEventListener('mouseenter', () => {
                gsap.to(person, {
                    scale: 1.15,
                    rotation: gsap.utils.random(-8, 8),
                    duration: 0.4,
                    ease: 'back.out(2)',
                });
            });
            person.addEventListener('mouseleave', () => {
                gsap.to(person, {
                    scale: 1,
                    rotation: 0,
                    duration: 0.5,
                    ease: 'elastic.out(1, 0.4)',
                });
            });
        });

        // ---- Emojis: hover grow + wiggle ----
        emojis.forEach((e) => {
            e.addEventListener('mouseenter', () => {
                gsap.to(e, {
                    scale: 1.4,
                    rotation: gsap.utils.random(-20, 20),
                    duration: 0.3,
                    ease: 'back.out(2.5)',
                });
            });
            e.addEventListener('mouseleave', () => {
                gsap.to(e, {
                    scale: 1,
                    rotation: 0,
                    duration: 0.5,
                    ease: 'elastic.out(1, 0.4)',
                });
            });
            // Click = bounce away and back
            e.addEventListener('click', () => {
                gsap.fromTo(e,
                    { y: 0 },
                    {
                        y: -40,
                        duration: 0.3,
                        yoyo: true,
                        repeat: 1,
                        ease: 'power2.out',
                    }
                );
            });
        });

        // ---- Badge: hover pops and rainbow appears ----
        badge.addEventListener('mouseenter', () => {
            gsap.to(badge, { scale: 1.06, duration: 0.3, ease: 'back.out(2)' });
            gsap.to(rainbow, { scale: 1.2, y: -5, duration: 0.4, ease: 'back.out(2)' });
        });
        badge.addEventListener('mouseleave', () => {
            gsap.to(badge, { scale: 1, duration: 0.5, ease: 'elastic.out(1, 0.4)' });
            gsap.to(rainbow, { scale: 1, y: 0, duration: 0.5, ease: 'elastic.out(1, 0.4)' });
        });

        // ---- Trusted logos: grayscale reset + wobble ----
        logos.forEach((lg) => {
            lg.addEventListener('mouseenter', () => {
                gsap.fromTo(lg,
                    { rotation: -2 },
                    { rotation: 0, duration: 0.5, ease: 'elastic.out(1, 0.4)' }
                );
            });
        });

        // ---- Mouse parallax for unicorn stage + emojis ----
        let mx = 0, my = 0, cmx = 0, cmy = 0;
        const hero = document.getElementById('hero');
        hero.addEventListener('mousemove', (e) => {
            const r = hero.getBoundingClientRect();
            mx = ((e.clientX - r.left) / r.width - 0.5) * 2;
            my = ((e.clientY - r.top) / r.height - 0.5) * 2;
        });
        hero.addEventListener('mouseleave', () => { mx = 0; my = 0; });

        gsap.ticker.add(() => {
            cmx += (mx - cmx) * 0.05;
            cmy += (my - cmy) * 0.05;
            // Don't override hover on unicorn
            if (!unicornStage.matches(':hover')) {
                gsap.set(unicornStage, { x: cmx * 15, y: cmy * 8 });
            }
            emojis.forEach((e, i) => {
                if (e.matches(':hover')) return;
                gsap.set(e, { x: cmx * (10 + i * 4), y: cmy * (6 + i * 2) });
            });
            people.forEach((p, i) => {
                if (p.matches(':hover')) return;
                gsap.set(p, { x: cmx * (14 + i * 3), y: cmy * (10 + i * 2) });
            });
        });
    }

    // Spawn a sparkle burst at an element's center
    function spawnBurst(target) {
        const rect = target.getBoundingClientRect();
        const cx = rect.left + rect.width / 2;
        const cy = rect.top + rect.height / 2;
        const burst = ['\u2728', '\u2B50', '\u{1F4AB}'];
        for (let i = 0; i < 12; i++) {
            const s = document.createElement('span');
            s.textContent = burst[i % burst.length];
            s.style.position = 'fixed';
            s.style.left = cx + 'px';
            s.style.top  = cy + 'px';
            s.style.fontSize = '22px';
            s.style.pointerEvents = 'none';
            s.style.zIndex = '200';
            s.style.transform = 'translate(-50%, -50%)';
            document.body.appendChild(s);
            const angle = (i / 12) * Math.PI * 2;
            const dist = 100 + Math.random() * 80;
            gsap.fromTo(s,
                { x: 0, y: 0, opacity: 1, scale: 0.5 },
                {
                    x: Math.cos(angle) * dist,
                    y: Math.sin(angle) * dist,
                    opacity: 0,
                    scale: 1.4,
                    rotation: 180,
                    duration: 0.9,
                    ease: 'power3.out',
                    onComplete: () => s.remove(),
                }
            );
        }
    }
})();

More GSAP landing pages