← back to Goldleafwallpaper

index.html

1176 lines

<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8">
<!-- Anti-flash: read theme from localStorage before first paint -->
<script>(function(){try{var t=localStorage.getItem('glw-theme');if(!t){t=window.matchMedia&&window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light';}document.documentElement.setAttribute('data-theme',t);}catch(e){}})();</script>

<!-- Google tag (gtag.js) — existing G-ID, do NOT create new property -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NP93HLD33N"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-NP93HLD33N');
</script>

<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>goldleafwallpaper — gold leaf, applied by hand.</title>
<meta name="description" content="goldleafwallpaper — gold leaf, applied by hand. A curated atelier dedicated entirely to gold leaf. Free memo samples. Trade service.">
<link rel="canonical" href="https://goldleafwallpaper.com/">
<meta name="theme-color" content="#0A0A08" media="(prefers-color-scheme: dark)">
<meta name="theme-color" content="#F5EDD5" media="(prefers-color-scheme: light)">

<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://goldleafwallpaper.com/">
<meta property="og:title" content="goldleafwallpaper — gold leaf, applied by hand.">
<meta property="og:description" content="goldleafwallpaper — gold leaf, applied by hand.">
<meta property="og:image" content="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Audley-Taupe-Leaf-Wallpaper_eeb9246b-f373-45b5-b828-bf848ed92148.jpg?v=1773305370">
<meta name="twitter:card" content="summary_large_image">

<!-- JSON-LD -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Store",
  "name": "goldleafwallpaper",
  "url": "https://goldleafwallpaper.com/",
  "email": "info@goldleafwallpaper.com",
  "description": "Curated collection of gold-leaf, metallic-foil and lacquer wallcoverings for hospitality and luxury residential interiors.",
  "sameAs": ["https://designerwallcoverings.com"]
}
</script>

<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=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;1,300;1,400&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">

<style>
/* ============================================================
   DESIGN TOKENS — Bottega Veneta dark luxe (gold auction catalog)
   Light theme inverts bg/ink; accents (gold) stay constant.
   ============================================================ */
:root {
  --bg: #0A0A08;
  --header-bg: rgba(10,10,8,0.88);
  --card-bg: #111110;
  --ink: #F8F4EC;
  --ink-soft: #B6AD99;
  --ink-faint: #7A7363;
  --line: rgba(248,244,236,0.10);
  --gold: #C9A14B;
  --gold-dim: rgba(201,161,75,0.18);
  --forest: #0F1F14;
  --cols: 5;
}
[data-theme="light"] {
  --bg: #F5EDD5;
  --header-bg: rgba(245,237,213,0.92);
  --card-bg: #FFFBF2;
  --ink: #1A1208;
  --ink-soft: #5A4E38;
  --ink-faint: #8A7D65;
  --line: rgba(26,18,8,0.12);
  --gold: #9A6E1C;
  --gold-dim: rgba(154,110,28,0.12);
}
html { background: var(--bg); color-scheme: light dark; }
html[data-theme="dark"] { color-scheme: dark; }
html[data-theme="light"] { color-scheme: light; }
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
  color: var(--ink);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  min-height: 100vh;
}

/* ===== HEADER ===== */
header {
  position: fixed; top: 0; left: 0; right: 0;
  display: flex; justify-content: space-between; align-items: center;
  padding: 20px 32px; z-index: 100;
  transform: translateY(-100%);
  transition: transform 0.35s ease;
  background: var(--header-bg);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--line);
}
body.show-header header { transform: translateY(0); }
.h-group { display: flex; align-items: center; gap: 20px; }
.h-link {
  display: flex; align-items: center; gap: 8px;
  font-size: 10px; letter-spacing: 0.28em; text-transform: uppercase; font-weight: 700;
  color: var(--ink); text-decoration: none; cursor: pointer;
  background: transparent; border: 0; transition: opacity 0.2s;
}
.h-link:hover { opacity: 0.65; }
.h-icon { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 1.5; }
/* Dark/Light toggle */
.theme-toggle {
  display: flex; align-items: center; justify-content: center;
  width: 36px; height: 36px;
  background: transparent; border: 1px solid var(--line);
  color: var(--ink); cursor: pointer; transition: border-color 0.2s, opacity 0.2s;
  flex-shrink: 0;
}
.theme-toggle:hover { border-color: var(--gold); opacity: 0.85; }
.theme-toggle .icon-sun { display: none; }
.theme-toggle .icon-moon { display: block; }
[data-theme="light"] .theme-toggle .icon-sun { display: block; }
[data-theme="light"] .theme-toggle .icon-moon { display: none; }

/* ===== HERO (cinema) ===== */
.cinema {
  position: relative; height: 100vh; width: 100%; overflow: hidden;
  background: var(--forest);
}
.cinema-bg {
  position: absolute; inset: 0;
  background-size: cover; background-position: center;
  background-repeat: no-repeat;
  background-color: var(--forest);
  transition: opacity 0.8s ease;
}
.cinema-bg::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(0,0,0,0.15) 0%,
    rgba(0,0,0,0) 30%,
    rgba(0,0,0,0) 55%,
    rgba(0,0,0,0.70) 100%);
}
/* Gold horizontal rule accent */
.cinema::before {
  content: ""; position: absolute; bottom: 0; left: 0; right: 0;
  height: 2px; background: var(--gold); z-index: 6; opacity: 0.6;
}
.corner-mark {
  position: absolute; top: 28px; left: 32px;
  font-family: 'Cormorant Garamond', serif;
  font-size: 13px; font-weight: 400; letter-spacing: 0.22em;
  text-transform: uppercase; color: #F8F4EC; z-index: 5; opacity: 0.9;
}
.center-mark {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -52%);
  text-align: center; z-index: 5;
}
.center-mark h1 {
  font-family: 'Cormorant Garamond', serif;
  font-size: clamp(52px, 8vw, 112px);
  font-weight: 300; letter-spacing: 0.18em;
  text-transform: uppercase; color: #F8F4EC;
  line-height: 0.92;
}
.center-mark .sub {
  display: block; margin-top: 20px;
  font-size: 10px; letter-spacing: 0.52em; text-transform: uppercase;
  font-weight: 600; color: var(--gold); font-family: 'Inter', sans-serif;
}
.center-mark .rule {
  display: block; width: 48px; height: 1px;
  background: var(--gold); margin: 20px auto 0;
}
.hero-meta {
  position: absolute; bottom: 36px; left: 32px; z-index: 5;
  font-size: 10px; letter-spacing: 0.28em; text-transform: uppercase;
  font-weight: 600; color: #F8F4EC; opacity: 0.75;
}
.hero-count { display: block; margin-top: 4px; font-size: 12px; letter-spacing: 0.06em; opacity: 0.9; }
.enter {
  position: absolute; bottom: 36px; right: 32px; z-index: 5;
  display: flex; align-items: center; gap: 14px;
  font-size: 10px; letter-spacing: 0.38em; text-transform: uppercase;
  font-weight: 700; color: #F8F4EC; text-decoration: none;
  border-bottom: 1px solid rgba(248,244,236,0.6);
  padding-bottom: 4px; transition: gap 0.25s, border-color 0.2s;
}
.enter:hover { gap: 24px; border-color: var(--gold); }

