/* ==========================================================================
   Cristal Lifewear — sacola
   Botão do cabeçalho e gaveta lateral, em todas as páginas.
   Referência: a sacola de loja-mvp/mockups/loja.html. No mockup ela é um
   painel fixo ao lado da grade; aqui é uma gaveta, que funciona igual no
   celular e existe em toda página, não só na loja.
   ========================================================================== */

/* --- Botão do cabeçalho ------------------------------------------------- */

.sacola-botao {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
  background: var(--lotus-0);
  color: var(--ink-900);
  cursor: pointer;
  transition: border-color var(--dur-base) var(--ease-soft),
              background var(--dur-base) var(--ease-soft),
              color var(--dur-base) var(--ease-soft);
}
.sacola-botao[hidden] { display: none; }
.sacola-botao:hover { border-color: var(--accent-primary); }
.sacola-botao:focus-visible { box-shadow: var(--shadow-focus); }
.sacola-botao svg { width: 20px; height: 20px; }

.sacola-botao__contagem {
  position: absolute;
  top: -4px;
  right: -4px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 5px;
  border-radius: var(--radius-pill);
  background: var(--accent-primary);
  color: #FFFFFF;
  font-size: .6875rem;
  font-weight: var(--fw-medium);
  line-height: 1;
}
.sacola-botao__contagem[hidden] { display: none; }

/* --- Gaveta ------------------------------------------------------------- */

.gaveta {
  inset: 0 0 0 auto;
  width: min(440px, 100%);
  height: 100%;
  max-width: 100%;
  max-height: 100%;
  margin: 0;
  padding: 0;
  border: 0;
  background: var(--lotus-0);
  color: var(--text-body);
  box-shadow: var(--shadow-lg);
  overscroll-behavior: contain;
}
.gaveta::backdrop { background: var(--overlay-scrim); }

/* A gaveta entra deslizando a largura inteira, não com um fade de 24px: o
   movimento curto em 320ms lia como um salto, e não contava de onde o painel
   veio. O véu escurece junto, um pouco mais rápido, para o fundo já estar
   assentado quando o painel chega. */
.gaveta[open] { animation: gaveta-entra var(--dur-gaveta) var(--ease-gaveta); }
.gaveta[open]::backdrop { animation: gaveta-veu var(--dur-base) var(--ease-soft); }

@keyframes gaveta-entra {
  from { transform: translateX(100%); }
}
@keyframes gaveta-veu {
  from { opacity: 0; }
}

/* Saída: o <dialog> continua `open` enquanto desliza para fora — quem fecha é
   o JavaScript, no fim da animação (assets/js/sacola-ui.js). Vem depois da
   regra de [open] de propósito: mesma especificidade, esta vence. */
.gaveta[data-fechando] { animation: gaveta-sai var(--dur-gaveta-sai) var(--ease-inout) forwards; }
.gaveta[data-fechando]::backdrop { animation: gaveta-veu-sai var(--dur-gaveta-sai) var(--ease-inout) forwards; }

@keyframes gaveta-sai {
  to { transform: translateX(100%); }
}
@keyframes gaveta-veu-sai {
  to { opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .gaveta[open],
  .gaveta[open]::backdrop,
  .gaveta[data-fechando],
  .gaveta[data-fechando]::backdrop { animation: none; }
}
/* Com a gaveta aberta a página de trás não rola junto. */
html:has(.gaveta[open]) { overflow: hidden; }

/* hidden precisa vencer o display dos componentes (.btn é flex). */
.gaveta [hidden] { display: none !important; }

/* Três faixas: topo, lista (a única que rola) e resumo preso no pé, num fundo
   rosado. Com uma peça só, o vazio fica no fundo da lista, não entre a peça e
   o resumo. Em tela baixa (celular deitado) o resumo não cabe preso: a gaveta
   inteira volta a rolar, ver o @media no fim. */
.gaveta__corpo {
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto;
  height: 100%;
}

.gaveta__topo {
  display: flex;
  align-items: baseline;
  gap: 12px;
  padding: 22px clamp(20px, 5vw, 28px) 18px;
  border-bottom: 1px solid var(--border-hairline);
}
.gaveta__titulo {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 1.625rem;
  line-height: 1.2;
  color: var(--text-heading);
}
.gaveta__conta {
  font-size: var(--fs-caption);
  letter-spacing: .04em;
  color: var(--text-muted);
}
.gaveta__fechar {
  align-self: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  margin: -6px -10px -6px auto;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--ink-700);
  cursor: pointer;
  transition: background var(--dur-base) var(--ease-soft), transform var(--dur-base) var(--ease-soft);
}
.gaveta__fechar:hover { background: var(--rosa-100); transform: rotate(90deg); }
.gaveta__fechar:focus-visible { box-shadow: var(--shadow-focus); }
.gaveta__fechar svg { width: 20px; height: 20px; }

