// Screen 5 — Dashboard overview (v2 Premium model).
// Источник: Agents/PREMIUM_ENTITLEMENT_MODEL_V2.md + WEB_SERVICE_ACCOUNT_FLOW_V2.md.
// ОДИН продукт «Fortune VPN Premium» с capabilities android/ios/external_subscription_url.

function Screen_Dashboard({ scenario = "active" }) {
  // scenarios: 'active' / 'empty' / 'expiring' / 'expired'
  const s = useAppState();
  const isEmpty   = scenario === "empty";
  const isExpire  = scenario === "expiring";
  const isExpired = scenario === "expired";

  if (isEmpty || (s.premium && s.premium.status !== "active" && !isExpire && !isExpired)) {
    return <Dashboard_Empty />;
  }

  // Расчёт дней до конца подписки (для expiration banner).
  const validUntil = s?.premium?.valid_until || s?.entitlement?.expires_at;
  const daysLeft = (() => {
    if (!validUntil) return 999;
    return Math.ceil((new Date(validUntil).getTime() - Date.now()) / 86400000);
  })();
  // Banner показываем только когда продление реально открылось (≤ 24ч) или подписка истекла.
  // Раньше показывали с 14 дней, но по новой бизнес-модели до этого момента продлить нельзя —
  // напоминание выглядело бы фальшиво.
  const showExpireBanner = isExpired || daysLeft <= 1;

  const chipText = isExpired ? "ИСТЕКЛА" : isExpire ? "ИСТЕКАЕТ" : "ПОДПИСКА";
  const pillKind = isExpired ? "off" : isExpire ? "warn" : "ok";
  const pillText = isExpired
    ? "Подписка истекла"
    : isExpire
      ? "Подписка скоро истечёт"
      : "Подписка активна";
  const realDate = validUntil ? window.fmtDate(validUntil) : "—";
  const dateText = isExpired ? "доступ истёк" : isExpire ? `${daysLeft} ${pluralDays(daysLeft)}` : realDate;
  const titleNode = isExpired
    ? <span style={{ color: "var(--danger)" }}>Подписка истекла</span>
    : isExpire
      ? <React.Fragment>Осталось <span style={{ color: "var(--warning)" }}>{dateText}</span></React.Fragment>
      : <React.Fragment>Подписка до <span className="grad-text">{dateText}</span></React.Fragment>;

  return (
    <Shell active="home" screenLabel={`05 Dashboard · ${scenario}`}>
      {/* Expiration banner (Proton-style): «Подписка истекает через N дней · Продлить» */}
      {showExpireBanner && (
        <ExpirationBanner isExpired={isExpired} daysLeft={daysLeft} />
      )}

      <Hero
        pill={<EyebrowPill chip={chipText} text={pillText} kind={pillKind} />}
        title={titleNode}
      >
        <div style={{ fontSize: 17, color: "#B2B2C6", lineHeight: 1.55, maxWidth: 620, marginTop: 4 }}>
          {isExpired
            ? "Продлите подписку, чтобы продолжить пользоваться сервисом."
            : "Подписка активна. Подключайтесь через V2Ray или Incy; Android и iOS — после релиза приложений."}
        </div>
        <div style={{ display: "flex", gap: 10, marginTop: 22, flexWrap: "wrap", alignItems: "center" }}>
          <button className="btn btn-primary" onClick={() => window.navigate("keys")}>Управлять</button>
          {(() => {
            const gate = window.canBuySubscription ? window.canBuySubscription() : { canBuy: true };
            return gate.canBuy
              ? <button className="btn btn-ghost" onClick={() => window.navigate("keys-checkout")}>{isExpired ? "Возобновить" : "Продлить"}</button>
              : <span style={{ fontSize: 13, color: "var(--muted)" }}>
                  Продление откроется за 24 часа до конца — через <b style={{ color: "var(--accent-soft)" }}>{window.fmtTimeLeft(Math.max(0, gate.msLeft - 24*60*60*1000))}</b>
                </span>;
          })()}
        </div>
      </Hero>

      {/* Двухколоночный layout: main (2fr) + right-rail (1fr), на мобиле — стек.
          «Способы подключения» внутри main column — чтобы левая колонка по высоте
          догоняла правый rail и не было пустоты под PremiumSummaryCard. */}
      <div data-grid="cards" data-layout="dashboard-two-col" style={{ display: "grid", gridTemplateColumns: "minmax(0, 2fr) minmax(280px, 1fr)", gap: 20, marginTop: 8, alignItems: "start" }}>
        {/* MAIN COLUMN */}
        <div style={{ display: "flex", flexDirection: "column", gap: 22, minWidth: 0 }}>
          <PremiumSummaryCard isExpired={isExpired} isExpire={isExpire} />

          {/* Способы подключения */}
          <div>
            <div className="eyebrow" style={{ marginBottom: 14 }}>СПОСОБЫ ПОДКЛЮЧЕНИЯ</div>
            <div data-grid="cards" style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 14 }}>
              <ConnectionCard
                icon={Icons.key}
                title="V2Ray и Incy"
                status="active"
                statusLabel="Активно"
                description={`Подключите по ссылке. Использовано ${s.limits.external_slots_used} из ${s.limits.max_external_slots}.`}
                cta="Управлять"
                onCta={() => window.navigate("keys")}
              />
              <ConnectionCard
                icon={Icons.android}
                title="Android-приложение"
                status="soon"
                statusLabel="скоро"
                description="VPN в одной кнопке. Активируется по вашему email после релиза."
              />
              <ConnectionCard
                icon={IosIcon}
                title="iOS-приложение"
                status="soon"
                statusLabel="скоро"
                description="VPN в одной кнопке. Активируется по вашему email после релиза."
              />
            </div>
            <div style={{ marginTop: 14, fontSize: 12.5, color: "var(--dim)" }}>
              Одна подписка покрывает все способы подключения. Когда приложения выйдут — никаких доплат.
            </div>
          </div>
        </div>

        {/* RIGHT RAIL (Proton-style «Get more from your VPN») */}
        <RightRail isExpired={isExpired} />
      </div>

    </Shell>
  );
}

