:root {
    /* ───────────────────────────────────────────────
       BRAND — Pantry "Home Intelligence"
       Paleta canónica (light) das guidelines:
         Navy     #1B2A4A  →  --color-primary
         Preto    #0F0F0F  →  --color-text / --ink
         Off-white#F5F4F0  →  --color-bg / --bg
         Bege     #E8E6DF  →  --color-border
         Cinza    #AAAAAA  →  --color-muted / --ink-3
       Tipografia: Helvetica Neue Light 300 (display) + Regular 400 (body).
       Sem serif. --color-accent (amber) preservado por enquanto para
       badges/active states existentes em toda a app.
       ─────────────────────────────────────────────── */
    --color-primary: #1B2A4A;
    --color-primary-700: #132039;
    --color-accent: oklch(0.72 0.18 55);
    --color-bg: #F5F4F0;
    --color-surface: #ffffff;
    --color-border: #E8E6DF;
    --color-text: #0F0F0F;
    --color-muted: #AAAAAA;
    --shadow-card: 0 1px 2px rgba(0,0,0,.04), 0 20px 50px -20px rgba(27,42,74,.18);
    --shadow-soft: 0 1px 2px rgba(0,0,0,.04), 0 8px 24px -12px rgba(27,42,74,.12);
    --radius-card: 1.1rem;
    --transition: 150ms ease;

    /* Font stacks — Helvetica Neue como base em TUDO (sans + display).
       Instrument Serif italic é o acento editorial, usado raramente via
       .serif utility (uma palavra por título, frases curtas em narrativa
       ou empty states). NUNCA em parágrafos. Carregada do Google Fonts. */
    --font-sans:    'Helvetica Neue', Helvetica, Inter, Arial, sans-serif;
    --font-display: 'Helvetica Neue', Helvetica, Inter, Arial, sans-serif;
    --font-serif:   'Instrument Serif', Georgia, 'Times New Roman', serif;

    /* Monochrome scale — alinhado com a brand (preto #0F0F0F + cinza #AAAAAA).
       Antes inspirado em Zinc; agora segue exactamente as guidelines. */
    --ink:          #0F0F0F;
    --ink-2:        #52525B;
    --ink-3:        #AAAAAA;
    --ink-4:        #D4D4D8;
    --line:         #ECECEE;
    --line-2:       #F4F4F5;
    --line-strong:  #D4D4D8;

    /* Functional state colors — used surgically (text, dots) */
    --pos:          #15803D;
    --pos-soft:     #DCFCE7;
    --neg:          #B91C1C;
    --neg-soft:     #FEE2E2;
    --warn:         #92400E;
    --warn-soft:    #FEF3C7;

    /* Radii */
    --r-sm:         8px;
    --r-md:         10px;
    --r-lg:         14px;

    /* ───────────────────────────────────────────────
       Surface tokens — usar EM VEZ de #fff / #F5F4F0
       hardcoded. São os pontos de inversão para dark mode.
       ─────────────────────────────────────────────── */
    --bg:               #F5F4F0;   /* fundo da página */
    --surface:          #FFFFFF;   /* cards, inputs, modals */
    --surface-2:        #FBFAF7;   /* surfaces ligeiramente mais escuras (welcome optin, etc) */
    --surface-overlay:  rgba(255,255,255,0.96); /* mobile-nav, top bars com blur */
    --surface-hover:    rgba(9,9,11,0.04);      /* hover sobre surfaces brancas */

    /* Inversões textuais usadas em fundos escuros (botões primários, etc).
       Em dark mode estes invertem-se também — `--on-ink` deixa de ser branco. */
    --on-ink:           #FFFFFF;   /* texto sobre var(--ink) — botões primários */
    --ink-hover:        #1F1F23;   /* hover de var(--ink) — escurece em light, clareia em dark */

    /* Sombras parametrizadas — em dark mode usa-se borders/glows em vez de
       drop-shadows (que ficam invisíveis em fundo escuro). */
    --shadow-1:         0 1px 2px rgba(15,23,42,0.04);
    --shadow-2:         0 1px 2px rgba(15,23,42,0.04), 0 8px 24px -12px rgba(15,23,42,0.12);
    --shadow-3:         0 1px 2px rgba(15,23,42,0.04), 0 20px 50px -20px rgba(15,23,42,0.12);
    --shadow-mobile-nav: 0 -8px 32px rgba(15,23,42,0.16);

    /* Foco (accessibility) — em dark mode é ring claro, não escuro */
    --ring:             rgba(9,9,11,0.08);

    /* Skeletons / placeholders */
    --skeleton:         rgba(9,9,11,0.06);

    /* Navigation tokens — INDEPENDENTES do tema porque a sidebar
       é sempre escura em light mode (estilo zinc/dark sidebar) e
       continua escura em dark mode (com tonalidade ligeiramente
       diferente do background). */
    --nav-bg:           #09090B;             /* navy quase preta */
    --nav-bg-active:    rgba(255,255,255,0.08);
    --nav-fg:           rgba(255,255,255,0.92);
    --nav-fg-muted:     rgba(255,255,255,0.55);
    --nav-divider:      rgba(255,255,255,0.06);

    color-scheme: light;
}

/* ───────────────────────────────────────────────────
   DARK MODE — paleta inspirada na navy do brand (#1B2A4A)
   com texto em cream warm (#F4F3EE) que evoca o cream
   do landing. Não é violeta-poster — é Pantry escuro.
   ─────────────────────────────────────────────────── */
[data-theme="dark"] {
    /* Brand legacy */
    --color-primary: #C8A66E;       /* o cream-amber de marca destaca-se */
    --color-primary-700: #B5915F;
    --color-bg: #0E1424;
    --color-surface: #181F31;
    --color-border: rgba(255,255,255,0.08);
    --color-text: #F4F3EE;
    --color-muted: #8A8D96;
    --shadow-card: 0 1px 2px rgba(0,0,0,0.5), 0 20px 50px -20px rgba(0,0,0,0.6);
    --shadow-soft: 0 1px 2px rgba(0,0,0,0.4), 0 8px 24px -12px rgba(0,0,0,0.4);

    /* Monochrome inverted — texto claro sobre fundo escuro */
    --ink:          #F4F3EE;        /* "tinta" passa a ser cream warm */
    --ink-2:        #B6B7BC;        /* secundário */
    --ink-3:        #71747C;        /* muted */
    --ink-4:        #3F4452;        /* dividers / faint ui */
    --line:         rgba(255,255,255,0.08);
    --line-2:       rgba(255,255,255,0.04);
    --line-strong:  rgba(255,255,255,0.16);

    /* States — versões suavizadas para dark backgrounds.
       Os "soft" passam a ser tints translúcidos em vez de tons pastel. */
    --pos:          #4ADE80;
    --pos-soft:     rgba(74,222,128,0.12);
    --neg:          #F87171;
    --neg-soft:     rgba(248,113,113,0.12);
    --warn:         #FBBF24;
    --warn-soft:    rgba(251,191,36,0.12);

    /* Surfaces — gradação subtil entre página e cards.
       Inspiração: navy #0E1424 → cards um pouco mais claros #181F31. */
    --bg:               #0E1424;
    --surface:          #181F31;
    --surface-2:        #1F273C;
    --surface-overlay:  rgba(24,31,49,0.92);
    --surface-hover:    rgba(255,255,255,0.04);

    /* Inversões — botões primários ficam em cream-on-navy em vez de white-on-black */
    --on-ink:           #0E1424;    /* texto sobre var(--ink) — invertido */
    --ink-hover:        #E5E2D8;    /* hover de var(--ink) clareia em dark */

    /* Sombras quase invisíveis em fundo escuro — usar borders/glows */
    --shadow-1:         0 1px 0 rgba(255,255,255,0.03), 0 2px 4px rgba(0,0,0,0.4);
    --shadow-2:         0 2px 4px rgba(0,0,0,0.4), 0 8px 24px -12px rgba(0,0,0,0.6);
    --shadow-3:         0 4px 8px rgba(0,0,0,0.4), 0 20px 60px -20px rgba(0,0,0,0.7);
    --shadow-mobile-nav: 0 -8px 32px rgba(0,0,0,0.5);

    --ring:             rgba(244,243,238,0.12);
    --skeleton:         rgba(255,255,255,0.06);

    /* Em dark mode a sidebar usa um tom ligeiramente mais escuro do
       que o background da página — gradação subtil entre página
       (#0E1424) e sidebar (#080C18) para criar profundidade. */
    --nav-bg:           #080C18;
    --nav-bg-active:    rgba(255,255,255,0.06);
    --nav-fg:           rgba(244,243,238,0.92);
    --nav-fg-muted:     rgba(244,243,238,0.50);
    --nav-divider:      rgba(255,255,255,0.05);

    color-scheme: dark;
}

