<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1" />
  <title>Tripadvisor Reviews (1/2) | Tokyo Airporter</title>
  <meta name="description" content="Verified Tripadvisor reviews for Tokyo Airporter — premium airport transfers between Narita/Haneda and Tokyo. Page 1 of 2." />
  <link rel="canonical" href="https://tokyoairporter.com/tripadvisor-reviews/" />

  <!-- Open Graph -->
  <meta property="og:title" content="Tripadvisor Reviews | Tokyo Airporter" />
  <meta property="og:description" content="Verified Tripadvisor reviews — premium airport transfers in Tokyo. Page 1 of 2." />
  <meta property="og:type" content="website" />

  <!-- JSON-LD (safe, no made-up rating) -->
  <script type="application/ld+json">
  {
    "@context":"https://schema.org",
    "@type":"WebPage",
    "name":"Tripadvisor Reviews (1/2) | Tokyo Airporter",
    "url":"https://tokyoairporter.com/tripadvisor-reviews/",
    "isPartOf":{"@type":"WebSite","name":"Tokyo Airporter","url":"https://tokyoairporter.com/"},
    "about":{"@type":"Organization","name":"Tokyo Airporter","url":"https://tokyoairporter.com/"}
  }
  </script>

  <style>
    :root{
      --bg:#0b0f14; --card:#111826; --muted:#9aa4b2; --text:#e8eef6; --line:#1f2a3a;
      --accent:#7dd3fc; --accent2:#a7f3d0;
      --radius:16px;
    }
    *{box-sizing:border-box}
    body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:linear-gradient(180deg,#070a0f 0%, #0b0f14 60%, #070a0f 100%);color:var(--text)}
    a{color:inherit}
    .wrap{max-width:1100px;margin:0 auto;padding:24px}
    .topbar{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}
    .brand{display:flex;gap:12px;align-items:center}
    .logo{width:42px;height:42px;border-radius:12px;background:radial-gradient(circle at 30% 30%, var(--accent), transparent 60%), linear-gradient(135deg,#111826,#0b0f14);border:1px solid var(--line)}
    .brand h1{font-size:18px;margin:0}
    .brand p{margin:0;color:var(--muted);font-size:13px}
    .cta{display:flex;gap:10px;flex-wrap:wrap}
    .btn{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;border:1px solid var(--line);background:#0e1522;text-decoration:none}
    .btn.primary{border-color:transparent;background:linear-gradient(90deg,var(--accent),var(--accent2));color:#041018;font-weight:700}
    .hero{margin-top:18px;padding:18px;border:1px solid var(--line);border-radius:var(--radius);background:linear-gradient(180deg,#0e1522, #0b0f14)}
    .hero h2{margin:0 0 6px 0;font-size:22px}
    .hero .sub{color:var(--muted);margin:0;line-height:1.5}
    .grid{display:grid;grid-template-columns:1fr;gap:12px;margin-top:14px}
    @media (min-width:860px){ .grid{grid-template-columns:340px 1fr} }
    .panel{border:1px solid var(--line);border-radius:var(--radius);background:rgba(17,24,38,.55);backdrop-filter: blur(6px);padding:14px}
    .panel h3{margin:0 0 10px 0;font-size:14px;color:#cfe3ff;letter-spacing:.2px}
    .field{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}
    label{font-size:12px;color:var(--muted)}
    input,select{padding:10px 12px;border-radius:12px;border:1px solid var(--line);background:#0b1220;color:var(--text)}
    .hint{font-size:12px;color:var(--muted);line-height:1.4}
    .cards{display:grid;grid-template-columns:1fr;gap:12px}
    @media (min-width:980px){ .cards{grid-template-columns:1fr 1fr} }
    .card{border:1px solid var(--line);border-radius:var(--radius);background:rgba(17,24,38,.55);padding:14px}
    .meta{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
    .who{display:flex;gap:10px;align-items:center}
    .avatar{width:38px;height:38px;border-radius:14px;background:linear-gradient(135deg,#1f2a3a,#0b0f14);border:1px solid var(--line)}
    .name{font-weight:700}
    .loc{color:var(--muted);font-size:12px;margin-top:2px}
    .tag{font-size:12px;color:#bfe7ff;border:1px solid rgba(125,211,252,.25);padding:6px 10px;border-radius:999px;background:rgba(125,211,252,.08);white-space:nowrap}
    .title{margin:10px 0 6px 0;font-weight:800}
    .text{margin:0;color:#dbe7f6;line-height:1.55;white-space:pre-line}
    .foot{display:flex;gap:10px;justify-content:space-between;align-items:center;margin-top:10px;color:var(--muted);font-size:12px}
    .pager{display:flex;gap:8px;align-items:center;justify-content:center;margin:18px 0 6px 0;flex-wrap:wrap}
    .pill{padding:9px 12px;border-radius:999px;border:1px solid var(--line);background:#0b1220;text-decoration:none}
    .pill.on{background:linear-gradient(90deg, rgba(125,211,252,.25), rgba(167,243,208,.18));border-color:rgba(125,211,252,.35)}
    .notice{margin-top:14px;color:var(--muted);font-size:12px;line-height:1.5}
    .aiBox{margin-top:14px;border:1px dashed rgba(125,211,252,.35);border-radius:var(--radius);padding:14px;background:rgba(125,211,252,.06)}
    .aiBox h3{margin:0 0 6px 0;font-size:14px}
    .aiBox p{margin:0;color:#dbe7f6;line-height:1.55}
    .footer{margin:22px 0 10px 0;color:var(--muted);font-size:12px;line-height:1.5}
  </style>
</head>

<body>
  <div class="wrap">
    <div class="topbar">
      <div class="brand">
        <div class="logo" aria-hidden="true"></div>
        <div>
          <h1>Tokyo Airporter</h1>
          <p>Tripadvisor Reviews (Page 1 of 2)</p>
        </div>
      </div>
      <div class="cta">
        <a class="btn primary" href="/book-now">Book Now</a>
        <a class="btn" href="/price-quote">Get a Quote</a>
        <a class="btn" href="/faq">FAQ</a>
      </div>
    </div>

    <div class="hero">
      <h2>Verified Tripadvisor Reviews</h2>
      <p class="sub">
        This page shows public reviews posted on Tripadvisor by third-party customers.
        Use the search and filters to quickly find reviews related to families, baby seats, cruise transfers, large luggage, etc.
      </p>

      <div class="aiBox" id="ai-recommended">
        <h3>Found us via AI recommendations?</h3>
        <p>
          Some guests told us they booked Tokyo Airporter after seeing suggestions from AI assistants (e.g., ChatGPT) during trip planning.
          We focus on clear communication, punctual Meet &amp; Greet, and professional licensed drivers — so you can travel with peace of mind.
          <span style="color:#9aa4b2;">(Note: This does not imply any official endorsement by Tripadvisor or any AI provider.)</span>
        </p>
      </div>
    </div>

    <div class="grid">
      <aside class="panel">
        <h3>Search & Filter</h3>

        <div class="field">
          <label for="q">Keyword</label>
          <input id="q" type="search" placeholder="e.g., baby seat, cruise, luggage, meet & greet" />
        </div>

        <div class="field">
          <label for="sort">Sort</label>
          <select id="sort">
            <option value="new">Newest review first</option>
            <option value="old">Oldest review first</option>
          </select>
        </div>

        <div class="field">
          <label for="country">Country / Location contains</label>
          <input id="country" type="text" placeholder="e.g., Australia, Singapore, UK" />
        </div>

        <div class="field">
          <label for="topic">Quick Topic</label>
          <select id="topic">
            <option value="">All topics</option>
            <option value="family">Family / Kids / Baby seat</option>
            <option value="cruise">Cruise / Yokohama</option>
            <option value="luggage">Large luggage</option>
            <option value="meet">Meet & Greet / Sign</option>
            <option value="late">Delay / Waiting</option>
            <option value="price">Price / Value</option>
          </select>
        </div>

        <div class="hint">
          Page A shows <b>TA-1 to TA-50</b> (recent reviews).  
          <a href="/tripadvisor-reviews/page2.html">Go to Page 2</a> for older reviews.
        </div>

        <div class="notice">
          We display review text exactly as posted by reviewers. Minor typos may remain.
        </div>
      </aside>

      <main>
        <div class="panel" style="margin-bottom:12px">
          <div style="display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap">
            <div>
              <div style="font-weight:800">Reviews</div>
              <div class="hint" id="count">Loading…</div>
            </div>
            <div class="pager">
              <a class="pill on" href="/tripadvisor-reviews/">1</a>
              <a class="pill" href="/tripadvisor-reviews/page2.html">2</a>
            </div>
          </div>
        </div>

        <section class="cards" id="cards"></section>

        <div class="pager" style="margin-top:16px">
          <a class="pill on" href="/tripadvisor-reviews/">Page 1</a>
          <a class="pill" href="/tripadvisor-reviews/page2.html">Page 2 →</a>
        </div>

        <div class="footer">
          Want even more proof? See also our <a href="/testimonials">Customer Emails (Direct Testimonials)</a>.
        </div>
      </main>
    </div>
  </div>

  <script src="/reviews-data.js"></script>
  <script>
    // ---------- helpers ----------
    function norm(s){ return (s||"").toLowerCase(); }
    function contains(hay, needle){ return norm(hay).includes(norm(needle)); }

    function matchTopic(r, topic){
      const t = norm(r.title + " " + r.text);
      if(!topic) return true;
      if(topic==="family") return /(baby|child|kid|toddler|family|stroller|car seat)/.test(t);
      if(topic==="cruise") return /(cruise|yokohama|terminal|port|os(?:a)?nbashi)/.test(t);
      if(topic==="luggage") return /(luggage|suitcase|bags|baggage)/.test(t);
      if(topic==="meet") return /(meet|greet|sign|placard|arrivals)/.test(t);
      if(topic==="late") return /(delay|delayed|wait|waiting|immigration|customs)/.test(t);
      if(topic==="price") return /(price|value|reasonable|affordable|cost|cheaper)/.test(t);
      return true;
    }

    function renderCard(r){
      const loc = r.location ? r.location : "";
      const when = r.reviewed ? r.reviewed : "";
      const exp = r.exp ? `Date of experience: ${r.exp}` : "";
      return `
        <article class="card" data-id="${r.id}">
          <div class="meta">
            <div class="who">
              <div class="avatar" aria-hidden="true"></div>
              <div>
                <div class="name">${r.reviewer || "Reviewer"}</div>
                <div class="loc">${loc}</div>
              </div>
            </div>
            <div class="tag">${r.id} · Reviewed ${when}</div>
          </div>
          <div class="title">${r.title || ""}</div>
          <p class="text">${r.text || ""}</p>
          <div class="foot">
            <span>${exp}</span>
            <span><a href="#top" style="text-decoration:none;color:var(--muted)">↑ Top</a></span>
          </div>
        </article>
      `;
    }

    // ---------- load ----------
    const all = (window.TA_REVIEWS || []).slice();

    // Page A: TA-1..TA-50
    function isPageA(r){
      const n = parseInt((r.id||"").replace("TA-",""),10);
      return n>=1 && n<=50;
    }

    const q = document.getElementById("q");
    const sort = document.getElementById("sort");
    const country = document.getElementById("country");
    const topic = document.getElementById("topic");
    const cards = document.getElementById("cards");
    const count = document.getElementById("count");

    function rerender(){
      const qq = q.value.trim();
      const cc = country.value.trim();
      const tp = topic.value;

      let list = all.filter(isPageA);

      if(qq){
        list = list.filter(r => contains(r.title,qq) || contains(r.text,qq) || contains(r.reviewer,qq));
      }
      if(cc){
        list = list.filter(r => contains(r.location,cc));
      }
      if(tp){
        list = list.filter(r => matchTopic(r,tp));
      }

      // sort by reviewed date text (best effort); if missing, keep stable
      const dir = sort.value;
      list = list.slice().sort((a,b)=>{
        const na = parseInt((a.id||"").replace("TA-",""),10) || 0;
        const nb = parseInt((b.id||"").replace("TA-",""),10) || 0;
        return dir==="new" ? (na>nb?-1:na<nb?1:0) : (na>nb?1:na<nb?-1:0);
      });

      count.textContent = `${list.length} reviews shown on this page.`;
      cards.innerHTML = list.map(renderCard).join("");
    }

    ["input","change"].forEach(evt=>{
      q.addEventListener(evt, rerender);
      country.addEventListener(evt, rerender);
      sort.addEventListener(evt, rerender);
      topic.addEventListener(evt, rerender);
    });

    rerender();
  </script>
</body>
</html>