// Premium summary card — главный блок на /home.
// Источник: Agents/PREMIUM_ENTITLEMENT_MODEL_V2.md.
// Показывает: статус, valid_until, seats used / max, capabilities (android/ios/external).
function PremiumSummaryCard({ isExpired, isExpire }) {
  const s = useAppState();
  const p = s.premium;
  const lim = s.limits;
  const cap = p.capabilities;
  const validUntil = p.valid_until ? window.fmtDate(p.valid_until) : "—";

  const expireDaysLeft = (() => {
    if (!p.valid_until) return null;
    return Math.ceil((new Date(p.valid_until).getTime() - Date.now()) / 86400000);
  })();
  return (
    <PsCard>
      <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 14 }}>
        <PsIcon icon={Icons.shield} />
        <Badge kind={isExpired ? "danger" : isExpire ? "warn" : "active"}>
          {isExpired ? "Истекла" : isExpire && expireDaysLeft != null ? `Осталось ${expireDaysLeft} ${pluralDays(expireDaysLeft)}` : "Активна"}
        </Badge>
      </div>
      <h3 style={{ margin: "0 0 4px", fontSize: 20, fontWeight: 700, letterSpacing: "-0.02em" }}>Ваша подписка</h3>
      <div style={{ fontSize: 13.5, color: "var(--muted)", marginBottom: 14 }}>План: Fortune VPN Premium</div>

      <div style={{ display: "flex", flexDirection: "column", gap: 10, fontSize: 14, marginBottom: 16 }}>
        <Row k="Действует до" v={isExpired ? "—" : validUntil} />
        <Row k="Подключений всего" v={`${lim.seats_used} из ${lim.max_seats}`} />
        <Row k="Мобильные устройства" v={`${lim.mobile_devices_used} из ${lim.max_mobile_devices_total}`} />
        <Row k="Ссылки V2Ray / Incy" v={`${lim.external_slots_used} из ${lim.max_external_slots}`} />
      </div>

      {/* Renewal-window info: если до конца > 24ч — скажем когда откроется продление */}
      {(() => {
        const gate = window.canBuySubscription ? window.canBuySubscription() : null;
        if (!gate || gate.canBuy) return null;
        const left = window.fmtTimeLeft(Math.max(0, gate.msLeft - 24*60*60*1000));
        return (
          <div style={{
            display: "flex", gap: 8, alignItems: "flex-start",
            padding: "10px 12px", borderRadius: 10, marginBottom: 16,
            background: "rgba(46,168,255,.06)", border: "1px solid rgba(46,168,255,.22)",
            fontSize: 12.5, color: "var(--ink)", lineHeight: 1.5,
          }}>
            <span style={{ color: "var(--accent-soft)", flexShrink: 0, marginTop: 1 }}><Icons.info size={14} /></span>
            <span>Продление откроется за 24 часа до конца — через <b style={{ color: "var(--accent-soft)" }}>{left}</b>.</span>
          </div>
        );
      })()}

      {/* Что включено в подписку */}
      <div style={{
        padding: "12px 14px", borderRadius: 10, marginBottom: 18,
        background: "var(--panel)", border: "1px solid var(--border)",
      }}>
        <div style={{ fontSize: 11, color: "var(--muted)", textTransform: "uppercase", letterSpacing: 0.6, marginBottom: 8 }}>
          Включено в подписку
        </div>
        <div style={{ display: "flex", flexDirection: "column", gap: 6, fontSize: 13.5 }}>
          <CapabilityRow label="Android-приложение" active={cap.android_access} soon={!cap.android_access} soonText="После релиза" />
          <CapabilityRow label="iOS-приложение" active={cap.ios_access} soon={!cap.ios_access} soonText="После релиза" />
          <CapabilityRow label="V2Ray / Incy" active={cap.external_subscription_url} />
        </div>
      </div>

      <button className="btn btn-primary btn-block" onClick={() => window.navigate("keys")}>
        {isExpired ? "Возобновить" : "Управлять подпиской"}
      </button>
    </PsCard>
  );
}

