Minggu, 28 Desember 2025

Landing Page - Marketplace

 



Buat landing page e-commerce bernama “Kreativa Market” yang menjual produk digital (template, preset, course, asset UI, font, stock content) dan produk industri kreatif (merch, art print, handmade, apparel, stationery).

Teknologi

1 file index.html

TailwindCSS CDN

Tanpa framework (no React/Vue)

JS vanilla secukupnya: mobile menu, search, filter kategori, add-to-cart UI (dummy), modal quick view, toast notif

Gaya UI

Clean, modern, premium, banyak whitespace

Palet: slate netral + aksen indigo/emerald (atau amber)

Card border halus, rounded besar, shadow lembut

Micro-interactions: hover lift/scale, transition halus, button states, focus states

Aksesibilitas: aria-label, focus ring, kontras aman

Struktur landing (urut)

Header sticky

Logo teks “Kreativa Market”

Menu: Digital Products, Creative Goods, Bundles, Deals, Reviews, FAQ

Search (desktop), icon search (mobile)

CTA: “Login” (opsional) + “Cart (0)”

Hamburger menu (mobile toggle)

Hero

Headline kuat: “Tempat Belanja Produk Digital & Kreatif yang Siap Pakai”

Subheadline 1–2 kalimat (value: instan, kualitas kurasi, lisensi jelas)

CTA utama: “Shop Now”

CTA sekunder: “Explore Bundles”

Trust badges: “Instant Download”, “Secure Checkout”, “Creator Verified”

Hero visual placeholder gradient + mockup card

Featured Categories

Grid 6 kategori: UI Kits, Templates, Presets, Courses, Art Prints, Merch

Klik kategori melakukan filter produk (JS)

Best Sellers (Product Grid)

Minimal 12 produk dummy (judul realistis)

Tiap card: image placeholder, kategori badge, rating, harga, diskon (sebagian), tombol “Add to Cart”

Klik card buka Quick View modal (detail singkat + tombol add)

Support “Digital” vs “Physical” label

Bundles / Deals

Section bundle card 3 item, highlight hemat

CTA “Get Bundle”

Why Choose Us

4–6 benefit (lisensi jelas, kurasi, support, refund policy untuk digital sesuai ketentuan)

Reviews / Testimonials

6 review card (nama, role, rating, komentar)

Tambahkan logo creator/brand placeholder

CTA Subscribe

Background gradient

Copy: “Dapatkan diskon & drop produk baru tiap minggu”

Form email + tombol subscribe

Teks privasi singkat

Footer

Kolom: About, Shop, Support, Social

Link: Privacy Policy, Terms, Refund Policy

Copyright

Fitur JS

Toggle mobile menu

Search produk (filter nama/kategori)

Filter kategori (chips)

Load more (tampilkan 8 dulu, tambah 4)

Add-to-cart dummy: update angka cart + toast “Added”

Quick view modal (open/close, ESC to close)

Output: berikan kode index.html lengkap + JS di bawah. Jangan gunakan library eksternal selain Tailwind CDN.

Index.html

<!doctype html>
<html lang="id">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Kreativa Market — Produk Digital & Industri Kreatif</title>
  <meta name="description" content="Kreativa Market: tempat belanja produk digital & produk industri kreatif yang siap pakai. Kurasi premium, lisensi jelas, checkout aman." />

  <!-- TailwindCSS CDN -->
  <script src="https://cdn.tailwindcss.com"></script>
</head>

