/* ════════════════════════════════════════════════════════════════════════════
   ZOKKO · SISTEMA DE COMPONENTES APP-MÓVIL (compartido, una sola fuente)
   ────────────────────────────────────────────────────────────────────────────
   Convierte la web Zokko en una APP nativa de verdad cuando se ve en un móvil:
   cabecera mínima, barra de pestañas inferior, tarjetas app, hojas inferiores
   (bottom-sheet) tipo iOS, formularios, toggles, toasts, estados vacíos…
   Espejo 1:1 del prototipo iOS (/Users/anonymous/zokkeo-ios): tokens de
   ZColors.swift, tipografía Outfit, tarjeta radio 12-14, precio teal bold.

   ─── REGLAS DE ORO ───────────────────────────────────────────────────────────
   (1) TODO vive dentro de @media (max-width: 640px). El ESCRITORIO (≥641px) NO
       lee ni una sola regla de aquí → queda intacto por construcción.
   (2) No reinventa por página: reestiliza el SISTEMA compartido (zk-card,
       form-group, modal-overlay, category-pill…) y las clases de cada sección
       (mercadillo-card, dealsx-card, notif-row, conversation-*, message-bubble…).
   (3) Se carga GLOBALMENTE vía @import desde css/zokko-main.css (presente en
       todas las páginas y en el preview dev). El tab bar (DOM) y las hojas las
       inyecta js/header.js; aquí vive su estilo.

   El bloque "calidad-app" base (cabecera + tab bar + grid + zk-card) sigue en
   css/zokko-main.css (lo dejó el prototipo); ESTE fichero lo EXTIENDE a todos los
   demás componentes sin duplicarlo.
   ════════════════════════════════════════════════════════════════════════════ */

/* ── ÚNICA regla fuera de @media (justificada): la barra de pestañas y las hojas
   son elementos EXCLUSIVOS de la app móvil. El DOM del tab bar lo inyecta
   header.js en todas las anchuras; en ESCRITORIO no debe verse (sin esta regla
   aparecía como una fila de enlaces suelta al pie de la página). Dentro del
   @media de abajo se reactiva con display:flex. No altera ningún contenido real
   del escritorio: solo oculta un artefacto que no debería estar ahí. ── */
#zkAppTabbar { display: none; }

/* La cabecera app (.zk-apphead) la inyecta header.js en TODAS las anchuras;
   en ESCRITORIO no debe verse (su estilo vive dentro del @media de abajo). */
#zkApphead { display: none; }