/* Auto-prefer dark mode quando o user nunca escolheu explicitamente
   (não tem data-theme atribuído manualmente). O bootstrap script no
   App.razor lida com a leitura do localStorage para over-ride. */
@media (prefers-color-scheme: dark) {
    :root:not([data-theme]) {
        /* As mesmas regras do [data-theme="dark"] aplicadas via fallback —
           o bootstrap normalmente já põe data-theme antes de paint, mas
           caso não corra (JS desligado), pelo menos respeita o sistema. */
        --color-bg: #0E1424;
        --color-surface: #181F31;
        --color-border: rgba(255,255,255,0.08);
        --color-text: #F4F3EE;
        --ink:          #F4F3EE;
        --ink-2:        #B6B7BC;
        --ink-3:        #71747C;
        --ink-4:        #3F4452;
        --line:         rgba(255,255,255,0.08);
        --line-2:       rgba(255,255,255,0.04);
        --line-strong:  rgba(255,255,255,0.16);
        --pos:          #4ADE80;
        --pos-soft:     rgba(74,222,128,0.12);
        --neg:          #F87171;
        --neg-soft:     rgba(248,113,113,0.12);
        --warn:         #FBBF24;
        --warn-soft:    rgba(251,191,36,0.12);
        --bg:               #0E1424;
        --surface:          #181F31;
        --surface-2:        #1F273C;
        --surface-overlay:  rgba(24,31,49,0.92);
        --surface-hover:    rgba(255,255,255,0.04);
        --on-ink:           #0E1424;
        --ink-hover:        #E5E2D8;
        --shadow-1:         0 1px 0 rgba(255,255,255,0.03), 0 2px 4px rgba(0,0,0,0.4);
        --shadow-2:         0 2px 4px rgba(0,0,0,0.4), 0 8px 24px -12px rgba(0,0,0,0.6);
        --shadow-3:         0 4px 8px rgba(0,0,0,0.4), 0 20px 60px -20px rgba(0,0,0,0.7);
        --shadow-mobile-nav: 0 -8px 32px rgba(0,0,0,0.5);
        --ring:             rgba(244,243,238,0.12);
        --skeleton:         rgba(255,255,255,0.06);
        color-scheme: dark;
    }
}

/* ─────────────────────────────────────────────────────────
   GLOBAL: Kill native number input spinners across the app.
   These rules MUST be global (not in a .razor.css file)
   because Blazor CSS isolation doesn't cleanly target
   ::-webkit-* pseudo-elements on dynamically rendered
   InputNumber children, and Bootstrap is loaded globally
   with conflicting form styles.
   ───────────────────────────────────────────────────────── */
.cart-list input[type="number"],
.cart-stepper input[type="number"],
.cart-row-price-row input[type="number"],
.nc-shell input[type="number"] {
    -webkit-appearance: textfield !important;
    -moz-appearance: textfield !important;
    appearance: textfield !important;
}

.cart-list input[type="number"]::-webkit-outer-spin-button,
.cart-list input[type="number"]::-webkit-inner-spin-button,
.cart-stepper input[type="number"]::-webkit-outer-spin-button,
.cart-stepper input[type="number"]::-webkit-inner-spin-button,
.cart-row-price-row input[type="number"]::-webkit-outer-spin-button,
.cart-row-price-row input[type="number"]::-webkit-inner-spin-button,
.nc-shell input[type="number"]::-webkit-outer-spin-button,
.nc-shell input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none !important;
    appearance: none !important;
    margin: 0 !important;
    display: none !important;
    height: 0 !important;
    width: 0 !important;
    visibility: hidden !important;
    pointer-events: none !important;
}

/* ─────────────────────────────────────────────────────────
   GLOBAL: Cart stepper layout (qty buttons + input)
   Same reason as above — needs to apply to InputNumber's
   rendered <input> child without isolation interference.
   ───────────────────────────────────────────────────────── */
.cart-list .cart-stepper {
    display: inline-flex !important;
    align-items: stretch !important;
    border: 1px solid var(--line) !important;
    border-radius: 6px !important;
    overflow: hidden !important;
    background: var(--surface) !important;
    height: 28px !important;
    width: max-content !important;
}
.cart-list .cart-stepper:hover { border-color: var(--ink-3) !important; }
.cart-list .cart-stepper:focus-within {
    border-color: var(--ink) !important;
    box-shadow: 0 0 0 3px rgba(9,9,11,.06) !important;
}
.cart-list .cart-stepper-btn {
    width: 26px !important;
    border: none !important;
    background: transparent !important;
    color: var(--ink-2) !important;
    font-size: 14px !important;
    line-height: 1 !important;
    cursor: pointer !important;
    padding: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    transition: all 120ms ease !important;
}
.cart-list .cart-stepper-btn:hover {
    background: var(--line-2) !important;
    color: var(--ink) !important;
}
.cart-list .cart-stepper input,
.cart-list input.cart-stepper-input {
    width: 38px !important;
    min-width: 38px !important;
    border: none !important;
    border-left: 1px solid var(--line) !important;
    border-right: 1px solid var(--line) !important;
    border-radius: 0 !important;
    text-align: center !important;
    font: inherit !important;
    font-size: 13px !important;
    font-weight: 600 !important;
    background: transparent !important;
    color: var(--ink) !important;
    padding: 0 !important;
    margin: 0 !important;
    box-shadow: none !important;
    outline: none !important;
}
.cart-list .cart-stepper input:focus,
.cart-list input.cart-stepper-input:focus {
    outline: none !important;
    background: var(--line-2) !important;
    box-shadow: none !important;
}

/* Price input — flat, ghost style */
.cart-list .cart-row-price-row {
    display: inline-flex !important;
    align-items: center !important;
    gap: 6px !important;
    justify-content: flex-end !important;
}
.cart-list input.cart-num-input,
.cart-list input.cart-row-price-input {
    width: 78px !important;
    padding: 5px 10px !important;
    border: 1px solid transparent !important;
    border-radius: 6px !important;
    background: transparent !important;
    font: inherit !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    color: var(--ink) !important;
    text-align: right !important;
    font-variant-numeric: tabular-nums !important;
    letter-spacing: -0.1px !important;
    transition: all 120ms ease !important;
    box-shadow: none !important;
}
.cart-list input.cart-num-input:hover,
.cart-list input.cart-row-price-input:hover {
    background: var(--surface-hover) !important;
}
.cart-list input.cart-num-input:focus,
.cart-list input.cart-row-price-input:focus {
    outline: none !important;
    background: var(--surface) !important;
    border-color: var(--ink) !important;
    box-shadow: 0 0 0 3px var(--ring) !important;
}

/* Mobile adjustments — stepper goes full width */
@media (max-width: 768px) {
    .cart-list .cart-stepper {
        height: 32px !important;
        width: max-content !important;
    }
    .cart-list .cart-stepper-btn { width: 30px !important; }
    .cart-list .cart-stepper input,
    .cart-list input.cart-stepper-input {
        width: 40px !important;
        min-width: 40px !important;
        font-size: 14px !important;
    }
    .cart-list input.cart-num-input,
    .cart-list input.cart-row-price-input {
        width: 92px !important;
    }
}

@media (max-width: 420px) {
    .cart-list .cart-stepper { width: 100% !important; }
    .cart-list .cart-stepper input,
    .cart-list input.cart-stepper-input {
        flex: 1 !important;
        width: auto !important;
    }
}

/* ─────────────────────────────────────────────────────────
   Auth pages (Login, Registo, JuntarFamilia) shared
   primitives. AuthLayout uses these globally because CSS
   isolation can't cross from layout to children.
   ───────────────────────────────────────────────────────── */
.auth-page {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 12px;
    background: var(--bg);
    padding: 24px;
}

.auth-card {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-lg);
    padding: 32px 28px;
    width: 100%;
    max-width: 420px;
    box-shadow: var(--shadow-3);
}

.auth-brand {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
    margin-bottom: 28px;
}

.auth-brand img { height: 48px; width: auto; }

.auth-h1 {
    margin: 0;
    font-size: 18px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: -0.3px;
    text-align: center;
}

.auth-sub {
    margin: 4px 0 0;
    font-size: 13px;
    color: var(--ink-2);
    text-align: center;
}

