// Services page

function ServicesIntro() {
  const bp = useBP();
  return (
    <section style={{ padding: secPad(bp, 80, 56), background: TNF.cream }}>
      <div style={{ maxWidth: 1100, margin: '0 auto', textAlign: 'center' }}>
        <SectionEyebrow>Everything we offer</SectionEyebrow>
        <H2 style={{ fontWeight: 700 }}>One trusted partner.<br/>Every travel need.</H2>
        <p style={{ fontSize: 16, color: TNF.inkSoft, marginTop: 24, lineHeight: 1.7, maxWidth: 720, margin: '24px auto 0' }}>
          Five services, one phone number, one team. Whether you need a single visa stamp or a multi-country grand tour, you’ll work with the same consultant the whole way through.
        </p>
      </div>
    </section>
  );
}

function ServicesList() {
  const bp = useBP();
  const mob = bp === 'mobile';
  return (
    <section style={{ padding: bpv(bp, '20px 20px 52px', '28px 36px 72px', '32px 56px 80px'), background: TNF.cream }}>
      <div style={{ maxWidth: 1200, margin: '0 auto', display: 'flex', flexDirection: 'column', gap: bpv(bp, 20, 28, 32) }}>
        {SERVICES.map((s, i) => {
          const Ic = Icon[s.icon];
          const flip = i % 2 === 1;
          const accent = [TNF.green, TNF.turq, TNF.greenDk, TNF.turqDk, TNF.blueDk, TNF.green, TNF.turq][i];
          return (
            <div key={s.id} style={{
              background: '#fff', borderRadius: 22, overflow: 'hidden',
              display: 'grid', gridTemplateColumns: mob ? '1fr' : '1fr 1.2fr', gap: 0,
              border: `1px solid ${TNF.lineSoft}`, boxShadow: '0 1px 2px rgba(0,0,0,0.03)',
              direction: (flip && !mob) ? 'rtl' : 'ltr',
            }}>
              <div style={{ direction: 'ltr', position: 'relative', minHeight: mob ? 200 : 320 }}>
                <Img photo={serviceImg(s.id)} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%' }}/>
                <div style={{ position: 'absolute', top: 20, left: 20, background: accent, color: i === 1 || i === 3 ? TNF.blueXdk : '#fff', padding: '8px 14px', borderRadius: 999, fontSize: 12, fontWeight: 600, letterSpacing: '0.06em', textTransform: 'uppercase' }}>
                  {s.tag}
                </div>
              </div>
              <div style={{ direction: 'ltr', padding: mob ? '28px 22px' : '40px 48px', display: 'flex', flexDirection: 'column' }}>
                <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 20 }}>
                  <div style={{ width: 44, height: 44, borderRadius: 12, background: `${accent}1f`, color: accent, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                    <Ic width={22} height={22}/>
                  </div>
                  <div style={{ fontFamily: 'monospace', fontSize: 13, color: TNF.inkSoft, letterSpacing: '0.1em' }}>0{i + 1}</div>
                </div>
                <h3 style={{ fontFamily: 'var(--tnf-display)', fontSize: mob ? 28 : 36, color: TNF.blueDk, margin: 0, fontWeight: 800, letterSpacing: '-0.015em', lineHeight: 1.1 }}>{s.label}</h3>
                <p style={{ fontSize: mob ? 15 : 16, color: TNF.inkSoft, marginTop: 16, lineHeight: 1.65, flex: 1 }}>{s.long}</p>
                <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginTop: 20, flexWrap: 'wrap' }}>
                  {s.id !== 'tickets' && s.id !== 'visa' && (
                    <button onClick={() => window.__openQuote && window.__openQuote()} style={{ ...btn(TNF.blueDk, { small: true }), minHeight: 44, width: mob ? '100%' : 'auto', justifyContent: 'center' }}>
                      Request a quote <Icon.arrow width={14} height={14}/>
                    </button>
                  )}
                  <a href="contact.html" style={{ ...btnOutline({ small: true }), minHeight: 44, width: mob ? '100%' : 'auto', justifyContent: 'center' }}>
                    Talk to us
                  </a>
                </div>
              </div>
            </div>
          );
        })}
      </div>
    </section>
  );
}
function serviceImg(id) {
  return ({
    inbound:   'svcInbound',
    outbound:  'svcOutbound',
    visa:      'visaService',
    tickets:   'airTicketing',
    cab:       'svcCab',
    insurance: 'insuranceService',
    corporate: 'team',
  })[id];
}