function CapabilityRow({ label, active, soon, soonText }) {
  return (
    <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
      <span style={{
        width: 18, height: 18, borderRadius: 99, flexShrink: 0,
        display: "inline-flex", alignItems: "center", justifyContent: "center",
        background: active ? "rgba(106,229,142,.18)" : soon ? "rgba(162,172,184,.18)" : "rgba(229,72,77,.15)",
        color: active ? "var(--green)" : soon ? "var(--muted)" : "var(--danger)",
        lineHeight: 0,
      }}>
        {active ? (
          // Inline-SVG c viewBox 12×12 чтобы галка визуально центрировалась внутри 18px круга.
          <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor"
               strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" style={{ display: "block" }}>
            <path d="M2.8 6.2 L5 8.4 L9.2 4" />
          </svg>
        ) : (
          <span style={{ fontSize: 10, fontWeight: 800, lineHeight: 1 }}>—</span>
        )}
      </span>
      <span style={{ color: active ? "var(--ink)" : "var(--muted)" }}>{label}</span>
      {soon && <span style={{ marginLeft: "auto", fontSize: 11, color: "var(--dim)" }}>{soonText}</span>}
    </div>
  );
}

// Expiration banner — Proton-style. Жёлтый/красный banner вверху Home,
// если подписка скоро истекает или истекла.
function ExpirationBanner({ isExpired, daysLeft }) {
  const isWarn = !isExpired && daysLeft <= 14 && daysLeft > 0;
  const bg = isExpired ? "rgba(229,72,77,.08)" : "rgba(245,166,35,.08)";
  const border = isExpired ? "rgba(229,72,77,.32)" : "rgba(245,166,35,.32)";
  const color = isExpired ? "var(--danger)" : "var(--warning)";
  const title = isExpired
    ? "Подписка истекла"
    : "Подписка скоро закончится";
  const body = isExpired
    ? "Продлите, чтобы продолжить пользоваться сервисом."
    : `Остался ${daysLeft <= 0 ? "последний день" : `${daysLeft} ${pluralDays(daysLeft)}`}. Продление открыто.`;
  return (
    <div style={{
      display: "flex", alignItems: "center", gap: 14, flexWrap: "wrap",
      padding: "14px 18px", marginBottom: 20,
      background: bg, border: `1px solid ${border}`, borderRadius: 14,
    }}>
      <span style={{ color, flexShrink: 0, display: "flex" }}>
        {isExpired ? <Icons.alert /> : <Icons.info />}
      </span>
      <div style={{ flex: "1 1 280px", minWidth: 0 }}>
        <div style={{ fontSize: 14, fontWeight: 700, color: "var(--ink)" }}>{title}</div>
        <div style={{ fontSize: 13, color: "var(--muted)", marginTop: 2 }}>{body}</div>
      </div>
      <button className="btn btn-primary btn-sm" onClick={() => window.navigate("keys-checkout")}>
        {isExpired ? "Возобновить" : "Продлить"}
      </button>
    </div>
  );
}