.auth-form {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.auth-field {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.auth-field label {
    font-size: 12px;
    font-weight: 500;
    color: var(--ink-2);
}

.auth-input {
    width: 100%;
    padding: 9px 12px;
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    background: var(--surface);
    color: var(--ink);
    font: inherit;
    font-size: 13.5px;
    transition: border-color 120ms ease, box-shadow 120ms ease;
}

.auth-input::placeholder { color: var(--ink-3); }
.auth-input:hover { border-color: var(--ink-3); }
.auth-input:focus {
    outline: none;
    border-color: var(--ink);
    box-shadow: 0 0 0 3px var(--ring);
}

/* Wrapper para input de password com botão de toggle (olhinho).
   O input fica com padding-right extra para deixar espaço ao botão. */
.auth-pw-wrap {
    position: relative;
    width: 100%;
}
.auth-pw-wrap input {
    padding-right: 38px;
}
.auth-pw-toggle {
    position: absolute;
    top: 50%;
    right: 4px;
    transform: translateY(-50%);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--ink-3);
    cursor: pointer;
    border-radius: 6px;
    transition: color 120ms ease, background 120ms ease;
}
.auth-pw-toggle:hover { color: var(--ink); background: var(--surface-hover); }
.auth-pw-toggle:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 1px;
}
.auth-pw-toggle i { font-size: 15px; }

.auth-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    width: 100%;
    padding: 10px 16px;
    border: 1px solid transparent;
    border-radius: var(--r-sm);
    font: inherit;
    font-size: 13.5px;
    font-weight: 600;
    cursor: pointer;
    transition: all 120ms ease;
    text-decoration: none;
    margin-top: 4px;
}

.auth-btn:disabled { opacity: 0.6; cursor: not-allowed; }
.auth-btn-primary { background: var(--ink); color: var(--on-ink); border-color: var(--ink); }
.auth-btn-primary:hover:not(:disabled) { background: var(--ink-hover); color: var(--on-ink); }

.auth-msg {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 12px;
    border-radius: var(--r-sm);
    font-size: 13px;
    border: 1px solid var(--line);
    background: var(--line-2);
    color: var(--ink);
}

.auth-msg.is-bad { background: var(--neg-soft); color: var(--neg); border-color: rgba(185,28,28,.2); }
.auth-msg.is-pos { background: var(--pos-soft); color: var(--pos); border-color: rgba(21,128,61,.2); }

/* ── Welcome / Onboarding (/bem-vindo) ───────────────────────── */
/* Carrossel de 6 passos. Layout próprio sem NavMenu (WelcomeLayout).
   Mobile-first: tudo centrado, max-width 560px, animações simples. */

.welcome-page {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    background: var(--bg);
    padding: 24px 16px 32px;
}
.welcome-page-brand { margin-bottom: 20px; }
.welcome-page-brand img { height: 28px; opacity: 0.85; }

.welcome-shell { width: 100%; max-width: 560px; margin: 0 auto; }

/* Top: progress dots (esquerda) + skip (direita) */
.welcome-top {
    display: flex; align-items: center; justify-content: space-between;
    margin-bottom: 16px;
}
.welcome-progress { display: flex; gap: 6px; }
.welcome-progress-dot {
    width: 8px; height: 8px; border-radius: 50%;
    background: var(--line);
    transition: background 200ms ease, width 200ms ease;
}
.welcome-progress-dot.is-active { background: var(--ink); width: 24px; border-radius: 4px; }
.welcome-progress-dot.is-done { background: var(--ink-3); }
.welcome-skip {
    font-size: 12.5px; color: var(--ink-3); font-weight: 500;
    text-decoration: none; padding: 4px 8px; border-radius: 4px;
    transition: color 120ms, background 120ms;
}
.welcome-skip:hover { color: var(--ink-2); background: rgba(0,0,0,.04); }

/* Card central que muda por step */
.welcome-card {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-lg);
    padding: 32px 28px;
    box-shadow: var(--shadow-3);
    min-height: 460px;
    display: flex;
    flex-direction: column;
}

.welcome-step { flex: 1; display: flex; flex-direction: column; }
.welcome-step-fade { animation: welcomeFadeIn 350ms ease both; }

@keyframes welcomeFadeIn {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
}

.welcome-emoji { font-size: 36px; line-height: 1; margin-bottom: 12px; }
/* Welcome / onboarding titles — agora em Helvetica Neue Light 300 para
   ficar consistente com a brand. Antes era Fraunces serif (legacy). */
.welcome-h1 {
    font-family: var(--font-display);
    font-size: clamp(26px, 5.5vw, 32px);
    font-weight: 300; letter-spacing: -0.4px;
    margin: 0 0 8px; color: var(--ink);
}
.welcome-step-h2 {
    font-family: var(--font-display);
    font-size: clamp(22px, 4.5vw, 26px);
    font-weight: 300; letter-spacing: -0.3px;
    margin: 0 0 8px; color: var(--ink);
}
.welcome-sub, .welcome-step-p {
    margin: 0 0 20px;
    color: var(--ink-2);
    font-size: 14.5px;
    line-height: 1.55;
}

.welcome-time-pill {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 12px; background: var(--line-2);
    border-radius: 999px;
    font-size: 12px; color: var(--ink-2); font-weight: 500;
    align-self: flex-start;
}

/* Passo 2: Instalar PWA — 2 cards (iOS / Android) */
.welcome-install-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
    margin-top: auto;
}
.welcome-install-card {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    padding: 14px 16px;
}
.welcome-install-head {
    display: flex; align-items: center; gap: 8px;
    padding-bottom: 10px; margin-bottom: 10px;
    border-bottom: 1px solid var(--line-2);
    font-size: 12.5px; font-weight: 600; color: var(--ink);
}
.welcome-install-head svg { color: var(--ink-2); flex-shrink: 0; }
.welcome-install-list {
    list-style: decimal;
    padding-left: 18px;
    margin: 0;
    font-size: 12.5px;
    color: var(--ink-2);
    line-height: 1.55;
}
.welcome-install-list li { margin-bottom: 4px; }
.welcome-install-list li:last-child { margin-bottom: 0; }
.welcome-install-list i { font-size: 13px; vertical-align: -1px; }
.welcome-install-list strong { color: var(--ink); font-weight: 600; }

.welcome-install-skip {
    margin: 14px 0 0;
    text-align: center;
    font-size: 11.5px;
    color: var(--ink-3);
    font-style: italic;
}

@media (max-width: 520px) {
    .welcome-install-grid { grid-template-columns: 1fr; gap: 8px; }
}

/* Mock visuals — partilhados entre steps */
.welcome-mock {
    margin-top: auto;
    padding: 16px;
    background: var(--line-2);
    border-radius: var(--r-md);
    overflow: hidden;
}
.welcome-mock-arrow {
    text-align: center; color: var(--ink-3);
    margin: 8px 0; font-size: 18px;
}

/* Step 2: receipt → categorized */
.welcome-receipt {
    background: #1B2A4A; color: #fff;
    border-radius: 8px; padding: 12px 14px;
    font-family: 'SF Mono', Menlo, Consolas, monospace;
    font-size: 11.5px; line-height: 1.5;
}
.welcome-receipt-header {
    display: flex; align-items: center; gap: 6px;
    font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em;
    opacity: 0.6; padding-bottom: 6px; margin-bottom: 6px;
    border-bottom: 1px dashed rgba(255,255,255,.2);
}
.welcome-receipt-line { color: rgba(255,255,255,.85); }
.welcome-result {
    background: var(--surface); border: 1px solid var(--line);
    border-radius: 8px; padding: 12px 14px;
    display: flex; flex-direction: column; gap: 8px;
}
.welcome-cat { display: flex; flex-direction: column; gap: 2px; }
.welcome-cat-name {
    font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.12em;
    color: var(--ink-3); font-weight: 600;
}
.welcome-cat-items {
    font-size: 12.5px; color: var(--ink); font-weight: 500;
    line-height: 1.35;
}