/* ===== SECTIONS ===== */
.section { padding: 96px 32px; }
.section-header {
  display: flex; justify-content: space-between; align-items: flex-end;
  flex-wrap: wrap; gap: 24px;
  margin-bottom: 48px; padding-bottom: 24px;
  border-bottom: 1px solid var(--line);
}
.section-eyebrow {
  font-size: 10px; letter-spacing: 0.42em; text-transform: uppercase;
  font-weight: 700; color: var(--gold); margin-bottom: 14px;
}
.section-title {
  font-family: 'Cormorant Garamond', serif;
  font-size: clamp(36px, 5vw, 72px); font-weight: 300;
  letter-spacing: -0.01em; line-height: 0.95; color: var(--ink);
}
.section-meta {
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  font-weight: 600; color: var(--ink-faint); text-align: right; line-height: 1.6;
}

/* ===== FILTER BAR ===== */
.filter-bar {
  display: flex; gap: 8px; align-items: center;
  margin-bottom: 20px; flex-wrap: wrap;
}
.chip {
  padding: 7px 14px; font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; font-weight: 700; color: var(--ink);
  background: transparent; border: 1px solid var(--line);
  cursor: pointer; transition: all 0.2s; font-family: inherit;
  white-space: nowrap;
}
.chip:hover { border-color: var(--gold); color: var(--gold); }
.chip.active { background: var(--gold); color: #0A0A08; border-color: var(--gold); }
.sort-select {
  padding: 7px 32px 7px 12px; font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; font-weight: 700; color: var(--ink);
  background: transparent; border: 1px solid var(--line);
  cursor: pointer; font-family: inherit; appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--ink) 50%),
                    linear-gradient(135deg, var(--ink) 50%, transparent 50%);
  background-position: calc(100% - 13px) 50%, calc(100% - 8px) 50%;
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
}
.sort-select:hover { border-color: var(--gold); }
.sort-select option { background: var(--bg); color: var(--ink); }
.search-wrap {
  flex: 0 1 300px; margin-left: auto;
  display: flex; align-items: center; gap: 10px;
  border-bottom: 1px solid var(--line); padding: 6px 0;
}
.search-wrap input {
  flex: 1; background: transparent; border: 0; color: var(--ink);
  font-family: inherit; font-size: 13px; outline: none; letter-spacing: 0.04em;
}
.search-wrap input::placeholder { color: var(--ink-faint); }
.search-wrap svg { width: 16px; height: 16px; stroke: var(--ink-faint); fill: none; stroke-width: 1.5; }