/* Os recados da gaveta agora são avisos flutuantes (.aviso, em site.css),
   montados em .avisos--gaveta aqui dentro. */
.gaveta__aviso:empty { display: none; }
/* "Esvaziar a sacola", dentro do recado da volta do pagamento. */
.gaveta__aviso-acao {
  min-height: 40px;
  padding: 0 4px;
  border: 0;
  background: transparent;
  font: inherit;
  color: inherit;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gaveta__aviso-acao:hover { color: var(--accent-primary); }
.gaveta__aviso-acao:focus-visible { box-shadow: var(--shadow-focus); border-radius: var(--radius-sm); }

/* --- Itens -------------------------------------------------------------- */

.gaveta__meio {
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 0 clamp(20px, 5vw, 28px);
}
.gaveta__itens {
  margin: 0;
  padding: 0;
  list-style: none;
}
/* Mesma linguagem dos cards da loja: foto reta em 4/5, nome discreto, preço
   em rosa. */
.gaveta__item {
  display: flex;
  gap: 16px;
  padding: 20px 0;
  border-bottom: 1px solid var(--border-hairline);
}
.gaveta__item:last-child { border-bottom: 0; }
.gaveta__foto {
  width: 84px;
  height: 105px;
  flex: none;
  object-fit: cover;
  background: var(--rosa-200);
}
.gaveta__info {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1;
  min-width: 0;
}
.gaveta__nome {
  /* Alvo de toque de 33 px sem mexer no desenho (ver site.css). */
  align-self: flex-start;
  display: inline-block;
  padding-block: 5px;
  margin-block: -5px;
  font-family: var(--font-body);
  font-size: .9375rem;
  line-height: 1.35;
  letter-spacing: .02em;
  color: var(--text-heading);
  text-decoration: none;
}
.gaveta__nome:hover { color: var(--accent-primary); }
.gaveta__detalhe {
  font-size: var(--fs-caption);
  line-height: 1.45;
  color: var(--text-muted);
}
.gaveta__acoes {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: auto;
  padding-top: 8px;
}
.gaveta__valor {
  margin-left: auto;
  font-size: 1rem;
  font-weight: var(--fw-medium);
  color: var(--accent-primary);
  white-space: nowrap;
}
/* Desenho de 34px, alvo de toque de 40: o botão passa um pouco da pílula. */
.gaveta__qtd {
  display: inline-flex;
  align-items: center;
  height: 34px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
}
.gaveta__qtd-botao {
  width: 34px;
  height: 40px;
  margin-block: -3px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pill);
  background: transparent;
  font: inherit;
  font-size: 1rem;
  line-height: 1;
  color: var(--text-heading);
  cursor: pointer;
}
.gaveta__qtd-botao:hover:not(:disabled) { color: var(--accent-primary); }
.gaveta__qtd-botao:disabled { color: var(--ink-300); cursor: default; }
.gaveta__qtd-botao:focus-visible { box-shadow: var(--shadow-focus); }
.gaveta__qtd-valor {
  min-width: 18px;
  font-size: .875rem;
  font-variant-numeric: tabular-nums;
  color: var(--text-heading);
  text-align: center;
}
/* Lixeira ao lado da quantidade, no lugar do "remover" sublinhado. O nome
   para o leitor de tela vem do aria-label que sacola-ui.js põe ("Remover da
   sacola: …"). */
.gaveta__remover {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text-muted);
  cursor: pointer;
  transition: color var(--dur-base) var(--ease-soft), background var(--dur-base) var(--ease-soft);
}
.gaveta__remover svg { width: 18px; height: 18px; }
.gaveta__remover:hover { color: var(--accent-primary); background: var(--rosa-50); }
.gaveta__remover:focus-visible { box-shadow: var(--shadow-focus); }

.gaveta__vazia {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 100%;
  padding: 40px 0;
  text-align: center;
}
.gaveta__vazia-icone { width: 56px; height: 56px; margin-bottom: 6px; color: var(--rosa-400); }
.gaveta__vazia-titulo {
  margin: 0;
  font-family: var(--font-display);
  font-size: 1.5rem;
  color: var(--text-heading);
}
.gaveta__vazia-texto { margin: 0; font-size: var(--fs-body-s); color: var(--text-muted); }
.gaveta__vazia .btn { margin-top: 18px; }

/* --- Resumo e saídas ---------------------------------------------------- */

.gaveta__resumo {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 20px clamp(20px, 5vw, 28px) 22px;
  border-top: 1px solid var(--border-hairline);
  background: var(--rosa-25);
}