/* Step 3: stock list */
.welcome-mock-stock { display: flex; flex-direction: column; gap: 8px; padding: 14px; }
.welcome-stock-row {
    display: flex; align-items: center; justify-content: space-between;
    padding: 10px 12px; background: var(--surface);
    border: 1px solid var(--line); border-radius: 8px; gap: 10px;
}
.welcome-stock-info { display: flex; align-items: center; gap: 8px; min-width: 0; }
.welcome-stock-info i { font-size: 16px; color: var(--ink-2); flex-shrink: 0; }
.welcome-stock-info span { font-size: 13px; font-weight: 600; color: var(--ink); }
.welcome-stock-tag {
    font-size: 10.5px; padding: 3px 8px; border-radius: 999px;
    font-weight: 600; flex-shrink: 0;
}
.welcome-stock-tag.is-warn { background: rgba(245,158,11,.12); color: #B45309; }
.welcome-stock-tag.is-low  { background: rgba(185,28,28,.10); color: #B91C1C; }
.welcome-stock-tag.is-ok   { background: var(--pos-soft); color: var(--pos); }

/* Step 7: notification opt-in mock — duas notificações empilhadas */
.welcome-mock-notif {
    display: flex; flex-direction: column; gap: 8px; padding: 14px;
}
.welcome-notif {
    display: flex; align-items: flex-start; gap: 10px;
    padding: 10px 12px; background: var(--surface);
    border: 1px solid var(--line); border-radius: 10px;
    box-shadow: 0 2px 6px rgba(15,23,42,.04);
}
.welcome-notif-icon {
    width: 28px; height: 28px; border-radius: 8px;
    background: var(--ink); color: var(--on-ink);
    display: grid; place-items: center; flex-shrink: 0;
    font-size: 13px;
}
.welcome-notif-body { flex: 1; min-width: 0; }
.welcome-notif-title {
    font-size: 11.5px; font-weight: 700; color: var(--ink);
    margin-bottom: 2px;
}
.welcome-notif-text {
    font-size: 12.5px; color: var(--ink-2); line-height: 1.35;
}

/* Step 4: lista partilhada (2 telemóveis) */
.welcome-mock-share {
    display: flex; align-items: center; justify-content: center;
    gap: 8px; padding: 16px;
}
.welcome-phone {
    flex: 1; max-width: 180px; min-width: 0;
    background: var(--surface); border: 1px solid var(--line);
    border-radius: 14px; padding: 12px;
    display: flex; flex-direction: column; gap: 4px;
}
.welcome-phone-label {
    font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em;
    color: var(--ink-3); font-weight: 600; margin-bottom: 6px;
}
.welcome-phone-item {
    padding: 6px 8px; font-size: 12.5px; color: var(--ink);
    background: var(--line-2); border-radius: 6px;
}
.welcome-phone-item.is-checked {
    text-decoration: line-through; color: var(--ink-3); background: transparent;
}
.welcome-sync {
    display: flex; flex-direction: column; align-items: center;
    color: var(--ink-2); font-size: 18px; flex-shrink: 0;
}
.welcome-sync small {
    font-size: 9px; text-transform: uppercase; letter-spacing: 0.1em;
    margin-top: 2px; color: var(--ink-3);
}

/* Step 5: comparação de lojas */
.welcome-mock-comparison { display: flex; flex-direction: column; gap: 6px; padding: 14px; }
.welcome-store-row {
    display: flex; align-items: center; justify-content: space-between;
    padding: 10px 12px; background: var(--surface);
    border: 1px solid var(--line); border-radius: 8px; gap: 10px;
}
.welcome-store-row.is-winner {
    background: linear-gradient(180deg, var(--pos-soft), var(--surface));
    border-color: var(--pos);
}
.welcome-store-info { display: flex; align-items: center; gap: 10px; min-width: 0; }
.welcome-store-icon {
    width: 28px; height: 28px; border-radius: 6px;
    background: var(--line-2); color: var(--ink-2);
    display: grid; place-items: center; flex-shrink: 0;
}
.welcome-store-icon i { font-size: 12px; }
.welcome-store-row.is-winner .welcome-store-icon { background: var(--pos); color: var(--surface); }
.welcome-store-name { font-size: 13px; font-weight: 600; color: var(--ink); }
.welcome-store-tag { font-size: 10.5px; color: var(--ink-3); font-weight: 500; }
.welcome-store-row.is-winner .welcome-store-tag { color: var(--pos); font-weight: 600; }
.welcome-store-badge {
    font-size: 11px; padding: 3px 9px; border-radius: 999px;
    background: var(--line-2); color: var(--ink-2); font-weight: 600;
    flex-shrink: 0;
}
.welcome-store-badge.is-winner { background: var(--pos-soft); color: var(--pos); }

/* Linha de confiança no topo do mock */
.welcome-confidence-line {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    margin-bottom: 4px;
    background: var(--line-2);
    border-radius: 8px;
    font-size: 11.5px;
    color: var(--ink-2);
}
.welcome-confidence-line i { font-size: 13px; color: var(--ink-2); }
.welcome-confidence-line strong { color: var(--ink); font-weight: 600; }

/* Dica inline no fim do mock — destaca em amarelo subtil */
.welcome-tip-inline {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    margin-top: 8px;
    padding: 9px 12px;
    background: rgba(245, 158, 11, 0.08);
    border: 1px solid rgba(245, 158, 11, 0.25);
    border-radius: 8px;
    font-size: 11.5px;
    color: var(--ink);
    line-height: 1.4;
}
.welcome-tip-inline i {
    font-size: 13px;
    color: var(--warn, #B45309);
    margin-top: 1px;
    flex-shrink: 0;
}
.welcome-tip-inline strong { color: var(--ink); font-weight: 600; }

/* ── Upgrade banner ──────────────────────────────────
   Aparece em pontos onde uma feature está bloqueada no Free.
   Versão grande (default) — caixa com ícone, título, descrição e CTA.
   Versão compact — linha inline mais discreta. */
.upgrade-banner {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 16px 18px;
    background: var(--surface-2);
    border: 1px solid var(--line);
    border-radius: var(--r-md, 12px);
    margin: 16px 0;
}
[data-theme="light"] .upgrade-banner,
:root:not([data-theme]) .upgrade-banner {
    background: linear-gradient(135deg, #FBFAF7 0%, #F4F2EA 100%);
}
.upgrade-banner-icon {
    flex-shrink: 0;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: var(--ink);
    color: var(--on-ink);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
}
.upgrade-banner-content {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.upgrade-banner-title {
    font-size: 14.5px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1.35;
}
.upgrade-banner-desc {
    margin: 0;
    font-size: 13px;
    color: var(--ink-2);
    line-height: 1.45;
}
.upgrade-banner-cta {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    background: var(--ink);
    color: var(--on-ink);
    border-radius: var(--r-sm, 8px);
    text-decoration: none;
    font-weight: 600;
    font-size: 13px;
    transition: background 120ms;
    white-space: nowrap;
}
.upgrade-banner-cta:hover { background: var(--ink-hover); color: var(--on-ink); }

/* Compact — versão de 1 linha */
.upgrade-banner.is-compact {
    padding: 10px 14px;
    gap: 10px;
}
.upgrade-banner.is-compact .upgrade-banner-icon {
    width: 28px;
    height: 28px;
    font-size: 13px;
}
.upgrade-banner.is-compact .upgrade-banner-title { font-size: 13px; }
.upgrade-banner.is-compact .upgrade-banner-desc { display: none; }
.upgrade-banner.is-compact .upgrade-banner-cta {
    padding: 6px 10px;
    font-size: 12px;
}

@media (max-width: 600px) {
    .upgrade-banner {
        flex-direction: column;
        align-items: flex-start;
        text-align: left;
    }
    .upgrade-banner-cta { align-self: stretch; justify-content: center; }
}

/* Step 6: final CTA */
.welcome-final { align-items: stretch; }
.welcome-cta {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%; padding: 14px 20px;
    background: var(--ink); color: var(--on-ink);
    border-radius: var(--r-sm);
    font-weight: 600; font-size: 14.5px;
    text-decoration: none;
    transition: background 120ms;
    margin-top: 8px;
}
.welcome-cta:hover { background: var(--ink-hover); color: var(--on-ink); }
.welcome-cta-arrow { margin-left: auto; }
.welcome-secondary-link-final {
    display: block; margin-top: 16px; text-align: center;
    font-size: 13px; color: var(--ink-3); text-decoration: none;
}
.welcome-secondary-link-final:hover { color: var(--ink-2); }

/* ── Opt-in de stock (card 4) ──────────────────────────────
   Caixa "Power-up opcional" que aparece debaixo do mock com
   2 botões — Activar agora / Mais tarde — para o utilizador
   decidir se quer o modo completo ou simples. */
.welcome-optin {
    margin-top: 20px;
    padding: 14px 16px;
    border: 1px solid var(--line);
    border-radius: var(--r-md, 12px);
    background: var(--surface-2);
    display: flex;
    flex-direction: column;
    gap: 12px;
}
.welcome-optin-head {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 13px;
    color: var(--ink-2);
    line-height: 1.4;
}
.welcome-optin-head i {
    color: var(--color-accent, #C8852C);
    font-size: 16px;
    flex-shrink: 0;
}
.welcome-optin-actions {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.welcome-optin-btn {
    flex: 1 1 auto;
    min-width: 140px;
    padding: 10px 14px;
    border: 1px solid var(--line);
    border-radius: var(--r-sm, 8px);
    font: inherit;
    font-size: 13.5px;
    font-weight: 600;
    background: var(--surface);
    color: var(--ink);
    cursor: pointer;
    transition: background 120ms, border-color 120ms;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
}
.welcome-optin-btn:hover { background: var(--line-2); }
.welcome-optin-btn:disabled { opacity: 0.6; cursor: wait; }

.welcome-optin-btn-primary {
    background: var(--ink);
    color: var(--on-ink);
    border-color: var(--ink);
}
.welcome-optin-btn-primary:hover { background: var(--ink-hover); }

.welcome-optin-btn-ghost {
    background: transparent;
    color: var(--ink-2);
}

/* Variantes para o card de notificações: CTA dominante (block, full-width)
   + skip discreto como link, em vez de dois botões lado a lado de igual peso.
   Empurra mais users para clicar Activar — o "Mais tarde" continua acessível
   mas visualmente subordinado. */
.welcome-optin-actions-stacked {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
}

.welcome-optin-btn-block {
    flex: none;
    width: 100%;
    padding: 12px 16px;
    font-size: 14px;
}

.welcome-optin-skip-link {
    background: transparent;
    border: none;
    color: var(--ink-3);
    font: inherit;
    font-size: 12.5px;
    font-weight: 500;
    cursor: pointer;
    padding: 4px 8px;
    text-decoration: underline;
    text-decoration-color: rgba(127,127,127,.35);
    text-underline-offset: 3px;
    align-self: center;
    transition: color 120ms ease, text-decoration-color 120ms ease;
}

.welcome-optin-skip-link:hover:not(:disabled) {
    color: var(--ink-2);
    text-decoration-color: currentColor;
}

.welcome-optin-skip-link:disabled {
    opacity: 0.5;
    cursor: wait;
}

.welcome-optin-spinner {
    width: 14px; height: 14px;
    border: 2px solid rgba(255,255,255,.3);
    border-top-color: #fff;
    border-radius: 50%;
    animation: welcome-spin 700ms linear infinite;
}
@keyframes welcome-spin { to { transform: rotate(360deg); } }

.welcome-optin-confirm {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 12px;
    background: var(--pos-soft, #DCFCE7);
    color: var(--pos, #15803D);
    border-radius: var(--r-sm, 8px);
    font-size: 13.5px;
    font-weight: 500;
}
.welcome-optin-confirm i { font-size: 16px; }

.welcome-optin-error {
    padding: 8px 12px;
    background: var(--neg-soft, #FEE2E2);
    color: var(--neg, #B91C1C);
    border-radius: var(--r-sm, 8px);
    font-size: 12.5px;
}

/* Navigation: botões anterior/seguinte */
.welcome-nav {
    display: flex; justify-content: space-between; align-items: center;
    margin-top: 16px; gap: 12px;
}
.welcome-nav-btn {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 10px 18px;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    font: inherit; font-size: 13.5px; font-weight: 600;
    color: var(--ink); cursor: pointer;
    transition: border-color 120ms, background 120ms;
}
.welcome-nav-btn:hover { border-color: var(--ink-3); background: var(--line-2); }
.welcome-nav-next {
    background: var(--ink); color: var(--on-ink); border-color: var(--ink);
}
.welcome-nav-next:hover { background: var(--ink-hover); color: var(--on-ink); border-color: var(--ink-hover); }
.welcome-nav-spacer { width: 1px; }

/* Animações reutilizáveis dentro dos mocks */
@keyframes welcomeSlideIn {
    from { opacity: 0; transform: translateX(-8px); }
    to   { opacity: 1; transform: translateX(0); }
}
@keyframes welcomeSlideUp {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: translateY(0); }
}
@keyframes welcomePulse {
    0%, 100% { opacity: 0.5; transform: scale(1); }
    50%      { opacity: 1; transform: scale(1.08); }
}
.animate-fade-in { animation: welcomeFadeIn 400ms ease both; }
.animate-slide-up { animation: welcomeSlideUp 500ms 200ms ease both; }
.animate-slide-in { animation: welcomeSlideIn 400ms ease both; }
.animate-pulse { animation: welcomePulse 1.8s ease-in-out infinite; }

/* Mobile */
@media (max-width: 520px) {
    .welcome-page { padding: 16px 12px 24px; }
    .welcome-card { padding: 24px 20px; min-height: 420px; }
    .welcome-mock-share { gap: 4px; padding: 12px; }
    .welcome-phone { padding: 10px; }
    .welcome-phone-item { font-size: 11.5px; padding: 5px 7px; }
    .welcome-nav-btn { padding: 9px 14px; font-size: 13px; }
}

/* Banner "Instalar como app" — abaixo do auth-card, só em mobile */
.pwa-install {
    width: 100%;
    max-width: 380px;
    margin: 16px auto 0;
    padding: 14px 16px;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow-1);
    box-sizing: border-box;
}
.pwa-install-head {
    display: flex;
    align-items: start;
    gap: 10px;
}
.pwa-install-head > i {
    font-size: 22px;
    color: var(--ink-2);
    flex-shrink: 0;
    margin-top: 2px;
}
.pwa-install-head > div {
    flex: 1;
    min-width: 0;
}
.pwa-install-title {
    display: block;
    font-size: 13.5px;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 2px;
}
.pwa-install-sub {
    margin: 0;
    font-size: 12px;
    color: var(--ink-3);
    line-height: 1.4;
}
.pwa-install-close {
    background: transparent;
    border: none;
    padding: 0;
    width: 24px;
    height: 24px;
    display: grid;
    place-items: center;
    color: var(--ink-3);
    cursor: pointer;
    border-radius: 4px;
    flex-shrink: 0;
    transition: background 120ms;
}
.pwa-install-close:hover { background: var(--line-2); color: var(--ink-2); }

.pwa-steps {
    margin-top: 10px;
    padding-top: 10px;
    border-top: 1px solid var(--line);
}
.pwa-platform {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    color: var(--ink-3);
    margin-bottom: 8px;
}
.pwa-platform i { font-size: 13px; }
.pwa-list {
    list-style: decimal;
    margin: 0;
    padding-left: 18px;
    font-size: 12.5px;
    color: var(--ink-2);
    line-height: 1.5;
}
.pwa-list li { margin-bottom: 3px; }
.pwa-list li:last-child { margin-bottom: 0; }
.pwa-list i { font-size: 13px; vertical-align: -1px; }

.pwa-install-btn {
    width: 100%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    padding: 9px 14px;
    background: var(--ink);
    color: var(--on-ink);
    border: none;
    border-radius: var(--r-sm);
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: background 120ms;
}
.pwa-install-btn:hover { background: var(--ink-hover); }

.auth-divider {
    border: none;
    border-top: 1px solid var(--line);
    margin: 24px 0 16px;
}

.auth-forgot {
    margin: 14px 0 0;
    text-align: center;
    font-size: 12.5px;
}
.auth-forgot a {
    color: var(--ink-2);
    text-decoration: none;
    transition: color 120ms ease;
}
.auth-forgot a:hover {
    color: var(--ink);
    text-decoration: underline;
}

/* Linha label + link "esqueci-me" alinhado à direita (padrão UX) */
.auth-field-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
}
.auth-field-link {
    font-size: 11.5px;
    color: var(--ink-2);
    text-decoration: none;
    transition: color 120ms ease;
}
.auth-field-link:hover {
    color: var(--ink);
    text-decoration: underline;
}

.auth-links {
    display: flex;
    flex-direction: column;
    gap: 4px;
    text-align: center;
    font-size: 12.5px;
    color: var(--ink-2);
}

.auth-links a {
    color: var(--ink);
    text-decoration: none;
    font-weight: 500;
    padding: 6px 8px;
    border-radius: 6px;
    transition: background-color 120ms ease;
}

.auth-links a:hover {
    background: var(--line-2);
    color: var(--ink);
}

.auth-divider-text {
    color: var(--ink-3);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    text-align: center;
    margin: 4px 0 8px;
}

*, *::before, *::after {
    box-sizing: border-box;
}

html, body {
    overflow-x: hidden;
    max-width: 100%;
    /* Brand: Helvetica Neue como fonte principal (sistema no Mac/iOS).
       Inter mantém-se como fallback para Windows/Android. tabular-nums
       garante que preços/totais alinham em colunas (essencial para
       dashboards de finanças e listas de compras). */
    font-family: var(--font-sans, "Helvetica Neue", Helvetica, Inter, Arial, sans-serif);
    background: var(--bg);
    color: var(--ink);
    font-variant-numeric: tabular-nums;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    transition: background-color 200ms ease, color 200ms ease;
}


a, .btn-link {
    color: var(--color-primary);
}

.btn-primary {
    color: #fff;
    background-color: var(--color-primary);
    border-color: var(--color-primary-700);
}

.btn-primary:hover {
    background-color: var(--color-primary-700);
    border-color: var(--color-primary-700);
}

.action-btn {
    width: 2.25rem;
    height: 2.25rem;
    padding: 0;
    border-radius: 0.8rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid transparent;
    background: rgba(27, 42, 74, 0.05);
    color: var(--color-primary);
    transition: transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease, border-color 150ms ease, color 150ms ease;
}

.action-btn i {
    font-size: 0.9rem;
    line-height: 1;
}

.action-btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 6px 16px rgba(27, 42, 74, 0.12);
}

.action-btn:focus-visible {
    outline: none;
    box-shadow: 0 0 0 0.2rem rgba(27, 42, 74, 0.14);
}

.action-btn:disabled {
    opacity: 0.55;
    transform: none;
    box-shadow: none;
}

.action-btn-edit {
    border-color: rgba(27, 42, 74, 0.15);
    background: rgba(27, 42, 74, 0.06);
}

.action-btn-edit:hover {
    background: rgba(27, 42, 74, 0.12);
    border-color: rgba(27, 42, 74, 0.22);
}

.action-btn-delete {
    border-color: rgba(185, 28, 28, 0.15);
    background: rgba(185, 28, 28, 0.06);
    color: #b91c1c;
}

.action-btn-delete:hover {
    background: rgba(185, 28, 28, 0.12);
    border-color: rgba(185, 28, 28, 0.22);
    color: #991b1b;
}

.action-btn-success {
    border-color: rgba(22, 163, 74, 0.16);
    background: rgba(22, 163, 74, 0.08);
    color: #166534;
}

.action-btn-success:hover {
    background: rgba(22, 163, 74, 0.14);
    border-color: rgba(22, 163, 74, 0.24);
    color: #14532d;
}

.action-btn-neutral {
    border-color: rgba(148, 163, 184, 0.18);
    background: rgba(148, 163, 184, 0.08);
    color: #475569;
}

.action-btn-neutral:hover {
    background: rgba(148, 163, 184, 0.16);
    border-color: rgba(148, 163, 184, 0.26);
    color: #334155;
}

.action-btn-favorite-on {
    border-color: rgba(217, 119, 6, 0.25);
    background: rgba(217, 119, 6, 0.1);
    color: #b45309;
}

.action-btn-favorite-on:hover {
    background: rgba(217, 119, 6, 0.18);
    border-color: rgba(217, 119, 6, 0.35);
    color: #92400e;
}

.action-btn-track-on {
    border-color: rgba(217, 119, 6, 0.25);
    background: rgba(217, 119, 6, 0.1);
    color: #b45309;
}

.action-btn-track-on:hover {
    background: rgba(217, 119, 6, 0.18);
    border-color: rgba(217, 119, 6, 0.35);
    color: #92400e;
}

.action-btn-track-off {
    border-color: rgba(148, 163, 184, 0.12);
    background: rgba(148, 163, 184, 0.05);
    color: #94a3b8;
}

.action-btn-track-off:hover {
    background: rgba(185, 28, 28, 0.06);
    border-color: rgba(185, 28, 28, 0.18);
    color: #b91c1c;
}

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.22rem rgba(27, 42, 74, .35);
}

.content {
    padding-top: 1.1rem;
}

h1:focus {
    outline: none;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid #e50000;
}

/* ── Product autocomplete suggestions (used in Compras + HistoricoCompras) */

.cart-suggestions {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    right: 0;
    min-width: 280px;
    background: var(--surface);
    border: 1px solid var(--line-strong);
    border-radius: 0.85rem;
    box-shadow: var(--shadow-2);
    list-style: none;
    padding: 0.35rem;
    margin: 0;
    z-index: 100;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}

.cart-suggestion-item {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    width: 100%;
    min-width: 0;
    padding: 0.5rem 0.7rem;
    background: transparent;
    border: none;
    border-radius: 0.55rem;
    text-align: left;
    cursor: pointer;
    transition: background-color 120ms ease;
}

.cart-suggestion-item:hover { background: var(--line-2); }

.cart-suggestion-icon {
    font-size: 0.82rem;
    color: #b45309;
    flex-shrink: 0;
}

.cart-suggestion-name {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.cart-suggestion-hint {
    flex: 0 1 auto;
    max-width: 45%;
    font-size: 0.74rem;
    color: var(--color-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

input.plain-number {
    appearance: textfield;
    -moz-appearance: textfield;
    -webkit-appearance: none;
    border: 0;
    margin: 0;
    padding: 0;
    background: transparent;
    font: inherit;
    line-height: 1;
    color: inherit;
    box-shadow: none;
    outline: none;
}

input.plain-number::-webkit-outer-spin-button,
input.plain-number::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

input.plain-number.valid.modified,
input.plain-number.invalid {
    outline: none !important;
}

.validation-message {
    color: #e50000;
}

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }

.darker-border-checkbox.form-check-input {
    border-color: #929292;
}

.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
    color: var(--bs-secondary-color);
    text-align: end;
}

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
    text-align: start;
}

.table {
    --bs-table-bg: transparent;
    --bs-table-color: var(--color-text);
}

.table > :not(caption) > * > * {
    border-bottom-color: #E8E6DF;
}

/* ══════════════════════════════════════════════
   Mobile bottom nav (global — bypasses CSS isolation
   so NavLink <a> tags receive the styles)
   ══════════════════════════════════════════════ */

/* ── "Liquid Glass" floating nav (iOS 26-inspired) ───────────
   Aproximação CSS ao Liquid Glass da Apple:
     • Blur forte (28px) + saturação alta (180%) — simula passagem de luz
     • Gradient interno multi-layer — fake refracção
     • Edge highlight no topo (luz a entrar) + sombra subtil em baixo (depth)
     • Múltiplas sombras externas para flutuar "no ar"
   Sem WebGL não conseguimos refracção verdadeira mas o resultado é
   convincente em 95% dos casos. */
.mobile-nav {
    position: fixed;
    bottom: calc(env(safe-area-inset-bottom) + 10px);
    left: 10px;
    right: 10px;
    z-index: 500;
    background: var(--surface-overlay);
    /* Gradient overlay POR CIMA do background — simula refracção/lensing.
       Acrescentamos via background-image em camada para ficar combinado
       com o backdrop-filter sem conflitar. */
    background-image: linear-gradient(
        180deg,
        rgba(255, 255, 255, 0.08) 0%,
        rgba(255, 255, 255, 0.02) 35%,
        rgba(0, 0, 0, 0.03) 100%
    );
    backdrop-filter: blur(28px) saturate(180%);
    -webkit-backdrop-filter: blur(28px) saturate(180%);
    border: 1px solid var(--line);
    border-radius: 22px;
    /* Camadas de sombra:
       1. Top edge highlight (inset, branco fraco) — luz a entrar no vidro
       2. Bottom edge shadow (inset, preto fraco) — profundidade
       3. Sombra externa próxima — separa do conteúdo por baixo
       4. Sombra externa difusa — sensação de flutuar */
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.12),
        inset 0 -1px 0 rgba(0, 0, 0, 0.08),
        0 8px 24px -8px rgba(15, 23, 42, 0.22),
        0 2px 8px rgba(15, 23, 42, 0.08);
    display: flex;
    align-items: stretch;
    height: 60px;
}

/* Dark mode — o highlight do topo precisa de ser mais subtil
   (não queremos linha branca brilhante em fundo escuro). */
[data-theme="dark"] .mobile-nav {
    background-image: linear-gradient(
        180deg,
        rgba(255, 255, 255, 0.05) 0%,
        rgba(255, 255, 255, 0.01) 35%,
        rgba(0, 0, 0, 0.10) 100%
    );
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.08),
        inset 0 -1px 0 rgba(0, 0, 0, 0.20),
        0 8px 32px -8px rgba(0, 0, 0, 0.5),
        0 2px 8px rgba(0, 0, 0, 0.3);
}

.mobile-nav-item {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    background: none;
    border: none;
    color: var(--ink-3);
    text-decoration: none !important;
    font-size: 10.5px;
    font-weight: 600;
    font-family: var(--font-sans, "Helvetica Neue", Helvetica, Inter, Arial, sans-serif);
    letter-spacing: 0.1px;
    cursor: pointer;
    padding: 8px 4px 6px;
    -webkit-tap-highlight-color: transparent;
    transition: color 160ms ease;
    position: relative;
    min-width: 0;
    z-index: 0;
}

.mobile-nav-item:hover { color: var(--ink-2); text-decoration: none !important; }
.mobile-nav-item:active { transform: scale(0.94); }

.mobile-nav-item i {
    font-size: 20px;
    line-height: 1;
    display: block;
    position: relative;
    z-index: 1;
    transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
}

.mobile-nav-item span {
    line-height: 1;
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
    position: relative;
    z-index: 1;
}

.mobile-nav-item.active,
.mobile-nav-item.is-active {
    color: var(--ink);
}

/* Active pill behind icon — Liquid Glass-inspired.
   Em vez de cor sólida, usa gradient radial (mais luz no centro)
   para parecer um "halo" de luz, como uma lente de aumento. */
.mobile-nav-item.active::before,
.mobile-nav-item.is-active::before {
    content: '';
    position: absolute;
    top: 4px;
    left: 50%;
    transform: translateX(-50%);
    width: 40px;
    height: 26px;
    background: radial-gradient(
        ellipse at center,
        var(--surface-hover) 0%,
        var(--surface-hover) 50%,
        transparent 100%
    );
    border-radius: 13px;
    z-index: 0;
    /* Edge highlight do próprio halo — reforça o feel de vidro */
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.10);
    animation: mobileNavPillIn 260ms cubic-bezier(0.34, 1.56, 0.64, 1);
}

.mobile-nav-item.active i,
.mobile-nav-item.is-active i {
    transform: scale(1.06);
}

@keyframes mobileNavPillIn {
    0%   { opacity: 0; transform: translateX(-50%) scale(0.6); }
    100% { opacity: 1; transform: translateX(-50%) scale(1); }
}

/* ── Central "Comprar" floating pill ──────────────── */
.mobile-nav-center {
    gap: 4px;
    padding-top: 0;
    padding-bottom: 6px;
    justify-content: flex-end;
}

.mobile-nav-center i {
    width: 42px;
    height: 42px;
    background: var(--ink);
    border-radius: 50%;
    color: var(--on-ink) !important;
    font-size: 18px;
    display: flex !important;
    align-items: center;
    justify-content: center;
    box-shadow:
        0 6px 16px rgba(15,23,42,0.28),
        0 0 0 4px var(--bg);
    margin-top: -18px;
    transition: transform 160ms cubic-bezier(0.34, 1.56, 0.64, 1), background-color 120ms ease;
    flex-shrink: 0;
}

.mobile-nav-center span {
    color: var(--ink);
    font-size: 10px;
}

.mobile-nav-center::after,
.mobile-nav-center::before { display: none !important; }
/* Estado activo (estás na página /compras) — mantém o background --ink para
   garantir contraste correcto em ambos os temas. Antes era hardcoded a
   #1F1F23, o que em dark mode dava ícone preto sobre fundo preto (invisível).
   O sinal de "estás cá" vem do shadow ligeiramente reforçado, não da cor. */
.mobile-nav-center.active i,
.mobile-nav-center.is-active i {
    background: var(--ink);
    box-shadow:
        0 8px 20px rgba(15,23,42,0.34),
        0 0 0 4px var(--bg);
    transform: scale(1.04);
}
.mobile-nav-center:active i { transform: scale(0.92); }

/* ── Sheet overlay ────────────────────────────── */
.mobile-sheet-overlay {
    position: fixed;
    inset: 0;
    background: rgba(15,23,42,0.32);
    z-index: 600;
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    animation: mobileOverlayIn 180ms ease forwards;
}

/* ── Bottom sheet ─────────────────────────────── */
.mobile-sheet {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 700;
    background: var(--surface);
    border-radius: 18px 18px 0 0;
    padding: 0 16px calc(20px + env(safe-area-inset-bottom));
    box-shadow: var(--shadow-mobile-nav);
    animation: mobileSheetUp 240ms cubic-bezier(0.32,0.72,0,1) forwards;
    border-top: 1px solid var(--line);
}

.mobile-sheet-handle {
    width: 36px;
    height: 4px;
    background: var(--ink-4);
    border-radius: 999px;
    margin: 12px auto 18px;
}

.mobile-sheet-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px;
    margin-bottom: 14px;
}

.mobile-sheet-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    padding: 16px 8px 14px;
    border-radius: var(--r-md);
    background: var(--line-2);
    border: 1px solid var(--line);
    text-decoration: none !important;
    color: var(--ink);
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: background 120ms ease, border-color 120ms ease;
}

.mobile-sheet-item:hover { text-decoration: none !important; color: var(--ink); border-color: var(--ink-3); }
.mobile-sheet-item i { font-size: 22px; color: var(--ink-2); }
.mobile-sheet-item.active {
    background: var(--ink);
    color: var(--on-ink);
    border-color: var(--ink);
}
.mobile-sheet-item.active i { color: var(--on-ink); }
.mobile-sheet-item:active { transform: scale(0.97); }

.mobile-sheet-footer {
    display: flex;
    gap: 8px;
    border-top: 1px solid var(--line);
    padding-top: 14px;
}

.mobile-sheet-footer-item {
    flex: 1;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 14px;
    border-radius: var(--r-sm);
    background: var(--line-2);
    border: 1px solid var(--line);
    text-decoration: none !important;
    color: var(--ink);
    font-size: 13px;
    font-weight: 500;
    font-family: var(--font-sans, "Helvetica Neue", Helvetica, Inter, Arial, sans-serif);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: background 120ms ease, border-color 120ms ease;
}

.mobile-sheet-footer-item:hover { text-decoration: none !important; background: var(--surface); border-color: var(--ink-3); }
.mobile-sheet-footer-item i { font-size: 14px; color: var(--ink-2); }
.mobile-sheet-logout { color: var(--neg) !important; }
.mobile-sheet-logout i { color: var(--neg) !important; }
.mobile-sheet-logout:hover { background: var(--neg-soft); border-color: rgba(185,28,28,0.2); }

@media (min-width: 641px) {
    .mobile-nav { display: none !important; }
    .mobile-sheet-overlay { display: none !important; }
    .mobile-sheet { display: none !important; }
}

/* ══════════════════════════════════════════════
   MOBILE PRESS FEEDBACK
   Touch-only :active transforms para os
   containers clicáveis principais. Faz a app
   sentir-se nativa em vez de "site na browser".
   `@media (hover: none)` exclui desktop/mouse.
   ══════════════════════════════════════════════ */
@media (hover: none) {
    /* Cards e linhas grandes — scale subtil (98%) */
    .hs-week-row:active,
    .hs-signal:active,
    .hs-empty-hero-cta:active,
    .st-product-row:active,
    .st-variant:active,
    .cart-row:active,
    .lc-item:active,
    .lc-store:active,
    .cmp-result:active,
    .cmp-entry:active,
    .hc-row-head:active,
    .hc-item:active {
        transform: scale(0.98);
        transition: transform 100ms ease;
    }

    /* Chips e botões pequenos — scale mais marcado (94%) */
    .hs-replenish-chip:active,
    .st-act-btn:active,
    .nc-chip:active,
    .nc-product-main:active,
    .cmp-variant-chip:active,
    .topbar-icon-btn:active,
    .lc-stepper button:active {
        transform: scale(0.94);
        transition: transform 100ms ease;
    }
}

/* ══════════════════════════════════════════════
   SPRING-IN para valores grandes (KPIs, headlines)
   Aplicar `.num-springin` a um elemento — ele entra
   com opacidade 0, translateY 8px e scale 0.95,
   depois descansa em 1,0,0 com easing overshoot.
   Usar em valores que aparecem só depois de async
   load (totalSpent, savings, etc.).
   ══════════════════════════════════════════════ */
@keyframes numSpringIn {
    0%   { opacity: 0; transform: translateY(10px) scale(0.92); }
    60%  { opacity: 1; transform: translateY(-2px) scale(1.02); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

.num-springin {
    animation: numSpringIn 520ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
    display: inline-block;
}

.num-springin-delayed {
    animation: numSpringIn 520ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
    animation-delay: 80ms;
    display: inline-block;
}

/* ══════════════════════════════════════════════
   SKELETON LOADERS
   Substitui spinners por placeholders com shimmer.
   Usar:
       <div class="skel skel-line"></div>
       <div class="skel skel-line skel-line-lg"></div>
       <div class="skel skel-circle"></div>
       <div class="skel skel-card"></div>
   Combinar em wrappers para imitar o layout final.
   ══════════════════════════════════════════════ */
@keyframes skelShimmer {
    0%   { background-position: -200% 0; }
    100% { background-position: 200% 0; }
}

.skel {
    background: linear-gradient(
        90deg,
        var(--skeleton) 0%,
        var(--surface-hover) 50%,
        var(--skeleton) 100%
    );
    background-size: 200% 100%;
    animation: skelShimmer 1.4s ease-in-out infinite;
    border-radius: 8px;
    display: block;
}

.skel-line       { height: 12px; margin: 6px 0; }
.skel-line-sm    { height: 8px; }
.skel-line-lg    { height: 18px; }
.skel-line-xl    { height: 28px; border-radius: 6px; }
.skel-circle     { width: 40px; height: 40px; border-radius: 50%; }
.skel-card       { height: 88px; border-radius: 12px; }
.skel-card-sm    { height: 56px; border-radius: 10px; }
.skel-card-lg    { height: 140px; border-radius: 14px; }

/* Larguras úteis para skel-line */
.skel-w-25  { width: 25%; }
.skel-w-40  { width: 40%; }
.skel-w-50  { width: 50%; }
.skel-w-60  { width: 60%; }
.skel-w-75  { width: 75%; }
.skel-w-90  { width: 90%; }
.skel-w-full{ width: 100%; }

/* Grupo: cluster de skeletons espaçados */
.skel-group {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

/* Respeitar prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
    .skel { animation: none; opacity: 0.6; }
    .num-springin,
    .num-springin-delayed { animation: none; }
    .mobile-nav-item.active::before,
    .mobile-nav-item.is-active::before { animation: none; }
}

/* ══════════════════════════════════════════════
   BOTTOM SHEET PATTERN (mobile only)
   Utility classes para converter modals centrados
   num bottom sheet em mobile (≤640px). Em desktop
   ficam centrados como antes.

   Uso:
     <div class="m-sheet-overlay" @onclick="Close">
         <div class="m-sheet" @onclick:stopPropagation>
             <div class="m-sheet-handle"></div>   <!-- só visível em mobile -->
             <header class="m-sheet-head">...</header>
             <div class="m-sheet-body">...</div>
             <footer class="m-sheet-foot">...</footer>
         </div>
     </div>

   Modals existentes podem opt-in adicionando estas
   classes em vez de overlays custom.
   ══════════════════════════════════════════════ */
.m-sheet-overlay {
    position: fixed;
    inset: 0;
    z-index: 1000;
    background: rgba(15,23,42,0.55);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    display: flex;
    align-items: center;
    justify-content: center;
    animation: mSheetOverlayIn 200ms ease forwards;
}

.m-sheet {
    background: var(--surface);
    border-radius: 16px;
    width: min(560px, 100% - 32px);
    max-height: calc(100vh - 64px);
    overflow-y: auto;
    box-shadow: var(--shadow-3);
    border: 1px solid var(--line);
    display: flex;
    flex-direction: column;
    animation: mSheetCenterIn 220ms cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}

.m-sheet-handle { display: none; }

.m-sheet-head {
    padding: 18px 20px 12px;
    border-bottom: 1px solid var(--line);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}

.m-sheet-body {
    padding: 16px 20px;
    flex: 1;
}

.m-sheet-foot {
    padding: 12px 20px 16px;
    border-top: 1px solid var(--line);
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}

@keyframes mSheetOverlayIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

@keyframes mSheetCenterIn {
    from { opacity: 0; transform: translateY(20px) scale(0.96); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes mSheetUpIn {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
}

@media (max-width: 640px) {
    .m-sheet-overlay {
        align-items: flex-end;
    }
    .m-sheet {
        width: 100%;
        max-width: 100%;
        max-height: 92vh;
        border-radius: 18px 18px 0 0;
        border-left: 0;
        border-right: 0;
        border-bottom: 0;
        animation: mSheetUpIn 280ms cubic-bezier(0.32, 0.72, 0, 1) forwards;
        padding-bottom: env(safe-area-inset-bottom);
    }
    .m-sheet-handle {
        display: block;
        width: 36px;
        height: 4px;
        background: var(--line);
        border-radius: 2px;
        margin: 8px auto 4px;
        flex-shrink: 0;
    }
    .m-sheet-head {
        padding: 8px 20px 12px;
    }
    .m-sheet-foot {
        /* Footer flutuante em mobile — sticky para ficar sempre visível
           mesmo com lista longa. */
        position: sticky;
        bottom: 0;
        background: var(--surface);
    }
}

@keyframes mobileOverlayIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

@keyframes mobileSheetUp {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
}

/* ══════════════════════════════════════════════
   Landing-style design system — global
   ══════════════════════════════════════════════ */

.panel h2,
.panel h3 {
    font-family: var(--font-display);
    letter-spacing: -0.02em;
    font-weight: 600;
}

.eyebrow {
    display: block;
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    color: var(--color-muted);
    margin-bottom: 0.3rem;
}

.panel {
    border-radius: var(--radius-card);
    box-shadow: var(--shadow-card);
}

.panel-header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 1rem;
}

.panel-header-row h2 {
    margin: 0;
}

@keyframes fade-in {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
}

.animate-fade-in {
    animation: fade-in 0.5s ease both;
}

/* ── BETA badge — usado em features ainda em desenvolvimento ─── */
.beta-badge {
    display: inline-block;
    margin-left: 8px;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 1px;
    background: linear-gradient(135deg, #F59E0B, #EA580C);
    color: #fff;
    text-transform: uppercase;
    vertical-align: middle;
    line-height: 1.4;
    box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}

/* Quando dentro de um botão escuro (lc-btn-primary), mantém contraste */
.lc-btn-primary .beta-badge {
    background: rgba(255,255,255,0.95);
    color: #EA580C;
}

/* ══════════════════════════════════════════════════════════════
   BRAND TYPOGRAPHY UTILITIES — Pantry Home Intelligence
   Reflectem os 4 níveis das guidelines. Usar em vez de definir
   font-family/weight/size ad-hoc nas páginas.

     .brand-display   → wordmark (Light 300, ls 12px, uppercase)
     .brand-heading   → títulos de página (Light 300, sem ls)
     .brand-body      → texto corrente (Regular 400, 16px)
     .brand-label     → eyebrows, badges, micro caps (Regular 400, ls 3px)

   Mantemos as classes existentes (.eyebrow, .panel h2, etc) — estas
   são apenas alternativas explícitas para quem quer alinhar 1:1
   com a documentação de marca.
   ══════════════════════════════════════════════════════════════ */
.brand-display {
    font-family: var(--font-display);
    font-weight: 300;
    font-size: clamp(28px, 4vw, 38px);
    letter-spacing: 12px;
    color: var(--color-primary);
    text-transform: uppercase;
    line-height: 1.05;
}
.brand-heading {
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 24px;
    letter-spacing: -0.2px;
    color: var(--ink);
    line-height: 1.2;
}
.brand-body {
    font-family: var(--font-sans);
    font-weight: 400;
    font-size: 16px;
    line-height: 1.7;
    color: var(--ink);
}
.brand-label {
    font-family: var(--font-sans);
    font-weight: 400;
    font-size: 10px;
    letter-spacing: 3px;
    color: var(--ink-3);
    text-transform: uppercase;
}

/* ══════════════════════════════════════════════════════════════
   EDITORIAL ACCENT — Instrument Serif italic
   Usar com moderação. Regras:
     1. Uma palavra por título · uma frase por bloco. Mais que isso
        e perde força.
     2. Nunca em parágrafos — só Helvetica para body.
     3. Weight 200 só acima de 32px (em pares com a serif fica fininho).
     4. Letter-spacing inverso à dimensão (negativo em grande, positivo
        em uppercase pequeno).
     5. Tabular numerals (já no body) — números alinham em colunas.

   Exemplos:
     <h1>Resumo, <span class="serif">em ordem</span></h1>
     <div class="empty-state-msg serif">Nada para comprar.</div>
     <p>Algo subiu de forma <span class="serif">significativa</span>.</p>
   ══════════════════════════════════════════════════════════════ */
.serif {
    font-family: var(--font-serif);
    font-style: italic;
    font-weight: 400;
    /* Optical adjustments — Instrument Serif italic é ligeiramente
       mais larga que Helvetica Light. Estes valores compensam para
       parecer "à mesma medida" no contexto da frase. */
    letter-spacing: -0.01em;
}

/* Variantes opcionais para casos específicos sem precisar de inline styles. */
.serif-display {
    /* Para hero numbers / títulos grandes — letter-spacing mais apertado. */
    font-family: var(--font-serif);
    font-style: italic;
    font-weight: 400;
    letter-spacing: -0.04em;
}

.serif-empty {
    /* Para empty states — italic + cor secundária + tamanho confortável. */
    font-family: var(--font-serif);
    font-style: italic;
    font-weight: 400;
    font-size: 1.4rem;
    color: var(--ink-2);
    letter-spacing: -0.02em;
}