/* View toggle */
.view-toggle { display: flex; }
.view-toggle button {
  padding: 7px 14px; font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; font-weight: 700; color: var(--ink);
  background: transparent; border: 1px solid var(--line); border-right: 0;
  cursor: pointer; transition: all 0.2s; font-family: inherit;
}
.view-toggle button:last-child { border-right: 1px solid var(--line); }
.view-toggle button.active { background: var(--gold); color: #0A0A08; border-color: var(--gold); }
.view-toggle button:hover:not(.active) { border-color: var(--gold); }

/* Density slider (corkwallcovering pattern) */
.density { display: flex; align-items: center; gap: 14px; padding: 4px 0; margin-bottom: 20px; }
.density label { font-size: 10px; letter-spacing: 0.32em; text-transform: uppercase; font-weight: 700; color: var(--ink-faint); white-space: nowrap; }
.density input[type=range] {
  flex: 1; max-width: 200px; -webkit-appearance: none; appearance: none;
  height: 1px; background: var(--line); outline: none; cursor: pointer;
}
.density input[type=range]::-webkit-slider-thumb {
  -webkit-appearance: none; width: 14px; height: 14px;
  background: var(--gold); cursor: pointer; border-radius: 50%;
}
.density input[type=range]::-moz-range-thumb {
  width: 14px; height: 14px; background: var(--gold);
  cursor: pointer; border-radius: 50%; border: 0;
}
.density .ct { font-size: 11px; color: var(--ink-faint); letter-spacing: 0.18em; text-transform: uppercase; font-weight: 600; min-width: 60px; }

/* ===== GRID ===== */
.grid {
  display: grid;
  grid-template-columns: repeat(var(--cols), 1fr);
  gap: 0;
}
.grid.hidden { display: none; }
.item {
  position: relative; aspect-ratio: 1 / 1.15;
  cursor: pointer; overflow: hidden;
  border: 1px solid var(--line);
  transition: transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
  background: var(--card-bg);
}
.item:hover { transform: scale(1.035); z-index: 5; }
.item img {
  width: 100%; height: 100%; object-fit: cover;
  display: block; background: var(--card-bg);
}
.overlay {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 14px 14px 12px;
  background: linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.82) 35%, rgba(0,0,0,0.96) 100%);
}
[data-theme="light"] .overlay {
  background: linear-gradient(180deg, rgba(245,237,213,0) 0%, rgba(245,237,213,0.88) 40%, rgba(245,237,213,0.97) 100%);
}
.item-vendor { font-size: 9px; letter-spacing: 0.28em; text-transform: uppercase; font-weight: 700; color: var(--gold); margin-bottom: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.item-name { font-size: 12px; font-weight: 600; color: var(--ink); margin-bottom: 8px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
[data-theme="light"] .item-name { color: var(--ink); }
.item-actions { display: flex; gap: 6px; }
.sample-btn {
  flex: 1; padding: 8px 8px; background: transparent;
  color: var(--muted, var(--gold, #A98B5B));
  border: 1px solid var(--muted, var(--gold, #A98B5B));
  font-family: inherit; font-size: 9px; letter-spacing: 0.22em;
  text-transform: uppercase; font-weight: 700;
  cursor: pointer; text-decoration: none; text-align: center;
  transition: background 0.15s, color 0.15s; display: block;
}
.sample-btn:hover { background: var(--muted, var(--gold, #A98B5B)); color: var(--bg, #0A0A08); }
.dw-btn {
  padding: 8px 10px; background: transparent;
  border: 1px solid rgba(248,244,236,0.3); color: #F8F4EC;
  font-family: inherit; font-size: 9px; letter-spacing: 0.18em;
  text-transform: uppercase; font-weight: 600; cursor: pointer;
  text-decoration: none; text-align: center; transition: border-color 0.2s;
  display: block;
}
[data-theme="light"] .dw-btn { border-color: var(--line); color: var(--ink); }
.dw-btn:hover { border-color: var(--gold); }

/* Pagination */
.pagination { display: flex; align-items: center; justify-content: center; gap: 16px; padding: 48px 0; }
.page-btn {
  padding: 10px 20px; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  font-weight: 700; color: var(--ink); background: transparent;
  border: 1px solid var(--line); cursor: pointer; font-family: inherit;
  transition: all 0.2s;
}
.page-btn:hover:not(:disabled) { border-color: var(--gold); color: var(--gold); }
.page-btn:disabled { opacity: 0.3; cursor: default; }
.page-info { font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink-faint); font-weight: 600; }

/* Table view */
.table-view { display: none; border-collapse: collapse; width: 100%; border-top: 1px solid var(--line); }
.table-view.active { display: table; }
.table-view thead th {
  text-align: left; padding: 14px 16px;
  font-size: 10px; letter-spacing: 0.32em; text-transform: uppercase;
  font-weight: 700; color: var(--ink-faint);
  border-bottom: 1px solid var(--line); cursor: pointer; user-select: none;
  white-space: nowrap; background: var(--gold-dim); transition: color 0.15s;
}
.table-view thead th:hover { color: var(--ink); }
.table-view thead th.sorted { color: var(--gold); }
.table-view thead th.no-sort { cursor: default; }
.table-view thead th.no-sort:hover { color: var(--ink-faint); }
.sort-arrow { display: inline-block; margin-left: 6px; opacity: 0.4; font-size: 10px; }
.sorted .sort-arrow { opacity: 1; }
.table-view tbody tr { border-bottom: 1px solid var(--line); transition: background 0.15s; }
.table-view tbody tr:hover { background: var(--gold-dim); }
.table-view tbody td { padding: 10px 16px; font-size: 13px; color: var(--ink); vertical-align: middle; }
.table-view tbody td.thumb { width: 80px; padding: 6px 6px 6px 0; }
.table-view tbody td.thumb img { width: 60px; height: 60px; object-fit: cover; display: block; border: 1px solid var(--line); }
.table-view tbody td.cell-code { font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; font-family: 'SF Mono', Menlo, Monaco, Consolas, monospace; }
.table-view tbody td.cell-vendor { font-size: 11px; letter-spacing: 0.1em; color: var(--gold); font-weight: 600; }
.table-view tbody td.cell-action { width: 130px; text-align: right; }
.table-view tbody td.cell-action a { padding: 8px 12px; background: var(--gold); color: #0A0A08; font-family: inherit; font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; font-weight: 700; border: 0; cursor: pointer; text-decoration: none; display: inline-block; transition: opacity 0.2s; }
.table-view tbody td.cell-action a:hover { opacity: 0.8; }

/* ===== EDITORIAL STRIP ===== */
.editorial { padding: 96px 32px; border-top: 1px solid var(--line); background: var(--forest); }
[data-theme="light"] .editorial { background: rgba(15,31,20,0.06); }
.editorial-inner { max-width: 760px; }
.editorial h2 {
  font-family: 'Cormorant Garamond', serif;
  font-size: clamp(32px, 4.5vw, 60px); font-weight: 300;
  line-height: 1.1; color: var(--ink); margin-bottom: 28px;
}
.editorial p { font-size: 16px; line-height: 1.78; color: var(--ink-soft); margin-bottom: 16px; }
.editorial-rule { width: 48px; height: 2px; background: var(--gold); margin-bottom: 32px; }

/* ===== FOOTER ===== */
footer { padding: 80px 32px 40px; border-top: 1px solid var(--line); }
.footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 48px; margin-bottom: 56px; }
.footer-brand {
  font-family: 'Cormorant Garamond', serif;
  font-size: 28px; font-weight: 300; letter-spacing: 0.22em;
  text-transform: uppercase; color: var(--ink); margin-bottom: 16px;
}
.footer-gold-rule { width: 36px; height: 1px; background: var(--gold); margin-bottom: 16px; }
.footer-text { font-size: 14px; line-height: 1.72; color: var(--ink-soft); max-width: 360px; }
.footer-col h4 { font-size: 10px; letter-spacing: 0.38em; text-transform: uppercase; font-weight: 700; color: var(--gold); margin-bottom: 20px; }
.footer-col a { display: block; font-size: 13px; color: var(--ink-soft); text-decoration: none; margin-bottom: 10px; transition: color 0.2s; letter-spacing: 0.02em; }
.footer-col a:hover { color: var(--ink); }
.footer-bottom {
  padding-top: 24px; border-top: 1px solid var(--line);
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: 16px;
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink-faint);
}

/* ===== MODALS ===== */
.modal { display: none; position: fixed; inset: 0; z-index: 1000; background: rgba(0,0,0,0.82); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); align-items: center; justify-content: center; padding: 32px; }
.modal.open { display: flex; }
.modal-box { background: var(--bg); border: 1px solid var(--line); max-width: 540px; width: 100%; padding: 48px; position: relative; max-height: 90vh; overflow-y: auto; }
.modal-close { position: absolute; top: 20px; right: 20px; background: transparent; border: 0; color: var(--ink-faint); font-size: 22px; cursor: pointer; transition: color 0.2s; line-height: 1; }
.modal-close:hover { color: var(--ink); }
.modal h3 { font-family: 'Cormorant Garamond', serif; font-size: 28px; font-weight: 300; color: var(--ink); margin-bottom: 8px; }
.modal-sub { font-size: 13px; color: var(--ink-soft); margin-bottom: 24px; line-height: 1.6; }
.modal-preview { display: flex; align-items: center; gap: 14px; padding: 12px; background: var(--gold-dim); margin-bottom: 24px; border: 1px solid var(--line); }
.modal-preview img { width: 64px; height: 64px; object-fit: cover; flex-shrink: 0; }
.modal-preview .pn { font-weight: 600; font-size: 14px; color: var(--ink); }
.modal-preview .pc { font-size: 10px; color: var(--ink-faint); letter-spacing: 0.18em; text-transform: uppercase; margin-top: 3px; }
.field { margin-bottom: 16px; }
.field label { display: block; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; font-weight: 700; color: var(--ink-faint); margin-bottom: 6px; }
.field input, .field textarea, .field select {
  width: 100%; padding: 10px 12px; background: transparent;
  border: 1px solid var(--line); color: var(--ink);
  font-family: inherit; font-size: 14px; outline: none;
  transition: border-color 0.2s;
}
.field input:focus, .field textarea:focus { border-color: var(--gold); }
.field textarea { min-height: 80px; resize: vertical; }
.submit {
  width: 100%; padding: 14px; background: var(--gold); color: #0A0A08;
  border: 0; font-family: inherit; font-size: 11px; letter-spacing: 0.32em;
  text-transform: uppercase; font-weight: 700; cursor: pointer; margin-top: 8px;
  transition: opacity 0.2s;
}
.submit:hover { opacity: 0.85; }
.contact-options { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; }
.contact-option {
  display: flex; align-items: center; gap: 16px; padding: 18px 20px;
  background: transparent; border: 1px solid var(--line);
  color: var(--ink); font-family: inherit; font-size: 11px;
  letter-spacing: 0.22em; text-transform: uppercase; font-weight: 700;
  cursor: pointer; text-decoration: none; transition: all 0.2s; width: 100%; text-align: left;
}
.contact-option:hover { border-color: var(--gold); color: var(--gold); }
.contact-option svg { width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 1.5; flex-shrink: 0; }
.co-label { flex: 1; display: block; }
.co-value { display: block; font-size: 10px; letter-spacing: 0.14em; text-transform: none; font-weight: 400; opacity: 0.65; margin-top: 3px; }

/* ===== RESPONSIVE ===== */
@media (max-width: 1200px) {
  .grid { grid-template-columns: repeat(min(var(--cols), 4), 1fr); }
}
@media (max-width: 900px) {
  .grid { grid-template-columns: repeat(3, 1fr); }
  .density { display: none; }
}
@media (max-width: 640px) {
  .grid { grid-template-columns: repeat(2, 1fr); }
  header { padding: 16px 20px; }
  .section, .editorial, footer { padding-left: 20px; padding-right: 20px; }
  .footer-grid { grid-template-columns: 1fr; gap: 32px; }
  .center-mark h1 { letter-spacing: 0.1em; }
  .search-wrap { flex: 1 1 100%; margin-left: 0; }
  .filter-bar { gap: 6px; }
  .table-view tbody td.thumb { display: none; }
}
</style>
<style id="ns-modal-fix">.ns-modal{display:none}.ns-modal.show{display:flex;align-items:center;justify-content:center;position:fixed;inset:0;background:rgba(0,0,0,0.6);z-index:1000}.ns-modal-card{background:#faf6ef;color:#1a1714;padding:32px;border-radius:12px;max-width:480px;width:90%;position:relative;box-shadow:0 20px 60px rgba(0,0,0,0.3)}.ns-modal .close-x{position:absolute;top:12px;right:16px;background:transparent;border:0;font-size:24px;cursor:pointer;color:#1a1714}.ns-modal h3{margin:0 0 8px;font-size:22px;font-weight:400}.ns-modal .sub{color:rgba(0,0,0,0.5);margin:0 0 20px;font-size:14px}.ns-actions{display:grid;gap:10px}.ns-action{display:flex;gap:14px;align-items:center;color:inherit;text-decoration:none;padding:14px 16px;border:1px solid rgba(0,0,0,0.12);border-radius:8px}.ns-action:hover{background:rgba(0,0,0,0.04)}.ns-action .ico{font-size:20px}.ns-action .txt{display:flex;flex-direction:column}.ns-action .txt b{font-weight:600}.ns-action .txt span{font-size:12px;color:rgba(0,0,0,0.5)}</style>
<script src="/corner-nav.js" defer></script>
</head>
<body>
<style id="ns-header-modal-styles">
        .ns-header { position: sticky; top: 0; z-index: 100; display: flex; align-items: center; justify-content: space-between; padding: 18px 36px; background: rgba(10,10,10,0.92) !important; backdrop-filter: blur(8px); border-bottom: 1px solid rgba(245,241,232,0.06); }
        .ns-brand { display: inline-flex; align-items: center; gap: 14px; text-decoration: none; }
        .ns-dot { width: 28px; height: 28px; border-radius: 50%; background: var(--ns-dot-bg, radial-gradient(circle at 35% 35%, #b66a4d 0%, #8a4a30 60%, #5a2d1c 100%)); box-shadow: 0 0 0 1px rgba(245,241,232,0.10), 0 2px 12px rgba(180,90,60,0.30); flex-shrink: 0; }
        .ns-name { font-family: -apple-system, "SF Pro Display", "Helvetica Neue", system-ui, sans-serif; font-size: 18px !important; font-weight: 300 !important; letter-spacing: 0.02em !important; color: #f5f1e8 !important; text-transform: none !important; margin: 0 !important; }
        .ns-name sup { font-size: 0.55em; font-weight: 300; margin-left: 1px; }
        .ns-nav a, .ns-nav button { font-family: -apple-system, "SF Pro Text", system-ui, sans-serif; font-size: 15px !important; font-weight: 400 !important; color: #f5f1e8 !important; text-decoration: none !important; background: none !important; border: 0 !important; cursor: pointer; transition: color 200ms; letter-spacing: 0 !important; text-transform: none !important; }
        .ns-nav a:hover, .ns-nav button:hover { color: #ffffff !important; }
        /* All widths: hide nav by default, hamburger always visible on right, nav opens as right-anchored dropdown panel */
        .ns-nav {
            display: none !important;
            position: absolute; top: 100%; right: 18px;
            flex-direction: column; align-items: stretch; gap: 0;
            background: rgba(10,10,10,0.96); backdrop-filter: blur(10px);
            border: 1px solid rgba(245,241,232,0.10); border-top: 0;
            min-width: 220px; padding: 10px 0; margin: 0;
            box-shadow: 0 16px 40px rgba(0,0,0,0.55);
            z-index: 150;
        }
        .ns-nav.open { display: flex !important; }
        .ns-nav a, .ns-nav button {
            padding: 12px 22px !important;
            border-bottom: 1px solid rgba(245,241,232,0.06);
            width: 100%; text-align: left;
        }
        .ns-nav a:last-child, .ns-nav button:last-child { border-bottom: 0; }
        .ns-nav a:hover, .ns-nav button:hover { background: rgba(245,241,232,0.06) !important; color: #ffffff !important; }
        @media (max-width: 480px) { .ns-nav { right: 12px; min-width: 200px; } }
        .ns-header .mobile-toggle { display: flex !important; align-items: center; justify-content: center; width: 36px; height: 36px; background: transparent; border: 0; cursor: pointer; padding: 0; gap: 4px; flex-direction: column; }
        .ns-header .mobile-toggle span { display: block; width: 22px; height: 1.5px; background: #f5f1e8; transition: transform 200ms, opacity 200ms; }
        .ns-header .mobile-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(5px) rotate(45deg); }
        .ns-header .mobile-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
        .ns-header .mobile-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-5px) rotate(-45deg); }
    </style>
<style id="ns-gold-kill">
    /* novasuede: kill gold-solid fills, off-white instead. Edge color stays gold. */
    .new-badge, .new-arrivals-pill,
    .color-filter-btn.active, .drapery-btn,
    .sample-btn-chip, .cb-cta {
      background: #f5f1e8 !important;
      color: #0a0a0a !important;
      border-color: #f5f1e8 !important;
    }
    .new-badge:hover, .new-arrivals-pill:hover,
    .color-filter-btn.active:hover, .drapery-btn:hover,
    .sample-btn-chip:hover, .cb-cta:hover {
      background: #fff !important;
      color: #0a0a0a !important;
    }
  </style>
<header class="ns-header">
        <a href="/" class="ns-brand" aria-label="Home">
            <span class="ns-dot"></span>
            <span class="ns-name">goldleafwallpaper</span>
        </a>
        <nav class="ns-nav" id="nsPrimaryNav" aria-label="Primary">
            <a href="/">Home</a>
            <a href="/about">About</a>
            <button type="button" onclick="nsContactOpen()">Contact</button>
        </nav>
        <button type="button" class="mobile-toggle" aria-label="Toggle menu" aria-controls="nsPrimaryNav" aria-expanded="false" onclick="nsToggleNav(this)">
            <span></span><span></span><span></span>
        </button>
    </header>

<div class="ns-modal" id="nsContactModal" role="dialog" aria-modal="true" aria-labelledby="nsContactTitle" onclick="if(event.target===this)nsContactClose()">
        <div class="ns-modal-card">
            <button type="button" class="close-x" onclick="nsContactClose()" aria-label="Close">×</button>
            <h3 id="nsContactTitle">How can we help?</h3>
            <p class="sub">Trade-account replies within one business day.</p>
            <div class="ns-actions">
                <a class="ns-action" href="#contact" onclick="nsContactClose()"><span class="ico">📋</span><div class="txt"><b>Get a Quote</b><span>Project specs → priced estimate</span></div></a>
                <a class="ns-action" href="#contact" onclick="nsContactClose();openModal();"><span class="ico">📦</span><div class="txt"><b>Order a Sample</b><span>Free swatch to your shop</span></div></a>
                <a class="ns-action" href="mailto:info@goldleafwallpaper.com?subject=Atelier%20Aurum%20inquiry"><span class="ico">✉️</span><div class="txt"><b>Email Us</b><span>info@goldleafwallpaper.com</span></div></a>
                <a class="ns-action" href="tel:888-373-4564"><span class="ico">📞</span><div class="txt"><b>Call Us</b><span>(888) 373-4564 · M–F, 9–5 PT</span></div></a>
            </div>
        </div>
    </div>
<script>
  function nsContactOpen() { var m = document.getElementById('nsContactModal'); if (m) m.classList.add('show'); }
  function nsContactClose() { var m = document.getElementById('nsContactModal'); if (m) m.classList.remove('show'); }
  function nsToggleNav(btn) {
    var nav = document.getElementById('nsPrimaryNav');
    if (!nav) return;
    var open = nav.classList.toggle('open');
    btn.setAttribute('aria-expanded', open ? 'true' : 'false');
  }
  document.addEventListener('keydown', function(e){ if (e.key === 'Escape') nsContactClose(); });
</script>









<!-- HEADER -->
<header id="siteHeader">
  <div class="h-group">
    <button class="h-link" onclick="openContactMenu()" aria-label="Contact">
      <svg class="h-icon" viewBox="0 0 24 24"><path d="M3 6h18v12H3z"/><path d="M3 6l9 7 9-7"/></svg>
      <span>Contact</span>
    </button>
    <button class="h-link" onclick="openMenuModal()" aria-label="Menu">
      <span>Menu</span>
      <svg class="h-icon" viewBox="0 0 24 24"><path d="M3 7h18M3 12h18M3 17h18"/></svg>
    </button>
  </div>
  <button class="theme-toggle" id="themeToggle" aria-label="Toggle dark/light mode" title="Toggle dark / light">
    <svg class="icon-sun" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
      <circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/>
    </svg>
    <svg class="icon-moon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
      <path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z"/>
    </svg>
  </button>
</header>

<!-- HERO -->
<section class="cinema">
  <div class="cinema-bg" id="cinemaBg"></div>
  <div class="corner-mark">goldleafwallpaper</div>
  <div class="center-mark">
    <h1>Gold Leaf</h1>
    <span class="rule"></span>
    <span class="sub">Metallic &middot; Foil &middot; Lacquer</span>
  </div>
  <div class="hero-meta" id="heroMeta">
    Loading
    <span class="hero-count" id="heroCount">1,957 Patterns</span>
  </div>
  <a class="enter" href="#patterns">
    Enter Collection
    <svg width="24" height="12" viewBox="0 0 24 12" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M0 6h22M16 1l6 5-6 5"/></svg>
  </a>
</section>

<!-- COLLECTION -->
<section class="section" id="patterns">
  <div class="section-header">
    <div>
      <div class="section-eyebrow">The Collection</div>
      <h2 class="section-title" id="sectionTitle">Loading.</h2>
    </div>
    <div class="section-meta" id="sectionMeta">Gold Leaf &middot; Foil &middot; Lacquer<br>Free Memo Samples</div>
  </div>

  <!-- Filter chips -->
  <div class="filter-bar" id="filterBar">
    <button class="chip active" data-filter="all">All</button>
    <button class="chip" data-filter="gold">Gold</button>
    <button class="chip" data-filter="silver">Silver</button>
    <button class="chip" data-filter="neutral">Neutral</button>
    <button class="chip" data-filter="warm">Warm</button>
    <button class="chip" data-filter="green">Green</button>
    <select class="sort-select" id="sortSelect" aria-label="Sort patterns">
      <option value="default">Sort: Featured</option>
      <option value="title-asc">Title A–Z</option>
      <option value="title-desc">Title Z–A</option>
      <option value="vendor-asc">Brand A–Z</option>
      <option value="price-asc">Price Low–High</option>
      <option value="price-desc">Price High–Low</option>
    </select>
    <div class="view-toggle" role="tablist">
      <button id="viewGallery" class="active" role="tab" aria-selected="true">Gallery</button>
      <button id="viewTable" role="tab" aria-selected="false">Table</button>
    </div>
    <div class="search-wrap">
      <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M21 21l-5.5-5.5"/></svg>
      <input type="text" id="searchInput" placeholder="Search pattern, vendor, SKU...">
    </div>
  </div>

  <!-- Density slider -->
  <div class="density">
    <label for="densitySlider">Grid</label>
    <input type="range" id="densitySlider" min="3" max="10" step="1" value="5" aria-label="Grid columns">
    <span class="ct" id="densityLabel">5 cols</span>
  </div>

  <!-- Grid + Table -->
  <div class="grid" id="grid"></div>
  <table class="table-view" id="tableView">
    <thead>
      <tr>
        <th class="no-sort" aria-label="Thumb"></th>
        <th data-sort-key="vendor">Brand<span class="sort-arrow">↕</span></th>
        <th data-sort-key="title">Pattern<span class="sort-arrow">↕</span></th>
        <th data-sort-key="sku" class="no-sort">SKU</th>
        <th class="no-sort"></th>
      </tr>
    </thead>
    <tbody id="tableBody"></tbody>
  </table>

  <!-- Pagination -->
  <div class="pagination" id="pagination">
    <button class="page-btn" id="prevBtn" disabled>Previous</button>
    <span class="page-info" id="pageInfo">Page 1</span>
    <button class="page-btn" id="nextBtn">Next</button>
  </div>
</section>

<!-- EDITORIAL -->
<section class="editorial">
  <div class="editorial-inner">
    <div class="section-eyebrow">About This Collection</div>
    <div class="editorial-rule"></div>
    <h2>Where gold leaf meets the wall.</h2>
    <p>For centuries, gilded surfaces have signaled permanence — the kind of luxury that doesn't apologize for itself. This collection brings that tradition into contemporary interiors: real metallic-foil grounds, lacquered surfaces that catch light at every hour, and leaf-on-paper constructions handcrafted with the same reverence once reserved for illuminated manuscripts.</p>
    <p>Each pattern here is sourced from the ateliers we trust most: 1838 Wallcoverings, Phillipe Romano, Maya Romanoff, Schumacher, and other curated trade ateliers. Free memo samples ship within days. Trade accounts receive hands-on service from our team.</p>
    <p>This is not a catalogue of catalog wallpaper. These are surfaces worth the room they're in.</p>
  </div>
</section>

<!-- FOOTER -->
<footer>
  <div class="footer-grid">
    <div>
      <div class="footer-brand">Gold Leaf Wallpaper</div>
      <div class="footer-gold-rule"></div>
      <p class="footer-text">A curated storefront for metallic, foil, and gold-leaf wallcoverings — sourced from the world's finest ateliers and backed by hands-on trade expertise. Free memo samples. No minimum order.</p>
    </div>
    <div class="footer-col">
      <h4>Explore</h4>
      <a href="#patterns">All Patterns</a>
      <a href="/about.html">About</a>
      <a href="#" onclick="openSampleModal();return false">Request Sample</a>
    </div>
    <div class="footer-col">
      <h4>Contact</h4>
      <a href="mailto:info@goldleafwallpaper.com">info@goldleafwallpaper.com</a>
      <a href="tel:8883734564">(888) 373-4564</a>
    </div>
  </div>
  <div class="footer-bottom">
    <span>&copy; 2026 Goldleafwallpaper.com &middot; A curated atelier</span>
    <span>Free Samples &middot; Trade Service &middot; Expert Hands-On Help</span>
  </div>
</footer>

<!-- MENU MODAL -->
<div class="modal" id="menuModal" onclick="if(event.target===this)closeMenuModal()">
  <div class="modal-box" style="max-width:440px">
    <button class="modal-close" onclick="closeMenuModal()" aria-label="Close">&times;</button>
    <h3>Menu</h3>
    <p class="modal-sub">Gold Leaf Wallpaper &mdash; Metallic &middot; Foil &middot; Lacquer</p>
    <div class="contact-options">
      <a class="contact-option" href="#patterns" onclick="closeMenuModal()"><span class="co-label">Collection<span class="co-value">1,900+ metallic patterns</span></span></a>
      <button class="contact-option" type="button" onclick="closeMenuModal();openContactMenu()"><span class="co-label">Contact Us</span></button>
      
      <a class="contact-option" href="mailto:info@goldleafwallpaper.com"><svg viewBox="0 0 24 24"><path d="M3 6h18v12H3z"/><path d="M3 6l9 7 9-7"/></svg><span class="co-label">info@goldleafwallpaper.com</span></a>
      <a class="contact-option" href="tel:8883734564"><svg viewBox="0 0 24 24"><path d="M4 5c0-.6.4-1 1-1h3l2 5-2 1c1 2.5 3 4.5 5.5 5.5l1-2 5 2v3c0 .6-.4 1-1 1A16 16 0 0 1 4 5z"/></svg><span class="co-label">(888) 373-4564</span></a>
    </div>
  </div>
</div>

<!-- CONTACT MODAL -->
<div class="modal" id="contactModal" onclick="if(event.target===this)closeContactMenu()">
  <div class="modal-box" style="max-width:440px">
    <button class="modal-close" onclick="closeContactMenu()" aria-label="Close">&times;</button>
    <h3>Contact Us</h3>
    <p class="modal-sub">goldleafwallpaper &mdash; gold leaf, applied by hand.</p>
    <div class="contact-options">
      <button class="contact-option" type="button" onclick="closeContactMenu();openInquiryModal()">
        <svg viewBox="0 0 24 24"><path d="M4 4h16v12H7l-3 3z"/></svg>
        <span class="co-label">Project Inquiry<span class="co-value">Scope &middot; sq.ft. &middot; timeline</span></span>
      </button>
      <button class="contact-option" type="button" onclick="closeContactMenu();openSampleModal()">
        <svg viewBox="0 0 24 24"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/></svg>
        <span class="co-label">Request a Sample<span class="co-value">Free memo samples, ships in 3–5 days</span></span>
      </button>
      <a class="contact-option" href="mailto:info@goldleafwallpaper.com">
        <svg viewBox="0 0 24 24"><path d="M3 6h18v12H3z"/><path d="M3 6l9 7 9-7"/></svg>
        <span class="co-label">Email<span class="co-value">info@goldleafwallpaper.com</span></span>
      </a>
      <a class="contact-option" href="tel:8883734564">
        <svg viewBox="0 0 24 24"><path d="M4 5c0-.6.4-1 1-1h3l2 5-2 1c1 2.5 3 4.5 5.5 5.5l1-2 5 2v3c0 .6-.4 1-1 1A16 16 0 0 1 4 5z"/></svg>
        <span class="co-label">Call<span class="co-value">(888) 373-4564</span></span>
      </a>
    </div>
  </div>
</div>

<!-- INQUIRY MODAL -->
<div class="modal" id="inquiryModal" onclick="if(event.target===this)closeInquiryModal()">
  <div class="modal-box">
    <button class="modal-close" onclick="closeInquiryModal()" aria-label="Close">&times;</button>
    <h3>Project Inquiry</h3>
    <p class="modal-sub">Tell us about your project &mdash; we respond within one business day.</p>
    <form id="inquiryForm" onsubmit="return submitInquiry(event)">
      <div class="field"><label>Name</label><input type="text" name="name" required></div>
      <div class="field"><label>Email</label><input type="email" name="email" required></div>
      <div class="field"><label>Phone</label><input type="tel" name="phone"></div>
      <div class="field"><label>Company / Trade</label><input type="text" name="company"></div>
      <div class="field"><label>Project Name</label><input type="text" name="projectName" required></div>
      <div class="field"><label>Project Scope</label><textarea name="projectScope" placeholder="Square footage &middot; room count &middot; timeline" required></textarea></div>
      <div class="field"><label>Additional Notes</label><textarea name="message" placeholder="Patterns of interest, finish preferences, budget..."></textarea></div>
      <button type="submit" class="submit" id="inquirySubmit">Send Inquiry</button>
      <div id="inquiryStatus" style="margin-top:12px;font-size:11px;letter-spacing:0.18em;text-transform:uppercase;text-align:center;display:none"></div>
    </form>
  </div>
</div>

<!-- SAMPLE MODAL -->
<div class="modal" id="sampleModal" onclick="if(event.target===this)closeSampleModal()">
  <div class="modal-box">
    <button class="modal-close" onclick="closeSampleModal()" aria-label="Close">&times;</button>
    <h3>Order a Free Sample</h3>
    <p class="modal-sub">Memo samples ship free within 3&ndash;5 business days. No minimum order.</p>
    <div class="modal-preview" id="modalPreview" style="display:none">
      <img id="mpImg" src="" alt="">
      <div><div class="pn" id="mpName"></div><div class="pc" id="mpCode"></div></div>
    </div>
    <form id="sampleForm" onsubmit="return submitSample(event)">
      <div class="field"><label>Name</label><input type="text" name="name" required></div>
      <div class="field"><label>Email</label><input type="email" name="email" required></div>
      <div class="field"><label>Company / Trade</label><input type="text" name="company"></div>
      <div class="field"><label>Shipping Address</label><input type="text" name="address" placeholder="Street"></div>
      <div class="field" style="display:grid;grid-template-columns:2fr 1fr 1fr;gap:8px">
        <input type="text" name="city" placeholder="City" style="padding:10px 12px;background:transparent;border:1px solid var(--line);color:var(--ink);font-family:inherit;font-size:14px;outline:none">
        <input type="text" name="state" placeholder="State" style="padding:10px 12px;background:transparent;border:1px solid var(--line);color:var(--ink);font-family:inherit;font-size:14px;outline:none">
        <input type="text" name="zip" placeholder="ZIP" style="padding:10px 12px;background:transparent;border:1px solid var(--line);color:var(--ink);font-family:inherit;font-size:14px;outline:none">
      </div>
      <div class="field"><label>Notes</label><textarea name="message" placeholder="Project, sq.ft., timing..."></textarea></div>
      <button type="submit" class="submit" id="sampleSubmit">Send Sample Request — Free</button>
      <div id="sampleStatus" style="margin-top:12px;font-size:11px;letter-spacing:0.18em;text-transform:uppercase;text-align:center;display:none"></div>
    </form>
  </div>
</div>

<script>
'use strict';

// === DATA + STATE ===
let allProducts = [];
let filtered = [];
let currentFilter = 'all';
let currentSearch = '';
let currentSort = 'default';
let currentView = 'gallery';
let currentPage = 1;
const PAGE_SIZE = 60;

// Hydrate sort from storage before the first applyAll()
(function() {
  let saved;
  try { saved = localStorage.getItem('glw.grid.sort'); } catch(e) {}
  if (saved) {
    currentSort = saved;
    const sel = document.getElementById('sortSelect');
    if (sel && [].some.call(sel.options, function(o) { return o.value === saved; })) {
      sel.value = saved;
    }
  }
})();

// === THEME TOGGLE ===
const themeToggle = document.getElementById('themeToggle');
themeToggle.addEventListener('click', function() {
  const isDark = document.documentElement.getAttribute('data-theme') === 'dark';
  const next = isDark ? 'light' : 'dark';
  document.documentElement.setAttribute('data-theme', next);
  try { localStorage.setItem('glw-theme', next); } catch(e) {}
});

// === AUTO-SHOW HEADER ===
(function() {
  const header = document.getElementById('siteHeader');
  const REVEAL = 80;
  let hideT;
  function show() { clearTimeout(hideT); document.body.classList.add('show-header'); }
  function scheduleHide() {
    clearTimeout(hideT);
    hideT = setTimeout(function() {
      if (header.matches(':hover') || header.contains(document.activeElement)) return;
      document.body.classList.remove('show-header');
    }, 200);
  }
  document.addEventListener('mousemove', function(e) {
    if (e.clientY < REVEAL || header.contains(e.target)) show(); else scheduleHide();
  });
  document.addEventListener('focusin', function(e) { if (header.contains(e.target)) show(); });
  document.addEventListener('focusout', scheduleHide);
  document.addEventListener('touchstart', function(e) {
    const y = (e.touches && e.touches[0]) ? e.touches[0].clientY : 0;
    if (y < REVEAL || header.contains(e.target)) show(); else scheduleHide();
  }, { passive: true });
  window.addEventListener('scroll', function() { if (window.scrollY < 4) show(); }, { passive: true });
  show();
})();

// === DENSITY SLIDER (persisted per corkwallcovering pattern) ===
const slider = document.getElementById('densitySlider');
const dlabel = document.getElementById('densityLabel');
function applyDensity(n) {
  document.documentElement.style.setProperty('--cols', n);
  dlabel.textContent = n + ' cols';
}
slider.addEventListener('input', function() {
  const n = parseInt(this.value, 10);
  applyDensity(n);
  try { localStorage.setItem('glw.grid.density', String(n)); } catch(e) {}
});
// Hydrate density from storage before first render
(function() {
  let saved;
  try { saved = parseInt(localStorage.getItem('glw.grid.density'), 10); } catch(e) {}
  if (saved >= 3 && saved <= 10) { slider.value = saved; applyDensity(saved); }
})();

// === FILTER / SORT / SEARCH ===
// Filters partition the Renaissance Metal Leaf catalog by finish + color family.
// Every chip is verified to return a non-zero, non-total slice on the real 61-SKU
// feed (Gold 35 / Silver 24 / Neutral 18 / Warm 32 / Green 8) — the old chips
// (Bronze/Foil/Lacquer=empty, Black/Metallic=everything) were dead furniture from
// the previous mixed-vendor catalog. Finish reads the title (e.g. "Gold Leaf ·
// Brass"); color family reads the "color:X" tag.
function computeFilter(p) {
  const t = (p.title || '').toLowerCase();
  const tags = (p.tags || '').toLowerCase();
  if (currentFilter === 'all') return true;
  const f = currentFilter.toLowerCase();
  if (f === 'gold')   return t.includes('gold leaf');
  if (f === 'silver') return t.includes('silver leaf');
  if (f === 'neutral') return /color:(cream|oatmeal|ecru|bone|pearl|beige|light gray|oyster|ivory|alabaster)/i.test(tags);
  if (f === 'warm')    return /color:(brass|chocolate|mocha|khaki|tan|camel|clay|copper|caramel|honey)/i.test(tags);
  if (f === 'green')   return /color:(forest|sage|moss|olive|peacock|celadon|powder blue)/i.test(tags);
  return true;
}

function computeSort(arr) {
  if (currentSort === 'default') return arr;
  return [...arr].sort(function(a, b) {
    if (currentSort === 'title-asc') return (a.title||'').localeCompare(b.title||'');
    if (currentSort === 'title-desc') return (b.title||'').localeCompare(a.title||'');
    if (currentSort === 'vendor-asc') return (a.vendor||'').localeCompare(b.vendor||'');
    if (currentSort === 'price-asc') return (parseFloat(a.retail_price)||0) - (parseFloat(b.retail_price)||0);
    if (currentSort === 'price-desc') return (parseFloat(b.retail_price)||0) - (parseFloat(a.retail_price)||0);
    return 0;
  });
}

function applyAll() {
  let result = allProducts.filter(function(p) {
    if (!computeFilter(p)) return false;
    if (currentSearch) {
      const q = currentSearch.toLowerCase();
      const hay = ((p.title||'') + ' ' + (p.vendor||'') + ' ' + (p.dw_sku||'') + ' ' + (p.mfr_sku||'') + ' ' + (p.tags||'')).toLowerCase();
      if (hay.indexOf(q) === -1) return false;
    }
    return true;
  });
  result = computeSort(result);
  filtered = result;
  currentPage = 1;
  renderCurrent();
  updatePagination();
  // Update section title
  document.getElementById('sectionTitle').textContent = result.length.toLocaleString() + ' Patterns.';
  document.getElementById('sectionMeta').innerHTML = result.length.toLocaleString() + ' results &middot; Free Memo Samples';
}

function getPage() {
  const start = (currentPage - 1) * PAGE_SIZE;
  return filtered.slice(start, start + PAGE_SIZE);
}

function renderCurrent() {
  if (currentView === 'table') renderTable(getPage());
  else renderGrid(getPage());
}

function renderGrid(page) {
  const grid = document.getElementById('grid');
  if (!page.length) {
    grid.innerHTML = '<div style="grid-column:1/-1;padding:80px 0;text-align:center;color:var(--ink-faint);font-size:13px;letter-spacing:0.18em;text-transform:uppercase">No patterns match.</div>';
    return;
  }
  grid.innerHTML = page.map(function(p) {
    const title = escH(p.title || 'Untitled');
    const vendor = escH(p.vendor || '');
    const img = escH(p.image_url || '');
    const handle = escH(p.handle || '');
    const sku = escH(p.dw_sku || p.mfr_sku || '');
    const dwLink = 'https://designerwallcoverings.com/products/' + handle + '#sample';
    return '<div class="item">' +
      '<img src="' + img + '" alt="' + title + '" loading="lazy" onerror="this.style.opacity=0.12">' +
      '<div class="overlay">' +
        '<div class="item-vendor">' + vendor + '</div>' +
        '<div class="item-name">' + title + '</div>' +
        '<div class="item-actions">' +
          '<a class="sample-btn" href="' + dwLink + '" target="_blank" rel="noopener" title="Order free memo sample">Memo Sample — Free</a>' +
        '</div>' +
      '</div>' +
    '</div>';
  }).join('');
}

function renderTable(page) {
  const tbody = document.getElementById('tableBody');
  if (!page.length) {
    tbody.innerHTML = '<tr><td colspan="5" style="padding:60px 16px;text-align:center;color:var(--ink-faint);font-size:13px;letter-spacing:0.18em;text-transform:uppercase">No patterns match.</td></tr>';
    return;
  }
  tbody.innerHTML = page.map(function(p) {
    const title = escH(p.title || 'Untitled');
    const vendor = escH(p.vendor || '');
    const img = escH(p.image_url || '');
    const handle = escH(p.handle || '');
    const sku = escH(p.dw_sku || p.mfr_sku || '');
    const dwLink = 'https://designerwallcoverings.com/products/' + handle + '#sample';
    return '<tr>' +
      '<td class="thumb"><img src="' + img + '" alt="' + title + '" loading="lazy" onerror="this.style.opacity=0.12"></td>' +
      '<td class="cell-vendor">' + vendor + '</td>' +
      '<td>' + title + '</td>' +
      '<td class="cell-code">' + sku + '</td>' +
      '<td class="cell-action"><a href="' + dwLink + '" target="_blank" rel="noopener">Sample</a></td>' +
    '</tr>';
  }).join('');
  // Update sort arrows
  const [sortKey] = (currentSort || '').split('-');
  document.querySelectorAll('.table-view thead th[data-sort-key]').forEach(function(th) {
    const isSorted = th.dataset.sortKey === sortKey;
    th.classList.toggle('sorted', isSorted);
    const arrow = th.querySelector('.sort-arrow');
    if (arrow) arrow.textContent = isSorted ? (currentSort.endsWith('-asc') ? '↑' : '↓') : '↕';
  });
}

function updatePagination() {
  const totalPages = Math.ceil(filtered.length / PAGE_SIZE);
  document.getElementById('prevBtn').disabled = currentPage <= 1;
  document.getElementById('nextBtn').disabled = currentPage >= totalPages;
  document.getElementById('pageInfo').textContent = 'Page ' + currentPage + ' of ' + totalPages;
  document.getElementById('pagination').style.display = totalPages <= 1 ? 'none' : 'flex';
}

function escH(s) {
  return String(s == null ? '' : s)
    .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
}

// === EVENT LISTENERS ===
document.querySelectorAll('.chip').forEach(function(chip) {
  chip.addEventListener('click', function() {
    document.querySelectorAll('.chip').forEach(function(c) { c.classList.remove('active'); });
    chip.classList.add('active');
    currentFilter = chip.getAttribute('data-filter');
    applyAll();
  });
});

document.getElementById('searchInput').addEventListener('input', function(e) {
  currentSearch = e.target.value;
  applyAll();
});

document.getElementById('sortSelect').addEventListener('change', function(e) {
  currentSort = e.target.value;
  try { localStorage.setItem('glw.grid.sort', currentSort); } catch(ex) {}
  applyAll();
});

document.getElementById('viewGallery').addEventListener('click', function() { setView('gallery'); });
document.getElementById('viewTable').addEventListener('click', function() { setView('table'); });

function setView(view) {
  currentView = view;
  const grid = document.getElementById('grid');
  const table = document.getElementById('tableView');
  const galleryBtn = document.getElementById('viewGallery');
  const tableBtn = document.getElementById('viewTable');
  if (view === 'table') {
    grid.classList.add('hidden'); table.classList.add('active');
    galleryBtn.classList.remove('active'); galleryBtn.setAttribute('aria-selected', 'false');
    tableBtn.classList.add('active'); tableBtn.setAttribute('aria-selected', 'true');
  } else {
    grid.classList.remove('hidden'); table.classList.remove('active');
    tableBtn.classList.remove('active'); tableBtn.setAttribute('aria-selected', 'false');
    galleryBtn.classList.add('active'); galleryBtn.setAttribute('aria-selected', 'true');
  }
  renderCurrent();
}

document.querySelectorAll('.table-view thead th[data-sort-key]').forEach(function(th) {
  th.addEventListener('click', function() {
    const key = th.dataset.sortKey;
    const [curKey, curDir] = (currentSort || '').split('-');
    const nextDir = (curKey === key && curDir === 'asc') ? 'desc' : 'asc';
    currentSort = key + '-' + nextDir;
    document.getElementById('sortSelect').value = currentSort;
    try { localStorage.setItem('glw.grid.sort', currentSort); } catch(ex) {}
    applyAll();
  });
});

document.getElementById('prevBtn').addEventListener('click', function() {
  if (currentPage > 1) { currentPage--; renderCurrent(); updatePagination(); window.scrollTo({top: document.getElementById('patterns').offsetTop - 80, behavior: 'smooth'}); }
});
document.getElementById('nextBtn').addEventListener('click', function() {
  const totalPages = Math.ceil(filtered.length / PAGE_SIZE);
  if (currentPage < totalPages) { currentPage++; renderCurrent(); updatePagination(); window.scrollTo({top: document.getElementById('patterns').offsetTop - 80, behavior: 'smooth'}); }
});

// === MODALS ===
function openMenuModal() { document.getElementById('menuModal').classList.add('open'); }
function closeMenuModal() { document.getElementById('menuModal').classList.remove('open'); }
function openContactMenu() { document.getElementById('contactModal').classList.add('open'); }
function closeContactMenu() { document.getElementById('contactModal').classList.remove('open'); }
function openInquiryModal() { document.getElementById('inquiryModal').classList.add('open'); }
function closeInquiryModal() { document.getElementById('inquiryModal').classList.remove('open'); }

function openSampleModal(name, handle, img) {
  const modal = document.getElementById('sampleModal');
  const prev = document.getElementById('modalPreview');
  if (name) {
    prev.style.display = 'flex';
    document.getElementById('mpImg').src = img || '';
    document.getElementById('mpName').textContent = name;
    document.getElementById('mpCode').textContent = handle || '';
  } else {
    prev.style.display = 'none';
  }
  modal.classList.add('open');
}
function closeSampleModal() { document.getElementById('sampleModal').classList.remove('open'); }

document.addEventListener('keydown', function(e) {
  if (e.key === 'Escape') {
    closeMenuModal(); closeContactMenu(); closeInquiryModal(); closeSampleModal();
  }
});

// === FORM HELPERS ===
function postForm(endpoint, payload, btn, statusEl, successMsg, onSuccess) {
  const orig = btn.textContent;
  btn.disabled = true; btn.textContent = 'Sending…'; statusEl.style.display = 'none';
  fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) })
    .then(function(r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })
    .then(function() {
      statusEl.textContent = successMsg;
      statusEl.style.color = 'var(--gold)'; statusEl.style.display = 'block';
      btn.textContent = 'Sent';
      setTimeout(onSuccess, 2500);
    })
    .catch(function() {
      btn.disabled = false; btn.textContent = orig;
      statusEl.textContent = 'Error &mdash; please email info@goldleafwallpaper.com';
      statusEl.style.color = '#d9534f'; statusEl.style.display = 'block';
    });
  return false;
}

function submitInquiry(e) {
  e.preventDefault();
  const d = new FormData(e.target);
  return postForm('/api/send-inquiry', {
    name: d.get('name'), email: d.get('email'), phone: d.get('phone'),
    company: d.get('company'), projectName: d.get('projectName'),
    projectScope: d.get('projectScope'), message: d.get('message')
  }, document.getElementById('inquirySubmit'), document.getElementById('inquiryStatus'),
  'Inquiry sent — we\'ll respond within 1 business day', closeInquiryModal);
}

function submitSample(e) {
  e.preventDefault();
  const d = new FormData(e.target);
  const name = document.getElementById('mpName').textContent || 'Sample';
  const code = document.getElementById('mpCode').textContent || '';
  return postForm('/api/send-sample-request', {
    name: d.get('name'), email: d.get('email'), company: d.get('company'),
    address: d.get('address'), city: d.get('city'), state: d.get('state'), zip: d.get('zip'),
    color: name + (code ? ' (' + code + ')' : ''),
    message: d.get('message')
  }, document.getElementById('sampleSubmit'), document.getElementById('sampleStatus'),
  'Request sent — ships in 3–5 business days', closeSampleModal);
}

// === LOAD DATA ===
fetch('/data/products.json')
  .then(function(r) { return r.json(); })
  .then(function(data) {
    allProducts = Array.isArray(data) ? data : [];
    document.getElementById('heroCount').textContent = allProducts.length.toLocaleString() + ' Patterns';
    applyAll();
    // Hero: pick from first 20 products with images, cycle by visit count
    const heroPool = allProducts.slice(0, 20).filter(function(p) { return p.image_url; });
    if (heroPool.length) {
      let v = 0;
      try { v = parseInt(localStorage.getItem('glw_visits') || '0', 10) || 0; localStorage.setItem('glw_visits', String(v + 1)); } catch(ex) {}
      const hero = heroPool[v % heroPool.length];
      document.getElementById('cinemaBg').style.backgroundImage = "url('" + hero.image_url + "')";
      document.getElementById('heroMeta').firstChild.nodeValue = (hero.vendor || '') + ' · ' + (hero.title || '');
    }
  })
  .catch(function(err) {
    console.error('Failed to load products', err);
    document.getElementById('grid').innerHTML = '<div style="padding:80px;text-align:center;color:var(--ink-faint)">Catalog unavailable. Please try again.</div>';
  });
</script>
</body>
</html>