<body class="bg-slate-50 text-slate-900 antialiased">
  <!-- Skip link -->
  <a href="#main" class="sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-[100] focus:rounded-xl focus:bg-white focus:px-4 focus:py-2 focus:shadow">
    Lewati ke konten utama
  </a>

  <!-- Toast -->
  <div id="toast"
       class="pointer-events-none fixed top-4 right-4 z-[100] hidden max-w-sm rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-lg">
    <div class="flex items-start gap-3">
      <div class="mt-0.5 inline-flex h-8 w-8 items-center justify-center rounded-xl bg-emerald-50 text-emerald-700" aria-hidden="true">✓</div>
      <div class="min-w-0">
        <p id="toastTitle" class="text-sm font-extrabold text-slate-900">Added to cart</p>
        <p id="toastMsg" class="mt-0.5 text-sm text-slate-600">Item berhasil ditambahkan.</p>
      </div>
    </div>
  </div>

  <!-- Header (sticky) -->
  <header class="sticky top-0 z-50 border-b border-slate-200 bg-white/80 backdrop-blur">
    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
      <div class="flex h-16 items-center justify-between gap-3">
        <!-- Logo -->
        <a href="#" class="inline-flex items-center gap-2 font-extrabold tracking-tight text-slate-900">
          <span class="inline-flex h-9 w-9 items-center justify-center rounded-xl bg-indigo-600 text-white shadow-sm" aria-hidden="true">
            <svg class="h-5 w-5" viewBox="0 0 24 24" fill="none">
              <path d="M6.5 4H20v14H6.5C5.12 18 4 16.88 4 15.5v-9C4 5.12 5.12 4 6.5 4Z" stroke="currentColor" stroke-width="1.8"/>
              <path d="M8 8h8M8 11h6M8 14h8" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
              <path d="M20 18v2H7.5C5.57 20 4 18.43 4 16.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
            </svg>
          </span>
          <span>Kreativa Market</span>
        </a>

        <!-- Desktop nav -->
        <nav class="hidden lg:flex items-center gap-6" aria-label="Navigasi utama">
          <a href="#digital" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Digital Products</a>
          <a href="#creative" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Creative Goods</a>
          <a href="#bundles" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Bundles</a>
          <a href="#deals" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Deals</a>
          <a href="#reviews" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Reviews</a>
          <a href="#faq" class="text-sm font-medium text-slate-700 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">FAQ</a>
        </nav>

        <!-- Desktop actions -->
        <div class="hidden md:flex items-center gap-3 flex-1 justify-end">
          <div class="relative w-full max-w-md">
            <label for="searchDesktop" class="sr-only">Cari produk</label>
            <input id="searchDesktop" type="search" placeholder="Cari template, preset, merch…"
                   class="w-full rounded-2xl border border-slate-200 bg-white px-4 py-2.5 pr-10 text-sm text-slate-900 shadow-sm outline-none transition focus:border-indigo-600 focus:ring-2 focus:ring-indigo-600/30" />
            <span class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-slate-400" aria-hidden="true">🔎</span>
          </div>

          <a href="#" class="hidden lg:inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-semibold text-slate-900 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
            Login
          </a>

          <button id="cartBtn" type="button"
                  class="inline-flex items-center justify-center rounded-2xl bg-slate-900 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-slate-800 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
                  aria-label="Buka keranjang">
            Cart (<span id="cartCount">0</span>)
          </button>
        </div>

        <!-- Mobile controls -->
        <div class="flex items-center gap-2 md:hidden">
          <button id="mobileSearchBtn" type="button"
                  class="inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white p-2.5 text-slate-700 shadow-sm transition hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
                  aria-label="Buka pencarian"
                  aria-controls="mobileSearch"
                  aria-expanded="false">
            <span aria-hidden="true">🔎</span>
          </button>

          <button id="mobileMenuBtn" type="button"
                  class="inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white p-2.5 text-slate-700 shadow-sm transition hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
                  aria-label="Buka menu"
                  aria-controls="mobileMenu"
                  aria-expanded="false">
            <svg id="iconOpen" aria-hidden="true" class="h-5 w-5" viewBox="0 0 24 24" fill="none">
              <path d="M4 6h16M4 12h16M4 18h16" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
            </svg>
            <svg id="iconClose" aria-hidden="true" class="hidden h-5 w-5" viewBox="0 0 24 24" fill="none">
              <path d="M6 6l12 12M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
            </svg>
          </button>
        </div>
      </div>

      <!-- Mobile search -->
      <div id="mobileSearch" class="md:hidden hidden pb-4">
        <div class="rounded-2xl border border-slate-200 bg-white p-3 shadow-sm">
          <label for="searchMobile" class="sr-only">Cari produk</label>
          <input id="searchMobile" type="search" placeholder="Cari produk…"
                 class="w-full rounded-2xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 shadow-sm outline-none transition focus:border-indigo-600 focus:ring-2 focus:ring-indigo-600/30" />
        </div>
      </div>

      <!-- Mobile menu -->
      <div id="mobileMenu" class="md:hidden hidden pb-4" role="dialog" aria-label="Menu mobile">
        <div class="rounded-2xl border border-slate-200 bg-white p-3 shadow-sm">
          <div class="grid gap-1">
            <a href="#digital" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">Digital Products</a>
            <a href="#creative" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">Creative Goods</a>
            <a href="#bundles" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">Bundles</a>
            <a href="#deals" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">Deals</a>
            <a href="#reviews" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">Reviews</a>
            <a href="#faq" class="rounded-xl px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">FAQ</a>
          </div>

          <div class="mt-3 grid gap-2 sm:grid-cols-2">
            <a href="#"
               class="inline-flex w-full items-center justify-center rounded-xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-semibold text-slate-900 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
              Login
            </a>
            <button type="button"
                    class="inline-flex w-full items-center justify-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-slate-800 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
                    aria-label="Buka keranjang">
              Cart (<span id="cartCountMobile">0</span>)
            </button>
          </div>
        </div>
      </div>
    </div>
  </header>

  <main id="main">
    <!-- Hero -->
    <section class="relative overflow-hidden">
      <div aria-hidden="true" class="absolute inset-0 -z-10">
        <div class="absolute -top-24 -left-24 h-72 w-72 rounded-full bg-indigo-200 blur-3xl opacity-70"></div>
        <div class="absolute -bottom-28 -right-24 h-80 w-80 rounded-full bg-emerald-200 blur-3xl opacity-70"></div>
      </div>

      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12 sm:py-16">
        <div class="grid items-center gap-10 lg:grid-cols-2">
          <div>
            <p class="inline-flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3 py-1 text-xs font-semibold text-slate-700 shadow-sm">
              <span class="inline-flex h-2 w-2 rounded-full bg-emerald-500"></span>
              Kurasi premium • Lisensi jelas • Siap pakai
            </p>

            <h1 class="mt-5 text-3xl font-extrabold tracking-tight text-slate-900 sm:text-4xl lg:text-5xl">
              Tempat Belanja Produk Digital & Kreatif yang
              <span class="bg-gradient-to-r from-indigo-600 to-emerald-600 bg-clip-text text-transparent">Siap Pakai</span>
            </h1>

            <p class="mt-4 text-base leading-relaxed text-slate-600 sm:text-lg">
              Temukan template, preset, UI assets, font, hingga merch & art print dari kreator terverifikasi. Instant download untuk produk digital, dan pengiriman aman untuk produk fisik.
            </p>

            <div class="mt-7 flex flex-col gap-3 sm:flex-row sm:items-center">
              <a href="#shop"
                 class="inline-flex items-center justify-center rounded-2xl bg-indigo-600 px-5 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-700 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
                Shop Now
                <span class="ml-2" aria-hidden="true">→</span>
              </a>

              <a href="#bundles"
                 class="inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white px-5 py-3 text-sm font-semibold text-slate-900 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
                Explore Bundles
              </a>
            </div>

            <!-- Trust badges -->
            <div class="mt-8 grid grid-cols-1 gap-3 sm:grid-cols-3">
              <div class="rounded-3xl border border-slate-200 bg-white p-4 shadow-sm transition hover:shadow">
                <p class="text-sm font-extrabold text-slate-900">Instant Download</p>
                <p class="mt-1 text-xs text-slate-600">Produk digital langsung bisa dipakai</p>
              </div>
              <div class="rounded-3xl border border-slate-200 bg-white p-4 shadow-sm transition hover:shadow">
                <p class="text-sm font-extrabold text-slate-900">Secure Checkout</p>
                <p class="mt-1 text-xs text-slate-600">Pembayaran aman & terenkripsi</p>
              </div>
              <div class="rounded-3xl border border-slate-200 bg-white p-4 shadow-sm transition hover:shadow">
                <p class="text-sm font-extrabold text-slate-900">Creator Verified</p>
                <p class="mt-1 text-xs text-slate-600">Kurasi kualitas & lisensi jelas</p>
              </div>
            </div>
          </div>

          <!-- Hero visual -->
          <div class="relative">
            <div class="rounded-3xl border border-slate-200 bg-white shadow-sm overflow-hidden">
              <div class="relative h-72 sm:h-80 lg:h-[420px]">
                <div class="absolute inset-0 bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500 opacity-90"></div>
                <div class="absolute inset-0 opacity-20" aria-hidden="true"
                     style="background-image: radial-gradient(circle at 1px 1px, white 1px, transparent 0); background-size: 22px 22px;"></div>

                <div class="absolute inset-0 p-6">
                  <div class="flex items-center justify-between">
                    <div class="h-8 w-44 rounded-xl bg-white/25"></div>
                    <div class="h-8 w-8 rounded-xl bg-white/25"></div>
                  </div>

                  <div class="mt-8 grid gap-4">
                    <div class="rounded-2xl bg-white/15 p-4 backdrop-blur">
                      <div class="flex items-center justify-between">
                        <div class="h-4 w-2/3 rounded bg-white/30"></div>
                        <div class="h-6 w-20 rounded-lg bg-white/25"></div>
                      </div>
                      <div class="mt-3 h-3 w-5/6 rounded bg-white/20"></div>
                      <div class="mt-2 h-3 w-4/6 rounded bg-white/20"></div>
                      <div class="mt-4 flex gap-2">
                        <div class="h-7 w-24 rounded-lg bg-white/25"></div>
                        <div class="h-7 w-20 rounded-lg bg-white/25"></div>
                      </div>
                    </div>

                    <div class="grid grid-cols-2 gap-4">
                      <div class="rounded-2xl bg-white/15 p-4 backdrop-blur">
                        <div class="h-4 w-1/2 rounded bg-white/30"></div>
                        <div class="mt-3 h-8 w-3/4 rounded-xl bg-white/20"></div>
                      </div>
                      <div class="rounded-2xl bg-white/15 p-4 backdrop-blur">
                        <div class="h-4 w-1/2 rounded bg-white/30"></div>
                        <div class="mt-3 h-8 w-3/4 rounded-xl bg-white/20"></div>
                      </div>
                    </div>
                  </div>

                  <div class="absolute bottom-6 left-6 right-6 rounded-2xl bg-white/15 p-4 backdrop-blur">
                    <div class="flex items-center justify-between">
                      <div class="h-3 w-1/3 rounded bg-white/25"></div>
                      <div class="h-8 w-28 rounded-xl bg-white/25"></div>
                    </div>
                  </div>
                </div>
              </div>

              <div class="p-5 sm:p-6">
                <p class="text-sm font-extrabold text-slate-900">Kurasi produk kreatif, hasilnya cepat</p>
                <p class="mt-1 text-sm text-slate-600">Bundle hemat, lisensi jelas, dan produk fisik dibuat dengan kualitas premium.</p>
              </div>
            </div>

            <div class="absolute -bottom-4 -left-2 sm:-left-6 rounded-3xl border border-slate-200 bg-white px-4 py-3 shadow-sm">
              <p class="text-xs font-extrabold text-slate-900">⭐ 4.9/5</p>
              <p class="text-xs text-slate-600">dari 2.300+ pembeli</p>
            </div>
          </div>
        </div>
      </div>
    </section>

    <!-- Featured Categories -->
    <section class="py-12 sm:py-14">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="flex flex-col gap-2 sm:flex-row sm:items-end sm:justify-between">
          <div>
            <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">Featured Categories</h2>
            <p class="mt-2 text-slate-600">Klik kategori untuk memfilter produk di bawah.</p>
          </div>

          <!-- Filter chips -->
          <div class="flex flex-wrap items-center gap-2" role="tablist" aria-label="Filter kategori produk">
            <button type="button" data-filter="all" class="chip">All</button>
            <button type="button" data-filter="UI Kits" class="chip">UI Kits</button>
            <button type="button" data-filter="Templates" class="chip">Templates</button>
            <button type="button" data-filter="Presets" class="chip">Presets</button>
            <button type="button" data-filter="Courses" class="chip">Courses</button>
            <button type="button" data-filter="Art Prints" class="chip">Art Prints</button>
            <button type="button" data-filter="Merch" class="chip">Merch</button>
          </div>
        </div>

        <div class="mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
          <button type="button" data-filter="UI Kits" class="category-card" aria-label="Filter kategori UI Kits">
            <div class="h-12 w-12 rounded-2xl bg-indigo-50 text-indigo-700 inline-flex items-center justify-center" aria-hidden="true">▦</div>
            <div>
              <p class="font-extrabold text-slate-900">UI Kits</p>
              <p class="text-sm text-slate-600">Komponen siap pakai</p>
            </div>
          </button>

          <button type="button" data-filter="Templates" class="category-card" aria-label="Filter kategori Templates">
            <div class="h-12 w-12 rounded-2xl bg-emerald-50 text-emerald-700 inline-flex items-center justify-center" aria-hidden="true">⌁</div>
            <div>
              <p class="font-extrabold text-slate-900">Templates</p>
              <p class="text-sm text-slate-600">Notion, pitch deck, invoice</p>
            </div>
          </button>

          <button type="button" data-filter="Presets" class="category-card" aria-label="Filter kategori Presets">
            <div class="h-12 w-12 rounded-2xl bg-slate-100 text-slate-700 inline-flex items-center justify-center" aria-hidden="true">⟡</div>
            <div>
              <p class="font-extrabold text-slate-900">Presets</p>
              <p class="text-sm text-slate-600">Foto, video, color grading</p>
            </div>
          </button>

          <button type="button" data-filter="Courses" class="category-card" aria-label="Filter kategori Courses">
            <div class="h-12 w-12 rounded-2xl bg-indigo-50 text-indigo-700 inline-flex items-center justify-center" aria-hidden="true">▶</div>
            <div>
              <p class="font-extrabold text-slate-900">Courses</p>
              <p class="text-sm text-slate-600">Belajar cepat + praktik</p>
            </div>
          </button>

          <button type="button" data-filter="Art Prints" class="category-card" aria-label="Filter kategori Art Prints">
            <div class="h-12 w-12 rounded-2xl bg-emerald-50 text-emerald-700 inline-flex items-center justify-center" aria-hidden="true">✶</div>
            <div>
              <p class="font-extrabold text-slate-900">Art Prints</p>
              <p class="text-sm text-slate-600">Cetak premium & limited</p>
            </div>
          </button>

          <button type="button" data-filter="Merch" class="category-card" aria-label="Filter kategori Merch">
            <div class="h-12 w-12 rounded-2xl bg-slate-100 text-slate-700 inline-flex items-center justify-center" aria-hidden="true">⧉</div>
            <div>
              <p class="font-extrabold text-slate-900">Merch</p>
              <p class="text-sm text-slate-600">Apparel, stationery, handmade</p>
            </div>
          </button>
        </div>
      </div>
    </section>

    <!-- Best Sellers / Product Grid -->
    <section id="shop" class="py-12 sm:py-14">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="flex items-center justify-between gap-4">
          <div>
            <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">Best Sellers</h2>
            <p class="mt-2 text-slate-600">Produk terlaris — digital & fisik, siap bantu kamu produksi lebih cepat.</p>
          </div>
          <p id="resultCount" class="text-sm text-slate-600"></p>
        </div>

        <!-- Product Grid -->
        <div id="productGrid" class="mt-8 grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
          <!-- Product cards injected as static DOM with data-attributes for filtering/search -->
          <!-- Each product: data-title, data-category, data-type, data-price -->
          <!-- 1 -->
          <article class="product-card" data-id="p1" data-title="Aurora UI Kit — Mobile Components Pack" data-category="UI Kits" data-type="Digital" data-price="149000" data-rating="4.8" data-reviews="812" data-discount="20">
            <button type="button" class="product-open" aria-label="Buka detail produk Aurora UI Kit">
              <div class="product-thumb bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-indigo">UI Kits</span>
                  <span class="badge badge-slate">Digital</span>
                  <span class="badge badge-emerald">-20%</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.8</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Aurora UI Kit — Mobile Components Pack</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">120+ komponen, auto-layout friendly, cocok untuk MVP cepat.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 186.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 149.000</p>
                  <p class="text-xs text-slate-500">812 reviews • 2.1k sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Aurora UI Kit ke keranjang" data-add-id="p1">Add</button>
              </div>
            </div>
          </article>

          <!-- 2 -->
          <article class="product-card" data-id="p2" data-title="Notion Creator OS — Project & Content Planner" data-category="Templates" data-type="Digital" data-price="99000" data-rating="4.7" data-reviews="540" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Notion Creator OS">
              <div class="product-thumb bg-gradient-to-br from-emerald-500 via-indigo-500 to-slate-900"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-emerald">Templates</span>
                  <span class="badge badge-slate">Digital</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.7</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Notion Creator OS — Project & Content Planner</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Dashboard project, kalender konten, KPI tracker, SOP & goals.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 99.000</p>
                  <p class="text-xs text-slate-500">540 reviews • 1.4k sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Notion Creator OS ke keranjang" data-add-id="p2">Add</button>
              </div>
            </div>
          </article>

          <!-- 3 -->
          <article class="product-card" data-id="p3" data-title="Cinematic Lightroom Presets — Street Night Pack" data-category="Presets" data-type="Digital" data-price="79000" data-rating="4.6" data-reviews="392" data-discount="15">
            <button type="button" class="product-open" aria-label="Buka detail produk Cinematic Lightroom Presets">
              <div class="product-thumb bg-gradient-to-br from-slate-900 via-indigo-600 to-emerald-500"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-slate2">Presets</span>
                  <span class="badge badge-slate">Digital</span>
                  <span class="badge badge-emerald">-15%</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.6</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Cinematic Lightroom Presets — Street Night Pack</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">12 preset + guide exposure untuk tone cinematic yang konsisten.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 93.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 79.000</p>
                  <p class="text-xs text-slate-500">392 reviews • 980 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Lightroom Presets ke keranjang" data-add-id="p3">Add</button>
              </div>
            </div>
          </article>

          <!-- 4 -->
          <article class="product-card" data-id="p4" data-title="Mini Course: Brand Identity for Creators" data-category="Courses" data-type="Digital" data-price="199000" data-rating="4.9" data-reviews="228" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Mini Course Brand Identity">
              <div class="product-thumb bg-gradient-to-br from-indigo-600 via-slate-100 to-emerald-500"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-indigo">Courses</span>
                  <span class="badge badge-slate">Digital</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.9</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Mini Course: Brand Identity for Creators</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">3 jam materi + workbook: logo, tone, visual system, guideline.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 199.000</p>
                  <p class="text-xs text-slate-500">228 reviews • 650 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Mini Course ke keranjang" data-add-id="p4">Add</button>
              </div>
            </div>
          </article>

          <!-- 5 -->
          <article class="product-card" data-id="p5" data-title="Gallery Art Print — ‘Midnight Bloom’ A3" data-category="Art Prints" data-type="Physical" data-price="179000" data-rating="4.8" data-reviews="156" data-discount="10">
            <button type="button" class="product-open" aria-label="Buka detail produk Art Print Midnight Bloom">
              <div class="product-thumb bg-gradient-to-br from-emerald-500 via-slate-900 to-indigo-600"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-emerald">Art Prints</span>
                  <span class="badge badge-slate">Physical</span>
                  <span class="badge badge-emerald">-10%</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.8</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Gallery Art Print — ‘Midnight Bloom’ A3</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Kertas premium, warna tajam, cocok untuk studio & ruang kerja.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 199.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 179.000</p>
                  <p class="text-xs text-slate-500">156 reviews • 410 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Art Print ke keranjang" data-add-id="p5">Add</button>
              </div>
            </div>
          </article>

          <!-- 6 -->
          <article class="product-card" data-id="p6" data-title="Minimal Merch Tee — ‘Create Daily’" data-category="Merch" data-type="Physical" data-price="189000" data-rating="4.7" data-reviews="310" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Minimal Merch Tee">
              <div class="product-thumb bg-gradient-to-br from-slate-900 via-slate-700 to-emerald-500"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-slate2">Merch</span>
                  <span class="badge badge-slate">Physical</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.7</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Minimal Merch Tee — ‘Create Daily’</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Katun combed 24s, sablon halus, cutting modern fit.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 189.000</p>
                  <p class="text-xs text-slate-500">310 reviews • 900 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Merch Tee ke keranjang" data-add-id="p6">Add</button>
              </div>
            </div>
          </article>

          <!-- 7 -->
          <article class="product-card" data-id="p7" data-title="Font Pack: Modern Sans + Italic Set" data-category="UI Kits" data-type="Digital" data-price="129000" data-rating="4.6" data-reviews="118" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Font Pack Modern Sans">
              <div class="product-thumb bg-gradient-to-br from-indigo-600 via-emerald-400 to-slate-50"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-indigo">UI Kits</span>
                  <span class="badge badge-slate">Digital</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.6</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Font Pack: Modern Sans + Italic Set</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Lisensi untuk project kreatif, lengkap weight + italic.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 129.000</p>
                  <p class="text-xs text-slate-500">118 reviews • 320 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Font Pack ke keranjang" data-add-id="p7">Add</button>
              </div>
            </div>
          </article>

          <!-- 8 -->
          <article class="product-card" data-id="p8" data-title="Stock Content Pack — 80 B-Roll Clips (4K)" data-category="Templates" data-type="Digital" data-price="249000" data-rating="4.8" data-reviews="86" data-discount="25">
            <button type="button" class="product-open" aria-label="Buka detail produk Stock Content Pack 4K">
              <div class="product-thumb bg-gradient-to-br from-emerald-500 via-indigo-600 to-slate-900"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-emerald">Templates</span>
                  <span class="badge badge-slate">Digital</span>
                  <span class="badge badge-emerald">-25%</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.8</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Stock Content Pack — 80 B-Roll Clips (4K)</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">B-roll cinematic untuk ads, reels, dan product showcase.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 332.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 249.000</p>
                  <p class="text-xs text-slate-500">86 reviews • 210 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Stock Content Pack ke keranjang" data-add-id="p8">Add</button>
              </div>
            </div>
          </article>

          <!-- 9 -->
          <article class="product-card hidden" data-id="p9" data-title="Invoice & Proposal Templates — Creative Studio Set" data-category="Templates" data-type="Digital" data-price="69000" data-rating="4.5" data-reviews="250" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Invoice & Proposal Templates">
              <div class="product-thumb bg-gradient-to-br from-slate-900 via-indigo-500 to-emerald-400"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-emerald">Templates</span>
                  <span class="badge badge-slate">Digital</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.5</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Invoice & Proposal Templates — Creative Studio Set</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Template rapi untuk deal klien: invoice, proposal, scope, brief.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 69.000</p>
                  <p class="text-xs text-slate-500">250 reviews • 1.0k sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Invoice Templates ke keranjang" data-add-id="p9">Add</button>
              </div>
            </div>
          </article>

          <!-- 10 -->
          <article class="product-card hidden" data-id="p10" data-title="Handmade Stationery Set — ‘Studio Notes’" data-category="Merch" data-type="Physical" data-price="119000" data-rating="4.8" data-reviews="140" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Handmade Stationery Set">
              <div class="product-thumb bg-gradient-to-br from-emerald-400 via-slate-200 to-indigo-600"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-slate2">Merch</span>
                  <span class="badge badge-slate">Physical</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.8</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Handmade Stationery Set — ‘Studio Notes’</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Notebook, sticker sheet, dan postcard — crafted dengan detail.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 119.000</p>
                  <p class="text-xs text-slate-500">140 reviews • 380 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Stationery Set ke keranjang" data-add-id="p10">Add</button>
              </div>
            </div>
          </article>

          <!-- 11 -->
          <article class="product-card hidden" data-id="p11" data-title="Course: Motion Design Basics for Ads" data-category="Courses" data-type="Digital" data-price="259000" data-rating="4.9" data-reviews="97" data-discount="0">
            <button type="button" class="product-open" aria-label="Buka detail produk Course Motion Design Basics">
              <div class="product-thumb bg-gradient-to-br from-indigo-600 via-slate-900 to-emerald-500"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-indigo">Courses</span>
                  <span class="badge badge-slate">Digital</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.9</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Course: Motion Design Basics for Ads</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Dari layout sampai animasi: template project + checklist eksport.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-lg font-extrabold text-slate-900">Rp 259.000</p>
                  <p class="text-xs text-slate-500">97 reviews • 260 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Course Motion Design ke keranjang" data-add-id="p11">Add</button>
              </div>
            </div>
          </article>

          <!-- 12 -->
          <article class="product-card hidden" data-id="p12" data-title="Art Print Limited — ‘Neon City’ A2" data-category="Art Prints" data-type="Physical" data-price="289000" data-rating="4.7" data-reviews="62" data-discount="12">
            <button type="button" class="product-open" aria-label="Buka detail produk Art Print Neon City">
              <div class="product-thumb bg-gradient-to-br from-emerald-500 via-indigo-500 to-slate-900"></div>
            </button>
            <div class="p-6">
              <div class="flex items-center justify-between gap-3">
                <div class="flex flex-wrap items-center gap-2">
                  <span class="badge badge-emerald">Art Prints</span>
                  <span class="badge badge-slate">Physical</span>
                  <span class="badge badge-emerald">-12%</span>
                </div>
                <span class="text-xs text-slate-500">⭐ 4.7</span>
              </div>
              <h3 class="mt-3 text-base font-extrabold text-slate-900 line-clamp-2">Art Print Limited — ‘Neon City’ A2</h3>
              <p class="mt-2 text-sm text-slate-600 line-clamp-2">Limited run, tinta archival, cocok untuk koleksi.</p>
              <div class="mt-4 flex items-end justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 328.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 289.000</p>
                  <p class="text-xs text-slate-500">62 reviews • 120 sales</p>
                </div>
                <button type="button" class="btn-add" aria-label="Tambah Art Print Neon City ke keranjang" data-add-id="p12">Add</button>
              </div>
            </div>
          </article>
        </div>

        <!-- Empty state -->
        <div id="emptyState" class="mt-10 hidden rounded-3xl border border-slate-200 bg-white p-8 text-center shadow-sm">
          <p class="text-base font-extrabold text-slate-900">Produk tidak ditemukan.</p>
          <p class="mt-2 text-slate-600">Coba kata kunci lain atau pilih kategori yang berbeda.</p>
          <button id="resetFilters" type="button"
                  class="mt-5 inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white px-5 py-3 text-sm font-semibold text-slate-900 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
            Reset filter
          </button>
        </div>

        <!-- Load more -->
        <div class="mt-8 flex justify-center">
          <button id="loadMoreBtn" type="button"
                  class="inline-flex items-center justify-center rounded-2xl bg-slate-900 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-slate-800 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
            Load more
            <span class="ml-2" aria-hidden="true">↓</span>
          </button>
        </div>

        <!-- Anchor helpers for nav -->
        <div class="sr-only" id="digital">Digital products section</div>
        <div class="sr-only" id="creative">Creative goods section</div>
      </div>
    </section>

    <!-- Bundles / Deals -->
    <section id="bundles" class="py-12 sm:py-14">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="flex flex-col gap-2 sm:flex-row sm:items-end sm:justify-between">
          <div>
            <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">Bundles</h2>
            <p class="mt-2 text-slate-600">Paket hemat untuk produksi lebih cepat.</p>
          </div>
          <a href="#shop"
             class="inline-flex items-center justify-center rounded-2xl border border-slate-200 bg-white px-5 py-3 text-sm font-semibold text-slate-900 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
            Explore all
          </a>
        </div>

        <div class="mt-8 grid gap-5 lg:grid-cols-3">
          <article class="bundle-card">
            <div class="bundle-top bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500"></div>
            <div class="p-6">
              <div class="flex items-center justify-between">
                <span class="badge badge-emerald">Save 35%</span>
                <span class="text-xs text-slate-500">Digital Bundle</span>
              </div>
              <h3 class="mt-3 text-lg font-extrabold text-slate-900">Creator Launch Kit</h3>
              <p class="mt-2 text-sm text-slate-600">Template pitch deck + brand guide + content planner (Notion).</p>
              <div class="mt-4 flex items-center justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 399.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 259.000</p>
                </div>
                <button type="button" class="btn-primary" aria-label="Ambil bundle Creator Launch Kit">Get Bundle</button>
              </div>
            </div>
          </article>

          <article class="bundle-card">
            <div class="bundle-top bg-gradient-to-br from-emerald-500 via-indigo-600 to-slate-900"></div>
            <div class="p-6">
              <div class="flex items-center justify-between">
                <span class="badge badge-emerald">Save 25%</span>
                <span class="text-xs text-slate-500">Digital Bundle</span>
              </div>
              <h3 class="mt-3 text-lg font-extrabold text-slate-900">UI + Font Essentials</h3>
              <p class="mt-2 text-sm text-slate-600">UI kit mobile + font pack + icons starter untuk produk digital.</p>
              <div class="mt-4 flex items-center justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 499.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 379.000</p>
                </div>
                <button type="button" class="btn-primary" aria-label="Ambil bundle UI + Font Essentials">Get Bundle</button>
              </div>
            </div>
          </article>

          <article class="bundle-card" id="deals">
            <div class="bundle-top bg-gradient-to-br from-slate-900 via-indigo-600 to-emerald-500"></div>
            <div class="p-6">
              <div class="flex items-center justify-between">
                <span class="badge badge-emerald">Save 20%</span>
                <span class="text-xs text-slate-500">Mixed Bundle</span>
              </div>
              <h3 class="mt-3 text-lg font-extrabold text-slate-900">Studio Desk Set</h3>
              <p class="mt-2 text-sm text-slate-600">Stationery set + art print A3 + preset pack untuk konten studio.</p>
              <div class="mt-4 flex items-center justify-between">
                <div>
                  <p class="text-sm text-slate-500 line-through">Rp 499.000</p>
                  <p class="text-lg font-extrabold text-slate-900">Rp 399.000</p>
                </div>
                <button type="button" class="btn-primary" aria-label="Ambil bundle Studio Desk Set">Get Bundle</button>
              </div>
            </div>
          </article>
        </div>
      </div>
    </section>

    <!-- Why Choose Us -->
    <section class="py-12 sm:py-14 bg-white border-y border-slate-200">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="max-w-2xl">
          <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">Why Choose Us</h2>
          <p class="mt-2 text-slate-600">Fokus ke kualitas, lisensi, dan pengalaman belanja yang aman.</p>
        </div>

        <div class="mt-8 grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
          <div class="feature-card">
            <div class="icon-badge bg-indigo-50 text-indigo-700" aria-hidden="true">✓</div>
            <div>
              <p class="font-extrabold text-slate-900">Lisensi jelas</p>
              <p class="mt-1 text-sm text-slate-600">Keterangan penggunaan untuk personal/commercial lebih transparan.</p>
            </div>
          </div>
          <div class="feature-card">
            <div class="icon-badge bg-emerald-50 text-emerald-700" aria-hidden="true">⚡</div>
            <div>
              <p class="font-extrabold text-slate-900">Instant download</p>
              <p class="mt-1 text-sm text-slate-600">File digital tersedia otomatis setelah pembayaran berhasil.</p>
            </div>
          </div>
          <div class="feature-card">
            <div class="icon-badge bg-slate-100 text-slate-700" aria-hidden="true">★</div>
            <div>
              <p class="font-extrabold text-slate-900">Kurasi premium</p>
              <p class="mt-1 text-sm text-slate-600">Produk terpilih dengan standar kualitas visual & usability.</p>
            </div>
          </div>
          <div class="feature-card">
            <div class="icon-badge bg-indigo-50 text-indigo-700" aria-hidden="true">🛡</div>
            <div>
              <p class="font-extrabold text-slate-900">Checkout aman</p>
              <p class="mt-1 text-sm text-slate-600">Proteksi transaksi dan pengalaman belanja yang nyaman.</p>
            </div>
          </div>
          <div class="feature-card">
            <div class="icon-badge bg-emerald-50 text-emerald-700" aria-hidden="true">💬</div>
            <div>
              <p class="font-extrabold text-slate-900">Support responsif</p>
              <p class="mt-1 text-sm text-slate-600">Bantuan untuk akses file, lisensi, dan pengiriman produk fisik.</p>
            </div>
          </div>
          <div class="feature-card">
            <div class="icon-badge bg-slate-100 text-slate-700" aria-hidden="true">↩</div>
            <div>
              <p class="font-extrabold text-slate-900">Refund policy (digital)</p>
              <p class="mt-1 text-sm text-slate-600">Refund untuk digital mengikuti ketentuan: file rusak/tidak sesuai deskripsi.</p>
            </div>
          </div>
        </div>
      </div>
    </section>

    <!-- Reviews -->
    <section id="reviews" class="py-12 sm:py-14">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="max-w-2xl">
          <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">Reviews</h2>
          <p class="mt-2 text-slate-600">Cerita dari kreator dan tim yang memakai produk kami.</p>
        </div>

        <div class="mt-8 grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Nadia R.</p>
                <p class="text-xs text-slate-600">UI Designer</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 5 dari 5">⭐⭐⭐⭐⭐</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“UI kit-nya rapi dan konsisten. Aku bisa bikin landing page MVP jauh lebih cepat.”</blockquote>
          </figure>

          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Raka S.</p>
                <p class="text-xs text-slate-600">Content Creator</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 5 dari 5">⭐⭐⭐⭐⭐</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“Preset pack bikin warna kontenku konsisten. Editing jadi lebih hemat waktu.”</blockquote>
          </figure>

          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Alya M.</p>
                <p class="text-xs text-slate-600">Product Marketer</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 5 dari 5">⭐⭐⭐⭐⭐</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“Template proposalnya profesional. Klien langsung paham scope & deliverables.”</blockquote>
          </figure>

          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Kevin T.</p>
                <p class="text-xs text-slate-600">Freelance Designer</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 4 dari 5">⭐⭐⭐⭐☆</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“B-roll pack-nya berguna untuk iklan. Tinggal tambah overlay dan selesai.”</blockquote>
          </figure>

          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Sinta A.</p>
                <p class="text-xs text-slate-600">Studio Owner</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 5 dari 5">⭐⭐⭐⭐⭐</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“Art print-nya premium. Packaging rapi dan cocok buat hadiah.”</blockquote>
          </figure>

          <figure class="review-card">
            <div class="flex items-center justify-between">
              <figcaption>
                <p class="font-extrabold text-slate-900">Dimas P.</p>
                <p class="text-xs text-slate-600">Brand Lead</p>
              </figcaption>
              <div class="h-10 w-10 rounded-2xl border border-slate-200 bg-white shadow-sm" aria-label="Logo brand" title="Logo brand"></div>
            </div>
            <div class="mt-3 text-sm" aria-label="Rating 5 dari 5">⭐⭐⭐⭐⭐</div>
            <blockquote class="mt-3 text-sm text-slate-700 leading-relaxed">“Course-nya to the point. Banyak checklist yang bisa langsung dipakai tim.”</blockquote>
          </figure>
        </div>
      </div>
    </section>

    <!-- CTA Subscribe -->
    <section class="pb-14 sm:pb-16">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="relative overflow-hidden rounded-3xl border border-slate-200 bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500 shadow-sm">
          <div aria-hidden="true" class="absolute inset-0 opacity-20"
               style="background-image: radial-gradient(circle at 1px 1px, white 1px, transparent 0); background-size: 22px 22px;"></div>

          <div class="relative grid gap-8 p-6 sm:p-10 lg:grid-cols-2 lg:items-center">
            <div class="text-white">
              <h2 class="text-2xl font-extrabold tracking-tight sm:text-3xl">Dapatkan diskon & drop produk baru tiap minggu</h2>
              <p class="mt-3 text-white/90 leading-relaxed">Satu email per minggu. Promo bundle, rilis terbaru, dan rekomendasi kurasi premium.</p>
              <div class="mt-6 grid gap-3 sm:grid-cols-2">
                <div class="rounded-2xl bg-white/15 p-4 backdrop-blur">
                  <p class="text-sm font-semibold">✅ Early access</p>
                  <p class="mt-1 text-sm text-white/85">Rilis baru lebih dulu</p>
                </div>
                <div class="rounded-2xl bg-white/15 p-4 backdrop-blur">
                  <p class="text-sm font-semibold">✅ Deal mingguan</p>
                  <p class="mt-1 text-sm text-white/85">Diskon terkurasi</p>
                </div>
              </div>
            </div>

            <form class="rounded-3xl bg-white p-6 sm:p-7 shadow-sm" action="#" method="post">
              <label for="email" class="block text-sm font-semibold text-slate-900">Email</label>
              <input id="email" name="email" type="email" required
                     class="mt-2 w-full rounded-2xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-900 shadow-sm outline-none transition focus:border-indigo-600 focus:ring-2 focus:ring-indigo-600/30"
                     placeholder="nama@email.com" />
              <button type="submit"
                      class="mt-4 inline-flex w-full items-center justify-center rounded-2xl bg-slate-900 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-slate-800 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
                Subscribe
                <span class="ml-2" aria-hidden="true">→</span>
              </button>
              <p class="mt-3 text-xs text-slate-600">Kami tidak membagikan data. Kamu bisa unsubscribe kapan saja.</p>
            </form>
          </div>
        </div>
      </div>
    </section>

    <!-- FAQ -->
    <section id="faq" class="pb-14 sm:pb-16">
      <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
        <div class="max-w-2xl">
          <h2 class="text-2xl font-extrabold tracking-tight text-slate-900">FAQ</h2>
          <p class="mt-2 text-slate-600">Pertanyaan yang sering ditanyakan sebelum checkout.</p>
        </div>

        <div class="mt-8 grid gap-4 lg:grid-cols-2">
          <details class="faq-card">
            <summary class="cursor-pointer list-none font-extrabold text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded-xl px-1 py-1">
              Bagaimana cara mendapatkan produk digital setelah bayar?
            </summary>
            <p class="mt-2 text-sm text-slate-600 leading-relaxed">
              Setelah pembayaran berhasil, kamu akan menerima link unduhan (instant download) dan email konfirmasi.
            </p>
          </details>

          <details class="faq-card">
            <summary class="cursor-pointer list-none font-extrabold text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded-xl px-1 py-1">
              Apakah lisensi untuk commercial use tersedia?
            </summary>
            <p class="mt-2 text-sm text-slate-600 leading-relaxed">
              Tiap produk mencantumkan ketentuan lisensi (personal/commercial). Jika butuh lisensi khusus, hubungi support.
            </p>
          </details>

          <details class="faq-card">
            <summary class="cursor-pointer list-none font-extrabold text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded-xl px-1 py-1">
              Bagaimana kebijakan refund untuk produk digital?
            </summary>
            <p class="mt-2 text-sm text-slate-600 leading-relaxed">
              Refund untuk digital berlaku jika file rusak/tidak bisa dibuka atau tidak sesuai deskripsi. Bukti diperlukan.
            </p>
          </details>

          <details class="faq-card">
            <summary class="cursor-pointer list-none font-extrabold text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded-xl px-1 py-1">
              Pengiriman produk fisik berapa lama?
            </summary>
            <p class="mt-2 text-sm text-slate-600 leading-relaxed">
              Umumnya 2–5 hari kerja tergantung lokasi. Produk handmade bisa memerlukan waktu produksi tambahan.
            </p>
          </details>
        </div>
      </div>
    </section>
  </main>

  <!-- Footer -->
  <footer class="border-t border-slate-200 bg-white">
    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12">
      <div class="grid gap-10 sm:grid-cols-2 lg:grid-cols-4">
        <div>
          <p class="text-base font-extrabold text-slate-900">Kreativa Market</p>
          <p class="mt-3 text-sm leading-relaxed text-slate-600">
            Marketplace kurasi untuk produk digital & industri kreatif: cepat dipakai, kualitas premium, lisensi jelas.
          </p>
        </div>

        <div>
          <p class="text-sm font-extrabold text-slate-900">Shop</p>
          <ul class="mt-3 space-y-2 text-sm text-slate-600">
            <li><a href="#shop" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Best Sellers</a></li>
            <li><a href="#bundles" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Bundles</a></li>
            <li><a href="#deals" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Deals</a></li>
            <li><a href="#faq" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">FAQ</a></li>
          </ul>
        </div>

        <div>
          <p class="text-sm font-extrabold text-slate-900">Support</p>
          <ul class="mt-3 space-y-2 text-sm text-slate-600">
            <li><a href="#" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Privacy Policy</a></li>
            <li><a href="#" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Terms</a></li>
            <li><a href="#" class="hover:text-slate-900 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 rounded">Refund Policy</a></li>
          </ul>
        </div>

        <div>
          <p class="text-sm font-extrabold text-slate-900">Social</p>
          <div class="mt-3 flex items-center gap-3">
            <a href="#" aria-label="Instagram" class="inline-flex h-10 w-10 items-center justify-center rounded-2xl border border-slate-200 bg-white shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
              <span aria-hidden="true">📷</span>
            </a>
            <a href="#" aria-label="YouTube" class="inline-flex h-10 w-10 items-center justify-center rounded-2xl border border-slate-200 bg-white shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
              <span aria-hidden="true">▶️</span>
            </a>
            <a href="#" aria-label="LinkedIn" class="inline-flex h-10 w-10 items-center justify-center rounded-2xl border border-slate-200 bg-white shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2">
              <span aria-hidden="true">in</span>
            </a>
          </div>

          <div class="mt-6">
            <button type="button" class="btn-primary w-full" aria-label="Buka keranjang">
              Cart (<span id="cartCountFooter">0</span>)
            </button>
          </div>
        </div>
      </div>

      <div class="mt-10 flex flex-col gap-3 border-t border-slate-200 pt-6 sm:flex-row sm:items-center sm:justify-between">
        <p class="text-sm text-slate-600">© <span id="year"></span> Kreativa Market. All rights reserved.</p>
        <p class="text-sm text-slate-600">Made for creators • Built with Tailwind CDN</p>
      </div>
    </div>
  </footer>

  <!-- Quick View Modal -->
  <div id="modalOverlay" class="fixed inset-0 z-[90] hidden">
    <div class="absolute inset-0 bg-slate-900/50 backdrop-blur-sm" aria-hidden="true"></div>

    <div class="relative mx-auto flex min-h-full max-w-3xl items-center justify-center p-4">
      <div role="dialog" aria-modal="true" aria-label="Quick view produk"
           class="w-full overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-xl">
        <div class="flex items-center justify-between border-b border-slate-200 p-5">
          <div class="min-w-0">
            <p class="text-xs font-semibold text-slate-500">Quick View</p>
            <h3 id="modalTitle" class="mt-1 text-base font-extrabold text-slate-900 truncate">Product Title</h3>
          </div>
          <button id="modalClose" type="button"
                  class="inline-flex h-10 w-10 items-center justify-center rounded-2xl border border-slate-200 bg-white text-slate-700 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
                  aria-label="Tutup modal">
            ✕
          </button>
        </div>

        <div class="grid gap-0 md:grid-cols-2">
          <div class="h-64 md:h-full">
            <div id="modalThumb" class="h-full w-full bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500 opacity-90"></div>
          </div>
          <div class="p-6">
            <div class="flex flex-wrap items-center gap-2">
              <span id="modalCategory" class="badge badge-indigo">Category</span>
              <span id="modalType" class="badge badge-slate">Digital</span>
              <span id="modalDiscount" class="badge badge-emerald hidden">-0%</span>
            </div>

            <p id="modalDesc" class="mt-4 text-sm text-slate-600 leading-relaxed">
              Deskripsi produk akan muncul di sini.
            </p>

            <div class="mt-5 flex items-center justify-between">
              <div>
                <p id="modalOldPrice" class="text-sm text-slate-500 line-through hidden">Rp 0</p>
                <p id="modalPrice" class="text-2xl font-extrabold text-slate-900">Rp 0</p>
                <p id="modalMeta" class="mt-1 text-xs text-slate-500">⭐ 0 • 0 reviews</p>
              </div>
              <button id="modalAddBtn" type="button" class="btn-primary" aria-label="Tambah produk ke keranjang">
                Add to Cart
              </button>
            </div>

            <div class="mt-6 rounded-2xl border border-slate-200 bg-slate-50 p-4">
              <p class="text-sm font-extrabold text-slate-900">What you get</p>
              <ul id="modalBullets" class="mt-2 space-y-2 text-sm text-slate-700">
                <li class="flex gap-2"><span class="mt-1 h-2 w-2 rounded-full bg-emerald-500"></span> File siap pakai + panduan singkat</li>
                <li class="flex gap-2"><span class="mt-1 h-2 w-2 rounded-full bg-emerald-500"></span> Lisensi sesuai ketentuan produk</li>
                <li class="flex gap-2"><span class="mt-1 h-2 w-2 rounded-full bg-emerald-500"></span> Support untuk akses file/pengiriman</li>
              </ul>
            </div>

            <p class="mt-4 text-xs text-slate-500">
              Catatan: Produk digital bersifat non-returnable kecuali file rusak/tidak sesuai deskripsi (lihat Refund Policy).
            </p>
          </div>
        </div>
      </div>
    </div>
  </div>

  <!-- JS -->
  <script>
    (function () {
      // Helpers
      const $ = (sel, root = document) => root.querySelector(sel);
      const $$ = (sel, root = document) => Array.from(root.querySelectorAll(sel));
      const rupiah = (n) => new Intl.NumberFormat('id-ID').format(n);

      // Elements
      const mobileMenuBtn = $('#mobileMenuBtn');
      const mobileMenu = $('#mobileMenu');
      const iconOpen = $('#iconOpen');
      const iconClose = $('#iconClose');

      const mobileSearchBtn = $('#mobileSearchBtn');
      const mobileSearch = $('#mobileSearch');

      const searchDesktop = $('#searchDesktop');
      const searchMobile = $('#searchMobile');

      const chips = $$('.chip');
      const categoryCards = $$('.category-card');

      const productCards = $$('.product-card');
      const loadMoreBtn = $('#loadMoreBtn');
      const emptyState = $('#emptyState');
      const resetBtn = $('#resetFilters');
      const resultCount = $('#resultCount');

      const cartCount = $('#cartCount');
      const cartCountMobile = $('#cartCountMobile');
      const cartCountFooter = $('#cartCountFooter');

      const toast = $('#toast');
      const toastTitle = $('#toastTitle');
      const toastMsg = $('#toastMsg');

      // Modal
      const modalOverlay = $('#modalOverlay');
      const modalClose = $('#modalClose');
      const modalTitle = $('#modalTitle');
      const modalThumb = $('#modalThumb');
      const modalCategory = $('#modalCategory');
      const modalType = $('#modalType');
      const modalDiscount = $('#modalDiscount');
      const modalDesc = $('#modalDesc');
      const modalOldPrice = $('#modalOldPrice');
      const modalPrice = $('#modalPrice');
      const modalMeta = $('#modalMeta');
      const modalAddBtn = $('#modalAddBtn');

      // UI: apply reusable classes (no custom CSS)
      chips.forEach(btn => {
        btn.className = "chip inline-flex items-center rounded-full border border-slate-200 bg-white px-4 py-2 text-sm font-semibold text-slate-700 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2";
      });
      setChipActive('all');

      categoryCards.forEach(btn => {
        btn.className = "category-card group w-full rounded-3xl border border-slate-200 bg-white p-5 text-left shadow-sm transition hover:-translate-y-0.5 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2 flex items-center gap-4";
      });

      const btnAdds = $$('.btn-add');
      btnAdds.forEach(b => {
        b.className = "btn-add inline-flex items-center justify-center rounded-2xl bg-slate-900 px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:bg-slate-800 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2";
      });

      const btnPrimaryClass = "btn-primary inline-flex items-center justify-center rounded-2xl bg-indigo-600 px-5 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-700 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2";
      $$('.btn-primary').forEach(b => b.className = btnPrimaryClass);

      $$('.product-card').forEach(card => {
        card.classList.add('group','rounded-3xl','border','border-slate-200','bg-white','shadow-sm','overflow-hidden','transition','hover:-translate-y-0.5','hover:shadow-md');
      });

      $$('.product-thumb').forEach(t => t.classList.add('h-44','w-full','opacity-90'));
      $$('.product-open').forEach(btn => {
        btn.classList.add('block','w-full','text-left','focus:outline-none','focus:ring-2','focus:ring-indigo-600','focus:ring-offset-2');
      });

      // badges
      const badgeBase = ['inline-flex','items-center','rounded-full','px-2.5','py-1','text-xs','font-semibold'];
      $$('.badge').forEach(b => b.classList.add(...badgeBase));
      $$('.badge-indigo').forEach(b => b.classList.add('bg-indigo-50','text-indigo-700'));
      $$('.badge-emerald').forEach(b => b.classList.add('bg-emerald-50','text-emerald-700'));
      $$('.badge-slate').forEach(b => b.classList.add('bg-slate-100','text-slate-700'));
      $$('.badge-slate2').forEach(b => b.classList.add('bg-slate-100','text-slate-700'));

      // bundle cards
      $$('.bundle-card').forEach(c => c.classList.add('rounded-3xl','border','border-slate-200','bg-white','shadow-sm','overflow-hidden','transition','hover:-translate-y-0.5','hover:shadow-md'));
      $$('.bundle-top').forEach(t => t.classList.add('h-44','w-full','opacity-90'));

      // feature cards
      $$('.feature-card').forEach(c => c.classList.add('rounded-3xl','border','border-slate-200','bg-white','p-6','shadow-sm','transition','hover:shadow-md','flex','items-start','gap-4'));
      $$('.icon-badge').forEach(i => i.classList.add('inline-flex','h-12','w-12','items-center','justify-center','rounded-2xl','font-extrabold'));

      // review cards
      $$('.review-card').forEach(c => c.classList.add('rounded-3xl','border','border-slate-200','bg-white','p-6','shadow-sm','transition','hover:shadow-md'));

      // faq cards
      $$('.faq-card').forEach(c => c.classList.add('rounded-3xl','border','border-slate-200','bg-white','p-6','shadow-sm','transition','hover:shadow-md'));

      // State
      let visibleLimit = 8;
      let activeCategory = 'all';
      let activeQuery = '';
      let cart = 0;
      let currentModalProductId = null;

      function normalize(s) {
        return (s || '').toString().toLowerCase().trim();
      }

      function setMenu(open) {
        mobileMenu.classList.toggle('hidden', !open);
        iconOpen.classList.toggle('hidden', open);
        iconClose.classList.toggle('hidden', !open);
        mobileMenuBtn.setAttribute('aria-expanded', open ? 'true' : 'false');
        mobileMenuBtn.setAttribute('aria-label', open ? 'Tutup menu' : 'Buka menu');
      }

      function setSearch(open) {
        mobileSearch.classList.toggle('hidden', !open);
        mobileSearchBtn.setAttribute('aria-expanded', open ? 'true' : 'false');
        mobileSearchBtn.setAttribute('aria-label', open ? 'Tutup pencarian' : 'Buka pencarian');
        if (open) setTimeout(() => searchMobile && searchMobile.focus(), 50);
      }

      function setChipActive(filter) {
        chips.forEach((b) => {
          const isActive = b.dataset.filter === filter;
          b.setAttribute('aria-selected', isActive ? 'true' : 'false');
          b.className = isActive
            ? "chip inline-flex items-center rounded-full border border-indigo-200 bg-indigo-600 px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
            : "chip inline-flex items-center rounded-full border border-slate-200 bg-white px-4 py-2 text-sm font-semibold text-slate-700 shadow-sm transition hover:bg-slate-50 hover:shadow focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2";
        });
      }

      function matchesFilters(card) {
        const cat = card.dataset.category || '';
        const title = card.dataset.title || '';
        const type = card.dataset.type || '';
        const query = activeQuery;

        const catOk = (activeCategory === 'all') || (cat === activeCategory);
        const qOk = !query || normalize(title).includes(query) || normalize(cat).includes(query) || normalize(type).includes(query);
        return catOk && qOk;
      }

      function applyFilters() {
        const matched = productCards.filter(matchesFilters);
        let shown = 0;

        productCards.forEach(card => {
          const ok = matched.includes(card);
          if (!ok) {
            card.classList.add('hidden');
            return;
          }
          shown++;
          card.classList.toggle('hidden', shown > visibleLimit);
        });

        const anyVisible = productCards.some(c => !c.classList.contains('hidden'));
        emptyState.classList.toggle('hidden', anyVisible);

        resultCount.textContent = matched.length ? `${matched.length} produk ditemukan` : `0 produk ditemukan`;

        const canLoadMore = matched.length > visibleLimit;
        loadMoreBtn.classList.toggle('hidden', !canLoadMore);
      }

      function resetAll() {
        activeCategory = 'all';
        activeQuery = '';
        visibleLimit = 8;
        setChipActive('all');
        if (searchDesktop) searchDesktop.value = '';
        if (searchMobile) searchMobile.value = '';
        applyFilters();
      }

      function updateCartUI() {
        cartCount.textContent = String(cart);
        cartCountMobile.textContent = String(cart);
        cartCountFooter.textContent = String(cart);
      }

      let toastTimer = null;
      function showToast(title, msg) {
        toastTitle.textContent = title;
        toastMsg.textContent = msg;

        toast.classList.remove('hidden');
        toast.classList.add('animate-[fadeIn_150ms_ease-out]');
        clearTimeout(toastTimer);
        toastTimer = setTimeout(() => {
          toast.classList.add('hidden');
          toast.classList.remove('animate-[fadeIn_150ms_ease-out]');
        }, 1800);
      }

      function getProductById(id) {
        return productCards.find(c => c.dataset.id === id);
      }

      function openModal(productCard) {
        if (!productCard) return;

        const id = productCard.dataset.id;
        currentModalProductId = id;

        const title = productCard.dataset.title || 'Product';
        const category = productCard.dataset.category || 'Category';
        const type = productCard.dataset.type || 'Digital';
        const price = parseInt(productCard.dataset.price || '0', 10);
        const rating = productCard.dataset.rating || '4.8';
        const reviews = productCard.dataset.reviews || '0';
        const discount = parseInt(productCard.dataset.discount || '0', 10);

        modalTitle.textContent = title;
        modalCategory.textContent = category;
        modalType.textContent = type;

        // thumb gradient: reuse card thumb class by reading its class list
        const thumb = productCard.querySelector('.product-thumb');
        modalThumb.className = thumb ? thumb.className.replace('h-44', 'h-full') : "h-full w-full bg-gradient-to-br from-indigo-600 via-indigo-500 to-emerald-500 opacity-90";

        // description (simple)
        const short = productCard.querySelector('p.text-sm')?.textContent || 'Produk kurasi premium, siap pakai.';
        modalDesc.textContent = short + " Cocok untuk mempercepat workflow kreatifmu dengan kualitas yang konsisten.";

        // price display
        if (discount > 0) {
          const oldP = Math.round(price / (1 - discount / 100));
          modalOldPrice.textContent = "Rp " + rupiah(oldP);
          modalOldPrice.classList.remove('hidden');
          modalDiscount.textContent = "-" + discount + "%";
          modalDiscount.classList.remove('hidden');
        } else {
          modalOldPrice.classList.add('hidden');
          modalDiscount.classList.add('hidden');
        }
        modalPrice.textContent = "Rp " + rupiah(price);
        modalMeta.textContent = `⭐ ${rating} • ${reviews} reviews`;

        // Show modal
        modalOverlay.classList.remove('hidden');
        document.body.classList.add('overflow-hidden');
        // focus close
        setTimeout(() => modalClose.focus(), 50);
      }

      function closeModal() {
        modalOverlay.classList.add('hidden');
        document.body.classList.remove('overflow-hidden');
        currentModalProductId = null;
      }

      // Events
      mobileMenuBtn && mobileMenuBtn.addEventListener('click', () => {
        const open = mobileMenu.classList.contains('hidden');
        setMenu(open);
      });

      mobileSearchBtn && mobileSearchBtn.addEventListener('click', () => {
        const open = mobileSearch.classList.contains('hidden');
        setSearch(open);
      });

      // Close on escape
      document.addEventListener('keydown', (e) => {
        if (e.key === 'Escape') {
          setMenu(false);
          setSearch(false);
          closeModal();
        }
      });

      // Close menu on click link
      $$('#mobileMenu a[href^="#"]').forEach(a => a.addEventListener('click', () => setMenu(false)));

      // Chips filter
      chips.forEach(btn => {
        btn.addEventListener('click', () => {
          activeCategory = btn.dataset.filter || 'all';
          visibleLimit = 8;
          setChipActive(activeCategory);
          applyFilters();
          const shop = document.getElementById('shop');
          if (shop) shop.scrollIntoView({ behavior: 'smooth', block: 'start' });
        });
      });

      // Category cards behave like chips
      categoryCards.forEach(btn => {
        btn.addEventListener('click', () => {
          const filter = btn.dataset.filter || 'all';
          activeCategory = filter;
          visibleLimit = 8;
          setChipActive(filter);
          applyFilters();
          const shop = document.getElementById('shop');
          if (shop) shop.scrollIntoView({ behavior: 'smooth', block: 'start' });
        });
      });

      // Search
      function handleSearch(val) {
        activeQuery = normalize(val);
        visibleLimit = 8;
        applyFilters();
      }
      searchDesktop && searchDesktop.addEventListener('input', (e) => handleSearch(e.target.value));
      searchMobile && searchMobile.addEventListener('input', (e) => handleSearch(e.target.value));

      // Load more
      loadMoreBtn && loadMoreBtn.addEventListener('click', () => {
        visibleLimit += 4;
        applyFilters();
      });

      // Reset
      resetBtn && resetBtn.addEventListener('click', resetAll);

      // Add to cart buttons
      $$('.btn-add').forEach(btn => {
        btn.addEventListener('click', (e) => {
          e.stopPropagation();
          const id = btn.dataset.addId;
          cart += 1;
          updateCartUI();
          const p = getProductById(id);
          const t = p?.dataset.title || 'Item';
          showToast('Added to cart', t);
        });
      });

      // Open modal on card image/title click
      $$('.product-open').forEach(btn => {
        btn.addEventListener('click', () => {
          const card = btn.closest('.product-card');
          openModal(card);
        });
      });

      // Also open modal when clicking on title area (optional)
      $$('.product-card h3').forEach(h3 => {
        h3.addEventListener('click', () => {
          const card = h3.closest('.product-card');
          openModal(card);
        });
        h3.classList.add('cursor-pointer');
      });

      // Modal close actions
      modalClose && modalClose.addEventListener('click', closeModal);
      modalOverlay && modalOverlay.addEventListener('click', (e) => {
        // click outside dialog
        if (e.target === modalOverlay) closeModal();
      });

      modalAddBtn && modalAddBtn.addEventListener('click', () => {
        if (!currentModalProductId) return;
        cart += 1;
        updateCartUI();
        const p = getProductById(currentModalProductId);
        const t = p?.dataset.title || 'Item';
        showToast('Added to cart', t);
      });

      // Footer year
      const yearEl = document.getElementById('year');
      if (yearEl) yearEl.textContent = new Date().getFullYear();

      // Initial render: show 8 first (already hidden for 9-12), but keep robust
      updateCartUI();
      applyFilters();
    })();
  </script>
</body>
</html>


Tidak ada komentar:

Posting Komentar

Belajar React - Mobile Apps

  https://www.youtube.com/watch?v=W44BvYQCQFM&list=PLM2utx0CaGTLCnIRiWqeiZArfIkcGhA-3