function pluralDays(n) {
  const mod10 = n % 10, mod100 = n % 100;
  if (mod10 === 1 && mod100 !== 11) return "день";
  if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return "дня";
  return "дней";
}

// Right-rail — Proton-style cross-rail с «Get more from your VPN».
// У нас не upsell другого тарифа, а secondary-actions: пригласить друга, скачать клиент, поддержка.
function RightRail({ isExpired }) {
  const s = window.useAppState ? window.useAppState() : window.appState;
  const premium = s?.premium || {};
  const lim = s?.limits || {};
  const externalUsed = lim.external_slots_used || 0;
  const externalMax = lim.max_external_slots || 0;
  const externalRoom = Math.max(0, externalMax - externalUsed);
  const seatsAvail = lim.seats_available || 0;
  // Один external slot занят, есть место на ещё один и есть свободный seat.
  const showSecondSlotPrompt = premium.status === "active" && externalUsed >= 1 && externalRoom >= 1 && seatsAvail >= 1;

  return (
    <aside style={{ display: "flex", flexDirection: "column", gap: 14, minWidth: 0 }}>
      {/* Card: добавить ещё одну ссылку (V2Ray/Incy), если есть свободный slot и seat */}
      {showSecondSlotPrompt && (
        <RailCard
          eyebrow="Подсказка"
          title="Добавьте вторую ссылку"
          body="Для V2Ray или Incy на втором устройстве. В подписке доступно до 2 ссылок."
          ctaLabel="Открыть подписку"
          onCta={() => window.navigate("keys")}
          accent
        />
      )}

      {/* Card: реф-программа */}
      <RailCard
        eyebrow="Бонусы"
        title="Реферальная программа"
        body="Поделитесь персональной ссылкой. После первой реальной оплаты друга бонусные дни попадут на проверку."
        ctaLabel="Подробнее"
        onCta={() => window.navigate("referral")}
      />

      {/* Card: V2Ray / Incy setup helper */}
      <RailCard
        eyebrow="Подключение"
        title="Как настроить V2Ray и Incy"
        body="Установите клиент, вставьте ссылку, подключайтесь."
        ctaLabel="Открыть инструкции"
        onCta={() => window.navigate("setup-v2ray")}
      />

      {/* Card: поддержка — два канала: Telegram (через VPN) и email (если VPN недоступен) */}
      <RailCard
        eyebrow="Помощь"
        title="Поддержка"
        body="Telegram — основной канал. Если он недоступен без VPN — пишите на почту."
        contacts={[
          { href: "https://t.me/FortuneVPNsupportbot", label: "@FortuneVPNsupportbot", external: true },
          { href: "mailto:support@fortunetavern.com", label: "support@fortunetavern.com" },
        ]}
      />
    </aside>
  );
}

function RailCard({ eyebrow, title, body, ctaLabel, onCta, ctaHref, accent, contacts }) {
  const border = accent ? "rgba(46,168,255,.25)" : "var(--border)";
  const bg = accent
    ? "linear-gradient(180deg, rgba(46,168,255,.06), rgba(255,255,255,0.01))"
    : "linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.01))";
  return (
    <div style={{
      padding: "16px 18px", borderRadius: 14,
      background: bg, border: `1px solid ${border}`,
      display: "flex", flexDirection: "column", gap: 8, minWidth: 0,
    }}>
      <div className="eyebrow" style={{ fontSize: 11 }}>{eyebrow}</div>
      <div style={{ fontSize: 15, fontWeight: 700, letterSpacing: "-0.01em", color: "var(--ink)", lineHeight: 1.35 }}>{title}</div>
      <div style={{ fontSize: 13, color: "var(--muted)", lineHeight: 1.5 }}>{body}</div>
      {contacts ? (
        <div style={{ display: "flex", flexDirection: "column", gap: 4, marginTop: 6 }}>
          {contacts.map((c, i) => (
            <a key={i} href={c.href}
               target={c.external ? "_blank" : undefined}
               rel={c.external ? "noopener" : undefined}
               style={{ fontSize: 13, color: "var(--accent-soft)", textDecoration: "none", wordBreak: "break-all" }}>
              {c.label}
            </a>
          ))}
        </div>
      ) : ctaHref ? (
        <a href={ctaHref} target="_blank" rel="noopener" className="btn btn-ghost btn-sm" style={{ alignSelf: "flex-start", textDecoration: "none", marginTop: 4 }}>
          {ctaLabel}
        </a>
      ) : (
        <button onClick={onCta} className="btn btn-ghost btn-sm" style={{ alignSelf: "flex-start", marginTop: 4 }}>
          {ctaLabel}
        </button>
      )}
    </div>
  );
}