const PROCESS_STEPS = [
  {
    n: '01', t: 'Consultation', timing: 'Day 1 · Free',
    blurb: 'A real conversation about how you travel — pace, taste, must-sees, dealbreakers. No questionnaires, no scripts.',
    bullets: [
      '30-minute call or WhatsApp chat at a time that suits you',
      'We listen to what has worked (and what hasn’t) on past trips',
      'You meet the consultant who will own your booking end to end',
    ],
    accent: 'green',
  },
  {
    n: '02', t: 'Custom plan', timing: 'Day 2–5',
    blurb: 'Your consultant drafts a full itinerary — flights, stays, transfers, day-by-day plan — built to your taste, your calendar and your budget.',
    bullets: [
      'A first draft in 3–5 working days, not weeks',
      'Two stay options per city — never just the one we get a kickback on',
      'Pace adjusted to your group: slower with kids, denser for solo trips',
    ],
    accent: 'turq',
  },
  {
    n: '03', t: 'Clear quote', timing: 'Day 5–6',
    blurb: 'An itemised quote with every line shown separately — flights, stays, transfers, visas, insurance, our planning fee. No padding, no hidden charges.',
    bullets: [
      'Line-by-line pricing in INR with our markup made explicit',
      'Trade stay categories for trip length and see the impact instantly',
      'A re-quote if your dates shift — usually within the day',
    ],
    accent: 'green',
  },
  {
    n: '04', t: 'We book it all', timing: '2–3 weeks before travel',
    blurb: 'Once you confirm, we handle every reservation, voucher and document — flights, hotels, transfers, visas, insurance — while you keep working.',
    bullets: [
      'Tickets issued same day, with seat preferences applied',
      'All vouchers, e-tickets and visa filings managed for you',
      'Travel insurance explained, not just sold — picked to fit your trip',
    ],
    accent: 'turq',
  },
  {
    n: '05', t: 'On-trip support', timing: 'While you travel',
    blurb: 'One number, any hour. From a re-routed flight to a missed transfer to a quiet dinner recommendation — your consultant is on call throughout.',
    bullets: [
      '24/7 WhatsApp and phone access during your trip dates',
      'The same person you’ve been working with — no call-centre handoffs',
      'Vetted on-ground partners in every city for real-time help',
    ],
    accent: 'green',
  },
  {
    n: '06', t: 'Follow-up', timing: 'Within a week of return',
    blurb: 'A debrief on your return — over coffee in Piravom, or a call if you’re elsewhere. Honest feedback we use to shape the next trip we plan together.',
    bullets: [
      'Your candid review of every hotel, transfer and partner',
      'Notes that go straight into the next trip we design for you',
      'A small return-home gift from the team — our favourite part',
    ],
    accent: 'turq',
  },
];