/* CEP de entrega: campo e botão numa pílula só. */
.gaveta__cep {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.gaveta__rotulo {
  font: var(--type-eyebrow);
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.gaveta__cep-campo {
  display: flex;
  align-items: center;
  height: 48px;
  padding: 4px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
  background: var(--lotus-0);
  transition: border-color var(--dur-base) var(--ease-soft), box-shadow var(--dur-base) var(--ease-soft);
}
.gaveta__cep-campo:hover { border-color: var(--ink-300); }
.gaveta__cep-campo:focus-within { border-color: var(--accent-primary); box-shadow: var(--shadow-focus); }
.gaveta__cep-campo:has([aria-invalid="true"]) { border-color: var(--accent-primary-hover); }
.gaveta__cep-entrada {
  flex: 1;
  min-width: 0;
  height: 100%;
  padding: 0 14px;
  border: 0;
  background: transparent;
  font: inherit;
  font-size: var(--fs-body-s);
  font-variant-numeric: tabular-nums;
  letter-spacing: .04em;
  color: var(--text-heading);
}
.gaveta__cep-entrada::placeholder { color: var(--text-muted); opacity: 1; }
/* O foco aparece na pílula inteira (:focus-within acima). Sem anular aqui, o
   :focus-visible global de site.css desenhava um segundo anel, quadrado,
   dentro dela. */
.gaveta__cep-entrada:focus-visible { outline: none; box-shadow: none; }
.gaveta__cep-botao {
  flex: none;
  height: 100%;
  padding: 0 18px;
  border: 0;
  border-radius: var(--radius-pill);
  background: var(--rosa-100);
  font: inherit;
  font-size: .6875rem;
  font-weight: var(--fw-medium);
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--accent-primary-hover);
  cursor: pointer;
  transition: background var(--dur-base) var(--ease-soft);
}
.gaveta__cep-botao:hover { background: var(--rosa-200); }
.gaveta__cep-botao:focus-visible { box-shadow: var(--shadow-focus); }
.gaveta__cep-botao:disabled { color: var(--text-muted); cursor: default; }
.gaveta__cep-recado {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 0;
  font-size: var(--fs-caption);
  line-height: 1.5;
  color: var(--text-muted);
}
.gaveta__cep-recado:empty { display: none; }
/* Pino de local só antes da cidade confirmada: no recado de "não foi possível
   validar" ele dizia o contrário do texto. */
.gaveta__cep-recado--local::before {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  background: var(--accent-primary);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E") center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E") center / contain no-repeat;
}
.gaveta__cep-recado strong { font-weight: var(--fw-medium); color: var(--text-heading); }
.gaveta__cep-recado--erro { color: var(--accent-primary-hover); }

.gaveta__contas {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 0;
  padding-top: 14px;
  border-top: 1px solid var(--border-hairline);
}
.gaveta__linha {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  font-size: var(--fs-body-s);
  color: var(--text-muted);
}
.gaveta__linha dt,
.gaveta__linha dd { margin: 0; }
.gaveta__linha dd { color: var(--text-body); text-align: right; }
/* Transportadora e prazo, embaixo do valor do frete. */
.gaveta__prazo {
  display: block;
  margin-top: 2px;
  font-size: .75rem;
  color: var(--text-muted);
}
.gaveta__linha--total {
  margin-top: 6px;
  font-size: .75rem;
  font-weight: var(--fw-medium);
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--text-heading);
}
.gaveta__linha--total dd {
  font-family: var(--font-display);
  font-size: 1.875rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1;
  color: var(--text-heading);
}

.gaveta__caminhos {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.gaveta__botao {
  width: 100%;
  min-height: 54px;
  padding: 0 20px;
  font-size: .8125rem;
  white-space: normal;
  text-align: center;
}
.gaveta__botao .arrow { width: 18px; height: 10px; flex: none; transition: transform var(--dur-base) var(--ease-soft); }
.gaveta__botao:hover .arrow { transform: translateX(4px); }
/* "Abrindo o pagamento…": mesma cor (o contraste não cai), só sem o convite
   ao clique. aria-disabled em vez de disabled, para o foco não se perder. */
.gaveta__botao[aria-disabled="true"],
.gaveta__botao[aria-disabled="true"]:hover {
  cursor: progress;
  transform: none;
  background: var(--accent-primary);
}

.gaveta__nota {
  margin: 0;
  font-size: .75rem;
  line-height: 1.6;
  color: var(--text-muted);
  text-align: center;
}

@media (prefers-reduced-motion: reduce) {
  .gaveta__fechar:hover { transform: none; }
}

/* Tela baixa: resumo preso não deixaria espaço para as peças (e ele mesmo
   não caberia). A gaveta inteira rola, como uma página. */
@media (max-height: 620px) {
  .gaveta__corpo { display: block; height: auto; min-height: 100%; }
  .gaveta__meio { overflow: visible; }
}