// Единый компонент «способ подключения». Статусы: active / soon / coming.
function ConnectionCard({ icon: I, title, status, statusLabel, description, cta, onCta }) {
  const isActive = status === "active";
  const isSoon = status === "soon";
  return (
    <div style={{
      position: "relative",
      background: isActive
        ? "linear-gradient(180deg, rgba(46,168,255,.06), rgba(255,255,255,0.01))"
        : "rgba(255,255,255,.02)",
      border: `1px solid ${isActive ? "rgba(46,168,255,.25)" : "rgba(255,255,255,.05)"}`,
      borderRadius: 16, padding: "20px 20px 22px",
      display: "flex", flexDirection: "column", gap: 12,
    }}>
      <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between" }}>
        <div style={{
          width: 36, height: 36, borderRadius: 10,
          background: isActive ? "rgba(46,168,255,.12)" : "rgba(162,172,184,.08)",
          border: `1px solid ${isActive ? "rgba(46,168,255,.22)" : "var(--border)"}`,
          color: isActive ? "var(--accent-soft)" : "var(--muted)",
          display: "grid", placeItems: "center",
        }}><I /></div>
        <span style={{
          fontSize: 10, fontWeight: 700, letterSpacing: "0.03em",
          padding: "3px 8px", borderRadius: 999,
          background: isActive ? "rgba(106,229,142,.18)" : "rgba(162,172,184,.18)",
          color: isActive ? "var(--green)" : "var(--muted)",
        }}>{statusLabel}</span>
      </div>
      <h4 style={{ margin: 0, fontSize: 16, fontWeight: 700, letterSpacing: "-0.01em", color: isSoon ? "var(--muted)" : "var(--ink)" }}>{title}</h4>
      <p style={{ margin: 0, fontSize: 13, color: isSoon ? "var(--dim)" : "var(--muted)", lineHeight: 1.55 }}>{description}</p>
      {cta && onCta && (
        <button className="btn btn-ghost btn-sm" onClick={onCta} style={{ marginTop: "auto", alignSelf: "flex-start" }}>
          {cta}
        </button>
      )}
    </div>
  );
}

// Карточка "скоро" — приглушённый стиль. Mobile apps stay informational until store links are ready.
function SoonCard({ icon: I, title, body, captureEmail, platform }) {
  // Для Android-карточки показываем превью блока устройств 0/2.
  const isAndroid = platform === "android";
  return (
    <div style={{
      position: "relative",
      background: "rgba(255,255,255,.02)",
      border: "1px solid rgba(255,255,255,.05)",
      borderRadius: 20, padding: "24px 22px",
    }}>
      <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 12 }}>
        <div style={{
          width: 40, height: 40, borderRadius: 10,
          background: "rgba(162,172,184,.08)", border: "1px solid var(--border)",
          color: "var(--muted)", display: "grid", placeItems: "center",
        }}><I /></div>
        <span style={{
          fontSize: 10, fontWeight: 700, letterSpacing: "0.03em",
          padding: "3px 8px", borderRadius: 999,
          background: "rgba(46,168,255,.12)", color: "var(--accent-soft)",
        }}>скоро</span>
      </div>
      <h3 style={{ margin: "0 0 6px", fontSize: 18, fontWeight: 700, letterSpacing: "-0.02em", color: "var(--muted)" }}>{title}</h3>
      <p style={{ margin: "0 0 14px", fontSize: 13.5, color: "var(--dim)", lineHeight: 1.55 }}>{body}</p>

      {/* Android: превью блока устройств 0/2 (по требованиям §2.2) */}
      {isAndroid && (
        <div style={{
          padding: "10px 12px", borderRadius: 10, marginBottom: 12,
          background: "rgba(255,255,255,.02)", border: "1px dashed var(--border)",
          display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10,
        }}>
          <div>
            <div style={{ fontSize: 12, color: "var(--muted)", textTransform: "uppercase", letterSpacing: 0.6 }}>Устройства</div>
            <div style={{ fontSize: 14, color: "var(--muted)", fontFamily: "ui-monospace, monospace" }}>0 / 2</div>
          </div>
          <div style={{ fontSize: 12, color: "var(--dim)", textAlign: "right", maxWidth: 200, lineHeight: 1.4 }}>
            После релиза — список с last-active и кнопкой «Отвязать»
          </div>
        </div>
      )}

    </div>
  );
}