function ServicesProcess() {
  const bp = useBP();
  const mob = bp === 'mobile';
  const [pinned, setPinned]   = React.useState(0);     // click-pinned step
  const [hovered, setHovered] = React.useState(null);  // mouse-hovered step

  // Display: hover takes priority, otherwise pinned
  const active = hovered !== null ? hovered : pinned;
  const step   = PROCESS_STEPS[active];
  const accent   = step.accent === 'green' ? TNF.green   : TNF.turq;
  const accentDk = step.accent === 'green' ? TNF.greenDk : TNF.turqDk;
  const accentFg = step.accent === 'green' ? TNF.blueXdk : '#fff';

  return (
    <section style={{ padding: bpv(bp, '52px 20px 56px', '64px 36px 72px', '80px 56px 88px'), background: '#fff' }}>
      <div style={{ maxWidth: 1200, margin: '0 auto' }}>
        <div style={{ textAlign: 'center', marginBottom: mob ? 28 : 44 }}>
          <SectionEyebrow>How a booking actually works</SectionEyebrow>
          <H2 style={{ fontWeight: 700 }}>Six steps from<br/>idea to itinerary.</H2>
          <p style={{ fontSize: 14, color: TNF.inkSoft, marginTop: 18, letterSpacing: '0.04em' }}>
            {mob ? 'Tap any step to explore.' : 'Hover any step to explore — click to pin it.'}
          </p>
        </div>

        {/* Dock row */}
        <div
          onMouseLeave={() => setHovered(null)}
          style={{
            position: 'relative', padding: mob ? '8px 0 16px' : '32px 0 24px', marginBottom: 8,
            overflowX: mob ? 'auto' : 'visible', WebkitOverflowScrolling: 'touch',
          }}
        >
          {/* Background connecting line (desktop/tablet only) */}
          {!mob && <div style={{
            position: 'absolute', top: 64, left: '6%', right: '6%', height: 2,
            background: `repeating-linear-gradient(to right, ${TNF.line} 0 6px, transparent 6px 12px)`,
            zIndex: 0,
          }}/>}
          {/* Highlighted progress line up to active step */}
          {!mob && <div style={{
            position: 'absolute', top: 64, left: '6%',
            width: `${(active / (PROCESS_STEPS.length - 1)) * 88}%`,
            height: 2, background: accent, opacity: 0.6,
            transition: 'width .45s cubic-bezier(.2,.7,.2,1), background .25s',
            zIndex: 0,
          }}/>}

          <div style={{ display: 'flex', justifyContent: mob ? 'flex-start' : 'space-between', gap: mob ? 8 : 0, position: 'relative', zIndex: 1, minWidth: mob ? 'max-content' : 0, padding: mob ? '0 4px' : 0 }}>
            {PROCESS_STEPS.map((s, i) => {
              const isHovered  = hovered === i;
              const isAdjacent = hovered !== null && Math.abs(hovered - i) === 1;
              const isActive   = active === i;
              const sAccent    = s.accent === 'green' ? TNF.green   : TNF.turq;
              const sAccentFg  = s.accent === 'green' ? TNF.blueXdk : '#fff';
              const scale      = (isHovered && !mob) ? 1.5 : (isAdjacent && !mob) ? 1.18 : 1;

              return (
                <button
                  key={s.n}
                  onMouseEnter={() => !mob && setHovered(i)}
                  onFocus={() => !mob && setHovered(i)}
                  onClick={() => { setPinned(i); setHovered(null); }}
                  aria-label={`Step ${s.n}: ${s.t}`}
                  style={{
                    background: 'transparent', border: 'none', padding: 0,
                    display: 'flex', flexDirection: 'column', alignItems: 'center',
                    gap: mob ? 10 : 16, cursor: 'pointer', position: 'relative',
                    flex: '0 0 auto', minWidth: mob ? 64 : 110,
                  }}
                >
                  <div style={{
                    width: mob ? 56 : 64, height: mob ? 56 : 64, borderRadius: '50%',
                    background: isActive ? sAccent : '#fff',
                    color:      isActive ? sAccentFg : TNF.blueDk,
                    border: `2px solid ${isActive ? sAccent : TNF.line}`,
                    display: 'flex', alignItems: 'center', justifyContent: 'center',
                    fontFamily: 'monospace', fontSize: 17, fontWeight: 700,
                    transform: `scale(${scale})`,
                    transition: 'transform .35s cubic-bezier(.2,.9,.3,1.1), background .25s, color .25s, box-shadow .35s, border-color .25s',
                    boxShadow: isActive
                      ? `0 0 0 8px ${sAccent}1a, 0 16px 32px ${sAccent}40`
                      : (isHovered ? `0 12px 28px rgba(11,38,48,0.18)` : '0 1px 2px rgba(0,0,0,0.04)'),
                  }}>
                    {s.n}
                  </div>
                </button>
              );
            })}
          </div>
        </div>

        {/* Detail dock */}
        <div style={{
          background: TNF.cream, borderRadius: 24, padding: mob ? '28px 22px' : '44px 52px',
          border: `1px solid ${TNF.lineSoft}`,
          boxShadow: '0 1px 2px rgba(0,0,0,0.03)',
          position: 'relative', overflow: 'hidden', minHeight: mob ? 0 : 260,
          transition: 'box-shadow .35s',
        }}>
          {/* Accent flush bar */}
          <div style={{
            position: 'absolute', top: 0, left: 0, right: 0, height: 4,
            background: accent, transition: 'background .25s',
          }}/>

          <div
            key={active}
            className="tnf-process-fade"
            style={{ display: 'grid', gridTemplateColumns: mob ? '1fr' : '0.85fr 1.4fr', gap: mob ? 24 : 64, alignItems: 'start' }}
          >
            <div>
              <div style={{
                fontFamily: 'monospace', fontSize: 12, color: accentDk,
                letterSpacing: '0.22em', textTransform: 'uppercase', fontWeight: 700,
              }}>
                Step {step.n} of 06
              </div>
              <h3 style={{
                fontFamily: 'var(--tnf-display)', fontSize: mob ? 34 : 48, color: TNF.blueDk,
                margin: '12px 0 0', fontWeight: 500, letterSpacing: '-0.02em', lineHeight: 1.05,
              }}>{step.t}</h3>
              <div style={{
                display: 'inline-flex', alignItems: 'center', gap: 8,
                marginTop: 20, padding: '8px 14px', borderRadius: 999,
                background: accent, color: accentFg, fontSize: 12,
                fontWeight: 600, letterSpacing: '0.04em',
              }}>
                <Icon.clock width={14} height={14}/>
                {step.timing}
              </div>
            </div>
            <div>
              <p style={{
                fontSize: mob ? 16 : 17, color: TNF.ink, lineHeight: 1.65, margin: 0,
                fontWeight: 400,
              }}>{step.blurb}</p>
              <div style={{
                marginTop: 24, display: 'flex', flexDirection: 'column', gap: 12,
              }}>
                {step.bullets.map((b, k) => (
                  <div key={k} style={{ display: 'flex', gap: 14, alignItems: 'flex-start' }}>
                    <div style={{
                      flex: '0 0 auto', width: 24, height: 24, borderRadius: 8,
                      background: `${accent}1f`, color: accentDk,
                      display: 'flex', alignItems: 'center', justifyContent: 'center',
                      marginTop: 1,
                    }}>
                      <Icon.check width={14} height={14}/>
                    </div>
                    <div style={{ fontSize: 14.5, color: TNF.inkSoft, lineHeight: 1.55 }}>{b}</div>
                  </div>
                ))}
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function ServicesForPartners() {
  const bp = useBP();
  const mob = bp === 'mobile';
  const [partnerOpen, setPartnerOpen] = React.useState(false);
  return (
    <section style={{ padding: secPad(bp, 80, 56), background: TNF.blueXdk, color: '#fff', position: 'relative', overflow: 'hidden' }}>
      <div style={{
        position: 'absolute', bottom: -100, left: -100, width: 400, height: 400,
        borderRadius: '50%', background: `radial-gradient(circle, ${TNF.green}30 0%, transparent 70%)`,
      }}/>
      <div style={{ maxWidth: 1200, margin: '0 auto', display: 'grid', gridTemplateColumns: bpv(bp, '1fr', '1fr 1fr', '1fr 1fr'), gap: bpv(bp, 36, 48, 80), alignItems: 'center', position: 'relative' }}>
        <div>
          <SectionEyebrow color={TNF.green}>For hospitality partners</SectionEyebrow>
          <H2 style={{ color: '#fff' }}>B2B partnerships<br/>that grow with you.</H2>
          <p style={{ fontSize: 16, opacity: 0.8, marginTop: 20, lineHeight: 1.65, maxWidth: 480 }}>
            Hotels, resorts, and DMCs across the GCC and India — we’re actively building a network of long-term hospitality partners. If you’d like to explore working together, we’d love to talk.
          </p>
          <button onClick={() => setPartnerOpen(true)} style={{ ...btn(TNF.green, { fg: TNF.blueXdk }), marginTop: 32, minHeight: 48, width: mob ? '100%' : 'auto', justifyContent: 'center' }}>
            Become a partner <Icon.arrow width={14} height={14}/>
          </button>
        </div>
        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 14 }}>
          {[
            { i: 'globe',     t: 'Inbound referrals', d: 'High-intent travellers from across India.' },
            { i: 'briefcase', t: 'Corporate flow',    d: 'Steady business-travel demand.' },
            { i: 'shield',    t: 'Reliable settlements', d: 'Clean, on-time commercial relationships.' },
            { i: 'user',      t: 'Single point of contact', d: 'Direct line to our ops team.' },
          ].map((b, i) => {
            const Ic = Icon[b.i];
            return (
              <div key={i} style={{ background: 'rgba(255,255,255,0.06)', border: '1px solid rgba(255,255,255,0.1)', borderRadius: 14, padding: 22 }}>
                <div style={{ width: 36, height: 36, borderRadius: 10, background: TNF.green, color: TNF.blueXdk, display: 'flex', alignItems: 'center', justifyContent: 'center', marginBottom: 14 }}>
                  <Ic width={18} height={18}/>
                </div>
                <h3 style={{ fontSize: 15, fontWeight: 600, margin: 0 }}>{b.t}</h3>
                <p style={{ fontSize: 13, opacity: 0.75, marginTop: 6, lineHeight: 1.5, marginBottom: 0 }}>{b.d}</p>
              </div>
            );
          })}
        </div>
      </div>
      <PartnerModal open={partnerOpen} onClose={() => setPartnerOpen(false)}/>
    </section>
  );
}

