<?php $pg_title="Frame Styles"; $pg_desc="Choose your perfect photo-booth frame style in Goa — from crisp 2×6″ strips to full-colour 4×6″ portraits and social squares. Tap any layout to preview it."; $pg_canon="/frame-styles/";
include $_SERVER['DOCUMENT_ROOT'].'/includes/header.php'; ?>
<style>
:root{ --gray-200:#C4C4C4; --gray-500:#6F6F6F; }

    .wrap { max-width: var(--container-max); margin: 0 auto; padding: 0 clamp(20px,5vw,48px); }
    .head { padding: 11rem 0 0; text-align: center; }
    .head h1 { font-family: var(--font-display); font-weight: 300; font-size: clamp(2.4rem,6vw,4.6rem);
      line-height: 1; color: var(--ivory); margin: 1rem auto 0; max-width: 880px; }
    .head p { font-family: var(--font-body); font-size: 1rem; font-weight: 300; line-height: 1.7;
      color: var(--gray-400); max-width: 600px; margin: 1.5rem auto 0; }
    .fs-frames { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.1rem; margin-top: 3.5rem; }
    @media (max-width: 720px) { .fs-frames { grid-template-columns: repeat(2, 1fr); } }
    @media (max-width: 460px) { .fs-frames { grid-template-columns: 1fr; } }
    .frame-card { position: relative; overflow: hidden; cursor: pointer; background: #120e0a;
      border: 1px solid rgba(201,169,110,0.1); aspect-ratio: 3/4; }
    .frame-card img { width: 100%; height: 100%; object-fit: contain; display: block; background: #120e0a;
      padding: 16px; box-sizing: border-box;
      filter: saturate(0.9) brightness(0.72); transition: transform 0.7s var(--ease-out-expo), filter 0.5s; }
    .frame-card:hover img { transform: scale(1.06); filter: saturate(1) brightness(0.9); }
    .frame-card .fc-scrim { position: absolute; inset: 0; pointer-events: none;
      background: linear-gradient(to top, rgba(8,7,6,0.9) 0%, transparent 55%); }
    .frame-card .fc-info { position: absolute; left: 16px; right: 16px; bottom: 16px; }
    .frame-card .fc-size { font-family: var(--font-display); font-weight: 500; font-size: 1.25rem; color: var(--ivory); }
    .frame-card .fc-shots { font-family: var(--font-body); font-size: 0.58rem; letter-spacing: 0.15em;
      text-transform: uppercase; color: var(--gold); margin-top: 3px; }
    .frame-card .fc-plus { position: absolute; top: 14px; right: 14px; width: 34px; height: 34px;
      border: 1px solid rgba(245,240,232,0.4); color: var(--ivory); display: flex; align-items: center;
      justify-content: center; opacity: 0; transform: scale(0.8); transition: all 0.4s var(--ease-out-expo); }
    .frame-card:hover .fc-plus { opacity: 1; transform: scale(1); }
    .note { margin-top: 2rem; font-family: var(--font-body); font-size: 0.78rem; font-weight: 300; color: var(--gray-500); }

    /* ---- Frame detail popup ---- */
    .fs-modal { position: fixed; inset: 0; z-index: 9996; display: flex; align-items: center;
      justify-content: center; padding: clamp(16px,4vw,48px); opacity: 0; visibility: hidden;
      background: rgba(6,5,4,0.92); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
      transition: opacity 0.35s, visibility 0.35s; }
    .fs-modal.open { opacity: 1; visibility: visible; }
    .fs-modal-inner { display: grid; grid-template-columns: 0.9fr 1fr; gap: clamp(1.5rem,3vw,3rem);
      max-width: 900px; width: 100%; background: var(--dark); border: 1px solid rgba(201,169,110,0.15);
      max-height: 88vh; overflow: hidden; transform: scale(0.96); transition: transform 0.4s var(--ease-out-expo); }
    .fs-modal.open .fs-modal-inner { transform: scale(1); }
    @media (max-width: 680px) { .fs-modal-inner { grid-template-columns: 1fr; max-height: 92vh; overflow-y: auto; } }
    .fs-modal-img { position: relative; background: #0e0c0a; display: flex; align-items: center; justify-content: center; padding: 24px; }
    .fs-modal-img img { width: 100%; height: 100%; max-height: calc(88vh - 48px); object-fit: contain; display: block; }
    @media (max-width: 680px) { .fs-modal-img img { max-height: 44vh; } }
    .fs-modal-body { padding: clamp(1.8rem,3vw,3rem) clamp(1.8rem,3vw,3rem) clamp(1.8rem,3vw,3rem) 0; display: flex; flex-direction: column; justify-content: center; }
    @media (max-width: 680px) { .fs-modal-body { padding: 1.8rem; } }
    .fs-modal-body .m-size { font-family: var(--font-display); font-weight: 300; font-size: clamp(1.8rem,3.5vw,2.6rem); color: var(--ivory); line-height: 1.05; }
    .fs-modal-body .m-shots { font-family: var(--font-body); font-size: 0.62rem; letter-spacing: 0.2em; text-transform: uppercase; color: var(--gold); margin-top: 0.6rem; }
    .fs-modal-body .m-blurb { font-family: var(--font-body); font-size: 0.9rem; font-weight: 300; line-height: 1.75; color: var(--gray-300); margin-top: 1.4rem; }
    .fs-modal-body .m-row { margin-top: 1.4rem; }
    .fs-modal-body .m-lbl { font-family: var(--font-body); font-size: 0.55rem; letter-spacing: 0.18em; text-transform: uppercase; color: var(--gray-600); }
    .fs-modal-body .m-val { font-family: var(--font-body); font-size: 0.85rem; font-weight: 300; color: var(--gray-200); margin-top: 3px; }
    .fs-modal-cta { margin-top: 2rem; }
    .fs-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 50px; height: 50px;
      border: 1px solid rgba(201,169,110,0.35); background: rgba(10,10,10,0.6); color: var(--gold);
      display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 2; transition: all 0.3s; }
    .fs-nav:hover { background: var(--gold); color: var(--black); }
    .fs-nav.prev { left: clamp(8px,2vw,24px); }
    .fs-nav.next { right: clamp(8px,2vw,24px); }
    .fs-close { position: absolute; top: clamp(12px,2vw,24px); right: clamp(12px,2vw,24px); width: 46px; height: 46px;
      border: 1px solid rgba(201,169,110,0.35); background: transparent; color: var(--gold);
      display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 3; }
    .fs-counter { position: absolute; bottom: clamp(12px,2vw,20px); left: 50%; transform: translateX(-50%); z-index: 2;
      font-family: var(--font-body); font-size: 0.62rem; letter-spacing: 0.2em; color: var(--gray-400); }

    /* ---- Prints carousel ---- */
    .prints-carousel { position: relative; margin-top: 3rem; }
    .prints-viewport { overflow: hidden; }
    .prints-track { display: flex; gap: 16px; align-items: center; transition: transform 0.55s var(--ease-out-expo); }
    .prints-track .p-slide { flex: 0 0 auto; height: 380px; overflow: hidden; background: #120e0a; }
    .prints-track .p-slide img { height: 380px; width: auto; object-fit: contain; display: block;
      filter: saturate(0.88) brightness(0.82); transition: filter 0.5s, transform 0.7s var(--ease-out-expo); }
    .prints-track .p-slide:hover img { filter: saturate(1) brightness(0.95); transform: scale(1.04); }
    .prints-arrows { display: flex; gap: 0.7rem; }
    .prints-arrows button { width: 46px; height: 46px; border: 1px solid rgba(201,169,110,0.3);
      background: transparent; color: var(--ivory); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.3s; }
    .prints-arrows button:hover { border-color: var(--gold); color: var(--gold); }
    .prints-arrows button:disabled { opacity: 0.3; cursor: default; }
  </style>

<main>
<header class="head wrap reveal">
    <span class="s-label">Frames</span>
    <h1>Choose your perfect <em style="color: var(--gold); font-style: italic;">frame style.</em></h1>
    <p>A blend of classic charm and modern flair — from crisp strips to full-colour portraits. Find the layout that fits your celebration.</p>
  </header>

  <section class="wrap">
    <div class="fs-frames" id="frames"></div>
    <p class="note">*Your frame style should be selected at least 24 hours before the event.</p>
  </section>

  <section class="wrap reveal" style="padding-top: 6rem;">
    <div style="display: flex; align-items: flex-end; justify-content: space-between; gap: 1.5rem; flex-wrap: wrap;">
      <div>
        <span class="s-label">Recent Prints</span>
        <h2 class="s-title" style="font-size: clamp(1.8rem,4vw,2.8rem); margin-top: 0.6rem;">Straight from <em style="color: var(--gold); font-style: italic;">the printer</em></h2>
      </div>
      <div class="prints-arrows">
        <button id="printsPrev" aria-label="Previous">
          <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"></path></svg>
        </button>
        <button id="printsNext" aria-label="Next">
          <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"></path></svg>
        </button>
      </div>
    </div>
    <div class="prints-carousel">
      <div class="prints-viewport"><div class="prints-track" id="prints"></div></div>
    </div>
  </section>

  <!-- Frame detail popup -->
  <div class="fs-modal" id="fsModal">
    <button class="fs-close" id="fsClose" aria-label="Close">
      <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M18 6L6 18M6 6l12 12"></path></svg>
    </button>
    <button class="fs-nav prev" id="fsPrev" aria-label="Previous frame">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"></path></svg>
    </button>
    <button class="fs-nav next" id="fsNext" aria-label="Next frame">
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"></path></svg>
    </button>
    <div class="fs-modal-inner" id="fsInner">
      <div class="fs-modal-img">
        <img id="fsImg" referrerpolicy="no-referrer" alt="">
        <span class="fs-counter" id="fsCounter"></span>
      </div>
      <div class="fs-modal-body">
        <div class="m-size" id="fsSize"></div>
        <div class="m-shots" id="fsShots"></div>
        <p class="m-blurb" id="fsBlurb"></p>
        <div class="m-row"><div class="m-lbl">Captured on</div><div class="m-val" id="fsBooth"></div></div>
        <div class="m-row"><div class="m-lbl">Best for</div><div class="m-val" id="fsBest"></div></div>
        <a href="https://wa.me/919146970951" class="mag-btn filled fs-modal-cta" onclick="event.preventDefault(); window.pbgOpenChat && window.pbgOpenChat(true)">Book This Frame</a>
      </div>
    </div>
  </div>

  <section style="padding: 8rem clamp(20px,5vw,48px); text-align: center; background: radial-gradient(ellipse at 50% 60%, rgba(201,169,110,0.08) 0%, var(--black) 70%); margin-top: 4rem;">
    <div class="reveal">
      <h2 class="s-title" style="font-size: clamp(2rem,5vw,3.5rem);">Found your <em style="color: var(--gold); font-style: italic;">frame?</em></h2>
      <div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; margin-top: 2.5rem;">
        <a href="https://wa.me/919146970951" class="mag-btn filled" onclick="event.preventDefault(); window.pbgOpenChat && window.pbgOpenChat(true)">Book Your Date</a>
        <a href="/#experiences" class="mag-btn">View Booths</a>
      </div>
    </div>
  </section>

  </main>

<script>

    const U = (p) => '/images/' + p.split('/').pop();
    const frames = [
      { size: '2×6″ Strip', shots: '3 photos', img: U('2025/07/WhatsApp-Image-2025-07-30-at-4.06.37-PM-341x1024.jpeg'), booth: 'Classic · Retro Booth', bestFor: 'Weddings, retro & vintage parties', blurb: 'The timeless photo-strip. Three frames down a slim 2×6″ print — guests keep one, the guestbook keeps one.' },
      { size: '4×6″ Portrait', shots: '4 photos', img: U('2025/09/IMG-20250923-WA0021jpg-683x1024.webp'), booth: 'Standard · Premium Booth', bestFor: 'Birthdays, anniversaries, family', blurb: 'A full 4×6″ portrait with a 2×2 grid of shots — the most popular all-rounder layout.' },
      { size: '4×6″ Portrait', shots: 'Single photo', img: U('2025/07/20250504_145258_100-683x1024.jpg'), booth: 'Premium · AI Booth', bestFor: 'Corporate galas & activations', blurb: 'One hero portrait edge-to-edge — clean space for branding, logos or a custom border.' },
      { size: '4×6″ Portrait', shots: '5 photos', img: U('2025/07/WhatsApp-Image-2025-07-19-at-1.37.48-PM-683x1024.jpeg'), booth: 'Standard · Glam Booth', bestFor: 'Hen parties, sweet sixteens', blurb: 'Five candid frames stacked on a portrait print — maximum fun-per-strip for lively crowds.' },
      { size: '4×6″ Landscape', shots: '3 photos', img: U('2025/07/WhatsApp-Image-2025-07-19-at-1.39.56-PM-1024x683.jpeg'), booth: 'Premium · Open-air Booth', bestFor: 'Group shots at weddings', blurb: 'A wide 4×6″ landscape with three frames — room for the whole group in every shot.' },
      { size: '4×6″ Landscape', shots: 'Single photo', img: U('2025/07/20241130_205112_737-1024x683.jpg'), booth: 'Open-air · AI Booth', bestFor: 'Cinematic corporate backdrops', blurb: 'A single wide landscape — great for scenic backdrops and branded step-and-repeat walls.' },
      { size: '4×6″ Landscape', shots: 'Triple photo', img: U('2025/09/IMG-20250924-WA0027jpg.webp'), booth: 'Premium · Glam Booth', bestFor: 'Receptions & milestones', blurb: 'Three landscape frames telling a little story — a favourite for receptions and big moments.' },
      { size: '4×4″ Square', shots: 'Single photo', img: U('2025/09/4-3.webp'), booth: '360 · Social Booth', bestFor: 'Instagrammable launches', blurb: 'A social-ready 4×4″ square — sized for the feed and instant sharing on the spot.' },
    ];
    const fEl = document.getElementById('frames');
    frames.forEach((f, i) => {
      const d = document.createElement('div'); d.className = 'frame-card reveal';
      d.style.transitionDelay = (i % 3 * 0.06) + 's';
      d.innerHTML = `
        <img src="${f.img}" referrerpolicy="no-referrer" alt="${f.size} — ${f.shots}" loading="lazy">
        <span class="fc-scrim"></span>
        <span class="fc-plus"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg></span>
        <div class="fc-info"><div class="fc-size">${f.size}</div><div class="fc-shots">${f.shots}</div></div>`;
      d.addEventListener('click', () => openModal(i));
      fEl.appendChild(d);
    });

    // ---- Frame detail popup with looping navigation ----
    const modal = document.getElementById('fsModal');
    let current = 0;
    const els = {
      img: document.getElementById('fsImg'), size: document.getElementById('fsSize'),
      shots: document.getElementById('fsShots'), blurb: document.getElementById('fsBlurb'),
      booth: document.getElementById('fsBooth'), best: document.getElementById('fsBest'),
      counter: document.getElementById('fsCounter'),
    };
    function renderModal() {
      const f = frames[current];
      els.img.src = f.img; els.img.alt = f.size + ' — ' + f.shots;
      els.size.textContent = f.size; els.shots.textContent = f.shots;
      els.blurb.textContent = f.blurb; els.booth.textContent = f.booth; els.best.textContent = f.bestFor;
      els.counter.textContent = (current + 1) + ' / ' + frames.length;
    }
    function openModal(i) { current = i; renderModal(); modal.classList.add('open'); document.body.style.overflow = 'hidden'; }
    function closeModal() { modal.classList.remove('open'); document.body.style.overflow = ''; }
    function step(dir) { current = (current + dir + frames.length) % frames.length; renderModal(); }
    document.getElementById('fsClose').addEventListener('click', closeModal);
    document.getElementById('fsPrev').addEventListener('click', () => step(-1));
    document.getElementById('fsNext').addEventListener('click', () => step(1));
    modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); });
    document.addEventListener('keydown', (e) => {
      if (!modal.classList.contains('open')) return;
      if (e.key === 'Escape') closeModal();
      else if (e.key === 'ArrowLeft') step(-1);
      else if (e.key === 'ArrowRight') step(1);
    });

    // ---- Recent Prints carousel (seamless infinite loop) ----
    const prints = ['2024/02/Frame-styles-photoboothgoa-4.webp','2024/02/Frame-styles-photoboothgoa-5-768x1152.webp','2024/02/Frame-styles-photoboothgoa-1.webp','2024/02/Frame-styles-photoboothgoa-6-768x516.webp','2024/02/Frame-styles-photoboothgoa-3-768x768.webp','2024/02/Frame-styles-photoboothgoa-2-768x1152.webp'];
    const pEl = document.getElementById('prints');
    const makeSlide = (p) => {
      const slide = document.createElement('div'); slide.className = 'p-slide';
      const img = document.createElement('img');
      img.src = U(p); img.referrerPolicy = 'no-referrer'; img.loading = 'lazy'; img.alt = '';
      slide.appendChild(img); return slide;
    };
    // Original set + a duplicate set appended, so content always fills the viewport
    // through the end of the first set — no blank space, and we reset seamlessly.
    prints.forEach((p) => pEl.appendChild(makeSlide(p)));
    prints.forEach((p) => pEl.appendChild(makeSlide(p)));

    let pIndex = 0;
    let animating = false;
    const prevBtn = document.getElementById('printsPrev');
    const nextBtn = document.getElementById('printsNext');
    const N = prints.length;
    const EASE = 'cubic-bezier(0.16,1,0.3,1)';
    const DUR = 550;

    function offsetFor(i) {
      const slide = pEl.children[i];
      return slide ? slide.offsetLeft : 0;
    }
    function place(withTransition) {
      pEl.style.transition = withTransition ? ('transform ' + DUR + 'ms ' + EASE) : 'none';
      pEl.style.transform = 'translateX(' + (-offsetFor(pIndex)) + 'px)';
    }
    function goNext() {
      if (animating) return; animating = true;
      pIndex++;
      place(true);
      setTimeout(() => {
        if (pIndex >= N) { pIndex -= N; place(false); }
        animating = false;
      }, DUR + 30);
    }
    function goPrev() {
      if (animating) return; animating = true;
      if (pIndex === 0) { pIndex = N; place(false); void pEl.offsetWidth; }
      pIndex--;
      place(true);
      setTimeout(() => { animating = false; }, DUR + 30);
    }
    nextBtn.addEventListener('click', goNext);
    prevBtn.addEventListener('click', goPrev);
    window.addEventListener('resize', () => place(false));
    pEl.querySelectorAll('img').forEach((img) => img.addEventListener('load', () => { if (!animating) place(false); }));
    place(false);

    const obs = new IntersectionObserver((es) => es.forEach(e => { if (e.isIntersecting) { e.target.classList.add('active'); obs.unobserve(e.target); } }), { threshold: 0.08 });
    document.querySelectorAll('.reveal').forEach(el => obs.observe(el));
  </script>

<?php include $_SERVER['DOCUMENT_ROOT'].'/includes/footer.php'; ?>