// Используем единый Apple-силуэт из Icons.apple — чтобы /home и сайдбар выглядели одинаково.
const IosIcon = () => <Icons.apple />;

// Empty dashboard = «first LK visit» state per WEB_SERVICE_ACCOUNT_FLOW_V2.md.
// Юзер залогинен (или только что создал аккаунт через /buy-start), Premium не активен.
// Спека требует показать:
//   Premium: not active
//   Subscription: not active
//   Seats used: 0 of 3
//   External slots: 0 of 2
function Dashboard_Empty() {
  const s = useAppState();
  const lim = s.limits;
  return (
    <Shell active="home" screenLabel="04 First LK visit (Premium inactive)">
      <Hero
        pill={<EyebrowPill chip="ПОДПИСКА" text="Подписка не оформлена" kind="off" />}
        title="Оформите подписку"
      >
        <div style={{ fontSize: 17, color: "#B2B2C6", lineHeight: 1.55, maxWidth: 640, marginTop: 4 }}>
          Одна подписка — до 3 подключений: V2Ray, Incy и (скоро) приложения для Android и iOS.
          {" "}1 месяц · 99 ₽ · без автопродления.
        </div>
        <div style={{ display: "flex", gap: 10, marginTop: 22, flexWrap: "wrap" }}>
          <button className="btn btn-primary btn-lg" onClick={() => window.navigate("keys-checkout")}>Выбрать тариф</button>
        </div>
      </Hero>

      {/* Status block (subscription not active) */}
      <PsCard style={{ marginBottom: 18 }}>
        <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 14 }}>
          <PsIcon icon={Icons.shield} />
          <Badge kind="pending">Не оформлена</Badge>
        </div>
        <h3 style={{ margin: "0 0 4px", fontSize: 20, fontWeight: 700, letterSpacing: "-0.02em" }}>Ваша подписка</h3>
        <div style={{ fontSize: 13.5, color: "var(--muted)", marginBottom: 14 }}>Подписка пока не оформлена</div>
        <div style={{ display: "flex", flexDirection: "column", gap: 10, fontSize: 14 }}>
          <Row k="Подключений всего"    v={`${lim.seats_used} из ${lim.max_seats}`} />
          <Row k="Мобильные устройства" v={`${lim.mobile_devices_used} из ${lim.max_mobile_devices_total}`} />
          <Row k="Ссылки V2Ray / Incy"  v={`${lim.external_slots_used} из ${lim.max_external_slots}`} />
        </div>
      </PsCard>

      {/* Что входит в подписку */}
      <div style={{ marginTop: 16 }}>
        <div className="eyebrow" style={{ marginBottom: 14 }}>ЧТО ВКЛЮЧАЕТ ПОДПИСКА</div>
        <div data-grid="cards" style={{ display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 14 }}>
          <ConnectionCard
            icon={Icons.android}
            title="Android-приложение"
            status="soon"
            statusLabel="скоро"
            description="VPN в одной кнопке. Активируется по вашему email после релиза."
          />
          <ConnectionCard
            icon={IosIcon}
            title="iOS-приложение"
            status="soon"
            statusLabel="скоро"
            description="VPN в одной кнопке. Активируется по вашему email после релиза."
          />
          <ConnectionCard
            icon={Icons.key}
            title="V2Ray и Incy"
            status="active"
            statusLabel="Доступно"
            description="Подключение по ссылке в стороннем клиенте. Работает на iOS / Android / Windows / macOS."
          />
        </div>
      </div>

      <div style={{ marginTop: 22, fontSize: 13.5, color: "var(--dim)", textAlign: "center" }}>
        Не уверены, что выбрать? <a href="/faq" style={{ color: "var(--accent-soft)", textDecoration: "none" }}>FAQ →</a>
      </div>
    </Shell>
  );
}

const Row = ({ k, v }) => (
  <div style={{ display: "flex", justifyContent: "space-between", gap: 8, paddingBottom: 8, borderBottom: "1px dashed var(--border)" }}>
    <span style={{ color: "var(--muted)" }}>{k}</span>
    <span style={{ color: "var(--ink)", fontWeight: 500, fontVariantNumeric: "tabular-nums" }}>{v}</span>
  </div>
);

Object.assign(window, { Screen_Dashboard, Dashboard_Empty, Row, SoonCard, IosIcon });