// === Partner registration modal (For hospitality partners) ===
function PartnerModal({ open, onClose }) {
  const bp = useBP();
  const mob = bp === 'mobile';
  const TYPES = ['Hotel', 'Resort', 'DMC', 'Other'];
  const EMPTY = { company: '', type: '', name: '', email: '', countryCode: 'IN', phone: '', message: '' };
  const [data, setData] = React.useState(EMPTY);
  const [errors, setErrors] = React.useState({});
  const [notice, setNotice] = React.useState('');
  const [sending, setSending] = React.useState(false);
  const [done, setDone] = React.useState(false);
  const guard = useFormGuard('partner', { maxPerWindow: 4, windowMs: 60000, minFillMs: 1200 });
  const captchaRef = React.useRef(null);
  const captcha = useHCaptcha(captchaRef, open && !done);
  React.useEffect(() => {
    if (open) { guard.reset(); setNotice(''); setErrors({}); setDone(false); setData(EMPTY); }
  }, [open]);
  if (!open) return null;
  const QERR = '#D14343';
  const update = (k, v) => {
    let cv = v;
    if (k === 'company' || k === 'name') cv = InputGuard.line(v, 80);
    else if (k === 'email') cv = InputGuard.email(v);
    else if (k === 'phone') cv = InputGuard.phone(v);
    else if (k === 'countryCode') cv = InputGuard.oneOf(v, COUNTRY_CODES.map(c => c.c), 'IN');
    else if (k === 'type') cv = InputGuard.oneOf(v, TYPES, '');
    else if (k === 'message') cv = InputGuard.text(v, 1000);
    setData(d => ({ ...d, [k]: cv }));
    setErrors(e => { if (!e[k]) return e; const n = { ...e }; delete n[k]; return n; });
  };
  const submit = async () => {
    const er = {};
    if (!isFilledName(data.company)) er.company = true;
    if (!isFilledName(data.name)) er.name = true;
    if (!isEmail(data.email)) er.email = true;
    if (!isPhone(data.phone)) er.phone = true;
    if (Object.keys(er).length) { setErrors(er); return; }
    const g = guard.evaluate();
    if (!g.ok) {
      if (g.bot) { setDone(true); return; }
      if (g.reason === 'too-fast') { setNotice('That was quick — take a moment, then send.'); return; }
      if (g.reason === 'rate') { setNotice(`Too many requests. Please wait ${Math.ceil((g.retryInMs || 0) / 1000)}s.`); return; }
      return;
    }
    // Require hCaptcha to be completed before submitting.
    const captchaToken = captcha.getToken();
    if (!captchaToken) { setNotice('Please complete the captcha and submit again.'); return; }
    setNotice(''); setSending(true);
    const dial = (COUNTRY_CODES.find(c => c.c === data.countryCode) || {}).code || '';
    try {
      await window.submitWeb3Form(window.WEB3FORMS.partner, {
        subject: `Partner registration — ${data.company || 'New partner'}`,
        from_name: 'Trips N Flys Website',
        form_name: 'Services — Partner Registration',
        company: data.company,
        partner_type: data.type || '—',
        contact_name: data.name,
        email: data.email,
        phone: `${dial} ${data.phone}`.trim(),
        message: data.message || '—',
        'h-captcha-response': captchaToken,
      });
    } catch (err) {
      setSending(false);
      captcha.reset();
      setNotice('Could not send right now. Please try again, or email info@tripsnflys.com.');
      return;
    }
    captcha.reset();
    guard.accept();
    setSending(false);
    setDone(true);
  };

  return (
    <div style={{ position: 'fixed', inset: 0, background: 'rgba(11, 38, 48, 0.6)', display: 'flex', alignItems: mob ? 'flex-end' : 'center', justifyContent: 'center', zIndex: 40, backdropFilter: 'blur(4px)', padding: mob ? 0 : 16, textAlign: 'left' }} onClick={onClose}>
      <div style={{ width: 560, maxWidth: mob ? '100%' : '92%', background: '#fff', borderRadius: mob ? '20px 20px 0 0' : 20, maxHeight: mob ? '92vh' : '90vh', boxShadow: '0 24px 64px rgba(0,0,0,0.3)', overflow: 'hidden', display: 'flex', flexDirection: 'column', color: TNF.ink }} onClick={e => e.stopPropagation()}>
        <div style={{ padding: mob ? '16px 20px' : '20px 28px', borderBottom: `1px solid ${TNF.line}`, display: 'flex', alignItems: 'center', flex: '0 0 auto' }}>
          <div style={{ fontWeight: 600, fontSize: 16, color: TNF.ink }}>Become a partner</div>
          <button onClick={onClose} style={{ marginLeft: 'auto', background: 'transparent', border: 'none', cursor: 'pointer', color: TNF.inkSoft, width: 32, height: 32, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
            <Icon.x width={20} height={20}/>
          </button>
        </div>
        <div style={{ padding: mob ? 20 : 28, overflowY: 'auto', flex: 1 }}>
          <HoneypotField value={guard.hp} onChange={guard.setHp}/>
          {done ? (
            <div style={{ textAlign: 'center', padding: '30px 0' }}>
              <div style={{ width: 64, height: 64, borderRadius: '50%', background: TNF.green, color: '#fff', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', marginBottom: 20 }}>
                <Icon.check width={32} height={32}/>
              </div>
              <h3 style={{ fontFamily: 'var(--tnf-display)', fontSize: 24, color: TNF.ink, margin: 0, fontWeight: 500 }}>
                Thanks, {data.name.split(' ')[0] || 'partner'}!
              </h3>
              <p style={{ color: TNF.inkSoft, fontSize: 14, lineHeight: 1.6, marginTop: 12, maxWidth: 380, marginLeft: 'auto', marginRight: 'auto' }}>
                Our partnerships team will review your details and reach out shortly.
              </p>
            </div>
          ) : (
            <>
              <p style={{ color: TNF.inkSoft, fontSize: 14, lineHeight: 1.6, margin: '0 0 20px' }}>
                Tell us about your property or business and we’ll be in touch to explore working together.
              </p>
              <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
                <Field label="Company / property name" required error={errors.company}>
                  <input value={data.company} onChange={e => update('company', e.target.value)} placeholder="e.g. Lagoon Resort & Spa" maxLength={80} style={{ ...qInp, borderColor: errors.company ? QERR : TNF.line }}/>
                </Field>
                <Field label="Partner type">
                  <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
                    {TYPES.map(t => (
                      <button key={t} type="button" onClick={() => update('type', t)} style={qChip(data.type === t, TNF.blueDk)}>{t}</button>
                    ))}
                  </div>
                </Field>
                <Field label="Contact name" required error={errors.name}>
                  <input value={data.name} onChange={e => update('name', e.target.value)} placeholder="Your name" maxLength={80} autoComplete="name" style={{ ...qInp, borderColor: errors.name ? QERR : TNF.line }}/>
                </Field>
                <div style={{ display: 'grid', gridTemplateColumns: mob ? '1fr' : '1fr 1fr', gap: 14 }}>
                  <Field label="Email" required error={errors.email}>
                    <input type="email" value={data.email} onChange={e => update('email', e.target.value)} placeholder="you@company.com" maxLength={254} autoComplete="email" style={{ ...qInp, borderColor: errors.email ? QERR : TNF.line }}/>
                  </Field>
                  <Field label="Phone" required error={errors.phone}>
                    <div style={{ display: 'flex', gap: 8 }}>
                      <CountryCodePicker value={data.countryCode} onChange={v => update('countryCode', v)} triggerStyle={qInp} fixed/>
                      <input value={data.phone} onChange={e => update('phone', e.target.value)} placeholder="Phone number" inputMode="tel" autoComplete="tel" maxLength={24} style={{ ...qInp, flex: 1, borderColor: errors.phone ? QERR : TNF.line }}/>
                    </div>
                  </Field>
                </div>
                <Field label="About your business">
                  <textarea rows={3} value={data.message} onChange={e => update('message', e.target.value)} maxLength={1000} placeholder="Location, rooms / inventory, what you’re looking for..." style={{ ...qInp, resize: 'vertical', fontFamily: 'inherit' }}/>
                </Field>
                <div ref={captchaRef} className="h-captcha" data-captcha="true"></div>
              </div>
            </>
          )}
        </div>
        {!done && (
          <div style={{ padding: mob ? '14px 20px' : '16px 28px', borderTop: `1px solid ${TNF.line}`, display: 'flex', alignItems: 'center', gap: 12, flex: '0 0 auto' }}>
            {notice && (
              <span style={{ color: QERR, fontSize: 13, fontWeight: 500, display: 'flex', alignItems: 'center', gap: 6, maxWidth: 260, lineHeight: 1.3 }}>
                <Icon.alert width={15} height={15}/> {notice}
              </span>
            )}
            <button onClick={submit} disabled={sending} style={{ ...btn(TNF.blueDk), marginLeft: 'auto', opacity: sending ? 0.6 : 1, cursor: sending ? 'not-allowed' : 'pointer' }}>
              {sending ? 'Sending…' : <>Submit <Icon.send width={16} height={16}/></>}
            </button>
          </div>
        )}
      </div>
    </div>
  );
}

function FAQSection() {
  const bp = useBP();
  const [open, setOpen] = React.useState(0);
  return (
    <section style={{ padding: secPad(bp, 80, 56), background: '#fff' }}>
      <div style={{ maxWidth: 1100, margin: '0 auto', display: 'grid', gridTemplateColumns: bpv(bp, '1fr', '1fr 1.6fr', '1fr 1.6fr'), gap: bpv(bp, 28, 48, 80) }}>
        <div>
          <SectionEyebrow>Frequently asked</SectionEyebrow>
          <H2 style={{ fontWeight: 700 }}>Good answers,<br/>before you ask.</H2>
          <p style={{ fontSize: 14, color: TNF.inkSoft, marginTop: 20, lineHeight: 1.6 }}>
            Something else on your mind? <a href="contact.html" style={{ color: TNF.blueDk, fontWeight: 600 }}>Drop us a note</a> — we’ll get back the same day.
          </p>
        </div>
        <div>
          {FAQ.map((f, i) => (
            <div key={i} style={{ borderBottom: `1px solid ${TNF.line}`, padding: '20px 0' }}>
              <button onClick={() => setOpen(open === i ? -1 : i)} style={{
                width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between',
                background: 'transparent', border: 'none', padding: 0, fontFamily: 'inherit',
                fontSize: bp === 'mobile' ? 16 : 17, fontWeight: 600, color: TNF.ink, textAlign: 'left', gap: 16,
                minHeight: bp === 'mobile' ? 44 : 'auto', cursor: 'pointer',
              }}>
                {f.q}
                <Icon.arrow width={18} height={18} style={{
                  transform: open === i ? 'rotate(90deg)' : 'rotate(0deg)',
                  transition: 'transform .25s', color: TNF.blueDk, flex: '0 0 auto',
                }}/>
              </button>
              {open === i && (
                <p style={{ marginTop: 14, fontSize: bp === 'mobile' ? 15 : 14, color: TNF.inkSoft, lineHeight: 1.7, marginBottom: 0 }}>{f.a}</p>
              )}
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}
window.FAQSection = FAQSection;

function ServicesPage() {
  return (
    <SiteShell active="Services" overHero={true}>
      <PageHero
        eyebrow="Services"
        title={<>Travel solutions,<br/>under one roof.</>}
        lede="From a single visa stamp to a multi-country grand tour — every service we offer, explained in plain language."
        photo="svcHeader"
        height={520}
      />
      <ServicesIntro/>
      <ServicesList/>
      <ServicesProcess/>
      <ServicesForPartners/>
      <FAQSection/>
    </SiteShell>
  );
}
window.ServicesPage = ServicesPage;