@media (max-width: 640px) {

  /* Reactiva la barra de pestañas SOLO en móvil (el resto de su estilo vive en
     el bloque base de css/zokko-main.css). */
  #zkAppTabbar { display: flex; }
  /* Reactiva la cabecera app SOLO en móvil. */
  #zkApphead { display: flex; }

  /* ══════════════════════════════════════════════════════════════════════════
     0 · TOKENS (1:1 ZColors.swift / Onb) — re-declarados por si el bloque base
        no cargó; CSS los deduplica. Toda la app referencia estas variables.
     ══════════════════════════════════════════════════════════════════════════ */
  :root {
    --zk-app-teal:        #00a693;   /* marca · precio · acciones */
    --zk-app-teal-dark:   #008a7a;   /* hover/pressed */
    --zk-app-teal-light:  #e6f7f5;   /* fondo teal suave */
    --zk-app-ink:         #1a1a1a;   /* texto fuerte */
    --zk-app-ink2:        #4b5563;   /* texto medio */
    --zk-app-accent:      #ff6b35;   /* regalo / gratis */
    --zk-app-gray50:      #f9fafb;
    --zk-app-gray100:     #f3f4f6;
    --zk-app-gray200:     #e5e7eb;
    --zk-app-gray300:     #d1d5db;
    --zk-app-gray400:     #9ca3af;
    --zk-app-gray500:     #6b7280;   /* texto inactivo/meta */
    --zk-app-line:        #e7e7ea;   /* hairline (Onb.line) */
    --zk-app-bg:          #f5f7f8;   /* fondo de pantalla app */
    --zk-app-success:     #10b981;
    --zk-app-warning:     #f59e0b;
    --zk-app-error:       #ef4444;
    /* radios */
    --zk-r-card: 14px;   --zk-r-md: 12px;   --zk-r-sm: 10px;   --zk-r-pill: 999px;
    /* sombras app */
    --zk-sh-card:  0 1px 3px rgba(16,34,46,0.06);
    --zk-sh-float: 0 8px 28px rgba(16,34,46,0.16);
    --zk-sh-sheet: 0 -6px 28px rgba(16,34,46,0.14);
    /* alturas */
    --zk-app-header-h: 56px;
    --zk-tabbar-h: 60px;
    --zk-safe-bottom: env(safe-area-inset-bottom, 0px);
    /* fuente app */
    --zk-app-font: 'Outfit', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  }

  /* Curva de animación app (iOS spring-ish) usada por sheets/toasts/transiciones */
  /* (definida como utilidad; cada componente la referencia) */

  /* ══════════════════════════════════════════════════════════════════════════
     1 · CABECERA APP CONSISTENTE (.zk-apphead) — la inyecta js/header.js en TODAS
        las páginas (lista→buscador+campana+avatar · detalle→volver+título). En
        móvil OCULTAMOS la cabecera web vieja (logo+hamburguesa) y mostramos esta.
        Espejo 1:1 de la cabecera de la app iOS/Android. Sticky, translúcida,
        hairline inferior. Altura = --zk-app-header-h.
     ══════════════════════════════════════════════════════════════════════════ */

  /* La cabecera web vieja desaparece en móvil; su DOM sigue vivo (oculto) para
     no romper el JS existente (login/sesión, menú, idioma, campana, tabbar). */
  .header { display: none !important; }

  /* ── Contenedor de la cabecera app ── */
  .zk-apphead {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 1400;
    height: var(--zk-app-header-h);
    box-sizing: border-box;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 0 10px;
    background: rgba(255,255,255,0.92);
    -webkit-backdrop-filter: saturate(180%) blur(12px);
    backdrop-filter: saturate(180%) blur(12px);
    border-bottom: 1px solid var(--zk-app-line);
    font-family: var(--zk-app-font);
  }
  /* Algunas páginas (mensajes) usan content-box raro; forzamos altura visible */
  .zk-apphead > * { min-width: 0; }

  /* ── VARIANTE LISTA/HUB: buscador pill + campana + avatar ── */
  .zk-apphead__search {
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    margin: 0;
  }
  .zk-apphead__search-wrap {
    position: relative;
    flex: 1 1 auto;
    display: flex;
    align-items: center;
  }
  .zk-apphead__search .zk-apphead__search-ico {
    position: absolute;
    left: 14px;
    color: var(--zk-app-gray400);
    font-size: 14px;
    pointer-events: none;
  }
  /* PILL del buscador (paridad app iOS ZokkeoTopBar: Capsule, altura 44, gris-100).
     OJO: la regla global input[type="search"]{border-radius:12px !important;min-height:48px}
     (§6) lleva !important y ganaba aunque esta sea id-scoped → la pill salía como
     rectángulo de 12px y 48px de alto. Por eso aquí forzamos también con !important:
     pill REAL (999px) + altura 44 (no 48). */
  #zkApphead .zk-apphead__search input {
    width: 100%;
    height: 44px !important;
    min-height: 44px !important;
    border: 1px solid transparent;
    border-radius: var(--zk-r-pill) !important;
    background: var(--zk-app-gray100);
    padding: 0 16px 0 38px !important;
    margin: 0;
    font-family: var(--zk-app-font);
    font-size: 15px !important;
    color: var(--zk-app-ink);
    box-sizing: border-box;
    transition: background .18s ease, border-color .18s ease, box-shadow .18s ease;
  }
  /* "Más CORTO / no tan ancho": el buscador sigue flexionando para rellenar, pero
     lo capamos para que NO llegue casi pegado a la campana — deja un respiro claro
     antes de campana/avatar (pill compacta, como la app). El hueco sobrante queda a
     la derecha del input, dentro del flex (margin-right auto lo empuja a la izq). */
  #zkApphead .zk-apphead__search { flex: 1 1 auto; max-width: 66%; margin-right: auto; }
  /* el icono no debe tapar el placeholder: -webkit-search-decoration off */
  #zkApphead .zk-apphead__search input::-webkit-search-decoration,
  #zkApphead .zk-apphead__search input::-webkit-search-cancel-button { -webkit-appearance: none; }
  #zkApphead .zk-apphead__search input::placeholder { color: var(--zk-app-gray400); opacity: 1; }
  #zkApphead .zk-apphead__search input:focus {
    outline: none;
    background: #fff;
    border-color: var(--zk-app-teal);
    box-shadow: 0 0 0 3px rgba(0,166,147,0.12);
  }

  .zk-apphead__btn {
    flex: 0 0 auto;
    width: 40px; height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    color: var(--zk-app-ink);
    font-size: 19px;
    border-radius: 50%;
    position: relative;
    -webkit-tap-highlight-color: transparent;
    cursor: pointer;
    padding: 0;
  }
  .zk-apphead__btn:active { background: var(--zk-app-gray100); }
  .zk-apphead__btn .zk-apphead__dot {
    position: absolute;
    top: 6px; right: 6px;
    min-width: 8px; height: 8px;
    border-radius: 999px;
    background: var(--zk-app-accent);
    border: 2px solid #fff;
    display: none;
  }
  .zk-apphead__btn.has-unread .zk-apphead__dot { display: block; }
  .zk-apphead__avatar {
    flex: 0 0 auto;
    width: 38px; height: 38px;
    border-radius: 50%;
    overflow: hidden;
    border: 1px solid var(--zk-app-gray200);
    background: var(--zk-app-gray100);
    padding: 0;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .zk-apphead__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }

  /* ── VARIANTE DETALLE/SUB: volver + título (+ acción contextual) ── */
  .zk-apphead--detail { gap: 4px; padding: 0 6px; }
  .zk-apphead__back {
    flex: 0 0 auto;
    width: 40px; height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    color: var(--zk-app-ink);
    font-size: 20px;
    border-radius: 50%;
    -webkit-tap-highlight-color: transparent;
    cursor: pointer;
    padding: 0;
  }
  .zk-apphead__back:active { background: var(--zk-app-gray100); }
  .zk-apphead__title {
    flex: 1 1 auto;
    min-width: 0;
    font-family: var(--zk-app-font);
    font-size: 17px;
    font-weight: 800;
    letter-spacing: -0.2px;
    color: var(--zk-app-ink);
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    padding: 0 4px;
  }
  /* el botón volver y la acción contextual mantienen el título centrado */
  .zk-apphead--detail .zk-apphead__back { margin-right: 0; }
  .zk-apphead__action {
    flex: 0 0 auto;
    width: 40px; height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    color: var(--zk-app-ink);
    font-size: 18px;
    border-radius: 50%;
    -webkit-tap-highlight-color: transparent;
    cursor: pointer;
    padding: 0;
  }
  .zk-apphead__action:active { background: var(--zk-app-gray100); }
  /* spacer invisible para equilibrar cuando no hay acción a la derecha */
  .zk-apphead__action--spacer { visibility: hidden; pointer-events: none; }

  /* ══════════════════════════════════════════════════════════════════════════
     1b · BUSCADORES EMBEBIDOS de páginas → mismo lenguaje pill (sin tocar el JS).
     ══════════════════════════════════════════════════════════════════════════ */
  .search-form,
  .conversations-search,
  .search-container-responsive {
    width: 100%;
  }
  .header .search-input,
  .search-bar .search-input,
  .conversations-search .search-input {
    background: var(--zk-app-gray100) !important;
    border: 1px solid transparent !important;
    border-radius: var(--zk-r-pill) !important;
    height: 42px;
    padding-left: 40px !important;
    font-family: var(--zk-app-font);
    font-size: 15px;
    transition: background .18s ease, border-color .18s ease;
  }
  .header .search-input:focus,
  .search-bar .search-input:focus,
  .conversations-search .search-input:focus {
    background: #fff !important;
    border-color: var(--zk-app-teal) !important;
    outline: none !important;
    box-shadow: 0 0 0 3px rgba(0,166,147,0.12) !important;
  }
  .search-icon,
  .search-icon-button { color: var(--zk-app-gray400) !important; }

  /* Dropdown de notificaciones de la campana → hoja app (full-bleed, redondeada
     arriba). Se ancla bajo la cabecera y baja como panel. */
  .notif-dropdown {
    position: fixed !important;
    top: var(--zk-app-header-h) !important;
    left: 0 !important; right: 0 !important;
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    border-radius: 0 0 18px 18px !important;
    border: none !important;
    border-bottom: 1px solid var(--zk-app-line) !important;
    box-shadow: var(--zk-sh-float) !important;
    max-height: 78vh !important;
  }
  .notif-dropdown__head { padding: 14px 16px 10px !important; }
  .notif-dropdown__title { font-family: var(--zk-app-font); font-weight: 700 !important; }
  .notif-row { padding: 12px 16px !important; gap: 12px !important; }
  .notif-row.is-unread { background: var(--zk-app-teal-light) !important; }

  /* ══════════════════════════════════════════════════════════════════════════
     2 · LIENZO APP — fondo gris suave y respiración para que las tarjetas floten
        como en la app. Páginas con contenedor estándar.
     ══════════════════════════════════════════════════════════════════════════ */
  body { font-family: var(--zk-app-font); background: var(--zk-app-bg); }
  /* Margen para no chocar con la cabecera sticky compacta en páginas con main */
  main { margin-top: var(--zk-app-header-h); }
  .container,
  .container.py-8 { padding-left: 14px !important; padding-right: 14px !important; }

  /* Títulos de sección estilo app: fuertes, compactos. */
  .section-title,
  .page-header h1,
  .mp-head h1,
  h1.title { font-family: var(--zk-app-font); font-weight: 800; letter-spacing: -0.2px; }

  /* ══════════════════════════════════════════════════════════════════════════
     3 · TARJETAS — todos los tipos con el lenguaje visual app.
        El zk-card base ya lo afina el prototipo; aquí cubrimos las tarjetas
        propias de cada sección (mercadillo, chollo, coche, servicio, artículo)
        para que TODAS hablen el mismo idioma.
     ══════════════════════════════════════════════════════════════════════════ */

  /* Acabado app común a toda tarjeta de catálogo. */
  .zk-card,
  .mercadillo-card,
  .dealsx-card,
  .product-card,
  .car-card,
  .service-card,
  .article-card,
  .articles-list .article {
    border-radius: var(--zk-r-card) !important;
    border: 1px solid var(--zk-app-gray200) !important;
    box-shadow: var(--zk-sh-card) !important;
    background: #fff !important;
    overflow: hidden;
    transition: transform .12s ease, box-shadow .12s ease;
  }
  .zk-card:active,
  .mercadillo-card:active,
  .dealsx-card:active,
  .service-card:active { transform: scale(0.985); }

  /* ── 3.1 Mercadillo (producto) — grid 2 col, foto cuadrada, precio teal ── */
  #mercadilloGrid,
  .mercadillo-grid,
  .products-grid {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 12px !important;
  }
  .mercadillo-media,
  .mercadillo-image { aspect-ratio: 1 / 1 !important; border-radius: 0 !important; }
  .mercadillo-image img,
  .mercadillo-media img { width: 100%; height: 100%; object-fit: cover; }
  .mercadillo-body,
  .mercadillo-info { padding: 10px 10px 12px !important; }
  .mercadillo-price,
  .mercadillo-price-current {
    font-family: var(--zk-app-font);
    font-size: 16px !important; font-weight: 800 !important;
    color: var(--zk-app-teal) !important;
  }
  .mercadillo-price-original { font-size: 12px !important; color: var(--zk-app-gray500) !important; }
  .mercadillo-card.is-gift .mercadillo-price,
  .mercadillo-gift-badge ~ * .mercadillo-price { color: var(--zk-app-accent) !important; }
  .mercadillo-condition,
  .mercadillo-location,
  .mercadillo-distance { font-size: 11px !important; color: var(--zk-app-gray500) !important; }
  .mercadillo-favorite {
    top: 8px !important; right: 8px !important;
    width: 32px; height: 32px;
    background: rgba(255,255,255,0.92); backdrop-filter: blur(4px);
    border-radius: 50%; box-shadow: 0 1px 4px rgba(0,0,0,0.12);
    display: flex; align-items: center; justify-content: center;
  }
  .mercadillo-gift-badge {
    background: var(--zk-app-accent) !important; color: #fff !important;
    font-size: 10px !important; font-weight: 700; border-radius: var(--zk-r-pill);
    padding: 3px 8px;
  }

  /* ── 3.2 Chollos (dealsx-card) — tarjeta horizontal/vertical app ── */
  #dealsxList,
  .dealsx-list,
  .deals-grid {
    display: grid !important;
    grid-template-columns: 1fr !important;
    gap: 12px !important;
  }
  .dealsx-card-media { aspect-ratio: 16 / 10 !important; }
  .dealsx-card-media img { width: 100%; height: 100%; object-fit: cover; }
  .dealsx-card-body { padding: 12px !important; }
  .dealsx-price-current {
    font-family: var(--zk-app-font);
    font-size: 19px !important; font-weight: 800 !important; color: var(--zk-app-teal) !important;
  }
  .dealsx-price-original { font-size: 13px !important; color: var(--zk-app-gray500) !important; }
  .dealsx-discount {
    background: var(--zk-app-accent) !important; color: #fff !important;
    border-radius: var(--zk-r-sm); font-weight: 800; font-size: 12px; padding: 3px 8px;
  }
  .dealsx-go-btn,
  .chollo-btn-ir {
    width: 100%; justify-content: center;
    background: var(--zk-app-teal) !important; color: #fff !important;
    border: none !important; border-radius: var(--zk-r-md) !important;
    height: 44px; font-family: var(--zk-app-font); font-weight: 700;
  }
  .dealsx-badge-hot { background: #fff1ec !important; color: var(--zk-app-accent) !important; }
  .dealsx-badge-verified { background: var(--zk-app-teal-light) !important; color: var(--zk-app-teal-dark) !important; }

  /* ── 3.3 Motor (coche) — lista app: foto 16:9, precio teal, meta año·km ── */
  .car-card,
  .vehicle-card { border-radius: var(--zk-r-card) !important; }
  .car-card .car-media,
  .car-card img:first-of-type { aspect-ratio: 16 / 10 !important; object-fit: cover; }
  .car-card .price,
  .car-price {
    font-family: var(--zk-app-font);
    font-size: 18px !important; font-weight: 800 !important; color: var(--zk-app-teal) !important;
  }
  .car-meta,
  .car-card .meta { font-size: 12px !important; color: var(--zk-app-gray500) !important; }
  /* Motor hub: tiles a 1 columna app */
  .motor-hero .tiles-3,
  .motor-hero .tiles-4 { grid-template-columns: 1fr 1fr !important; gap: 10px !important; }

  /* ── 3.4 Servicios — fila de perfil de profesional, app ── */
  .service-card,
  .professional-card {
    display: flex; gap: 12px; align-items: flex-start;
    padding: 12px !important;
  }
  .service-card .avatar-container,
  .professional-card .avatar-container { flex: 0 0 56px; }
  .badge-verified { color: var(--zk-app-teal) !important; }
  .badge-available { color: var(--zk-app-success) !important; }
  .price-info { color: var(--zk-app-teal) !important; font-weight: 800; font-family: var(--zk-app-font); }

  /* ── 3.5 La Plaza (artículo) — fila editorial app ── */
  .articles-list { display: flex; flex-direction: column; gap: 12px; }
  .articles-list .article,
  .article-card {
    display: flex; gap: 12px; padding: 12px !important;
  }
  .article-card .article-cover,
  .articles-list .article img { flex: 0 0 96px; width: 96px; height: 72px; object-fit: cover; border-radius: var(--zk-r-sm); }
  .article-card h3,
  .articles-list .article h3 { font-family: var(--zk-app-font); font-size: 15px; font-weight: 700; line-height: 1.25; }
  /* La Plaza: barra lateral (writers/topics) se apila bajo el feed en móvil */
  .blog-layout { display: block !important; }
  .sidebar { margin-top: 18px; }

  /* ══════════════════════════════════════════════════════════════════════════
     4 · CHIPS · SEGMENTED · PILLS — fila scrollable horizontal tipo app.
     ══════════════════════════════════════════════════════════════════════════ */
  .category-pills,
  .chips,
  .mz-subtabs,
  .mz-nav,
  .conversations-filter,
  .filter-chips {
    display: flex !important;
    gap: 8px !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    padding: 2px 0 6px !important;
    flex-wrap: nowrap !important;
  }
  .category-pills::-webkit-scrollbar,
  .chips::-webkit-scrollbar,
  .mz-subtabs::-webkit-scrollbar { display: none; }

  .category-pill,
  .chips .chip,
  .badge-pill,
  .mz-subtab {
    flex: 0 0 auto !important;
    border-radius: var(--zk-r-pill) !important;
    border: 1px solid var(--zk-app-gray200) !important;
    background: #fff !important;
    color: var(--zk-app-ink2) !important;
    font-family: var(--zk-app-font);
    font-size: 13px !important; font-weight: 600 !important;
    padding: 8px 14px !important;
    white-space: nowrap;
    -webkit-tap-highlight-color: transparent;
    transition: background .15s ease, color .15s ease, border-color .15s ease;
  }
  .category-pill.active,
  .category-pill.selected,
  .chips .chip.active,
  .mz-subtab.active,
  .mz-subtab[aria-selected="true"] {
    background: var(--zk-app-teal) !important;
    border-color: var(--zk-app-teal) !important;
    color: #fff !important;
  }

  /* ══════════════════════════════════════════════════════════════════════════
     5 · BOTONES — pill/relleno app, alto cómodo para el pulgar (≥44px).
     ══════════════════════════════════════════════════════════════════════════ */
  .btn,
  .btn-primary,
  .btn-secondary,
  button.btn,
  .btn-modal-submit,
  .send-btn {
    font-family: var(--zk-app-font) !important;
    font-weight: 700 !important;
    border-radius: var(--zk-r-md) !important;
    min-height: 44px;
    letter-spacing: 0.1px;
    transition: transform .1s ease, opacity .15s ease;
  }
  .btn:active,
  .btn-primary:active,
  .btn-secondary:active { transform: scale(0.97); }
  .btn-primary,
  .btn-modal-submit {
    background: var(--zk-app-teal) !important;
    color: #fff !important;
    border: none !important;
    box-shadow: 0 2px 8px rgba(0,166,147,0.22);
  }
  .btn-primary:active,
  .btn-modal-submit:active { background: var(--zk-app-teal-dark) !important; }
  .btn-secondary {
    background: #fff !important;
    color: var(--zk-app-ink) !important;
    border: 1px solid var(--zk-app-gray200) !important;
  }
  .btn-google {
    border-radius: var(--zk-r-md) !important;
    min-height: 46px; font-family: var(--zk-app-font); font-weight: 600;
  }
  /* CTA pegada al fondo (detalle / formularios largos) */
  .zk-sticky-cta,
  .sticky-cta,
  .detail-cta-bar {
    position: fixed; left: 0; right: 0;
    bottom: calc(var(--zk-tabbar-h) + var(--zk-safe-bottom));
    z-index: 1300;
    display: flex; gap: 10px; align-items: center;
    padding: 10px 14px calc(10px + var(--zk-safe-bottom));
    background: rgba(255,255,255,0.96);
    -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
    border-top: 1px solid var(--zk-app-line);
    box-shadow: var(--zk-sh-sheet);
  }
  .zk-sticky-cta .btn-primary { flex: 1 1 auto; }

  /* ══════════════════════════════════════════════════════════════════════════
     6 · FORMULARIOS · INPUTS · SELECTS · TEXTAREA — campos app, alto 46-48,
        radio 12, foco teal. Cubre form-group/form-input compartidos y los
        modales.
     ══════════════════════════════════════════════════════════════════════════ */
  .form-group { margin-bottom: 14px; }
  .form-label,
  .modal-title + .form-label { font-family: var(--zk-app-font); font-weight: 600; color: var(--zk-app-ink2); font-size: 13px; }
  .form-input,
  .modal-input,
  input[type="text"], input[type="email"], input[type="password"],
  input[type="tel"], input[type="number"], input[type="search"],
  textarea, select {
    font-family: var(--zk-app-font) !important;
    font-size: 16px !important;            /* ≥16px → iOS no hace zoom al enfocar */
    border-radius: var(--zk-r-md) !important;
    border: 1px solid var(--zk-app-gray200) !important;
    background: var(--zk-app-gray50) !important;
    min-height: 48px;
    padding: 12px 14px;
    transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
    -webkit-appearance: none; appearance: none;
  }
  textarea { min-height: 96px; line-height: 1.45; }
  .form-input:focus,
  .modal-input:focus,
  input:focus, textarea:focus, select:focus {
    border-color: var(--zk-app-teal) !important;
    background: #fff !important;
    box-shadow: 0 0 0 3px rgba(0,166,147,0.12) !important;
    outline: none !important;
  }
  /* Select como campo app con chevron propio */
  select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: right 14px center !important;
    padding-right: 38px !important;
  }
  .input-wrapper { position: relative; }
  .input-icon { color: var(--zk-app-gray400) !important; }
  .password-toggle { color: var(--zk-app-gray400) !important; }

  /* ══════════════════════════════════════════════════════════════════════════
     7 · TOGGLES (switch) · CHECKBOX · RADIO — switch iOS teal.
     ══════════════════════════════════════════════════════════════════════════ */
  .switch,
  .zk-switch {
    position: relative; display: inline-block;
    width: 50px; height: 30px; flex: 0 0 50px;
  }
  .switch input,
  .zk-switch input { opacity: 0; width: 0; height: 0; }
  .switch .slider,
  .switch > span,
  .zk-switch .slider {
    position: absolute; inset: 0; cursor: pointer;
    background: var(--zk-app-gray300);
    border-radius: var(--zk-r-pill);
    transition: background .22s ease;
  }
  .switch .slider::before,
  .switch > span::before,
  .zk-switch .slider::before {
    content: ""; position: absolute;
    height: 26px; width: 26px; left: 2px; top: 2px;
    background: #fff; border-radius: 50%;
    box-shadow: 0 1px 3px rgba(0,0,0,0.25);
    transition: transform .22s cubic-bezier(.4,1.3,.6,1);
  }
  .switch input:checked + .slider,
  .switch input:checked + span,
  .zk-switch input:checked + .slider { background: var(--zk-app-teal); }
  .switch input:checked + .slider::before,
  .switch input:checked + span::before,
  .zk-switch input:checked + .slider::before { transform: translateX(20px); }

  /* Checkbox/radio acento teal */
  input[type="checkbox"], input[type="radio"] { accent-color: var(--zk-app-teal); width: 20px; height: 20px; }

  /* Opciones de tipo de cuenta del registro → tarjetas seleccionables app */
  .account-type-options { gap: 10px; }
  .account-type-option {
    border-radius: var(--zk-r-md) !important;
    border: 1.5px solid var(--zk-app-gray200) !important;
    padding: 12px !important;
    transition: border-color .15s ease, background .15s ease;
  }
  .account-type-option.selected {
    border-color: var(--zk-app-teal) !important;
    background: var(--zk-app-teal-light) !important;
  }

  /* ══════════════════════════════════════════════════════════════════════════
     8 · MODALES → HOJA CENTRADA (login/registro) y overlay app.
        Estructura: .modal-overlay > .modal-container (modals.js) y .zkc-overlay
        (cookies). Fondo oscurecido con blur; tarjeta con esquinas grandes.
     ══════════════════════════════════════════════════════════════════════════ */
  .modal-overlay,
  .zkc-overlay.zkc-center {
    background: rgba(16,34,46,0.42) !important;
    -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
    padding: 16px !important;
    align-items: center !important;
  }
  .modal-container,
  .zkc-overlay.zkc-center .zkc-modal {
    width: 100% !important;
    max-width: 440px !important;
    border-radius: 22px !important;
    border: none !important;
    box-shadow: var(--zk-sh-float) !important;
    animation: zkSheetPop .26s cubic-bezier(.2,.9,.3,1) both;
    max-height: 90vh; overflow-y: auto;
  }
  .modal-content { padding: 22px 20px !important; }
  .modal-title { font-family: var(--zk-app-font); font-weight: 800 !important; font-size: 21px !important; }
  .modal-subtitle { color: var(--zk-app-gray500) !important; }
  .modal-close {
    width: 34px; height: 34px; border-radius: 50%;
    background: var(--zk-app-gray100) !important; color: var(--zk-app-ink) !important;
    display: flex; align-items: center; justify-content: center;
  }
  @keyframes zkSheetPop {
    from { opacity: 0; transform: translateY(14px) scale(0.97); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
  }

  /* ══════════════════════════════════════════════════════════════════════════
     9 · BOTTOM-SHEET tipo iOS — el patrón para dropdowns, selector de tipo de
        publicación (botón +), filtros, ajustes contextuales, diálogos de
        confirmación, menús contextuales. Lo inyecta/gestiona JS con esta clase.
        Estructura esperada:
          <div class="zk-sheet-scrim" data-zk-sheet>
            <div class="zk-sheet">
              <div class="zk-sheet__grab"></div>
              <div class="zk-sheet__head">…título…</div>
              <div class="zk-sheet__body">…opciones/filtros…</div>
            </div>
          </div>
     ══════════════════════════════════════════════════════════════════════════ */
  .zk-sheet-scrim {
    position: fixed; inset: 0; z-index: 2000;
    background: rgba(16,34,46,0.45);
    -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
    display: flex; align-items: flex-end; justify-content: center;
    opacity: 0; transition: opacity .22s ease;
  }
  .zk-sheet-scrim.is-open { opacity: 1; }
  .zk-sheet {
    width: 100%; max-width: 560px;
    background: #fff;
    border-radius: 22px 22px 0 0;
    box-shadow: var(--zk-sh-sheet);
    padding: 8px 0 calc(12px + var(--zk-safe-bottom));
    max-height: 86vh; overflow-y: auto;
    transform: translateY(100%);
    transition: transform .3s cubic-bezier(.2,.9,.3,1);
  }
  .zk-sheet-scrim.is-open .zk-sheet { transform: translateY(0); }
  .zk-sheet__grab {
    width: 38px; height: 5px; border-radius: var(--zk-r-pill);
    background: var(--zk-app-gray300);
    margin: 6px auto 4px;
  }
  .zk-sheet__head {
    font-family: var(--zk-app-font); font-weight: 800; font-size: 17px;
    color: var(--zk-app-ink);
    padding: 8px 20px 12px; text-align: center;
  }
  .zk-sheet__head small { display: block; font-weight: 500; font-size: 13px; color: var(--zk-app-gray500); margin-top: 2px; }
  .zk-sheet__body { padding: 0 14px 6px; }
  /* Fila de opción de hoja (selector de tipo, dropdown convertido). */
  .zk-sheet__opt {
    display: flex; align-items: center; gap: 14px;
    width: 100%;
    padding: 14px 12px;
    border: none; background: transparent;
    border-radius: var(--zk-r-md);
    font-family: var(--zk-app-font); font-size: 16px; font-weight: 600;
    color: var(--zk-app-ink); text-align: left;
    -webkit-tap-highlight-color: transparent;
    cursor: pointer;
  }
  .zk-sheet__opt:active { background: var(--zk-app-gray100); }
  .zk-sheet__opt + .zk-sheet__opt { border-top: 1px solid var(--zk-app-line); }
  .zk-sheet__opt .zk-sheet__ico {
    flex: 0 0 42px; width: 42px; height: 42px; border-radius: 12px;
    display: flex; align-items: center; justify-content: center;
    background: var(--zk-app-teal-light); color: var(--zk-app-teal);
    font-size: 18px;
  }
  .zk-sheet__opt .zk-sheet__ico--gift { background: #fff1ec; color: var(--zk-app-accent); }
  .zk-sheet__opt small { display: block; font-weight: 500; font-size: 13px; color: var(--zk-app-gray500); margin-top: 1px; }
  .zk-sheet__opt .fa-chevron-right { margin-left: auto; color: var(--zk-app-gray300); }
  /* Pie de hoja con botón cerrar/acción */
  .zk-sheet__foot { padding: 8px 16px 0; }
  .zk-sheet__cancel {
    width: 100%; min-height: 48px;
    border-radius: var(--zk-r-md);
    background: var(--zk-app-gray100); border: none;
    font-family: var(--zk-app-font); font-weight: 700; font-size: 16px;
    color: var(--zk-app-ink);
  }

  /* Convertir SELECTS nativos largos / dropdowns de filtro a aspecto hoja-trigger:
     el <select> sigue siendo nativo (rueda iOS), pero con piel app (ya cubierto
     en §6). Los menús JS (orden, filtros) usan .zk-sheet. */

  /* ══════════════════════════════════════════════════════════════════════════
     10 · DIÁLOGO DE CONFIRMACIÓN (alert app) — centrado, dos acciones.
         Estructura: .zk-dialog-scrim > .zk-dialog (.zk-dialog__title/__msg/__row)
     ══════════════════════════════════════════════════════════════════════════ */
  .zk-dialog-scrim {
    position: fixed; inset: 0; z-index: 2100;
    background: rgba(16,34,46,0.45);
    display: flex; align-items: center; justify-content: center;
    padding: 24px;
  }
  .zk-dialog {
    width: 100%; max-width: 320px;
    background: #fff; border-radius: 18px;
    box-shadow: var(--zk-sh-float);
    overflow: hidden;
    animation: zkSheetPop .22s ease both;
  }
  .zk-dialog__pad { padding: 22px 20px 16px; text-align: center; }
  .zk-dialog__title { font-family: var(--zk-app-font); font-weight: 800; font-size: 17px; color: var(--zk-app-ink); }
  .zk-dialog__msg { font-family: var(--zk-app-font); font-size: 14px; color: var(--zk-app-gray500); margin-top: 6px; line-height: 1.4; }
  .zk-dialog__row { display: flex; border-top: 1px solid var(--zk-app-line); }
  .zk-dialog__btn {
    flex: 1 1 0; min-height: 50px; border: none; background: #fff;
    font-family: var(--zk-app-font); font-size: 16px; font-weight: 600;
    color: var(--zk-app-teal);
  }
  .zk-dialog__btn + .zk-dialog__btn { border-left: 1px solid var(--zk-app-line); }
  .zk-dialog__btn--danger { color: var(--zk-app-error); font-weight: 700; }
  .zk-dialog__btn:active { background: var(--zk-app-gray100); }

  /* ══════════════════════════════════════════════════════════════════════════
     11 · TOASTS — píldora flotante sobre la tab bar, auto-desvanecido.
         Estructura: .zk-toast-host > .zk-toast (.is-ok / .is-err)
     ══════════════════════════════════════════════════════════════════════════ */
  .zk-toast-host {
    position: fixed; left: 0; right: 0;
    bottom: calc(var(--zk-tabbar-h) + 14px + var(--zk-safe-bottom));
    z-index: 2200;
    display: flex; flex-direction: column; align-items: center; gap: 8px;
    pointer-events: none;
  }
  .zk-toast {
    max-width: 88%;
    display: flex; align-items: center; gap: 10px;
    padding: 12px 16px;
    background: rgba(26,26,26,0.94); color: #fff;
    border-radius: var(--zk-r-pill);
    font-family: var(--zk-app-font); font-size: 14px; font-weight: 600;
    box-shadow: var(--zk-sh-float);
    animation: zkToastIn .26s ease both;
  }
  .zk-toast.is-ok i { color: #4ade80; }
  .zk-toast.is-err i { color: #fca5a5; }
  .zk-toast.is-leaving { animation: zkToastOut .24s ease both; }
  @keyframes zkToastIn  { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
  @keyframes zkToastOut { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(8px); } }

  /* ══════════════════════════════════════════════════════════════════════════
     12 · ESTADOS VACÍOS — espejo de EmptyStateBox.swift: icono suave + título +
         subtítulo + CTA cápsula teal, centrado.
     ══════════════════════════════════════════════════════════════════════════ */
  .empty-state,
  .mercadillo-empty,
  .notif-dropdown__empty,
  .zk-empty {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    text-align: center;
    padding: 40px 28px;
    color: var(--zk-app-gray500);
    font-family: var(--zk-app-font);
  }
  .empty-state .emoji,
  .empty-state i,
  .mercadillo-empty-icon,
  .zk-empty__icon {
    font-size: 44px !important; color: var(--zk-app-gray300) !important;
    margin-bottom: 12px;
  }
  .empty-state h3,
  .zk-empty__title { font-size: 16px; font-weight: 700; color: var(--zk-app-ink); margin: 0 0 4px; }
  .empty-state p,
  .zk-empty__sub { font-size: 14px; color: var(--zk-app-gray500); line-height: 1.45; }
  .zk-empty__cta {
    margin-top: 14px; min-height: 44px; padding: 0 22px;
    border-radius: var(--zk-r-pill); border: none;
    background: var(--zk-app-teal); color: #fff;
    font-family: var(--zk-app-font); font-weight: 700;
  }

  /* ══════════════════════════════════════════════════════════════════════════
     13 · FILA DE PERFIL / AJUSTES — celda con icono + texto + chevron/switch.
         (mi-zokko: setting-item, settings-list, activity-item, mz-id-row)
     ══════════════════════════════════════════════════════════════════════════ */
  .settings-list,
  .activity-list { background: #fff; border-radius: var(--zk-r-card); border: 1px solid var(--zk-app-gray200); overflow: hidden; box-shadow: var(--zk-sh-card); }
  .setting-item,
  .activity-item,
  .zk-edit-row {
    display: flex; align-items: center; gap: 14px;
    padding: 14px 16px;
    min-height: 56px;
    background: #fff;
    font-family: var(--zk-app-font);
  }
  .setting-item + .setting-item,
  .activity-item + .activity-item { border-top: 1px solid var(--zk-app-line); }
  .setting-item .setting-info,
  .activity-item .activity-content { flex: 1 1 auto; min-width: 0; }
  .activity-icon {
    flex: 0 0 40px; width: 40px; height: 40px; border-radius: 12px;
    display: flex; align-items: center; justify-content: center;
    background: var(--zk-app-teal-light); color: var(--zk-app-teal);
  }
  .activity-title,
  .setting-info > :first-child { font-weight: 600; color: var(--zk-app-ink); font-size: 15px; }
  .activity-time,
  .setting-info > :last-child { font-size: 13px; color: var(--zk-app-gray500); }
  .activity-amount { font-weight: 800; color: var(--zk-app-teal); font-family: var(--zk-app-font); }

  /* ══════════════════════════════════════════════════════════════════════════
     14 · NOTIFICACIONES (página /notificaciones) — filas app.
     ══════════════════════════════════════════════════════════════════════════ */
  .messages-layout,
  .notifications-list { display: block !important; }
  /* OJO: .message-content es el CONTENEDOR de la burbuja del CHAT (envuelve la
     .message-bubble + .message-time). NO debe llevar el estilo de fila de
     notificación (.notif-item): le metía fondo blanco + padding + borde →
     cada mensaje salía como un CUADRO BLANCO envolviendo la burbuja verde
     (doble chip). Lo dejamos transparente; el chip único es la .message-bubble. */
  .notif-item {
    display: flex; gap: 12px; align-items: flex-start;
    padding: 14px 16px;
    background: #fff;
    border-bottom: 1px solid var(--zk-app-line);
    font-family: var(--zk-app-font);
  }
  .message-content {
    background: transparent !important;
    border: 0 !important;
    border-bottom: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    display: flex; flex-direction: column;
    font-family: var(--zk-app-font);
  }
  .message-group.own .message-content { align-items: flex-end; }
  .notif-item .message-avatar {
    flex: 0 0 44px; width: 44px; height: 44px; border-radius: 50%; object-fit: cover;
  }
  .message-sender { font-weight: 700; color: var(--zk-app-ink); font-size: 14px; }
  .message-preview { font-size: 13px; color: var(--zk-app-gray500); }
  .actions-bar {
    position: sticky; top: var(--zk-app-header-h); z-index: 5;
    background: #fff; border-bottom: 1px solid var(--zk-app-line);
    padding: 10px 14px;
  }

  /* ══════════════════════════════════════════════════════════════════════════
     15 · CHAT / MENSAJES — lista de conversaciones + burbujas + composer app.
     ══════════════════════════════════════════════════════════════════════════ */
  /* En móvil: o lista o conversación; la página ya alterna. Damos piel app a ambas. */
  .conversations-sidebar,
  .chat-area { width: 100% !important; }
  .conversation-item,
  .conversations-list > * {
    font-family: var(--zk-app-font);
  }
  .conversation-avatar { width: 48px !important; height: 48px !important; border-radius: 50% !important; }
  .conversation-name { font-weight: 700; color: var(--zk-app-ink); font-size: 15px; }
  .conversation-preview { color: var(--zk-app-gray500); font-size: 13px; }
  .conversation-time { color: var(--zk-app-gray400); font-size: 12px; }
  .conversation-product-pill {
    background: var(--zk-app-teal-light) !important; color: var(--zk-app-teal-dark) !important;
    border-radius: var(--zk-r-pill); font-size: 11px; font-weight: 600; padding: 2px 8px;
  }

  /* Burbujas de mensaje — UNA sola burbuja por mensaje (paridad app):
     propia = teal a la derecha; entrante = gris claro a la izquierda. La
     burbuja es el ÚNICO chip; sin caja blanca externa (ver .message-content). */
  .messages-container,
  .messages-inner { padding: 12px 12px 90px !important; }
  .message-bubble {
    display: inline-block;
    max-width: 100% !important;
    width: fit-content;
    border-radius: 16px !important;
    padding: 8px 12px !important;
    font-family: var(--zk-app-font); font-size: 14px !important; line-height: 1.35;
    box-shadow: 0 1px 1.5px rgba(16,34,46,0.06);
  }
  /* La burbuja PROPIA (lado derecho del grupo .own) es teal. */
  .message-group.own .message-bubble,
  .message-bubble.sent,
  .message.sent .message-bubble,
  .message-bubble.mine {
    background: var(--zk-app-teal) !important; color: #fff !important;
    border: 0 !important;
    border-bottom-right-radius: 5px !important;
  }
  /* La burbuja ENTRANTE (gris claro, como la app). */
  .message-group:not(.own) .message-bubble,
  .message-bubble.received,
  .message.received .message-bubble,
  .message-bubble.theirs {
    background: var(--zk-app-gray100) !important; color: var(--zk-app-ink) !important;
    border: 0 !important;
    border-bottom-left-radius: 5px !important;
  }
  /* Hora + ticks compactos e integrados bajo la burbuja (no en una caja). */
  .message-time {
    font-size: 10.5px !important; color: var(--zk-app-gray400) !important;
    margin: 2px 4px 0 !important; padding: 0 !important;
    display: inline-flex; align-items: center; gap: 3px;
  }
  .message-time .message-status { display: inline-flex; align-items: center; }
  .message-time .status-icon { font-size: 10px; line-height: 1; }

  /* Composer fijo sobre la tab bar */
  .message-input-area {
    position: fixed; left: 0; right: 0;
    bottom: calc(var(--zk-tabbar-h) + var(--zk-safe-bottom));
    z-index: 1250;
    background: rgba(255,255,255,0.97);
    -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
    border-top: 1px solid var(--zk-app-line);
    padding: 8px 10px calc(8px + var(--zk-safe-bottom)) !important;
  }
  .message-input-wrapper {
    background: var(--zk-app-gray100) !important;
    border-radius: var(--zk-r-pill) !important;
    border: 1px solid transparent !important;
  }
  .message-input-wrapper:focus-within { border-color: var(--zk-app-teal) !important; background: #fff !important; }
  .message-input { font-family: var(--zk-app-font); font-size: 16px !important; }
  .send-btn {
    width: 44px !important; height: 44px !important; min-height: 44px;
    border-radius: 50% !important;
    background: var(--zk-app-teal) !important; color: #fff !important;
    display: flex; align-items: center; justify-content: center;
  }
  /* En chat NO mostramos la tab bar (pantalla inmersiva tipo app) — opcional via clase */
  body.zk-chat-immersive #zkAppTabbar { display: none; }
  body.zk-chat-immersive .message-input-area { bottom: var(--zk-safe-bottom); }

  /* ══════════════════════════════════════════════════════════════════════════
     16 · DETALLE (producto/coche/chollo) — galería full-bleed + CTA pegada.
         Cubre subdir/index.html (product-detail, detalle-chollo, motor coche).
     ══════════════════════════════════════════════════════════════════════════ */
  .detail-gallery,
  .product-gallery,
  .pd-gallery { border-radius: 0 !important; margin-left: -14px; margin-right: -14px; }
  .pd-price,
  .detail-price {
    font-family: var(--zk-app-font); font-weight: 800; color: var(--zk-app-teal); font-size: 26px;
  }
  /* Reserva hueco para la CTA pegada del detalle */
  body.zk-has-sticky-cta { padding-bottom: calc(var(--zk-tabbar-h) + 72px + var(--zk-safe-bottom)) !important; }

  /* ══════════════════════════════════════════════════════════════════════════
     17 · HOJA DE FILTROS — usa el bottom-sheet (§9). Aquí, los controles dentro.
     ══════════════════════════════════════════════════════════════════════════ */
  .zk-sheet .filter-group { padding: 12px 6px; border-bottom: 1px solid var(--zk-app-line); }
  .zk-sheet .filter-group:last-child { border-bottom: none; }
  .zk-sheet .filter-group__label { font-family: var(--zk-app-font); font-weight: 700; font-size: 14px; color: var(--zk-app-ink); margin-bottom: 8px; }
  .zk-sheet .filter-apply {
    width: 100%; min-height: 50px; margin-top: 6px;
    border-radius: var(--zk-r-md); border: none;
    background: var(--zk-app-teal); color: #fff;
    font-family: var(--zk-app-font); font-weight: 700; font-size: 16px;
  }

  /* ══════════════════════════════════════════════════════════════════════════
     18 · UTILIDADES — scroll suave, sin selección azul fea, oculta scrollbars
         horizontales de los rieles, respeta reduce-motion.
     ══════════════════════════════════════════════════════════════════════════ */
  * { -webkit-tap-highlight-color: rgba(0,0,0,0); }
  a, button { -webkit-touch-callout: none; }
  .zk-hscroll { display: flex; gap: 12px; overflow-x: auto; -webkit-overflow-scrolling: touch; scroll-snap-type: x mandatory; }
  .zk-hscroll::-webkit-scrollbar { display: none; }
  .zk-hscroll > * { scroll-snap-align: start; }

  /* ══════════════════════════════════════════════════════════════════════════
     19 · BARRA DE PESTAÑAS — badge de Mensajes (espejo de ZokkeoTabBar iOS) +
         AUTO-HIDE suave al hacer scroll (estilo app). El estilo base del tab bar
         vive en css/zokko-main.css; aquí solo se AÑADE el badge y la transición.
     ══════════════════════════════════════════════════════════════════════════ */
  /* La pestaña ancla el badge respecto a su icono. */
  #zkAppTabbar .zk-tab { position: relative; }

  /* Badge numérico de mensajes sin leer sobre el icono de la pestaña Mensajes. */
  #zkAppTabbar .zk-tab__badge {
    position: absolute;
    top: 2px;
    left: 50%;
    margin-left: 4px;               /* desplaza el badge al borde superior-derecho del icono */
    min-width: 16px; height: 16px;
    padding: 0 4px;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center; justify-content: center;
    border-radius: 999px;
    background: var(--zk-app-error);
    color: #fff;
    font-family: var(--zk-app-font);
    font-size: 9px; font-weight: 700; line-height: 1;
    border: 1.5px solid #fff;
    pointer-events: none;
  }

  /* BARRA INFERIOR SIEMPRE FIJA. FIX iOS 26 / WebKit 297779 (flip edge-on del
     fixed durante el momentum scroll en el iPhone real de Joseba): se FUERZA una
     capa GPU ESTABLE con translate3d(0,0,0) (promoción 2D, no mueve) + backface
     oculto — NO se quitan los transforms (eso lo empeora). Fondo SÓLIDO sin
     backdrop-filter (un blur sobre fixed re-crea el flip). El estilo base vive en
     zokko-main.css; aquí lo reforzamos con !important.
     NOTA: este fichero NO está enlazado en las HTML servidas (el CSS efectivo es
     zokko-main.css); se mantiene a paridad por si se enlazara en el futuro. */
  #zkAppTabbar {
    background: #ffffff !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
    transform: translate3d(0,0,0) !important;
    -webkit-transform: translate3d(0,0,0) !important;
    -webkit-backface-visibility: hidden !important;
    backface-visibility: hidden !important;
  }
  /* Capa GPU estable para cada hijo (＋ central incluido): translate3d(0,0,0) +
     backface oculto. La elevación del ＋ es por margin-top (zokko-main.css), así
     el translate3d 0,0,0 solo estabiliza, no mueve. */
  #zkAppTabbar *,
  #zkAppTabbar .zk-tab--plus,
  #zkAppTabbar .zk-tab--plus .zk-plus {
    transform: translate3d(0,0,0) !important;
    -webkit-transform: translate3d(0,0,0) !important;
    -webkit-backface-visibility: hidden !important;
    backface-visibility: hidden !important;
  }
  /* Por si quedara la clase de un build anterior: la neutralizamos. */
  #zkAppTabbar.zk-tabbar-hidden {
    transform: none !important;
  }

} /* /@media max-width:640px */

@media (max-width: 640px) and (prefers-reduced-motion: reduce) {
  .modal-container, .zk-sheet, .zk-toast, .zk-dialog, .zk-card,
  .mercadillo-card, .dealsx-card { animation: none !important; transition: none !important; }
}
