/*
 * Ponto de entrada do RVM.UI: o app inclui SO este arquivo.
 *   <link rel="stylesheet" href="_content/RVM.UI/rvm-ui.css" />
 *
 * tokens.css e GERADO pelo extrator (tools/fig-extract). Este arquivo e escrito a mao e nao pode ter
 * cor literal: tudo vem dos tokens.
 */
@import url('tokens.css');

/* Manrope (SIL OFL 1.1, fonts/OFL-Manrope.txt), variavel 200-800, via @fontsource-variable/manrope 5.3.0.
   So latin e latin-ext: cobrem o PT-BR inteiro. */
@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-display: swap;
  font-weight: 200 800;
  src: url('fonts/manrope-latin-ext-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-display: swap;
  font-weight: 200 800;
  src: url('fonts/manrope-latin-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/*
 * ESQUEMAS DE COR (RvmColorScheme), decisao do Rafael em 17/09/2026: os dois existem.
 *   original   -> os degraus do kit, medidos em design/medidas/ (RUI-003). Fidelidade total, e por
 *                 isso REPROVA AA em 5 das 6 familias — de proposito (Rafael, 20/09, RUI-007). O kit
 *                 escreve branco sobre amarelo; consertar aqui seria deixar de espelhar o kit. Ver 06.
 *   accessible -> degraus que passam 4.5:1 com texto (RNF-02). PADRAO. Tabela do desvio no 06.
 * Mesmo mecanismo do destaque: custom properties no elemento do RvmThemeProvider, herdadas. O esquema
 * mais proximo na arvore vence, entao da para misturar os dois na mesma tela.
 * So o que muda entre os esquemas mora aqui (--rvm-s-*). Destaque (Purple/Blue/Black) e igual nos dois.
 */
:root,
[data-rvm-contrast="accessible"] {
  --rvm-s-neutral-fill: var(--rvm-neutral-800);
  --rvm-s-neutral-fill-hover: var(--rvm-neutral-900);
  --rvm-s-neutral-ink: var(--rvm-neutral-800);
  --rvm-s-neutral-ink-hover: var(--rvm-neutral-900);
  /* 4,67:1 sobre o suave 100 — o proprio ink ja passa. */
  --rvm-s-neutral-soft-ink: var(--rvm-neutral-800);
  --rvm-s-neutral-soft-ink-hover: var(--rvm-neutral-900);

  --rvm-s-success-fill: var(--rvm-success-700);
  --rvm-s-success-fill-hover: var(--rvm-success-800);
  --rvm-s-success-ink: var(--rvm-success-700);
  --rvm-s-success-ink-hover: var(--rvm-success-800);
  /* 700 sobre o suave 50 da 4,37:1 — reprova. A UNICA familia que precisa subir no suave. */
  --rvm-s-success-soft-ink: var(--rvm-success-800);
  --rvm-s-success-soft-ink-hover: var(--rvm-success-900);

  --rvm-s-danger-fill: var(--rvm-danger-700);
  --rvm-s-danger-fill-hover: var(--rvm-danger-800);
  --rvm-s-danger-ink: var(--rvm-danger-700);
  --rvm-s-danger-ink-hover: var(--rvm-danger-800);
  /* 5,35:1 sobre o suave 50. */
  --rvm-s-danger-soft-ink: var(--rvm-danger-700);
  --rvm-s-danger-soft-ink-hover: var(--rvm-danger-800);

  --rvm-s-warning-fill: var(--rvm-warning-800);
  --rvm-s-warning-action: var(--rvm-warning-800);
  --rvm-s-warning-fill-hover: var(--rvm-warning-900);
  --rvm-s-warning-ink: var(--rvm-warning-800);
  --rvm-s-warning-ink-hover: var(--rvm-warning-900);
  /* 4,86:1 sobre o suave 50. */
  --rvm-s-warning-soft-ink: var(--rvm-warning-800);
  --rvm-s-warning-soft-ink-hover: var(--rvm-warning-900);

  --rvm-s-info-fill: var(--rvm-info-800);
  --rvm-s-info-fill-hover: var(--rvm-info-900);
  --rvm-s-info-ink: var(--rvm-info-800);
  --rvm-s-info-ink-hover: var(--rvm-info-900);
  /* 5,30:1 sobre o suave 50. */
  --rvm-s-info-soft-ink: var(--rvm-info-800);
  --rvm-s-info-soft-ink-hover: var(--rvm-info-900);

  /* White Secondary: texto branco sobre branco 50% em cima do accent-500 da 2,2:1 (azul); 10% e o maximo. */
  --rvm-s-inverse-soft: color-mix(in srgb, var(--rvm-white) 8%, transparent);
  --rvm-s-inverse-soft-hover: color-mix(in srgb, var(--rvm-white) 10%, transparent);

  /* Texto (RvmText e rotulos): grey-700, green-500, red-500 e yellow-600 no branco reprovam AA. */
  --rvm-s-text-secondary: var(--rvm-neutral-800);
  /* Dia fora do mes na agenda. O kit escreve em Grey-500 (1,9:1, reprova AA); aqui ele fica
     legivel porque quem diz "nao e deste mes" e a HACHURA, nao a cor — e forma nao depende
     de enxergar contraste. No esquema do kit, abaixo, ele volta ao Grey-500. */
  --rvm-s-text-muted: var(--rvm-neutral-800);
  /* Texto de apoio DENTRO de um balao do destaque (o tamanho do arquivo, a duracao do audio).
     O kit escreve em Violet-200 sobre Violet-500, que da 2,5:1 e reprova AA; aqui ele usa a
     mesma cor do texto principal, e a hierarquia fica por tamanho e peso em vez de por
     contraste. No esquema do kit, abaixo, volta ao 200. */
  --rvm-s-on-accent-muted: var(--rvm-s-on-accent-500);
  --rvm-s-text-success: var(--rvm-success-700);
  --rvm-s-text-danger: var(--rvm-danger-700);
  --rvm-s-text-warning: var(--rvm-warning-800);

  /* Controle desligado (borda do checkbox/radio, trilho do switch): grey-500 no branco da 1,9:1; AA de
     elemento grafico pede 3:1 -> neutral-700 (3,6:1). */
  --rvm-s-control-off: var(--rvm-neutral-700);
  /* Texto branco apagado sobre a cor cheia (sidebar colorida): o kit usa 75%, abaixo de AA. */
  --rvm-s-on-fill-muted: 100%;
  /* Item ativo da sidebar colorida: o kit clareia com branco 25% (texto branco cai abaixo de AA); aqui escurece. */
  --rvm-s-nav-active-on-fill: color-mix(in srgb, var(--rvm-ink-500) 30%, transparent);
}

/*
 * ⚠️ O esquema Original ESPELHA O KIT — decisao do Rafael em 20/09/2026 (`RUI-007`), e o `soft-ink`
 * daqui segue a mesma regra: e o tom que o Protask usa, nao o que passaria em AA. Medido, cinco das
 * seis familias reprovam AA aqui, e isso e de proposito: e para isso que serve o lado a lado.
 * Quem precisa de AA usa o esquema Accessible, que e o PADRAO de todo aplicativo. Ver o `06`.
 */
[data-rvm-contrast="original"] {
  --rvm-s-neutral-fill: var(--rvm-neutral-700);
  --rvm-s-neutral-fill-hover: var(--rvm-neutral-800);
  --rvm-s-neutral-ink: var(--rvm-neutral-700);
  --rvm-s-neutral-ink-hover: var(--rvm-neutral-800);
  --rvm-s-neutral-soft-ink: var(--rvm-neutral-700);
  --rvm-s-neutral-soft-ink-hover: var(--rvm-neutral-800);

  --rvm-s-success-fill: var(--rvm-success-500);
  --rvm-s-success-fill-hover: var(--rvm-success-700);
  --rvm-s-success-ink: var(--rvm-success-500);
  --rvm-s-success-ink-hover: var(--rvm-success-700);
  --rvm-s-success-soft-ink: var(--rvm-success-500);
  --rvm-s-success-soft-ink-hover: var(--rvm-success-700);

  --rvm-s-danger-fill: var(--rvm-danger-500);
  --rvm-s-danger-fill-hover: var(--rvm-danger-700);
  --rvm-s-danger-ink: var(--rvm-danger-500);
  --rvm-s-danger-ink-hover: var(--rvm-danger-700);
  --rvm-s-danger-soft-ink: var(--rvm-danger-500);
  --rvm-s-danger-soft-ink-hover: var(--rvm-danger-700);

  /* Kit: label, badge e progresso amarelos em 500; o botao amarelo em 600 (medido). */
  --rvm-s-warning-fill: var(--rvm-warning-500);
  --rvm-s-warning-action: var(--rvm-warning-600);
  --rvm-s-warning-fill-hover: var(--rvm-warning-800);
  --rvm-s-warning-ink: var(--rvm-warning-600);
  --rvm-s-warning-ink-hover: var(--rvm-warning-800);
  --rvm-s-warning-soft-ink: var(--rvm-warning-600);
  --rvm-s-warning-soft-ink-hover: var(--rvm-warning-800);

  /* Kit: cyan cheio em 500, texto do label suave em 600. */
  --rvm-s-info-fill: var(--rvm-info-500);
  --rvm-s-info-fill-hover: var(--rvm-info-700);
  --rvm-s-info-ink: var(--rvm-info-600);
  --rvm-s-info-ink-hover: var(--rvm-info-700);
  --rvm-s-info-soft-ink: var(--rvm-info-600);
  --rvm-s-info-soft-ink-hover: var(--rvm-info-700);

  --rvm-s-inverse-soft: color-mix(in srgb, var(--rvm-white) 50%, transparent);
  --rvm-s-inverse-soft-hover: color-mix(in srgb, var(--rvm-white) 75%, transparent);

  --rvm-s-text-secondary: var(--rvm-neutral-700);
  --rvm-s-text-muted: var(--rvm-neutral-500);
  --rvm-s-on-accent-muted: var(--rvm-accent-200);
  --rvm-s-text-success: var(--rvm-success-500);
  --rvm-s-text-danger: var(--rvm-danger-500);
  --rvm-s-text-warning: var(--rvm-warning-600);

  --rvm-s-control-off: var(--rvm-neutral-500);
  --rvm-s-on-fill-muted: 75%;
  --rvm-s-nav-active-on-fill: color-mix(in srgb, var(--rvm-white) 25%, transparent);
}

/*
 * Rampas de cor por papel (RvmColor). Componente le so --rvm-c-*.
 * Medido em design/medidas/*-button.json (RUI-003): Purple/Blue/Black -> accent (cheio 500, hover 700,
 * suave 50/100, borda 100); Grey -> neutral (suave 100/200, borda 200). O degrau que muda entre os
 * esquemas vem de --rvm-s-* (acima).
 * *-strong: o icone-botao usa um degrau acima no suave-hover e na borda (medido: violet 200 x 100).
 * --rvm-c-action: cheio do BOTAO quando difere do cheio dos outros componentes (so o amarelo).
 */
.rvm-c-accent {
  --rvm-c-fill: var(--rvm-accent-500);
  --rvm-c-fill-hover: var(--rvm-accent-700);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-accent-50);
  --rvm-c-soft-hover: var(--rvm-accent-100);
  --rvm-c-soft-hover-strong: var(--rvm-accent-200);
  --rvm-c-ink: var(--rvm-accent-500);
  --rvm-c-ink-hover: var(--rvm-accent-700);
  /* 5,17:1 sobre o suave 50 — o ink ja passa, nos dois esquemas. */
  --rvm-c-soft-ink: var(--rvm-accent-500);
  --rvm-c-soft-ink-hover: var(--rvm-accent-700);
  --rvm-c-line: var(--rvm-accent-100);
  --rvm-c-line-strong: var(--rvm-accent-200);
  --rvm-c-line-hover: var(--rvm-accent-700);
  --rvm-c-tint: var(--rvm-accent-50);
  --rvm-c-fill-on-dark: var(--rvm-accent-on-dark);
}

.rvm-c-neutral {
  --rvm-c-fill: var(--rvm-s-neutral-fill);
  --rvm-c-fill-hover: var(--rvm-s-neutral-fill-hover);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-neutral-100);
  --rvm-c-soft-hover: var(--rvm-neutral-200);
  --rvm-c-soft-hover-strong: var(--rvm-neutral-200);
  --rvm-c-ink: var(--rvm-s-neutral-ink);
  --rvm-c-ink-hover: var(--rvm-s-neutral-ink-hover);
  --rvm-c-soft-ink: var(--rvm-s-neutral-soft-ink);
  --rvm-c-soft-ink-hover: var(--rvm-s-neutral-soft-ink-hover);
  --rvm-c-line: var(--rvm-neutral-200);
  --rvm-c-line-strong: var(--rvm-neutral-200);
  --rvm-c-line-hover: var(--rvm-s-neutral-ink-hover);
  --rvm-c-tint: var(--rvm-neutral-50);
}

.rvm-c-success {
  --rvm-c-fill: var(--rvm-s-success-fill);
  --rvm-c-fill-hover: var(--rvm-s-success-fill-hover);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-success-50);
  --rvm-c-soft-hover: var(--rvm-success-100);
  --rvm-c-soft-hover-strong: var(--rvm-success-200);
  --rvm-c-ink: var(--rvm-s-success-ink);
  --rvm-c-ink-hover: var(--rvm-s-success-ink-hover);
  --rvm-c-line: var(--rvm-success-100);
  --rvm-c-line-strong: var(--rvm-success-200);
  --rvm-c-line-hover: var(--rvm-s-success-ink-hover);
  --rvm-c-tint: var(--rvm-success-50);
  --rvm-c-soft-ink: var(--rvm-s-success-soft-ink);
  --rvm-c-soft-ink-hover: var(--rvm-s-success-soft-ink-hover);
}

.rvm-c-danger {
  --rvm-c-fill: var(--rvm-s-danger-fill);
  --rvm-c-fill-hover: var(--rvm-s-danger-fill-hover);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-danger-50);
  --rvm-c-soft-hover: var(--rvm-danger-100);
  --rvm-c-soft-hover-strong: var(--rvm-danger-200);
  --rvm-c-ink: var(--rvm-s-danger-ink);
  --rvm-c-ink-hover: var(--rvm-s-danger-ink-hover);
  --rvm-c-soft-ink: var(--rvm-s-danger-soft-ink);
  --rvm-c-soft-ink-hover: var(--rvm-s-danger-soft-ink-hover);
  --rvm-c-line: var(--rvm-danger-100);
  --rvm-c-line-strong: var(--rvm-danger-200);
  --rvm-c-line-hover: var(--rvm-s-danger-ink-hover);
  --rvm-c-tint: var(--rvm-danger-50);
}

.rvm-c-warning {
  --rvm-c-fill: var(--rvm-s-warning-fill);
  --rvm-c-fill-hover: var(--rvm-s-warning-fill-hover);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-warning-50);
  --rvm-c-soft-hover: var(--rvm-warning-100);
  --rvm-c-soft-hover-strong: var(--rvm-warning-200);
  --rvm-c-ink: var(--rvm-s-warning-ink);
  --rvm-c-ink-hover: var(--rvm-s-warning-ink-hover);
  --rvm-c-soft-ink: var(--rvm-s-warning-soft-ink);
  --rvm-c-soft-ink-hover: var(--rvm-s-warning-soft-ink-hover);
  --rvm-c-line: var(--rvm-warning-100);
  --rvm-c-line-strong: var(--rvm-warning-200);
  --rvm-c-line-hover: var(--rvm-s-warning-ink-hover);
  --rvm-c-tint: var(--rvm-warning-50);
  --rvm-c-action: var(--rvm-s-warning-action);
}

.rvm-c-info {
  --rvm-c-fill: var(--rvm-s-info-fill);
  --rvm-c-fill-hover: var(--rvm-s-info-fill-hover);
  --rvm-c-on-fill: var(--rvm-white);
  --rvm-c-soft: var(--rvm-info-50);
  --rvm-c-soft-hover: var(--rvm-info-100);
  --rvm-c-soft-hover-strong: var(--rvm-info-200);
  --rvm-c-ink: var(--rvm-s-info-ink);
  --rvm-c-ink-hover: var(--rvm-s-info-ink-hover);
  --rvm-c-soft-ink: var(--rvm-s-info-soft-ink);
  --rvm-c-soft-ink-hover: var(--rvm-s-info-soft-ink-hover);
  --rvm-c-line: var(--rvm-info-100);
  --rvm-c-line-strong: var(--rvm-info-200);
  --rvm-c-line-hover: var(--rvm-s-info-ink-hover);
  --rvm-c-tint: var(--rvm-info-50);
}

/* Sobre fundo colorido ou escuro (White do kit). Borda 20% igual nos dois esquemas. */
.rvm-c-inverse {
  --rvm-c-fill: var(--rvm-white);
  --rvm-c-fill-hover: var(--rvm-neutral-300);
  --rvm-c-on-fill: var(--rvm-ink-400);
  --rvm-c-soft: var(--rvm-s-inverse-soft);
  --rvm-c-soft-hover: var(--rvm-s-inverse-soft-hover);
  --rvm-c-soft-hover-strong: var(--rvm-s-inverse-soft-hover);
  --rvm-c-ink: var(--rvm-white);
  --rvm-c-ink-hover: var(--rvm-white);
  --rvm-c-line: color-mix(in srgb, var(--rvm-white) 20%, transparent);
  --rvm-c-line-strong: color-mix(in srgb, var(--rvm-white) 20%, transparent);
  --rvm-c-line-hover: var(--rvm-white);
}

/* Enfeites do RvmArtisticIconBadge no destaque (medidos: roxo -> amarelo, azul -> verde, preto -> ciano).
   Ficam no elemento do provider, como os tokens do destaque, para herdar certo quando ha aninhamento. */
:root,
[data-rvm-accent="purple"] {
  --rvm-accent-on-dark: var(--rvm-accent-500);
  --rvm-accent-art-grad: var(--rvm-warning-500); --rvm-accent-art-grad-op: 0.35;
  --rvm-accent-art-glow-a: var(--rvm-info-500); --rvm-accent-art-glow-b: var(--rvm-warning-500);
}
[data-rvm-accent="blue"] {
  --rvm-accent-on-dark: var(--rvm-accent-500);
  --rvm-accent-art-grad: var(--rvm-success-500); --rvm-accent-art-grad-op: 0.5;
  --rvm-accent-art-glow-a: var(--rvm-warning-500); --rvm-accent-art-glow-b: var(--rvm-info-500);
}
[data-rvm-accent="black"] {
  /* Destaque preto sobre superficie escura some: vira branco (pedido do Rafael, 17/09/2026, nos dois esquemas). */
  --rvm-accent-on-dark: var(--rvm-white);
  --rvm-accent-art-grad: var(--rvm-info-500); --rvm-accent-art-grad-op: 0.25;
  --rvm-accent-art-glow-a: var(--rvm-success-500); --rvm-accent-art-glow-b: var(--rvm-warning-500);
}

/* A cor do TEXTO que vai por cima de cada degrau do destaque.
 *
 * ⚠️ Nao da para escolher uma cor so: o destaque preto INVERTE. No roxo e no azul so o 500 e escuro o
 * bastante para texto branco; no preto o 300, o 400 e o 500 pedem branco, e so o 100 e o 200 pedem
 * tinta. Calculado, nao estimado — o pior caso da tabela e 4,82:1, acima dos 4,5:1 do portao 4, e o
 * `MatrizDeContraste` do RUI-007 cobre isto.
 *
 * Existe porque o kit escreve a porcentagem DENTRO da fatia (medidor e bolha), e branco sobre o roxo
 * claro da 1,64:1. Decisao do Rafael em 21/09: "o contraste vem primeiro" — mas resolver, nao evitar.
 */
:root,
[data-rvm-accent="purple"],
[data-rvm-accent="blue"] {
  --rvm-s-on-accent-100: var(--rvm-ink-500);
  --rvm-s-on-accent-200: var(--rvm-ink-500);
  --rvm-s-on-accent-300: var(--rvm-ink-500);
  --rvm-s-on-accent-400: var(--rvm-ink-500);
  --rvm-s-on-accent-500: var(--rvm-white);
}
[data-rvm-accent="black"] {
  --rvm-s-on-accent-100: var(--rvm-ink-500);
  --rvm-s-on-accent-200: var(--rvm-ink-500);
  --rvm-s-on-accent-300: var(--rvm-white);
  --rvm-s-on-accent-400: var(--rvm-white);
  --rvm-s-on-accent-500: var(--rvm-white);
}

/* ⚠️ No esquema ORIGINAL o texto dentro da fatia e BRANCO em tudo, porque e o que o kit faz — e o
 * Original existe para espelhar o kit, nao para passar em AA (decisao do Rafael em 20/09, RUI-007).
 * Medido: branco sobre o roxo claro da 1,64:1 e sobre o amarelo 1,69:1. Quem precisa de AA usa o
 * Accessible, que e o PADRAO de todo aplicativo — e la cada degrau declara a sua cor por cima.
 *
 * E assim o lado a lado compara o que tem de comparar: o desenho do kit, com a cor do kit.
 */
[data-rvm-contrast="original"] {
  --rvm-s-on-accent-100: var(--rvm-white);
  --rvm-s-on-accent-200: var(--rvm-white);
  --rvm-s-on-accent-300: var(--rvm-white);
  --rvm-s-on-accent-400: var(--rvm-white);
  --rvm-s-on-accent-500: var(--rvm-white);
  --rvm-s-on-warning-500: var(--rvm-white);
  --rvm-s-on-success-500: var(--rvm-white);
  --rvm-s-on-danger-500: var(--rvm-white);
  --rvm-s-on-info-500: var(--rvm-white);
  --rvm-s-on-neutral-100: var(--rvm-white);
}

/* As cinco cores cheias do kit nao mudam com o destaque: as quatro que nao sao o destaque pedem tinta
 * (o amarelo com branco da 1,69:1). */
:root {
  --rvm-s-on-warning-500: var(--rvm-ink-500);
  --rvm-s-on-success-500: var(--rvm-ink-500);
  --rvm-s-on-danger-500: var(--rvm-ink-500);
  --rvm-s-on-info-500: var(--rvm-ink-500);
  --rvm-s-on-neutral-100: var(--rvm-ink-500);
}

/*
 * BASE DOS CAMPOS DE FORMULARIO (onda 2, RUI-004). Global de proposito: todo campo compartilha rotulo,
 * caixa e mensagem de erro, e CSS isolado nao alcanca elemento renderizado por componente filho.
 * Medidas: design/medidas/purple-text-field.json e with-label-*.json.
 *   caixa 48 px, raio 12 (ou pilula), padding 12/16, borda 1 px grey-100 por dentro, fundo branco;
 *   Active = foco dentro, borda no destaque; Disable = fundo e borda grey-100; Error = fundo red-50,
 *   borda red-500 e mensagem text-s abaixo (espaco 4); rotulo text-m 500 grey-800 (espaco 6).
 */
.rvm-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}

.rvm-field__label-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-8);
}

.rvm-field__label {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-neutral-800);
}

.rvm-field__box {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-4);
  box-sizing: border-box;
  min-height: 48px;
  padding: 12px var(--rvm-space-16);
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  cursor: text;
}

.rvm-field--pill .rvm-field__box { border-radius: var(--rvm-radius-full); }
.rvm-field__box:focus-within { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }

.rvm-field__input {
  flex: 1;
  min-width: 0;
  margin: 0;
  padding: 2px 0;
  border: 0;
  outline: 0;
  background: transparent;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-ink-500);
}

.rvm-field__input::placeholder { color: var(--rvm-s-text-secondary); opacity: 1; }
textarea.rvm-field__input { min-height: 136px; resize: vertical; }
.rvm-field--multiline .rvm-field__box { align-items: flex-start; }

.rvm-field__icon { color: var(--rvm-neutral-700); flex: none; }
.rvm-field__suffix { flex: none; font-size: var(--rvm-text-m-size); line-height: var(--rvm-text-m-line-height); color: var(--rvm-s-text-secondary); }

.rvm-field--disabled .rvm-field__box { background: var(--rvm-neutral-100); cursor: not-allowed; }
.rvm-field--disabled .rvm-field__input { color: var(--rvm-s-text-secondary); cursor: not-allowed; }

.rvm-field--error .rvm-field__box,
.rvm-field--error .rvm-field__box:focus-within { background: var(--rvm-danger-50); box-shadow: inset 0 0 0 1px var(--rvm-danger-500); }
.rvm-field--error .rvm-field__input::placeholder { color: var(--rvm-s-text-danger); }

.rvm-field__error {
  margin: -2px 0 0;
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  color: var(--rvm-s-text-danger);
}

/* Multiple Text Field: com tags o padding cai para 8 (medido). */
.rvm-field__box--tags { flex-wrap: wrap; gap: var(--rvm-space-8); padding: var(--rvm-space-8); }
.rvm-field__box--tags .rvm-field__input { min-width: 6rem; padding-left: var(--rvm-space-8); }

/*
 * CONTROLES DE ESCOLHA (onda 2, fatia 2): checkbox, radio, switch e chips. Globais pelo mesmo motivo da base
 * de campo (InputRadio do Blazor e componente filho). Input nativo visualmente oculto por cima do desenho:
 * teclado, formulario e leitor de tela sao os do navegador.
 * Medidas: design/medidas/checkbox.json, radio-button.json, switch-toggle.json, purple-*-with-label.json, purple-chips.json.
 */
.rvm-choice {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-8);
  font-family: var(--rvm-font-family);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  letter-spacing: var(--rvm-letter-spacing);
  color: var(--rvm-s-text-secondary);
  cursor: pointer;
}

.rvm-choice--end { flex-direction: row-reverse; justify-content: flex-end; }

.rvm-choice__input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: inherit;
}

.rvm-choice__mark {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 20px;
  height: 20px;
  border: 2px solid var(--rvm-s-control-off);
  background: var(--rvm-white);
  color: var(--rvm-white);
  pointer-events: none;
}

.rvm-choice__mark--checkbox { border-radius: 6px; }
.rvm-choice__mark--checkbox .rvm-icon { visibility: hidden; }
.rvm-choice__mark--radio { border-radius: var(--rvm-radius-full); }

.rvm-choice:has(.rvm-choice__input:checked) .rvm-choice__mark,
.rvm-choice--indeterminate .rvm-choice__mark { border-color: var(--rvm-accent-500); background: var(--rvm-accent-500); }
.rvm-choice:has(.rvm-choice__input:checked) .rvm-choice__mark--checkbox .rvm-icon,
.rvm-choice--indeterminate .rvm-choice__mark--checkbox .rvm-icon { visibility: visible; }
.rvm-choice:has(.rvm-choice__input:checked) .rvm-choice__mark--radio::after {
  content: "";
  width: 10px;
  height: 10px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
}

/* Rotulo marcado: 700 no destaque (medido). */
.rvm-choice:has(.rvm-choice__input:checked) .rvm-choice__text,
.rvm-choice--indeterminate .rvm-choice__text { font-weight: var(--rvm-font-weight-bold); color: var(--rvm-accent-500); }
.rvm-choice__text { display: inline-flex; align-items: center; gap: var(--rvm-space-4); }

.rvm-choice:has(.rvm-choice__input:focus-visible) .rvm-choice__mark { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-choice:has(.rvm-choice__input:disabled) { cursor: not-allowed; opacity: 0.65; }

/* Switch: trilho 36x20, padding 4, bolinha 12. */
.rvm-choice__mark--switch {
  justify-content: flex-start;
  width: 36px;
  padding: 4px;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-s-control-off);
  transition: background-color 120ms ease;
}

.rvm-choice__mark--switch::after {
  content: "";
  width: 12px;
  height: 12px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-neutral-50);
  transition: transform 120ms ease;
}

.rvm-choice:has(.rvm-choice__input:checked) .rvm-choice__mark--switch::after { transform: translateX(16px); background: var(--rvm-white); }

/* Chip: 40 px, raio 10, padding 10/14, borda 1 grey-100; selecionado fundo accent-50 e borda accent-500. */
.rvm-chip {
  min-height: 40px;
  box-sizing: border-box;
  padding: 10px 14px;
  border-radius: var(--rvm-radius-10);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
}

.rvm-chip:has(.rvm-choice__input:checked) { background: var(--rvm-accent-50); box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-chip:has(.rvm-choice__input:focus-visible) { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }

.rvm-choice-group { display: flex; flex-wrap: wrap; gap: var(--rvm-space-16); border: 0; margin: 0; padding: 0; min-width: 0; }
.rvm-choice-group--vertical { flex-direction: column; gap: var(--rvm-space-12); }
.rvm-choice-group__legend { padding: 0; margin-bottom: var(--rvm-space-8); font-family: var(--rvm-font-family); font-size: var(--rvm-text-m-size); font-weight: var(--rvm-font-weight-medium); color: var(--rvm-neutral-800); }

@media (prefers-reduced-motion: reduce) {
  .rvm-choice__mark--switch, .rvm-choice__mark--switch::after { transition: none; }
}

/* Raiz do tema (RvmThemeProvider). O destaque vem do atributo data-rvm-accent, resolvido no tokens.css. */
.rvm-theme {
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-ink-500);
}

/* Texto so para leitor de tela. */
.rvm-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* ---------- Select Option e Option (onda 2, RUI-004) ---------- */
.rvm-field--grey .rvm-field__box { background: var(--rvm-neutral-50); }

.rvm-select__anchor { position: relative; }

.rvm-select__trigger {
  width: 100%;
  gap: var(--rvm-space-8);
  border: 0;
  font: inherit;
  text-align: start;
  color: inherit;
  cursor: pointer;
}
.rvm-select__trigger:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-select__trigger[aria-expanded="true"] { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-select__trigger:disabled { cursor: not-allowed; }

/* Multiple Select: tags + botao que ocupa o resto da caixa. */
.rvm-select__box { cursor: default; }
.rvm-select__box:has(.rvm-select__trigger[aria-expanded="true"]) { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-select__trigger--inline {
  display: flex;
  align-items: center;
  flex: 1;
  min-width: 4rem;
  min-height: 24px;
  padding: 0 0 0 var(--rvm-space-8);
  background: transparent;
  box-shadow: none;
}
.rvm-select__trigger--inline:focus-visible { box-shadow: none; }
/* Aberto, quem ganha a borda do destaque e a caixa inteira (regra acima), nunca o botao interno. */
.rvm-select__trigger--inline[aria-expanded="true"] { box-shadow: none; }
.rvm-field__box--tags .rvm-select__trigger--inline { padding-inline-end: var(--rvm-space-8); }

.rvm-select__value {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-ink-500);
}
.rvm-select__value--placeholder { color: var(--rvm-s-text-secondary); }
.rvm-field--error .rvm-select__value--placeholder,
.rvm-field--error .rvm-field__icon { color: var(--rvm-s-text-danger); }
.rvm-field--disabled .rvm-select__value { color: var(--rvm-s-text-secondary); }

.rvm-select__native { appearance: none; cursor: pointer; }
.rvm-select__native[multiple] { min-height: 96px; }

.rvm-select__backdrop { position: fixed; inset: 0; z-index: 40; }

/* Lista: raio 12, padding 8/0, borda grey-100, Soft Shadow, 5 opcoes (240) visiveis. */
.rvm-option-list {
  position: absolute;
  z-index: 41;
  inset-inline: 0;
  top: calc(100% + 4px);
  box-sizing: border-box;
  max-height: 256px;
  margin: 0;
  padding: var(--rvm-space-8) 0;
  overflow-y: auto;
  list-style: none;
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
  scrollbar-width: thin;
  scrollbar-color: var(--rvm-accent-500) var(--rvm-neutral-100);
}
.rvm-option-list:focus { outline: 0; }

.rvm-option {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  min-height: 48px;
  padding: 12px var(--rvm-space-16);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-s-text-secondary);
  cursor: pointer;
}
.rvm-option:hover, .rvm-option:focus { background: var(--rvm-neutral-100); color: var(--rvm-ink-500); outline: 0; }
.rvm-option:focus-visible { box-shadow: inset 0 0 0 2px var(--rvm-accent-700); }
.rvm-option--selected, .rvm-option--selected:hover, .rvm-option--selected:focus { font-weight: var(--rvm-font-weight-bold); color: var(--rvm-accent-500); }
.rvm-option[aria-disabled="true"] { color: var(--rvm-neutral-500); cursor: not-allowed; background: transparent; }
.rvm-option__text { flex: 1; min-width: 0; }
.rvm-option__check { flex: none; }
.rvm-option__image { flex: none; width: 20px; height: 20px; margin: 2px; border-radius: var(--rvm-radius-full); object-fit: cover; }

/* Text Field + Select: unidade no fim do campo, lista de 200 px alinhada a direita (medido). */
.rvm-select__unit {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  flex: none;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-5);
  background: transparent;
  font: inherit;
  cursor: pointer;
}
.rvm-select__unit:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-select__unit:disabled { cursor: not-allowed; }
.rvm-option-list--end { inset-inline: auto 0; width: 200px; }

/* ---------- Small_Calendar e Datepicker (onda 2, RUI-004) ---------- */
.rvm-calendar {
  box-sizing: border-box;
  width: 400px;
  max-width: 100%;
  border-radius: var(--rvm-radius-20);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
  overflow: hidden;
}

.rvm-calendar__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-16);
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
}

/* Grey Icon Button Tertiary Medium do kit: 40, borda grey-200. */
.rvm-calendar__nav {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-200);
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-calendar__nav:hover { background: var(--rvm-neutral-50); }

.rvm-calendar__filters { display: flex; gap: var(--rvm-space-8); min-width: 0; }

/* Select Option No Outline: 40 de altura, raio 8, padding 10/12, text-m 500. Aberto ganha a borda do destaque. */
.rvm-calendar__pick {
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  height: 40px;
  padding: 10px 12px;
  border: 0;
  border-radius: var(--rvm-radius-8);
  background: var(--rvm-white);
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-ink-500);
  cursor: pointer;
}
.rvm-calendar__pick--month { width: 148px; }
.rvm-calendar__pick--year { width: 100px; }
.rvm-calendar__pick[aria-expanded="true"] { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }

.rvm-calendar__nav:focus-visible,
.rvm-calendar__pick:focus-visible,
.rvm-calendar__day:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }

/* Lista de mes/ano no lugar da grade: sem moldura propria. */
.rvm-calendar__list.rvm-option-list {
  position: static;
  max-height: 252px;
  padding: 0;
  border-radius: 0;
  box-shadow: none;
}

.rvm-calendar__days { padding: var(--rvm-space-16); }

.rvm-calendar__grid {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0 16px;
  margin: -16px 0;
  table-layout: fixed;
}

.rvm-calendar__grid th,
.rvm-calendar__grid td { height: 32px; padding: 0; text-align: center; }

.rvm-calendar__grid th {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}

.rvm-calendar__day {
  width: 32px;
  height: 32px;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: transparent;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
  cursor: pointer;
}
.rvm-calendar__day:hover { background: var(--rvm-neutral-100); color: var(--rvm-ink-500); }
.rvm-calendar__day[aria-disabled="true"],
.rvm-calendar__day[aria-disabled="true"]:hover { color: var(--rvm-neutral-400); background: transparent; cursor: not-allowed; text-decoration: line-through; }
.rvm-calendar__day--selected,
.rvm-calendar__day--selected:hover { background: var(--rvm-accent-500); color: var(--rvm-white); }

/* Faixa do periodo: Violet 50 em pilula; dentro dela o numero vai para o destaque em 600. */
.rvm-calendar__cell--range { background: var(--rvm-accent-50); }
.rvm-calendar__cell--range .rvm-calendar__day:not(.rvm-calendar__day--selected) { color: var(--rvm-accent-500); font-weight: var(--rvm-font-weight-semibold); }
.rvm-calendar__cell--row-start { border-start-start-radius: var(--rvm-radius-full); border-end-start-radius: var(--rvm-radius-full); }
.rvm-calendar__cell--row-end { border-start-end-radius: var(--rvm-radius-full); border-end-end-radius: var(--rvm-radius-full); }
/* Nas pontas a faixa comeca no centro do circulo, que a cobre. */
.rvm-calendar__cell--range-start { background: linear-gradient(to right, transparent 50%, var(--rvm-accent-50) 50%); }
.rvm-calendar__cell--range-end { background: linear-gradient(to left, transparent 50%, var(--rvm-accent-50) 50%); }
.rvm-calendar__cell--range-start.rvm-calendar__cell--range-end { background: transparent; }

/* Datepicker: caixa do campo com icone de calendario; janela abaixo, a esquerda, a direita ou na largura. */
.rvm-datepicker .rvm-select__trigger { width: auto; max-width: 100%; }
.rvm-datepicker--stretch .rvm-select__trigger { width: 100%; }
.rvm-datepicker__popup { position: absolute; z-index: 41; top: calc(100% + 8px); inset-inline-start: 0; }
.rvm-datepicker__popup--end { inset-inline: auto 0; }
.rvm-datepicker__popup--stretch { inset-inline: 0; }
.rvm-datepicker__popup .rvm-calendar { width: min(400px, calc(100vw - 32px)); max-width: none; }
.rvm-datepicker__popup--stretch .rvm-calendar { width: 100%; }
.rvm-datepicker__sentinel { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }

/* ---------- File Upload, File Type_Card, Media Upload e Profile Img (onda 2, RUI-004) ---------- */
/* File Type_Card: raio 12, padding 16, gap 12, borda grey-100; nome text-m 600, detalhes text-s 500. */
.rvm-file-card {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  box-sizing: border-box;
  min-width: 0;
  padding: var(--rvm-space-16);
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-file-card__icon { flex: none; }
.rvm-file-card--uploading .rvm-file-card__icon { opacity: .5; }
.rvm-file-card__body { display: flex; flex-direction: column; gap: var(--rvm-space-4); flex: 1; min-width: 0; }
.rvm-file-card__name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-file-card__details,
.rvm-file-card__status {
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}
.rvm-file-card__status-dot {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: var(--rvm-radius-full);
  color: var(--rvm-white);
}
.rvm-file-card--uploaded .rvm-file-card__status { color: var(--rvm-s-text-success); }
.rvm-file-card--uploaded .rvm-file-card__status-dot { background: var(--rvm-success-500); }
.rvm-file-card--uploading .rvm-file-card__status { color: var(--rvm-s-text-warning); }
.rvm-file-card--uploading .rvm-file-card__status-dot { background: var(--rvm-warning-500); }
.rvm-file-card--failed .rvm-file-card__status { color: var(--rvm-s-text-danger); }
.rvm-file-card--failed .rvm-file-card__status-dot { background: var(--rvm-danger-500); }

.rvm-file-card__actions { display: flex; align-items: center; gap: var(--rvm-space-8); flex: none; color: var(--rvm-neutral-700); }
.rvm-file-card__remove,
.rvm-file-card__actions button {
  display: inline-flex;
  flex: none;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-5);
  background: transparent;
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-file-card__remove:hover,
.rvm-file-card__actions button:hover { color: var(--rvm-ink-500); }
.rvm-file-card__remove:focus-visible,
.rvm-file-card__actions button:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }

/* Caixa (Container): raio 12, borda grey-100; area de soltar com padding 24 e gap 16, centralizada. */
.rvm-upload__container {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: var(--rvm-space-16);
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
}
.rvm-upload__plain { display: flex; flex-direction: column; align-items: flex-start; gap: var(--rvm-space-8); }
.rvm-upload__list { display: flex; flex-direction: column; gap: var(--rvm-space-8); width: 100%; margin: 0; padding: 0; list-style: none; }
.rvm-upload__plain .rvm-upload__list { gap: var(--rvm-space-8); }

.rvm-upload__drop {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-8);
  border-radius: var(--rvm-radius-12);
  text-align: center;
}
.rvm-upload__container:not(:has(.rvm-upload__list, .rvm-media-list)) { padding: var(--rvm-space-24); }
.rvm-upload__hint {
  margin: 0;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-s-text-secondary);
}
.rvm-upload__picker { position: relative; display: inline-flex; }

/* O input file nativo cobre o botao (ou a area de soltar) e recebe clique, teclado e arquivo solto. */
.rvm-upload__input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
  font-size: 0;
}
.rvm-upload__input:disabled { cursor: not-allowed; }
.rvm-upload__drop:has(.rvm-upload__input:focus-visible),
.rvm-upload__picker:has(.rvm-upload__input:focus-visible) { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; border-radius: var(--rvm-radius-full); }
.rvm-upload__drop:has(.rvm-upload__input:focus-visible) { border-radius: var(--rvm-radius-12); }
.rvm-upload--dragging { background: var(--rvm-accent-50); box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }

/* Media: miniatura 100, raio 12; enviado = selo verde 24 no canto; enviando = etiqueta com porcentagem. */
.rvm-media-list { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--rvm-space-16); margin: 0; padding: 0; list-style: none; }
.rvm-media { position: relative; width: 100px; height: 100px; }
.rvm-media__img { display: block; width: 100px; height: 100px; border-radius: var(--rvm-radius-12); object-fit: cover; }
.rvm-media__img--empty { display: flex; align-items: center; justify-content: center; background: var(--rvm-neutral-100); color: var(--rvm-neutral-700); }
.rvm-media--uploading .rvm-media__img,
.rvm-media--failed .rvm-media__img { filter: grayscale(1); opacity: .5; }
.rvm-media__badge {
  position: absolute;
  top: -8px;
  right: -8px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border-radius: var(--rvm-radius-full);
  color: var(--rvm-white);
}
.rvm-media__badge--success { background: var(--rvm-success-500); }
.rvm-media__progress,
.rvm-media__action { position: absolute; inset: 0; margin: auto; }
.rvm-media__progress { display: flex; align-items: center; justify-content: center; }
.rvm-media__action,
.rvm-media__remove {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-full);
  cursor: pointer;
}
.rvm-media__action { width: 32px; height: 32px; background: var(--rvm-accent-50); color: var(--rvm-accent-500); }
.rvm-media__remove {
  position: absolute;
  top: 4px;
  right: 4px;
  width: 24px;
  height: 24px;
  background: var(--rvm-danger-50);
  color: var(--rvm-danger-500);
  opacity: 0;
}
.rvm-media--uploaded .rvm-media__remove { top: 20px; }
.rvm-media:hover .rvm-media__remove,
.rvm-media:focus-within .rvm-media__remove,
.rvm-media--failed .rvm-media__remove { opacity: 1; }
.rvm-media__action:focus-visible,
.rvm-media__remove:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }

/* Profile Img: avatar 64 + link com "+" (text-m 700 no destaque), gap 12. */
.rvm-profile-upload__row { display: flex; align-items: center; gap: var(--rvm-space-12); }
.rvm-profile-upload__picker { position: relative; display: inline-flex; border-radius: var(--rvm-radius-5); }
.rvm-profile-upload__link {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-accent-500);
}
.rvm-profile-upload__picker:hover .rvm-profile-upload__link { text-decoration: underline; }
.rvm-profile-upload__picker:has(.rvm-upload__input:focus-visible) { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-field--disabled .rvm-profile-upload__link { color: var(--rvm-s-text-secondary); }

/* ---------- Color Picker, Icon Picker e Icon Selector (onda 2, RUI-004) ---------- */
.rvm-color-picker__items { display: flex; flex-wrap: wrap; gap: var(--rvm-space-8); }
.rvm-color-picker__item { position: relative; display: inline-flex; cursor: pointer; }
.rvm-color-picker__dot {
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 24px;
  height: 24px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-swatch) content-box;
  padding: 2px;
  color: var(--rvm-white);
}
.rvm-color-picker__item:has(.rvm-choice__input:checked) .rvm-color-picker__dot { box-shadow: inset 0 0 0 2px var(--rvm-neutral-100); }
.rvm-color-picker__item:has(.rvm-choice__input:focus-visible) .rvm-color-picker__dot { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-color-picker[disabled] .rvm-color-picker__item { cursor: not-allowed; opacity: .65; }

/* Icon Picker: 40, raio 10, padding 8, icone 24 grey-700; hover grey-100; escolhido = check verde 12 no canto. */
.rvm-icon-picker {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 40px;
  height: 40px;
  padding: var(--rvm-space-8);
  border: 0;
  border-radius: var(--rvm-radius-10);
  background: transparent;
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-icon-picker:hover { background: var(--rvm-neutral-100); }
.rvm-icon-picker:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px var(--rvm-accent-500); color: var(--rvm-accent-500); }
.rvm-icon-picker--selected::after {
  content: "";
  position: absolute;
  top: 2px;
  right: 2px;
  width: 12px;
  height: 12px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-success-500) center / 8px no-repeat
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 4.2 3.2 5.8 6.5 2.3' fill='none' stroke='white' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

.rvm-icon-selector { position: relative; }
.rvm-icon-selector__row { display: flex; align-items: center; gap: var(--rvm-space-12); }
.rvm-icon-selector__badge {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 64px;
  height: 64px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-neutral-100);
  color: var(--rvm-neutral-700);
}
.rvm-icon-selector__badge--active { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-icon-selector__badge--selected { background: var(--rvm-accent-50); color: var(--rvm-accent-500); }
.rvm-field--error .rvm-icon-selector__badge { background: var(--rvm-danger-50); box-shadow: inset 0 0 0 1px var(--rvm-danger-500); }

.rvm-icon-selector__link {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-5);
  background: transparent;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-accent-500);
  cursor: pointer;
}
.rvm-icon-selector__link:hover { text-decoration: underline; }
.rvm-icon-selector__link:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-icon-selector__link:disabled { color: var(--rvm-s-text-secondary); cursor: not-allowed; text-decoration: none; }

/* Janela: 344 x 368, raio 16, borda grey-100; cabecalho 80 com a busca em pilula; grade com padding 12 e gap 16. */
.rvm-icon-selector__popup {
  position: absolute;
  z-index: 41;
  top: calc(100% + 8px);
  inset-inline-start: 0;
  box-sizing: border-box;
  /* Largura propria, nao a do componente (o pai costuma ser so o circulo + link); cabe na tela do celular. */
  width: min(344px, calc(100vw - 32px));
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
  overflow: hidden;
}
.rvm-icon-selector__search { padding: var(--rvm-space-16); box-shadow: inset 0 -1px 0 var(--rvm-neutral-100); }
.rvm-icon-selector__search input[type="search"]::-webkit-search-cancel-button { cursor: pointer; }
.rvm-icon-selector__body { max-height: 288px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--rvm-accent-500) var(--rvm-neutral-100); }
.rvm-icon-selector__grid {
  display: grid;
  grid-template-columns: repeat(6, 40px);
  justify-content: space-between;
  gap: var(--rvm-space-16);
  padding: 12px;
}
.rvm-icon-selector__empty,
.rvm-icon-selector__more {
  margin: 0;
  padding: 12px var(--rvm-space-16);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  color: var(--rvm-s-text-secondary);
}

/* ---------- Scrollbar do kit (Internal Only: Scrollbar), onda 3, RUI-005 ---------- */
.rvm-scrollbar { scrollbar-width: thin; scrollbar-color: var(--rvm-accent-500) var(--rvm-neutral-100); }
.rvm-scrollbar::-webkit-scrollbar { width: 4px; height: 4px; }
.rvm-scrollbar::-webkit-scrollbar-track { background: var(--rvm-neutral-100); }
.rvm-scrollbar::-webkit-scrollbar-thumb { background: var(--rvm-accent-500); border-radius: var(--rvm-radius-full); }

/* ---------- Sidebar Menu, Single Menu, Dropdown Menu e Submenu (onda 3, RUI-005) ---------- */
.rvm-sidebar {
  --rvm-nav-pad: var(--rvm-space-16);
  --rvm-nav-bg: var(--rvm-white);
  --rvm-nav-ink: var(--rvm-s-text-secondary);
  --rvm-nav-ink-hover: var(--rvm-neutral-900);
  --rvm-nav-hover: var(--rvm-neutral-100);
  --rvm-nav-active: var(--rvm-c-action, var(--rvm-c-fill));
  --rvm-nav-active-ink: var(--rvm-c-on-fill);
  --rvm-nav-line: var(--rvm-c-action, var(--rvm-c-fill));
  --rvm-nav-title: var(--rvm-s-text-secondary);
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  width: 264px;
  height: 100%;
  min-height: 0;
  background: var(--rvm-nav-bg);
  box-shadow: inset -1px 0 0 var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
  transition: width .2s ease;
}
.rvm-sidebar--colored {
  --rvm-nav-bg: var(--rvm-c-action, var(--rvm-c-fill));
  --rvm-nav-ink: color-mix(in srgb, var(--rvm-c-on-fill) var(--rvm-s-on-fill-muted), transparent);
  --rvm-nav-ink-hover: var(--rvm-c-on-fill);
  --rvm-nav-hover: color-mix(in srgb, var(--rvm-c-on-fill) 10%, transparent);
  --rvm-nav-active: var(--rvm-s-nav-active-on-fill);
  --rvm-nav-active-ink: var(--rvm-c-on-fill);
  --rvm-nav-line: var(--rvm-c-on-fill);
  --rvm-nav-title: var(--rvm-nav-ink);
  box-shadow: none;
}
.rvm-sidebar--collapsed { width: 80px; }

/* Cabecalho: 80 de altura, padding 24 (recolhida 24/20). */
.rvm-sidebar__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-12);
  box-sizing: border-box;
  height: 80px;
  padding: var(--rvm-space-24);
  flex: none;
}
.rvm-sidebar--collapsed .rvm-sidebar__header { justify-content: center; padding: var(--rvm-space-24) 20px; }
.rvm-sidebar__logo { display: flex; align-items: center; min-width: 0; color: var(--rvm-ink-500); }
.rvm-sidebar--colored .rvm-sidebar__logo { color: var(--rvm-c-on-fill); }
.rvm-sidebar__toggle,
.rvm-sidebar__logo-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-5);
  background: transparent;
  color: var(--rvm-nav-ink);
  cursor: pointer;
}
.rvm-sidebar__logo-button:disabled { cursor: default; }
.rvm-sidebar__toggle:focus-visible,
.rvm-sidebar__logo-button:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-sidebar--colored .rvm-sidebar__toggle:focus-visible,
.rvm-sidebar--colored .rvm-sidebar__logo-button:focus-visible { outline-color: var(--rvm-c-on-fill); }
.rvm-sidebar__top { padding: 12px var(--rvm-nav-pad); flex: none; }
.rvm-sidebar__nav {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-24);
  flex: 1;
  min-height: 0;
  padding: var(--rvm-nav-pad);
  overflow-y: auto;
  overflow-x: hidden;
}
.rvm-sidebar--colored .rvm-sidebar__nav { scrollbar-color: var(--rvm-c-on-fill) transparent; }
.rvm-sidebar--collapsed .rvm-sidebar__nav { overflow: visible; gap: var(--rvm-space-12); position: relative; z-index: 41; }
/* Clique fora do painel: a camada fica atras da navegacao, entao os outros icones recebem o clique direto. */
.rvm-nav-dropdown__backdrop { z-index: 40; }
.rvm-sidebar__footer { display: flex; flex-direction: column; gap: var(--rvm-space-16); padding: var(--rvm-nav-pad); flex: none; }

.rvm-nav-group { display: flex; flex-direction: column; gap: var(--rvm-space-12); }
.rvm-nav-group__title {
  margin: 0;
  padding: 0 var(--rvm-space-12);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-bold);
  text-transform: uppercase;
  color: var(--rvm-nav-title);
}
.rvm-nav-list,
.rvm-nav-submenu { display: flex; flex-direction: column; gap: var(--rvm-space-12); margin: 0; padding: 0; list-style: none; }
.rvm-nav-list__item { position: relative; }

/* Single Menu: 48 de altura, pilula, padding 12/14, gap 8, icone 20 numa caixa de 24, text-m 600. */
.rvm-nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  width: 100%;
  min-height: 48px;
  padding: 12px 14px;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: transparent;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  text-align: start;
  text-decoration: none;
  color: var(--rvm-nav-ink);
  cursor: pointer;
}
.rvm-nav-item:hover { background: var(--rvm-nav-hover); color: var(--rvm-nav-ink-hover); }
.rvm-nav-item:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-sidebar--colored .rvm-nav-item:focus-visible { outline-color: var(--rvm-c-on-fill); }
.rvm-nav-item--active,
.rvm-nav-item--active:hover { background: var(--rvm-nav-active); color: var(--rvm-nav-active-ink); font-weight: var(--rvm-font-weight-bold); }
.rvm-nav-item__media { display: flex; align-items: center; justify-content: center; flex: none; width: 24px; height: 24px; }
.rvm-nav-item__media img { width: 20px; height: 20px; border-radius: var(--rvm-radius-full); object-fit: cover; }
.rvm-nav-item__text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rvm-nav-item__badge { flex: none; }
.rvm-nav-item__chevron { flex: none; margin: 3px; }

/* Left Line: barra de 4 px colada na borda da sidebar, raio so do lado de dentro. */
.rvm-sidebar--line .rvm-nav-list > .rvm-nav-list__item > .rvm-nav-item--active::before,
.rvm-sidebar--line .rvm-nav-submenu:not(.rvm-nav-submenu--flyout) .rvm-nav-item--active::before,
.rvm-sidebar--line.rvm-sidebar--collapsed .rvm-nav-item--has-active::before {
  content: "";
  position: absolute;
  top: 0;
  left: calc(-1 * var(--rvm-nav-pad));
  width: 4px;
  height: 100%;
  border-radius: 0 8px 8px 0;
  background: var(--rvm-nav-line);
}

/* Submenu dentro do Dropdown: recuo de 46 (alinha o texto com o do item pai), padding vertical 14. */
.rvm-nav-dropdown > .rvm-nav-submenu:not(.rvm-nav-submenu--flyout) { gap: 10px; margin-top: 10px; }
.rvm-nav-subitem { padding: 14px 14px 14px 46px; }

/* Sidebar recolhida: so o icone numa pilula de 48; contador sobre o canto; texto e seta somem da tela. */
.rvm-sidebar--collapsed .rvm-nav-list > .rvm-nav-list__item > .rvm-nav-item { justify-content: center; width: 48px; padding: 12px; }
.rvm-sidebar--collapsed .rvm-nav-list > .rvm-nav-list__item > .rvm-nav-item .rvm-nav-item__text,
.rvm-sidebar--collapsed .rvm-nav-dropdown__toggle .rvm-nav-item__chevron {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}
.rvm-sidebar--collapsed .rvm-nav-list > .rvm-nav-list__item > .rvm-nav-item .rvm-nav-item__badge { position: absolute; top: -4px; right: -8px; }
.rvm-sidebar--collapsed .rvm-nav-item--has-active,
.rvm-sidebar--collapsed .rvm-nav-dropdown--open > .rvm-nav-dropdown__toggle { background: var(--rvm-nav-active); color: var(--rvm-nav-active-ink); }

/* Painel flutuante do Dropdown na sidebar recolhida: 264 de largura, raio 16, padding 8, borda grey-100. */
.rvm-nav-submenu--flyout {
  --rvm-nav-ink: var(--rvm-s-text-secondary);
  --rvm-nav-ink-hover: var(--rvm-neutral-900);
  --rvm-nav-hover: var(--rvm-neutral-100);
  --rvm-nav-active: var(--rvm-c-action, var(--rvm-c-fill));
  --rvm-nav-active-ink: var(--rvm-c-on-fill);
  position: absolute;
  z-index: 42;
  top: 0;
  left: calc(100% + var(--rvm-nav-pad));
  box-sizing: border-box;
  width: 264px;
  padding: var(--rvm-space-8);
  gap: 10px;
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
}
.rvm-nav-submenu--flyout .rvm-nav-subitem { padding: 14px; }

@media (prefers-reduced-motion: reduce) { .rvm-sidebar { transition: none; } }

/* ---------- Kebab Menu: gatilho e painel de acoes (onda 3, RUI-005) ---------- */
.rvm-menu { position: relative; display: inline-flex; }
.rvm-menu__trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-menu__trigger--button {
  width: 48px;
  height: 48px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
}
.rvm-menu__trigger--icon { width: 24px; height: 24px; border-radius: var(--rvm-radius-5); }
.rvm-menu__trigger:hover { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
.rvm-menu__trigger[aria-expanded="true"] { background: var(--rvm-c-action, var(--rvm-accent-500)); color: var(--rvm-white); }
.rvm-menu__trigger:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-menu__trigger:disabled { color: var(--rvm-neutral-500); cursor: not-allowed; background: var(--rvm-neutral-50); }

/* Painel: 240 de largura, raio 16, padding 8, gap 10, borda grey-100 e Soft Shadow (medido). */
.rvm-menu__panel {
  position: absolute;
  z-index: 41;
  display: flex;
  flex-direction: column;
  gap: 10px;
  box-sizing: border-box;
  width: 240px;
  max-width: calc(100vw - 32px);
  padding: var(--rvm-space-8);
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
}
.rvm-menu__panel--bottomend { top: calc(100% + var(--rvm-space-8)); inset-inline-end: 0; }
.rvm-menu__panel--bottomstart { top: calc(100% + var(--rvm-space-8)); inset-inline-start: 0; }
.rvm-menu__panel--bottomcenter { top: calc(100% + var(--rvm-space-8)); left: 50%; transform: translateX(-50%); }
.rvm-menu__panel--topend { bottom: calc(100% + var(--rvm-space-8)); inset-inline-end: 0; }
.rvm-menu__panel--topstart { bottom: calc(100% + var(--rvm-space-8)); inset-inline-start: 0; }

.rvm-menu__item {
  --rvm-nav-ink: var(--rvm-s-text-secondary);
  --rvm-nav-ink-hover: var(--rvm-neutral-900);
  --rvm-nav-hover: var(--rvm-neutral-100);
  color: var(--rvm-nav-ink);
}
.rvm-menu__item--danger { --rvm-nav-ink: var(--rvm-s-text-danger); --rvm-nav-ink-hover: var(--rvm-s-text-danger); --rvm-nav-hover: var(--rvm-danger-50); }
.rvm-menu__item--disabled { color: var(--rvm-neutral-500); cursor: not-allowed; }
.rvm-menu__item--disabled:hover { background: transparent; color: var(--rvm-neutral-500); }

/* ---------- Widgets do topo e da sidebar, avisos e barra superior (onda 3, RUI-005) ---------- */
.rvm-widget { position: relative; display: inline-flex; font-family: var(--rvm-font-family); letter-spacing: var(--rvm-letter-spacing); }
.rvm-widget--card { display: flex; min-width: 0; }

.rvm-widget__trigger {
  display: inline-flex;
  align-items: center;
  flex: none;
  border: 0;
  background: transparent;
  font: inherit;
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
/* Gatilho de icone: pilula de 48, icone 20 numa caixa de 24 (medido). */
.rvm-widget__trigger--icon {
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 12px;
  border-radius: var(--rvm-radius-full);
}
.rvm-widget__trigger--icon:hover { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
.rvm-widget__trigger--icon[aria-expanded="true"] { background: var(--rvm-c-action, var(--rvm-accent-500)); color: var(--rvm-c-on-fill, var(--rvm-white)); }

/* Cartao (Profile, Team_Switcher): 256 de largura, raio 12, padding 12/14, gap 12, avatar 40. */
.rvm-widget__trigger--card {
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  gap: var(--rvm-space-12);
  padding: 12px 14px;
  border-radius: var(--rvm-radius-12);
  text-align: start;
}
.rvm-widget--card { width: 256px; max-width: 100%; }
.rvm-widget__trigger--card:hover { background: var(--rvm-neutral-50); }
.rvm-widget__trigger--card[aria-expanded="true"] { background: var(--rvm-neutral-50); box-shadow: inset 0 0 0 1px var(--rvm-neutral-100); }
.rvm-widget__trigger--card .rvm-widget__image { width: 40px; height: 40px; }

.rvm-widget__icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; }
.rvm-widget__image { flex: none; width: 20px; height: 20px; border-radius: var(--rvm-radius-full); object-fit: cover; }
.rvm-widget__texto { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.rvm-widget__titulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-widget__subtitulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}
.rvm-widget__chevron { flex: none; color: var(--rvm-neutral-700); }
.rvm-widget__badge { position: absolute; top: -2px; right: -6px; }
.rvm-widget__trigger:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-widget__trigger:disabled { color: var(--rvm-neutral-500); cursor: not-allowed; }

/* Painel: lista de 240 (padding 12, gap 4) ou folha de 444 com cabecalho e rodape. */
.rvm-widget__panel {
  position: absolute;
  z-index: 41;
  box-sizing: border-box;
  max-width: calc(100vw - 32px);
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
  overflow: hidden;
}
/* Conteudo mais largo que a lista rola em vez de sumir cortado (o kit desenha 240; o consumidor pode passar
   Size=Sheet para 444). */
.rvm-widget__panel--menu { width: 240px; padding: var(--rvm-space-12); overflow: auto; }
.rvm-widget__panel--menu .rvm-widget__body { display: flex; flex-direction: column; gap: var(--rvm-space-4); }
.rvm-widget__panel--sheet { width: 444px; }
.rvm-widget__panel--sheet .rvm-widget__body { max-height: 478px; overflow-y: auto; }
.rvm-widget__panel:focus { outline: 0; }

.rvm-widget__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  padding: 22px;
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
}
.rvm-widget__header-titulo {
  margin: 0;
  font-size: var(--rvm-display-s-size);
  line-height: var(--rvm-display-s-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-widget__close { display: inline-flex; padding: 0; border: 0; border-radius: var(--rvm-radius-5); background: transparent; color: var(--rvm-neutral-700); cursor: pointer; }
.rvm-widget__close:hover { color: var(--rvm-ink-500); }
.rvm-widget__close:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-widget__footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  padding: 22px;
  box-shadow: inset 0 1px 0 var(--rvm-neutral-100);
}

/* Notification: padding 16/22, gap 8; nao lido em Yellow 50. */
.rvm-widget__body ul { margin: 0; padding: 0; list-style: none; }
.rvm-notification {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-8);
  padding: var(--rvm-space-16) 22px;
  background: var(--rvm-white);
}
.rvm-notification--new { background: var(--rvm-warning-50); }
.rvm-notification__corpo { display: flex; flex-direction: column; gap: var(--rvm-space-8); }
.rvm-notification__titulo {
  margin: 0;
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-notification__texto {
  margin: 0;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-neutral-900);
}
.rvm-notification__acao {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  align-self: flex-start;
  padding: 0;
  border: 0;
  border-radius: var(--rvm-radius-5);
  background: transparent;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-accent-500);
  cursor: pointer;
}
.rvm-notification__acao:hover { text-decoration: underline; }
.rvm-notification__acao:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }

/* Barra superior: 88 de altura, padding 12/24, borda embaixo; direita com gap 8 e o perfil depois de 12. */
.rvm-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-32);
  box-sizing: border-box;
  min-height: 88px;
  padding: 12px var(--rvm-space-24);
  background: var(--rvm-white);
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-topbar__start { display: flex; align-items: center; gap: var(--rvm-space-16); min-width: 0; flex: 1; }
.rvm-topbar__end { display: flex; align-items: center; gap: var(--rvm-space-12); flex: none; }
.rvm-topbar__actions { display: flex; align-items: center; gap: var(--rvm-space-8); }

@media (max-width: 720px) {
  .rvm-topbar { flex-wrap: wrap; gap: var(--rvm-space-12); }
  .rvm-widget--card { width: auto; }
  .rvm-widget--card .rvm-widget__texto { display: none; }
}

/* ---------- Cabecalho de pagina, breadcrumbs e toolbar (onda 3, fatia 4, RUI-005) ---------- */
/* Back Button, Bookmark e Favorite Marker: 48, padding 14, borda grey-100 por dentro. */
.rvm-square-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  flex: none;
  width: 48px;
  height: 48px;
  padding: 14px;
  border: 0;
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  color: var(--rvm-neutral-700);
  text-decoration: none;
  cursor: pointer;
}
.rvm-square-button--pill { border-radius: var(--rvm-radius-full); }
.rvm-square-button:hover { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
.rvm-square-button:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-square-button:disabled,
.rvm-square-button[aria-disabled="true"] { color: var(--rvm-neutral-500); background: var(--rvm-neutral-50); cursor: not-allowed; }
/* Marcado: amarelo do kit (Yellow 500 com o icone em Yellow 900). */
.rvm-square-button--marked,
.rvm-square-button--marked:hover { background: var(--rvm-warning-500); color: var(--rvm-warning-900); box-shadow: none; }

.rvm-breadcrumbs { font-family: var(--rvm-font-family); letter-spacing: var(--rvm-letter-spacing); }
.rvm-breadcrumbs ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--rvm-space-8);
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
}
.rvm-breadcrumbs li { display: inline-flex; align-items: center; gap: var(--rvm-space-8); }
.rvm-breadcrumbs a {
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-accent-500);
  text-decoration: none;
}
.rvm-breadcrumbs a:hover { text-decoration: underline; }
.rvm-breadcrumbs a:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; border-radius: var(--rvm-radius-5); }
.rvm-breadcrumbs span[aria-current] { font-weight: var(--rvm-font-weight-medium); color: var(--rvm-s-text-secondary); }
.rvm-breadcrumbs__separador { color: var(--rvm-neutral-400); }

/* Cabecalho: 88 de altura, padding 20/24, gap 24, borda embaixo. */
.rvm-page-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-24);
  box-sizing: border-box;
  min-height: 88px;
  padding: 20px var(--rvm-space-24);
  background: var(--rvm-white);
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-page-header__start { display: flex; align-items: center; gap: var(--rvm-space-12); min-width: 0; }
.rvm-page-header__img { flex: none; width: 48px; height: 48px; border-radius: var(--rvm-radius-full); object-fit: cover; }
.rvm-page-header__texto { display: flex; flex-direction: column; gap: var(--rvm-space-4); min-width: 0; }
.rvm-page-header__titulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rvm-page-header__descricao {
  margin: 0;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-s-text-secondary);
}
.rvm-page-header__actions { display: flex; align-items: center; gap: var(--rvm-space-16); flex: none; flex-wrap: wrap; justify-content: flex-end; }

/* Toolbar: faixa de 48 com os dois lados. */
.rvm-page-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  flex-wrap: wrap;
  box-sizing: border-box;
  min-height: 48px;
  padding: 12px var(--rvm-space-24);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-page-toolbar__start,
.rvm-page-toolbar__end { display: flex; align-items: center; gap: var(--rvm-space-12); min-width: 0; flex-wrap: wrap; }

@media (max-width: 720px) {
  .rvm-page-header { flex-wrap: wrap; }
  .rvm-page-header__actions { width: 100%; justify-content: flex-start; }
}
/* ---------- Abas e filtros (onda 3, fatia 5, RUI-005) ---------- */
/* Button Tabs: pilula/12 de 48 com borda grey-100 e padding 4; as abas de 40 por dentro, raio 8. */
.rvm-tabs { font-family: var(--rvm-font-family); letter-spacing: var(--rvm-letter-spacing); }
.rvm-tabs__list { display: flex; align-items: center; }
.rvm-tabs--button .rvm-tabs__list {
  box-sizing: border-box;
  gap: 0;
  min-height: 48px;
  padding: var(--rvm-space-4);
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
}
.rvm-tabs--pill .rvm-tabs__list { border-radius: var(--rvm-radius-full); }
.rvm-tabs--regular .rvm-tabs__list,
.rvm-tabs--page .rvm-tabs__list { gap: var(--rvm-space-16); flex-wrap: wrap; }
/* Page Tabs: faixa branca de 52, padding 16/24, borda embaixo. */
.rvm-tabs--page {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  min-height: 52px;
  padding: var(--rvm-space-16) var(--rvm-space-24);
  background: var(--rvm-white);
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
}

.rvm-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  border: 0;
  background: none;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-s-text-secondary);
  cursor: pointer;
}
.rvm-tab:disabled { color: var(--rvm-neutral-500); cursor: not-allowed; }
.rvm-tab:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-tab--button { min-height: 40px; padding: 10px 14px; border-radius: var(--rvm-radius-8); }
.rvm-tabs--pill .rvm-tab--button { border-radius: var(--rvm-radius-full); }
.rvm-tab--button:hover:not(:disabled):not(.rvm-tab--on) { background: var(--rvm-neutral-50); color: var(--rvm-neutral-900); }
/* Texto sobre o suave: soft-ink, nao ink (RUI-007). Nas cinco familias que ja passavam o valor e o
   mesmo; no success ele sobe um degrau, que era o caso que reprovava. */
.rvm-tab--button.rvm-tab--on { background: var(--rvm-c-soft); color: var(--rvm-c-soft-ink); font-weight: var(--rvm-font-weight-bold); }
/* Regular Tab: coluna de 36 — texto e o sublinhado de 2, que so aparece na escolhida. */
.rvm-tab--regular { flex-direction: column; align-items: flex-start; gap: 0; min-height: 36px; padding: 0; }
.rvm-tab--regular .rvm-tab__linha { width: 100%; height: 2px; margin-top: 14px; border-radius: var(--rvm-radius-full); background: transparent; }
.rvm-tab--regular:hover:not(:disabled):not(.rvm-tab--on) { color: var(--rvm-neutral-900); }
.rvm-tab--regular.rvm-tab--on { color: var(--rvm-c-ink); font-weight: var(--rvm-font-weight-bold); }
.rvm-tab--regular.rvm-tab--on .rvm-tab__linha { background: var(--rvm-c-fill); }
/* Icone e contador vem das telas-modelo: o contador segue a cor do texto da aba. */
.rvm-tab__conteudo { display: inline-flex; align-items: center; gap: var(--rvm-space-8); }
.rvm-tab__media { display: inline-flex; }
.rvm-tab__count {
  font-size: var(--rvm-text-xs-size);
  line-height: var(--rvm-text-xs-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: inherit;
}

/* Filter: pilula de 48 (padding 14/16, gap 4) e o painel de 400 com cabecalho de 56 e pe de 80. */
.rvm-filter { position: relative; display: inline-flex; font-family: var(--rvm-font-family); letter-spacing: var(--rvm-letter-spacing); }
.rvm-filter__trigger {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  box-sizing: border-box;
  min-height: 48px;
  padding: 14px var(--rvm-space-16);
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-s-text-secondary);
  cursor: pointer;
  white-space: nowrap;
}
.rvm-filter__trigger:hover:not(:disabled) { background: var(--rvm-neutral-50); color: var(--rvm-neutral-900); }
.rvm-filter__trigger:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-filter__trigger:disabled { color: var(--rvm-neutral-500); background: var(--rvm-neutral-50); cursor: not-allowed; }
.rvm-filter__trigger--open,
.rvm-filter__trigger--open:hover { box-shadow: inset 0 0 0 1px var(--rvm-c-fill); color: var(--rvm-c-ink); background: var(--rvm-white); }
.rvm-filter__icone { display: inline-flex; }

.rvm-filter__panel {
  position: absolute;
  z-index: 40;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  width: min(400px, calc(100vw - 32px));
  max-height: min(640px, calc(100vh - 120px));
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100), var(--rvm-shadow-soft);
}
.rvm-filter__panel--bottomend { top: calc(100% + var(--rvm-space-8)); inset-inline-end: 0; }
.rvm-filter__panel--bottomstart { top: calc(100% + var(--rvm-space-8)); inset-inline-start: 0; }
.rvm-filter__panel--bottomcenter { top: calc(100% + var(--rvm-space-8)); left: 50%; transform: translateX(-50%); }
.rvm-filter__panel--topend { bottom: calc(100% + var(--rvm-space-8)); inset-inline-end: 0; }
.rvm-filter__panel--topstart { bottom: calc(100% + var(--rvm-space-8)); inset-inline-start: 0; }
.rvm-filter__panel:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-filter__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  min-height: 56px;
  padding: var(--rvm-space-16) var(--rvm-space-20);
  box-shadow: inset 0 -1px 0 var(--rvm-neutral-100);
}
.rvm-filter__titulo { font-size: var(--rvm-text-m-size); line-height: var(--rvm-text-m-line-height); font-weight: var(--rvm-font-weight-bold); color: var(--rvm-neutral-900); }
.rvm-filter__fechar {
  display: inline-flex;
  padding: 0;
  border: 0;
  background: none;
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-filter__fechar:hover { color: var(--rvm-neutral-900); }
.rvm-filter__fechar:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; border-radius: var(--rvm-radius-5); }
.rvm-filter__body {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-20);
  overflow: auto;
}
.rvm-filter__footer {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  box-sizing: border-box;
  min-height: 80px;
  padding: var(--rvm-space-16) var(--rvm-space-20);
  box-shadow: inset 0 1px 0 var(--rvm-neutral-100);
}
.rvm-filter__acao { flex: 1; justify-content: center; }

/* Filter Group: grey-50 com borda, cabecalho de 44 e corpo branco. */
.rvm-filter-group {
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-neutral-50);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  overflow: hidden;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-filter-group__header { margin: 0; font: inherit; }
.rvm-filter-group__trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-8);
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  padding: var(--rvm-space-12) var(--rvm-space-16);
  border: 0;
  background: none;
  font: inherit;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-neutral-900);
  text-align: left;
  cursor: pointer;
}
.rvm-filter-group__trigger:hover { background: var(--rvm-neutral-100); }
.rvm-filter-group__trigger:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: -2px; }
.rvm-filter-group__sinal { display: inline-flex; color: var(--rvm-neutral-700); }
.rvm-filter-group--open .rvm-filter-group__trigger { box-shadow: inset 0 -1px 0 var(--rvm-neutral-100); }
.rvm-filter-group__body {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-16);
  background: var(--rvm-white);
}
.rvm-filter-group__body--scroll { max-height: 196px; overflow: auto; }
.rvm-filter-group__body:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: -2px; }

/* ---------- Paginacao e passo a passo (onda 3, fatia 6, RUI-005) ---------- */
/* Pagination: setas e indicadores de 40 em pilula, espaco 8. */
.rvm-pagination { font-family: var(--rvm-font-family); letter-spacing: var(--rvm-letter-spacing); }
.rvm-pagination__lista {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--rvm-space-8);
  margin: 0;
  padding: 0;
  list-style: none;
}
.rvm-pagination__seta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 40px;
  height: 40px;
  padding: 10px;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-200);
  color: var(--rvm-neutral-700);
  cursor: pointer;
}
.rvm-pagination__seta:hover:not(:disabled) { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
.rvm-pagination__seta:focus-visible,
.rvm-indicator:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-pagination__seta:disabled { color: var(--rvm-neutral-500); background: var(--rvm-neutral-50); cursor: not-allowed; }

/* Indicator: 40 em pilula, borda grey-100; ativo cheio na cor do destaque. */
.rvm-indicator {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  min-width: 40px;
  height: 40px;
  padding: 8px;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-s-text-secondary);
}
button.rvm-indicator { cursor: pointer; }
button.rvm-indicator:hover:not(:disabled):not(.rvm-indicator--active) { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
button.rvm-indicator:disabled { color: var(--rvm-neutral-500); background: var(--rvm-neutral-50); cursor: not-allowed; }
.rvm-indicator--active {
  background: var(--rvm-c-fill);
  box-shadow: none;
  color: var(--rvm-c-on-fill);
}
button.rvm-indicator--active:disabled { background: var(--rvm-c-fill); color: var(--rvm-c-on-fill); opacity: 0.6; }
.rvm-indicator--gap { box-shadow: none; background: none; }

/* Stepper: bolinhas de 8 com espaco 6; o passo atual vira pilula de 20. */
.rvm-stepper { display: inline-flex; align-items: center; gap: 6px; }
.rvm-stepper__passo {
  width: 8px;
  height: 8px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-neutral-200);
}
.rvm-stepper__passo--on { width: 20px; background: var(--rvm-c-fill); }

/* ---------- Esqueleto de aplicativo (onda 3, fatia 7, RUI-005) ---------- */
.rvm-app-shell {
  display: flex;
  min-height: 100vh;
  background: var(--rvm-neutral-50);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
/* A sidebar acompanha a rolagem da pagina; quem rola por dentro dela e o proprio menu. */
.rvm-app-shell__aside { flex: none; display: flex; position: sticky; top: 0; height: 100vh; }
.rvm-app-shell__aside > * { height: 100%; }
.rvm-app-shell__main { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.rvm-app-shell__topo { display: flex; align-items: center; gap: var(--rvm-space-8); background: var(--rvm-white); }
.rvm-app-shell__topo > :last-child { flex: 1; min-width: 0; }
.rvm-app-shell__conteudo { flex: 1; min-width: 0; padding: var(--rvm-space-24); }
/* Em tela larga a sidebar esta sempre a vista: o botao de menu e a cortina nao existem. */
.rvm-app-shell__menu { display: none; }
.rvm-app-shell__cortina { display: none; }

@media (max-width: 900px) {
  .rvm-app-shell__aside {
    position: fixed;
    height: auto;
    z-index: 60;
    top: 0;
    bottom: 0;
    inset-inline-start: 0;
    transform: translateX(-100%);
    /* visibility (e nao so o transform) tira a gaveta fechada do Tab e da arvore de acessibilidade: sem isso,
       no celular a pessoa passa por ~26 itens invisiveis antes de chegar no botao de menu. O axe nao acusa
       isso — fora da tela nao e o mesmo que escondido. */
    visibility: hidden;
    transition: transform 150ms ease, visibility 150ms;
  }
  .rvm-app-shell--menu-aberto .rvm-app-shell__aside { transform: none; visibility: visible; }
  .rvm-app-shell__cortina {
    display: block;
    position: fixed;
    z-index: 50;
    inset: 0;
    border: 0;
    padding: 0;
    background: var(--rvm-ink-900);
    opacity: 0.4;
    cursor: pointer;
  }
  .rvm-app-shell__menu {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    box-sizing: border-box;
    width: 40px;
    height: 40px;
    margin-inline-start: var(--rvm-space-16);
    border: 0;
    border-radius: var(--rvm-radius-full);
    background: var(--rvm-white);
    box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
    color: var(--rvm-neutral-700);
    cursor: pointer;
  }
  .rvm-app-shell__menu:hover { background: var(--rvm-neutral-100); color: var(--rvm-neutral-900); }
  .rvm-app-shell__menu:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
  .rvm-app-shell__conteudo { padding: var(--rvm-space-16); }
}

/* ---------- Dialogo, confirmacao e estado vazio (onda 4, fatia 1, RUI-006) ---------- */
/* Medidas de 💠 Modal / Purple Confirmation Modal: caixa 480x298, raio 20, padding 24, gap 32;
   conteudo gap 16; texto gap 12; circulo do icone 64 com icone de 32; botoes de 48.
   A CORTINA e invencao (o kit desenha o modal sem a tela atras): mesma receita da gaveta do
   RvmAppShell, ink-900 a 40%, para o ecossistema ter uma sombra so. */
.rvm-modal {
  position: fixed;
  z-index: 100;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--rvm-space-16);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-modal__cortina {
  position: absolute;
  inset: 0;
  border: 0;
  padding: 0;
  background: var(--rvm-ink-900);
  opacity: 0.4;
  cursor: pointer;
}
/* Sentinela do Tab: existe so para receber o foco e devolve-lo a caixa. Sem tamanho e sem leitura. */
.rvm-modal__sentinela { position: absolute; width: 1px; height: 1px; opacity: 0; }
.rvm-modal__caixa {
  position: relative;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  /* O gap do Confirmation Modal no kit. Foi literal ate a RUI-008 dar o degrau ao extrator. */
  gap: var(--rvm-space-32);
  width: 480px;
  max-width: 100%;
  /* Respiro na viewport, nao medida do kit: fica literal de proposito. */
  max-height: calc(100vh - 32px);
  overflow-y: auto;
  padding: var(--rvm-space-24);
  border-radius: var(--rvm-radius-20);
  background: var(--rvm-white);
  box-shadow: var(--rvm-shadow-soft);
}
.rvm-modal__caixa:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-modal__titulo {
  margin: 0;
  font-size: var(--rvm-display-s-size);
  line-height: var(--rvm-display-s-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}

.rvm-confirm__conteudo { display: flex; flex-direction: column; gap: var(--rvm-space-16); }
.rvm-confirm__icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  box-sizing: border-box;
  width: 64px;
  height: 64px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-c-soft);
  color: var(--rvm-c-soft-ink);
}
.rvm-confirm__texto { display: flex; flex-direction: column; gap: var(--rvm-space-12); }
.rvm-confirm__titulo {
  margin: 0;
  font-size: var(--rvm-display-s-size);
  line-height: var(--rvm-display-s-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-confirm__descricao {
  margin: 0;
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-neutral-800);
}
.rvm-confirm__acoes { display: flex; align-items: center; gap: var(--rvm-space-12); }
/* Align=Center do kit: tudo centralizado e os dois botoes de 124 distribuidos por igual
   (SPACE_EVENLY na medida). O min-width guarda a largura do kit sem travar rotulo maior — em PT-BR
   "Continuar editando" nao cabe em 124. Esticar os botoes (flex: 1) foi o que a primeira versao fez,
   e o lado a lado mostrou a diferenca na hora. */
.rvm-confirm--centro .rvm-confirm__conteudo { align-items: center; text-align: center; }
.rvm-confirm--centro .rvm-confirm__texto { align-items: center; }
.rvm-confirm--centro .rvm-confirm__acoes { justify-content: space-evenly; }
.rvm-confirm--centro .rvm-confirm__acoes > * { min-width: 124px; }
/* Align=Left: conteudo a esquerda, botoes juntos a direita (gap 12). */
.rvm-confirm--esquerda .rvm-confirm__acoes { justify-content: flex-end; }

.rvm-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-24);
  text-align: center;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-empty__icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  box-sizing: border-box;
  width: 64px;
  height: 64px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-c-soft);
  color: var(--rvm-c-soft-ink);
}
/* A ilustracao (RUI-023) e flex:none pelo mesmo motivo do circulo de icone: sem isso, um titulo
   longo no rvm-empty__texto espremeria a imagem. */
.rvm-empty__mascote { flex: none; }
.rvm-empty__texto { display: flex; flex-direction: column; gap: var(--rvm-space-8); max-width: 420px; }
.rvm-empty__titulo {
  margin: 0;
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}
.rvm-empty__descricao {
  margin: 0;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-neutral-800);
}

/* ---------- Tabela e celulas (onda 4, fatia 2, RUI-006) ---------- */
/* Medidas de 💠 Table: cartao raio 20; cabecalho/rodape com padding 24 e gap 12; cabecalho de
   coluna com 56 de altura e corpo com 78, os dois com padding 18/24 e gap 8; borda neutra de 1. */
.rvm-table {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  border-radius: var(--rvm-radius-20);
  background: var(--rvm-white);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-table__cabecalho,
.rvm-table__rodape {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-24);
}
.rvm-table__cabecalho { justify-content: space-between; }
.rvm-table__rodape { justify-content: space-between; flex-wrap: wrap; }
.rvm-table__acoes { display: flex; align-items: center; gap: var(--rvm-space-8); }
/* A tabela rola sozinha na horizontal: em tela estreita, a alternativa seria espremer as colunas
   ate o texto virar uma letra por linha. O tabindex=0 que torna essa area alcancavel pelo teclado
   fica no RvmTable.razor, com teste em dados.spec.ts. */
.rvm-table__rolagem { overflow-x: auto; }
.rvm-table__rolagem:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: -2px; }
.rvm-table__grade { width: 100%; border-collapse: collapse; }
.rvm-table__thead { background: var(--rvm-white); }
.rvm-table__estado { padding: var(--rvm-space-24); text-align: center; }
.rvm-table__carregando {
  margin: 0;
  padding: var(--rvm-space-24);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-neutral-800);
}
/* Com LoadingMascot (RUI-023): o robo empilhado sobre o texto, em vez do texto sozinho. */
.rvm-table__carregando-com-mascote {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--rvm-space-8);
}
.rvm-table__carregando-com-mascote .rvm-table__carregando { padding: 0; }

/* RUI-028: o vazamento horizontal relatado nao reproduziu em Chromium/WebKit/Firefox nas 3 telas
   e larguras medidas (design/medidas/leitura de RUI-028) -- o `.rvm-table__rolagem { overflow-x:
   auto }` acima ja contem a tabela, e a cadeia `min-width: 0` do RvmAppShell ja deixa o miolo
   encolher. O min-width:0 abaixo e defesa de PACOTE, nao correcao de um bug visto: sem ele, um app
   que colocasse o RvmTable dentro de uma linha flex ou de uma coluna de grid herdaria o
   `min-width: auto` padrao do item e o vazamento voltaria fora do site de demonstracao, que so usa
   coluna flex. */
.rvm-table { min-width: 0; }

.rvm-header-cell {
  box-sizing: border-box;
  height: 56px;
  padding: 18px var(--rvm-space-24);
  border-bottom: 1px solid var(--rvm-neutral-100);
  background: var(--rvm-white);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
  text-align: start;
  white-space: nowrap;
}
.rvm-header-cell--centro { text-align: center; }
.rvm-header-cell--fim { text-align: end; }
.rvm-header-cell__ordenar {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-8);
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  cursor: pointer;
}
.rvm-header-cell__ordenar:hover { color: var(--rvm-accent-500); }
.rvm-header-cell__ordenar:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
/* Coluna sem ordem ainda: a seta fica apagada, mas acima do minimo de contraste de componente. */
.rvm-header-cell__seta--parada { color: var(--rvm-neutral-600); }

.rvm-cell {
  box-sizing: border-box;
  height: 78px;
  padding: 18px var(--rvm-space-24);
  border-bottom: 1px solid var(--rvm-neutral-100);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-neutral-900);
  text-align: start;
  vertical-align: middle;
}
.rvm-cell--centro { text-align: center; }
.rvm-cell--fim { text-align: end; }
.rvm-cell__conteudo { display: flex; align-items: center; gap: var(--rvm-space-8); }
.rvm-cell--centro .rvm-cell__conteudo { justify-content: center; }
.rvm-cell--fim .rvm-cell__conteudo { justify-content: flex-end; }
.rvm-cell__conteudo--numero { gap: var(--rvm-space-4); }
.rvm-cell__texto { display: flex; flex-direction: column; gap: var(--rvm-space-4); min-width: 0; }
.rvm-cell__titulo { font-weight: var(--rvm-font-weight-medium); }
/* Highlight do kit: a coluna que identifica a linha vem na tinta principal e mais pesada. */
.rvm-cell__texto--destaque .rvm-cell__titulo,
.rvm-cell__texto--destaque { color: var(--rvm-ink-500); font-weight: var(--rvm-font-weight-semibold); }
/* O kit usa Grey-700 aqui, que sobre branco da 3,64:1 e reprova no axe (texto de 12px precisa de
   4,5:1). --rvm-s-text-secondary e o degrau que cada esquema define para isso: escurece no
   Accessible e mantem o kit no Original. Mesma correcao que a sidebar colorida levou na onda 3. */
.rvm-cell__apoio {
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-s-text-secondary);
}
.rvm-cell__numero { font-weight: var(--rvm-font-weight-medium); }
.rvm-cell__numero--destaque { color: var(--rvm-ink-500); font-weight: var(--rvm-font-weight-semibold); }
.rvm-cell__codigo { font-weight: var(--rvm-font-weight-semibold); color: var(--rvm-ink-500); }
.rvm-cell__variacao {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-2);
  /* Texto sobre o fundo soft pede o degrau proprio: o ink normal sobre o soft reprova por pouco em
     algumas familias. Desde a RUI-007 o --rvm-c-soft-ink existe em TODAS, entao nao ha mais fallback:
     era o componente adivinhando o que era papel do sistema. */
  color: var(--rvm-c-soft-ink);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}
.rvm-cell__variacao--pilula {
  padding: var(--rvm-space-2) var(--rvm-space-8);
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-c-soft);
}
.rvm-cell__estado { display: inline-flex; align-items: center; gap: var(--rvm-space-8); }
.rvm-cell__bolinha {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-c-fill);
}
.rvm-cell__selo { display: inline-flex; flex: none; }

/* Coluna de escolha: so o checkbox, na largura dele. */
.rvm-cell--escolha { width: 1%; padding-inline-end: 0; }
.rvm-cell--escolha .rvm-choice { margin: 0; }

.rvm-row:hover .rvm-cell { background: var(--rvm-neutral-50); }
/* O :hover conta como classe, entao `.rvm-row:hover .rvm-cell` (3) vence `.rvm-row--escolhida
   .rvm-cell` (2) mesmo vindo antes: sem repetir o :hover aqui, a linha escolhida perde a cor de
   escolha justamente quando o mouse esta em cima dela. */
.rvm-row--escolhida .rvm-cell,
.rvm-row--escolhida:hover .rvm-cell { background: var(--rvm-accent-50); }
/* ---------- Cartoes (onda 4, fatias 5 e 6, RUI-006) ---------- */

/*
 * RvmStatCard. Medidas: small-statistic-card.json, small-icon-statistic-card.json,
 * small-badge-statistic-card.json, large-statistic-card.json, large-badge-statistic-card.json,
 * xtra-large-bar-statistic-card.json. Padding 20 (Small) / 24 (Large, XtraLarge), raio 20, gap 16.
 * Dark = fundo cheio na cor (--rvm-c-fill) com texto branco; Light = fundo branco com borda grey-100.
 */
.rvm-stat-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: var(--rvm-space-20);
  border-radius: var(--rvm-radius-20);
  overflow: hidden;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-stat-card--large,
.rvm-stat-card--xtra-large { padding: var(--rvm-space-24); }
.rvm-stat-card--light { background: var(--rvm-white); box-shadow: inset 0 0 0 1px var(--rvm-neutral-100); }
.rvm-stat-card--dark { background: var(--rvm-c-fill); color: var(--rvm-c-on-fill); }

/* Duas elipses translucidas no canto (medidas: 102/148 px, sem estilo de cor — decorativo, RUI-003). */
.rvm-stat-card__decor {
  position: absolute;
  inset: auto -30px -40px auto;
  width: 148px;
  height: 148px;
  border-radius: var(--rvm-radius-full);
  /* 6%, nao 12%: a mistura mais forte, onde a elipse cobre o texto, derrubava o contraste abaixo de
     4,5:1 (portao 4, pego pelo axe no RvmPaymentCard — mesmo enfeite, mesmo risco aqui). */
  background: color-mix(in srgb, var(--rvm-white) 6%, transparent);
  pointer-events: none;
}

.rvm-stat-card__top { position: relative; display: flex; align-items: flex-start; justify-content: space-between; gap: var(--rvm-space-12); }
.rvm-stat-card__heading { display: flex; align-items: center; gap: var(--rvm-space-8); min-width: 0; }
.rvm-stat-card__icon { display: inline-flex; flex: none; }
.rvm-stat-card--light .rvm-stat-card__icon { color: var(--rvm-c-ink); }
.rvm-stat-card__titles { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
/* Titulo, subtitulo, valor e detalhe sao RvmText: a cor vem do parametro Color dele (CorPrincipal/
   CorSecundaria no .razor), nunca daqui — classe isolada de componente ganha de classe externa mesmo
   com a mesma especificidade. O kit apaga esse texto a 75% de opacidade sobre o fundo cheio; aqui fica
   100% (branco solido), porque a opacidade derrubava o contraste abaixo de 4.5:1 (portao 4, pego pelo axe). */

.rvm-stat-card__action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: var(--rvm-radius-full);
  background: color-mix(in srgb, currentColor 15%, transparent);
  color: inherit;
  cursor: pointer;
}
.rvm-stat-card--light .rvm-stat-card__action { background: var(--rvm-c-soft); color: var(--rvm-c-soft-ink); }
.rvm-stat-card__action:hover { background: color-mix(in srgb, currentColor 25%, transparent); }
.rvm-stat-card__action:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
.rvm-stat-card__menu { flex: none; }

.rvm-stat-card__body { position: relative; display: flex; align-items: flex-start; gap: var(--rvm-space-16); }
.rvm-stat-card__badge { flex: none; }
.rvm-stat-card__numbers { display: flex; flex-direction: column; gap: var(--rvm-space-12); min-width: 0; }

.rvm-stat-card__detail { display: flex; align-items: center; gap: var(--rvm-space-4); flex-wrap: wrap; }
/* A cor do RvmText interno vem de CorTendencia; o span so precisa da mesma cor (var() por estilo em
   linha, no .razor) para o RvmIcon da seta, que segue a cor ambiente (currentColor). Sobre fundo cheio o
   par sobe/desce fica branco (medido); sobre branco, verde/vermelho fixo — o sentido e sempre o mesmo,
   independente da cor do cartao (medido no Small_Badge_Statistic Card). */
.rvm-stat-card__trend { display: inline-flex; align-items: center; gap: 2px; }

/* RUI-021: o encaixe (Chart) usa este mesmo invólucro — nao precisa de altura fixa, porque quem
   preenche (RvmLineChart/RvmBarChart/RvmDonutChart) ja tem o proprio tamanho, igual ao que Image ja
   fazia abaixo. O recuo em relacao ao resto do cartao continua vindo do gap do flex em .rvm-stat-card. */
.rvm-stat-card__visual { position: relative; }
.rvm-stat-card__image { display: block; width: 100%; height: auto; border-radius: var(--rvm-radius-12); }

/*
 * RvmProgressCard. Medida: progress-card.json. Padding 18, raio 16, borda grey-100, gap 16.
 */
.rvm-progress-card {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: 18px;
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-progress-card__head { display: flex; align-items: flex-start; gap: var(--rvm-space-12); }
.rvm-progress-card__texts { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.rvm-progress-card__title { color: var(--rvm-ink-500); }
.rvm-progress-card__desc { color: var(--rvm-s-text-secondary); }
.rvm-progress-card__menu { flex: none; }
.rvm-progress-card__footer { display: flex; flex-direction: column; gap: var(--rvm-space-8); }

/*
 * RvmTaskCard e RvmProjectCard. Medidas: purple-task-card.json (264x246), purple-project-card.json
 * (352x228/276). Padding 20, raio 16, borda grey-100, gap 16.
 */
.rvm-task-card,
.rvm-project-card {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: var(--rvm-space-20);
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-task-card__head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--rvm-space-8); min-height: 26px; }
.rvm-task-card__menu,
.rvm-project-card__menu { flex: none; margin-inline-start: auto; }
.rvm-task-card__title,
.rvm-project-card__title { color: var(--rvm-ink-500); margin: 0; }
.rvm-task-card__desc,
.rvm-project-card__desc { margin: 0; }
.rvm-task-card__desc,
.rvm-project-card__desc {
  color: var(--rvm-s-text-secondary);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.rvm-task-card__progress,
.rvm-project-card__progress { display: flex; flex-direction: column; gap: var(--rvm-space-8); }
.rvm-task-card__progress-label,
.rvm-project-card__progress-label { display: flex; align-items: center; justify-content: space-between; gap: var(--rvm-space-8); }
.rvm-task-card__footer,
.rvm-project-card__footer { display: flex; align-items: center; justify-content: space-between; gap: var(--rvm-space-16); }
.rvm-task-card__due,
.rvm-project-card__due { display: inline-flex; align-items: center; gap: var(--rvm-space-8); color: var(--rvm-neutral-600); flex: none; }

.rvm-project-card__head { display: flex; align-items: flex-start; gap: var(--rvm-space-16); }
.rvm-project-card__image,
.rvm-project-card__image-fallback { flex: none; width: 48px; height: 48px; border-radius: var(--rvm-radius-8); object-fit: cover; }
.rvm-project-card__badge-row { display: flex; align-items: center; flex: 1; gap: var(--rvm-space-8); min-height: 28px; }

/*
 * RvmFileCard. Medida: purple-file-folder-card.json. Horizontal: 360x96, linha, padding 16, raio 16.
 * Vertical: 208x260, coluna, previa grande em cima. Selecionado: borda no destaque (medido: Violet/500).
 */
.rvm-file-card {
  display: flex;
  box-sizing: border-box;
  border-radius: var(--rvm-radius-16);
  background: var(--rvm-white);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-file-card--selected { box-shadow: inset 0 0 0 1px var(--rvm-accent-500); }
.rvm-file-card--horizontal { align-items: center; gap: var(--rvm-space-16); padding: var(--rvm-space-16); }
.rvm-file-card--vertical { flex-direction: column; align-items: center; gap: var(--rvm-space-16); padding: 4px 4px var(--rvm-space-20); text-align: center; }

.rvm-file-card__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 48px;
  height: 48px;
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-neutral-50);
  color: var(--rvm-neutral-700);
}
.rvm-file-card__preview {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 172px;
  border-radius: var(--rvm-radius-12) var(--rvm-radius-12) 0 0;
  background: var(--rvm-neutral-50);
  color: var(--rvm-neutral-700);
}
.rvm-file-card__texts { display: flex; flex-direction: column; gap: 4px; min-width: 0; flex: 1; }
.rvm-file-card__texts--centro { align-items: center; padding: 0 var(--rvm-space-16); }
.rvm-file-card__name { color: var(--rvm-ink-500); margin: 0; }
.rvm-file-card__meta { color: var(--rvm-s-text-secondary); margin: 0; }
.rvm-file-card__menu { flex: none; }
.rvm-file-card__overlay { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: var(--rvm-space-12) var(--rvm-space-12) 0; }
.rvm-file-card__check { flex: none; }

/*
 * RvmPaymentCard. Medida: debit-card.json. 280x168 (168+40 com Actions), raio 16, padding 20.
 * A "Purple Grouped_Debit Card" do mesmo conjunto do kit e uma secao de dashboard (cartao + abas + lista
 * de lancamentos): layout de exemplo, nao virou componente (nota no RvmPaymentCard.razor).
 */
.rvm-payment-card {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  border-radius: var(--rvm-radius-16);
  overflow: hidden;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}
.rvm-payment-card--com-acoes { box-shadow: inset 0 0 0 1px var(--rvm-neutral-100); }
.rvm-payment-card__face {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: var(--rvm-space-20);
  min-height: 128px;
  background: var(--rvm-c-fill);
  color: var(--rvm-c-on-fill);
}
.rvm-payment-card:not(.rvm-payment-card--com-acoes) .rvm-payment-card__face { border-radius: var(--rvm-radius-16); }
.rvm-payment-card__decor {
  position: absolute;
  inset: auto -20px -30px auto;
  width: 132px;
  height: 132px;
  border-radius: var(--rvm-radius-full);
  /* 6%, nao 12%: a elipse cobre o canto onde fica a validade, e a mistura mais forte derrubava o
     contraste do texto branco abaixo de 4,5:1 no Info (portao 4, pego pelo axe). */
  background: color-mix(in srgb, var(--rvm-white) 6%, transparent);
  pointer-events: none;
}
.rvm-payment-card__top { position: relative; display: flex; align-items: flex-start; justify-content: space-between; gap: var(--rvm-space-16); }
.rvm-payment-card__mark { display: inline-flex; flex: none; }
.rvm-payment-card__balance { display: flex; flex-direction: column; gap: 4px; }
.rvm-payment-card__bottom { position: relative; display: flex; align-items: center; justify-content: space-between; gap: var(--rvm-space-16); }
/* Saldo, numero e validade sao RvmText com Color="Inverse" (ver RvmPaymentCard.razor) — a cor nao vem
   daqui, pela mesma razao do RvmStatCard (classe isolada de componente ganha de classe externa). O kit
   apaga "Balance" e a validade a 50% de opacidade; aqui ficam 100% (portao 4, contraste >= 4.5:1). */
.rvm-payment-card__actions {
  display: flex;
  gap: var(--rvm-space-16);
  box-sizing: border-box;
  padding: 18px;
  background: var(--rvm-white);
}

/* ---------- Listas (onda 4, fatia 4, RUI-006) ---------- */
/* Medidas: list-item-1-col.json, list-item-2-col.json (item com espaco 8 entre adorno, texto e lado
   direito; bloco de texto vertical com espaco 4), purple-list-group.json (cartao 360 de raio 20 e
   borda grey-100; cabecalho padding 24 gap 12; corpo padding 24 gap 18; lista com espaco 20) e
   purple-list-group-with-tab.json. */
.rvm-list {
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}

.rvm-list__itens {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-20);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Rolagem por dentro, como o kit desenha. A barra fina vem da .rvm-scrollbar da onda 3 — a receita ja
   existia e repeti-la aqui era duas verdades para a mesma barra. */
.rvm-list--rolagem { overflow-y: auto; }

/* A area rolavel entra no Tab, entao precisa dizer onde o foco esta. */
.rvm-list--rolagem:focus-visible {
  outline: 2px solid var(--rvm-accent-500);
  outline-offset: 2px;
}

.rvm-list__carregando {
  margin: 0;
  padding: var(--rvm-space-16) 0;
  text-align: center;
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  color: var(--rvm-s-text-secondary);
}

.rvm-list-item {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
}

/* O adorno nao encolhe: o kit reserva 44 para avatar e imagem, 20 para icone, e quem manda no tamanho
   e o componente que o aplicativo poe aqui. */
.rvm-list-item__adorno {
  display: inline-flex;
  flex: none;
  align-items: center;
}

.rvm-list-item__texto {
  display: flex;
  flex: 1 1 auto;
  min-width: 0;
  flex-direction: column;
  gap: var(--rvm-space-4);
}

.rvm-list-item__titulo,
.rvm-list-item__subtitulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* 2 Col: o titulo identifica o item, o subtexto apoia.
   O kit escreve o subtexto em Grey-700, que sobre branco da 3,64:1 e reprova no axe;
   --rvm-s-text-secondary e o degrau que cada esquema define para isso. Mesma correcao da celula. */
.rvm-list-item--duas-colunas .rvm-list-item__titulo {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}

.rvm-list-item--duas-colunas .rvm-list-item__subtitulo {
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-s-text-secondary);
}

/* 1 Col: a hierarquia se inverte — o titulo e um rotulo e o conteudo abaixo e o dado. */
.rvm-list-item--uma-coluna .rvm-list-item__titulo {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-s-text-secondary);
}

.rvm-list-item--uma-coluna .rvm-list-item__subtitulo {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-ink-500);
}

/* O selo no lugar do subtitulo (Content Type=Badge) nao herda o corte de uma linha. */
.rvm-list-item__subtitulo:has(.rvm-label) {
  overflow: visible;
  white-space: normal;
}

.rvm-list-item__valores {
  display: flex;
  flex: none;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--rvm-space-4);
  margin-inline-start: auto;
  text-align: end;
}

.rvm-list-item__valor {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  color: var(--rvm-ink-500);
}

.rvm-list-item__variacao {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-2);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-c-ink);
}

.rvm-list-item__valor-apoio {
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-regular);
  color: var(--rvm-s-text-secondary);
}

.rvm-list-item__acoes {
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: var(--rvm-space-8);
  margin-inline-start: auto;
}

/* Com valores E acoes, so o primeiro bloco empurra: dois `margin-inline-start: auto` abririam um vao
   entre os dois. */
.rvm-list-item__valores + .rvm-list-item__acoes { margin-inline-start: 0; }

.rvm-list-group {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: var(--rvm-radius-20);
  background: var(--rvm-white);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}

.rvm-list-group__cabecalho {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-24);
}

.rvm-list-group__titulos {
  display: flex;
  min-width: 0;
  flex-direction: column;
  gap: var(--rvm-space-8);
}

.rvm-list-group__linha-titulo {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
}

.rvm-list-group__menu { flex: none; }

/* As abas ficam entre o cabecalho e o corpo, com o mesmo recuo lateral. */
.rvm-list-group__abas { padding: 0 var(--rvm-space-24); }

.rvm-list-group__corpo {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-18);
  padding: var(--rvm-space-24);
}

/* O cabecalho ja separou o titulo do corpo; o corpo nao repete o recuo de cima. */
.rvm-list-group__cabecalho + .rvm-list-group__corpo,
.rvm-list-group__abas + .rvm-list-group__corpo { padding-top: var(--rvm-space-18); }
/* ---------- Atividade, historico e discussao (onda 4, fatia 7, RUI-006) ---------- */

/*
 * RvmActivity. Medidas: purple-activity.json, purple-activity-with-badge.json,
 * activity-with-image.json (408 de largura; Order First/Last x Type x Timestamp). Espaco 8 entre a
 * coluna do marcador e o conteudo; divisor vertical grey-200 de 1px na coluna do marcador.
 * O ponto (Tracker=Dot) e 24px com anel de 4px, cores herdadas de .rvm-c-accent (--rvm-c-fill/--rvm-c-soft).
 */
.rvm-activity { display: flex; align-items: stretch; gap: var(--rvm-space-8); }
.rvm-activity__tracker { display: flex; flex: none; flex-direction: column; align-items: center; width: 40px; }
.rvm-activity__marker { flex: none; }
.rvm-activity__dot {
  flex: none;
  box-sizing: border-box;
  width: 24px;
  height: 24px;
  border-radius: var(--rvm-radius-full);
  background: var(--rvm-c-fill);
  border: 4px solid var(--rvm-c-soft);
}
/* RUI-019: o Divider do kit e tracejado 4/4 em Grey-200 (activity-with-image.json e as demais
   medidas de atividade/historico). E <div> com fundo, nao SVG: repeating-linear-gradient controla
   o periodo com precisao, o que stroke-dasharray teria feito num SVG e border-style: dashed nao
   garante (o navegador escolhe o proprio traco). */
.rvm-activity__connector {
  flex: 1 1 auto;
  width: 1px;
  min-height: var(--rvm-space-8);
  margin-top: 4px;
  background-image: repeating-linear-gradient(to bottom, var(--rvm-neutral-200) 0 4px, transparent 4px 8px);
}
/* Order=Last do kit: o ultimo item da lista nao liga a mais nenhum, entao some a linha — decisao de
   quem monta a lista (RvmHistory ou qualquer outro container), nao um parametro do RvmActivity. */
.rvm-history__list > .rvm-activity:last-child .rvm-activity__connector { display: none; }
.rvm-activity__content { display: flex; flex-direction: column; gap: var(--rvm-space-8); min-width: 0; flex: 1; padding-bottom: var(--rvm-space-16); }
.rvm-activity__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--rvm-space-12); }
.rvm-activity__title,
.rvm-activity__desc,
.rvm-activity__time { margin: 0; }
.rvm-activity__time--topo { flex: none; white-space: nowrap; }
.rvm-activity__body { display: flex; flex-direction: column; gap: var(--rvm-space-8); }

/*
 * RvmHistory. Medida: purple-history-group.json. Cartao raio 20, borda grey-100; cabecalho com padding
 * 24 e gap 12; corpo com padding 24. A rolagem usa a classe .rvm-scrollbar ja existente (onda 3) em vez
 * de redesenhar a barra decorativa do kit.
 */
.rvm-history {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  border-radius: var(--rvm-radius-20);
  box-shadow: inset 0 0 0 1px var(--rvm-neutral-100);
  background: var(--rvm-white);
  overflow: hidden;
}
.rvm-history__header { display: flex; align-items: flex-start; gap: var(--rvm-space-12); padding: var(--rvm-space-24); }
.rvm-history__heading { display: flex; flex-direction: column; gap: var(--rvm-space-8); min-width: 0; flex: 1; }
.rvm-history__title-row { display: flex; align-items: center; gap: var(--rvm-space-12); }
.rvm-history__title,
.rvm-history__text { margin: 0; }
.rvm-history__menu { flex: none; }
.rvm-history__body { box-sizing: border-box; max-height: 558px; overflow-y: auto; padding: 0 var(--rvm-space-24) var(--rvm-space-24); }
/* O corpo entra no Tab porque rola: precisa dizer onde o foco esta. */
.rvm-history__body:focus-visible { outline: 2px solid var(--rvm-accent-500); outline-offset: -2px; }
.rvm-history__loading { margin: 0; padding: var(--rvm-space-24) 0; text-align: center; color: var(--rvm-s-text-secondary); font: inherit; }
.rvm-history__list { display: flex; flex-direction: column; }

/*
 * RvmComment. Medida: comment.json. O kit desenha o avatar em 40, mas o RvmAvatar so tem 32 (Small) e
 * 64 (Large) desde a onda 1, e o que se renderiza aqui e o 32 — divergencia declarada no `06`.
 * Gap 12; conteudo com borda inferior grey-100 e padding-bottom 20/24 em todo comentario que NAO e o
 * ultimo do fio (Order First&Middle x Last do kit — mesma logica de responsabilidade de lista do
 * RvmActivity). Resposta aninhada (ChildContent) recua 44px (32 do avatar + 12 do gap), alinhando com o
 * texto do comentario pai: o numero segue o avatar RENDERIZADO, senao o recuo nao alinha com nada.
 */
.rvm-comment { display: flex; align-items: flex-start; gap: var(--rvm-space-12); }
.rvm-comment:not(:last-child) > .rvm-comment__content { border-bottom: 1px solid var(--rvm-neutral-100); padding-bottom: var(--rvm-space-20); }
.rvm-comment__avatar { flex: none; }
.rvm-comment__content { display: flex; flex-direction: column; gap: var(--rvm-space-8); min-width: 0; flex: 1; }
.rvm-comment__head { display: flex; align-items: center; gap: var(--rvm-space-8); flex-wrap: wrap; }
.rvm-comment__author,
.rvm-comment__text { margin: 0; }
.rvm-comment__reply {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  align-self: flex-start;
  border: 0;
  background: none;
  padding: 0;
  margin: 0;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-bold);
  color: var(--rvm-c-ink);
  cursor: pointer;
}
.rvm-comment__reply:hover { color: var(--rvm-c-ink-hover); }
.rvm-comment__reply:focus-visible { outline: 2px solid var(--rvm-accent-700); outline-offset: 2px; }
.rvm-comment__replies { display: flex; flex-direction: column; gap: var(--rvm-space-16); margin-top: var(--rvm-space-8); padding-left: 44px; }

/*
 * RvmReview. Medida: reviews.json. Mesma casca do RvmComment (avatar 40, borda inferior no que nao e o
 * ultimo da lista), com a linha "Nota: [estrelas]" + data no cabecalho e "Nome - detalhe" na linha de
 * baixo. As miniaturas de foto (Img=Yes) reaproveitam o raio 12 do File Type_Card.
 */
.rvm-review { display: flex; align-items: flex-start; gap: var(--rvm-space-12); }
.rvm-review:not(:last-child) > .rvm-review__content { border-bottom: 1px solid var(--rvm-neutral-100); padding-bottom: var(--rvm-space-24); }
.rvm-review__avatar { flex: none; }
.rvm-review__content { display: flex; flex-direction: column; gap: var(--rvm-space-8); min-width: 0; flex: 1; }
.rvm-review__header { display: flex; align-items: center; justify-content: space-between; gap: var(--rvm-space-8); flex-wrap: wrap; }
.rvm-review__rating { display: inline-flex; align-items: center; gap: var(--rvm-space-4); }
.rvm-review__name { display: flex; align-items: center; gap: var(--rvm-space-4); flex-wrap: wrap; }
.rvm-review__text { margin: 0; }
.rvm-review__images { display: flex; flex-wrap: wrap; gap: var(--rvm-space-12); }
.rvm-review__image { display: block; width: 64px; height: 64px; border-radius: var(--rvm-radius-12); object-fit: cover; }
/* ---------- Celulas ricas (onda 4, fatia 3, RUI-006) ---------- */
/* Medida: design/medidas/square-image-cell.json. RvmCellUser e RvmCellCircleImage reusam o RvmAvatar
   (ajustado a 40 px por `style` inline no proprio componente — sem CSS aqui) e nao precisam de nada
   novo. O quadrado nao existe como componente: e uma <img> simples, cantos pelo token de raio. */
.rvm-cell__imagem {
  width: 40px;
  height: 40px;
  flex: none;
  object-fit: cover;
  border-radius: var(--rvm-radius-8);
  background: var(--rvm-neutral-100);
}

/* ---------- Conversor de moeda (💠 Other Widget, RUI-011) ---------- */
/* Medidas: other-widget-black-grouped-progress-card.json. ⚠️ O conjunto se chama "Black
   Grouped_Progress Card" no kit e NAO e um cartao de progresso — o autor copiou e nao renomeou.
   Cartao 360x348 raio 20 com borda grey-100; cabecalho padding 24 gap 12; corpo gap 24 com padding
   0/24/24/24; campos gap 16; a linha da taxa com gap 8. */
.rvm-converter {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  width: 360px;
  max-width: 100%;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: var(--rvm-radius-20);
  background: var(--rvm-white);
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}

.rvm-converter__cabecalho {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-24);
}

.rvm-converter__titulos {
  display: flex;
  min-width: 0;
  flex-direction: column;
  gap: var(--rvm-space-8);
}

.rvm-converter__menu { flex: none; }

.rvm-converter__corpo {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-24);
  padding: 0 var(--rvm-space-24) var(--rvm-space-24);
}

.rvm-converter__campos {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
}

/* O kit escreve a taxa em Grey-700, que sobre branco da 3,64:1 e reprova no axe (texto de 12px pede
   4,5:1). --rvm-s-text-secondary e o degrau que cada esquema define para isso. */
.rvm-converter__taxa {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
  margin: 0;
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}

/* O botao ocupa a largura do corpo, como no kit (312 dentro dos 360 com padding 24). */
.rvm-converter__acao { width: 100%; }

/* ---------- Graficos (onda 5, fatia 2, RUI-010) ---------- */
/* Medidas: bar-vertical.json, bar-horizontal.json, bar-upside-down.json. O desenho e um SVG de
   viewBox FIXO (decisao do Rafael, 20/09): uma tecnica so nos sete graficos. A barra tem 8 de
   espessura e raio 8 — e uma pilula —, e as cores saem da rampa do destaque: 500 para uma serie,
   100+500 para duas, 100+300+500 para tres. */
.rvm-chart {
  display: block;
  margin: 0;
  font-family: var(--rvm-font-family);
  letter-spacing: var(--rvm-letter-spacing);
}

.rvm-chart__desenho {
  display: block;
  width: 100%;
  height: auto;
}

/* ⚠️ O grafico nao passa da largura que o kit desenhou. Sem este teto ele estica ate o fim do
   container e, como o viewBox e fixo, o TEXTO CRESCE JUNTO: um Small de 504 esticado para 1080 sai
   com a fonte dobrada. Apareceu na primeira renderizacao da pagina, nao em teste. Diminuir funciona
   bem (e o que torna o grafico responsivo para baixo); aumentar e que estraga. */
/* ⚠️ `width` E `max-width: 100%`, nao so o max-width: um <figure> com um SVG de width:100% NAO tem
   largura intrinseca, e dentro de um flex ele colapsa para os 300px que o navegador da a um SVG solto.
   Apareceu na pagina de aprovacao, onde o grafico saiu menor do que o kit desenhou. Com os dois, ele
   nasce do tamanho do kit e ENCOLHE quando o espaco e menor — que e o que o torna responsivo para
   baixo. Aumentar e que estraga, porque o viewBox e fixo e o texto cresce junto. */
.rvm-chart--small { width: 504px; max-width: 100%; }
.rvm-chart--medium { width: 696px; max-width: 100%; }
.rvm-chart--large { width: 1080px; max-width: 100%; }

/* A grade do kit: linha fina neutra, sem peso visual, tracejada 2/5 em Grey-200 (bar-vertical.json,
   bar-horizontal.json e bar-upside-down.json — "Y Axis > Y > Line"). RUI-019: saiu solida na onda 5
   porque o extrator so aprendeu a medir tracejado na onda 6. */
.rvm-chart__grade line {
  stroke: var(--rvm-neutral-200);
  stroke-width: 1;
  stroke-dasharray: 2 5;
}

/* A grade suave usa o mesmo tracejado 2/5, mas um degrau mais claro: Grey-100 (smooth-line.json). */
.rvm-chart--linha .rvm-chart__grade line {
  stroke: var(--rvm-neutral-100);
}

/* O kit escreve os rotulos em Grey-700, que sobre branco da 3,64:1 e reprova no axe.
   --rvm-s-text-secondary e o degrau que cada esquema define para isso. */
.rvm-chart__valor,
.rvm-chart__categoria {
  fill: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  font-weight: var(--rvm-font-weight-regular);
}

/* A legenda: medida dentro do balao do kit ("Label"), um circulo de 10 com gap 6.
   ⚠️ A marca e a fatia usam A MESMA classe de cor (rvm-chart__cor--*), e as duas pintam por
   currentColor: a legenda nunca aponta para uma cor que o grafico nao usou. */
.rvm-chart-legenda {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rvm-space-6) var(--rvm-space-16);
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--rvm-font-family);
}

.rvm-chart-legenda--empilhada { flex-direction: column; }

.rvm-chart-legenda__item {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-6);
  font-size: var(--rvm-text-s-size);
}

.rvm-chart-legenda__marca {
  flex: none;
  width: 10px;
  height: 10px;
  border-radius: var(--rvm-radius-full);
  background: currentColor;
}

.rvm-chart-legenda__nome,
.rvm-chart-legenda__separador { color: var(--rvm-s-text-secondary); }

.rvm-chart-legenda__valor {
  color: var(--rvm-ink-500);
  font-weight: var(--rvm-font-weight-semibold);
}

/* A COR DE CADA SERIE OU FATIA.
   ⚠️ O degrau vem do C# (RvmChartRamp), nao de uma cascata de :has(): a rampa muda com a QUANTIDADE
   de fatias, e a cascata ja venceu o divergente por especificidade uma vez, pintando os dois lados de
   roxo com o teste de cor passando.
   Cada classe define DUAS coisas: a cor do desenho (`color`, lida por currentColor) e a cor do texto
   que vai POR CIMA dele. E o que faz a porcentagem dentro da fatia ser legivel nos tres destaques. */
.rvm-chart__fatia,
.rvm-chart__barra { fill: currentColor; }

/* ⚠️ A trilha precisa do fill explicito: sem ele o SVG pinta de PRETO, nao de transparente. Uma
   trilha preta num medidor parece dado, nao "o que falta" — e foi exatamente o que apareceu na tela
   quando um corte apagou esta regra. */
.rvm-chart__trilha { fill: var(--rvm-neutral-100); }

.rvm-chart__curva { stroke: currentColor; }

.rvm-chart__cor--accent-100 { color: var(--rvm-accent-100); --rvm-chart-sobre: var(--rvm-s-on-accent-100); }
.rvm-chart__cor--accent-200 { color: var(--rvm-accent-200); --rvm-chart-sobre: var(--rvm-s-on-accent-200); }
.rvm-chart__cor--accent-300 { color: var(--rvm-accent-300); --rvm-chart-sobre: var(--rvm-s-on-accent-300); }
.rvm-chart__cor--accent-400 { color: var(--rvm-accent-400); --rvm-chart-sobre: var(--rvm-s-on-accent-400); }
.rvm-chart__cor--accent-500 { color: var(--rvm-accent-500); --rvm-chart-sobre: var(--rvm-s-on-accent-500); }

/* ⚠️ Os tokens tem nome semantico (success, danger), mas numa pizza eles NAO querem dizer nada: sao a
   terceira e a quarta cor da roda. Para estado, use o texto. */
.rvm-chart__cor--warning-500 { color: var(--rvm-warning-500); --rvm-chart-sobre: var(--rvm-s-on-warning-500); }
.rvm-chart__cor--success-500 { color: var(--rvm-success-500); --rvm-chart-sobre: var(--rvm-s-on-success-500); }
.rvm-chart__cor--danger-500  { color: var(--rvm-danger-500);  --rvm-chart-sobre: var(--rvm-s-on-danger-500); }
.rvm-chart__cor--info-500    { color: var(--rvm-info-500);    --rvm-chart-sobre: var(--rvm-s-on-info-500); }
.rvm-chart__cor--neutral-100 { color: var(--rvm-neutral-100); --rvm-chart-sobre: var(--rvm-s-on-neutral-100); }

/* ── Onda 5, fatia 5: medidor e bolha ──────────────────────────────────────────────────────────
   ⚠️ O "Meter Chart" do kit NAO e um ponteiro: e uma barra de 284x100, raio 12, repartida entre os
   valores. Medido em meter-chart.json. O "Bubble" tem 312x244 e ate quatro circulos. */
/* Os radiais tem 248 de lado, e a bolha 312 — medidos. Como os cartesianos: `width` E
   `max-width: 100%`, senao um <figure> com SVG de width:100% colapsa para 300px dentro de um flex. */
.rvm-chart--rosca,
.rvm-chart--pizza {
  width: 248px;
  max-width: 100%;
}

.rvm-chart__radial { position: relative; }

/* O "Numbers" do kit, por cima do anel. */
.rvm-chart__centro {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--rvm-space-8);
  text-align: center;
  pointer-events: none;
}

/* Na meia rosca o numero ASSENTA NA BASE do desenho: a base dele e a base do grafico (pedido do
   Rafael, 21/09). Centrado nos 124 de altura ele flutuava, com sobra embaixo — e o que o olho procura
   num semicirculo e a linha de base, nao o meio da caixa. Na horizontal continua centrado. */
.rvm-chart--meia .rvm-chart__centro { justify-content: flex-end; }

/* O aviso enquanto o dado vem. */
.rvm-chart__carregando {
  margin: 0;
  padding: var(--rvm-space-16) 0;
  color: var(--rvm-s-text-secondary);
  font-family: var(--rvm-font-family);
  font-size: var(--rvm-text-m-size);
}
/* Com LoadingMascot (RUI-023): o robo empilhado sobre o texto, em vez do texto sozinho. */
.rvm-chart__carregando-com-mascote {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--rvm-space-8);
}
.rvm-chart__carregando-com-mascote .rvm-chart__carregando { padding: 0; }

.rvm-chart--medidor { width: 284px; max-width: 100%; }
.rvm-chart--bolha { width: 312px; max-width: 100%; }

/* O numero dentro do segmento ou da bolha, em TODOS eles, como o kit escreve.
   ⚠️ A cor vem da PROPRIA fatia (--rvm-chart-sobre), nao e branco fixo: branco sobre accent-100 da
   1,64:1 e sobre o amarelo 1,69:1, e o portao 4 pede 4,5:1. Com o token por degrau, o pior caso da
   tabela inteira e 4,82:1 — e por isso o numero pode ficar em todas as fatias. */
.rvm-chart__rotulo-interno {
  fill: var(--rvm-chart-sobre, var(--rvm-white));
  font-size: var(--rvm-text-m-size);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-chart--bolha .rvm-chart__rotulo-interno {
  font-size: var(--rvm-display-s-size);
}

/* A rampa propria do medidor (500+300 com dois pedacos) vem do C#: RvmChartRamp.Medidor. */

/* ── O balao do kit (o "Label" que aparece sobre a barra e sobre a curva) ──────────────────────
   Medido: raio 12, padding 12/16, gap 6, fundo Black-500 e sombra. Dentro, a mesma linha da legenda:
   circulo de 10, nome, dois-pontos e valor.

   ⚠️ SEM JAVASCRIPT. O alvo e um elemento HTML posicionado por cima do desenho, em PORCENTAGEM do
   viewBox — em pixel ele sairia do lugar quando o grafico encolhe. O balao e IRMAO do alvo dentro do
   mesmo elemento, porque o CSS so alcanca descendente e irmao: numa lista separada o :hover nunca
   chegaria nele. */
.rvm-chart__area { position: relative; }

.rvm-chart__dicas {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.rvm-chart__alvo {
  position: absolute;
  pointer-events: auto;
  border-radius: var(--rvm-radius-5);
}

/* O foco nao e enfeite: sem ele quem navega por teclado e enxerga pouco fica sem o dado do balao. */
.rvm-chart__alvo:focus-visible {
  outline: 2px solid var(--rvm-accent-500);
  outline-offset: 2px;
}

.rvm-chart__dica {
  position: absolute;
  left: 50%;
  /* Preso a ALTURA DO DADO dentro do alvo, nao ao topo dele: o alvo e largo de proposito (a faixa
     inteira da categoria), e ancorado no topo o balao sairia flutuando acima do grafico. */
  top: var(--rvm-chart-ancora, 0%);
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-6);
  width: max-content;
  max-width: 220px;
  padding: var(--rvm-space-12) var(--rvm-space-16);
  border-radius: var(--rvm-radius-12);
  background: var(--rvm-ink-500);
  box-shadow: var(--rvm-shadow-soft);
  font-family: var(--rvm-font-family);
  font-size: var(--rvm-text-s-size);
  opacity: 0;
  /* A variavel --rvm-desvio (RUI-027) e quem o JS (rvm-posicionar.js) usa pra somar um deslocamento
     horizontal quando o balao centralizado passaria da janela (a ultima categoria de um grafico
     largo, por exemplo). Sem JS a variavel nao existe e o 0px do fallback mantem o centralizado
     de sempre. */
  transform: translate(calc(-50% + var(--rvm-desvio, 0px)), calc(-100% - var(--rvm-space-4)));
  transition: opacity 120ms ease-out, transform 120ms ease-out;
  pointer-events: none;
}

.rvm-chart__alvo:hover .rvm-chart__dica,
.rvm-chart__alvo:focus-visible .rvm-chart__dica {
  opacity: 1;
  transform: translate(calc(-50% + var(--rvm-desvio, 0px)), calc(-100% - var(--rvm-space-8)));
}

/* ⚠️ Quem liga "reduzir movimento" ve o balao aparecer PRONTO, sem deslizar: movimento na tela
   provoca enjoo e desorientacao em quem tem disturbio vestibular (WCAG 2.3.3). */
@media (prefers-reduced-motion: reduce) {
  .rvm-chart__dica {
    transition: none;
    transform: translate(calc(-50% + var(--rvm-desvio, 0px)), calc(-100% - var(--rvm-space-8)));
  }
}

.rvm-chart__dica-titulo {
  color: var(--rvm-white);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-chart__dica-linha {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-6);
}

.rvm-chart__dica-marca {
  flex: none;
  width: 10px;
  height: 10px;
  border-radius: var(--rvm-radius-full);
  background: currentColor;   /* a cor vem da classe rvm-chart__cor--*, a mesma da fatia */
}

/* Black-100 no nome e branco no valor: e o contraste que o kit desenha dentro do balao escuro. */
.rvm-chart__dica-nome { color: var(--rvm-neutral-200); }

.rvm-chart__dica-valor {
  margin-left: auto;
  color: var(--rvm-white);
  font-weight: var(--rvm-font-weight-semibold);
}

/* ── Radar ─────────────────────────────────────────────────────────────────────────────────────
   ⚠️ NAO EXISTE NO KIT: zero ocorrencia de "radar", "spider" ou "polar" nos 387 conjuntos do
   Protask. E invencao declarada, pedida pelo Rafael em 21/09/2026.

   O que foi reusado do kit: os 7 degraus de grade, os 48 de folga do rotulo (a largura do eixo de
   valor), o traco de 2 da curva e a rampa de cor da linha.
   O que e escolha: o lado de 320, o raio de 112 e os 12% de opacidade da area. */
.rvm-chart--radar { width: 360px; max-width: 100%; }

/* RUI-019: o radar e invencao (nao existe no kit), sem tracejado medido — fica solido de proposito,
   sem herdar o stroke-dasharray que a onda 4/5 passou a usar em .rvm-chart__grade line. */
.rvm-chart--radar .rvm-chart__grade polygon,
.rvm-chart--radar .rvm-chart__grade line {
  stroke: var(--rvm-neutral-100);
  stroke-width: 1;
  stroke-dasharray: none;
}

/* A area preenchida deixa ver a serie de tras: sem a transparencia, a maior esconderia as outras.
   O traco fica cheio, para a borda continuar legivel onde as areas se cruzam. */
.rvm-chart__area-serie {
  fill: currentColor;
  fill-opacity: 0.12;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linejoin: round;
}


/* ─── Movimento (RUI-012) ──────────────────────────────────────────────────────────────────────
   ⚠️ INVENCAO DECLARADA. O Protask e um arquivo do Figma: quadro parado, sem duracao, sem curva de
   aceleracao e sem ordem de entrada. NAO HA O QUE MEDIR em design/medidas/ — cada numero aqui e
   escolha, e a justificativa de cada um esta no 06 e no card RUI-012.

   Uma frase explica o sistema inteiro: TODA FORMA CRESCE DE ONDE ELA ESTA ANCORADA. A barra em pe
   sobe do eixo, a deitada sai da esquerda, o medidor corre da borda esquerda da barra, a bolha
   estufa do proprio centro, a fatia abre do centro do circulo e a curva se desenha da esquerda para
   a direita. Nao ha nenhuma entrada que contrarie a leitura do grafico.

   Duas coisas diferentes, em propriedades diferentes, DE PROPOSITO:
     ENTRADA        -> @keyframes sobre transform / opacity / stroke-dashoffset, nunca sobre geometria
     TROCA DE DADO  -> transition sobre a GEOMETRIA (x, y, width, height, cx, cy, r, d), que e o que
                       o Blazor reescreve quando o valor muda
   Como as duas nao dividem nenhuma propriedade, a entrada nao trava a troca nem o contrario. E, o
   que mais importa, NENHUMA DAS DUAS altera o estado final: os testes de coordenada da onda 5
   continuam valendo palavra por palavra.

   ⚠️ Geometria em CSS e SVG2, e quem decide se anima e o navegador. Chrome e Safari animam tudo;
   o Firefox nao anima `d`, entao la a fatia da rosca troca de valor em SALTO. Degradar assim e
   aceitavel porque o estado final e identico nos tres: o que muda e so o caminho ate ele. A
   alternativa seria JavaScript, que a RCL nao aceita. */
:root {
  /* 1s — escolha do Rafael em 23/09/2026. ⚠️ E mais do que o dobro dos 400ms que o card sugeria:
     num painel de trabalho, 1s e o tempo que a pessoa espera para ler o numero. Fica como token
     justamente para poder ser revisto num lugar so depois de ver rodando. */
  --rvm-motion-duration: 1s;

  /* Sem escalonar. Com 1s de duracao, 40ms por serie fariam a ultima de doze barras so terminar em
     1,44s — o atraso COMPOE com a duracao, nao se dilui nela. O token existe para quem quiser
     escalonar num aplicativo so, sem mexer na biblioteca. */
  --rvm-motion-stagger: 0ms;

  /* ease-out forte: sai depressa e freia no fim, que e o que faz o valor final parecer "pousar"
     em vez de parar de repente. */
  --rvm-motion-ease: cubic-bezier(0.22, 1, 0.36, 1);
}

@keyframes rvm-cresce-de-baixo { from { transform: scaleY(0); } }
@keyframes rvm-cresce-de-cima  { from { transform: scaleY(0); } }
@keyframes rvm-cresce-da-esquerda { from { transform: scaleX(0); } }
@keyframes rvm-abre-do-centro { from { transform: scale(0.2); opacity: 0; } }
@keyframes rvm-estufa { from { transform: scale(0); opacity: 0; } }
@keyframes rvm-surge { from { opacity: 0; } }

/* ⚠️ `:where()` em TODO qualificador de tipo de grafico, e nao e enfeite: `:where()` NAO conta
   para a especificidade, entao toda regra que anima vale exatamente UMA classe. Sem isso,
   `.rvm-chart--barra.rvm-chart--divergente .rvm-chart__barra--desce` (tres classes) venceria o
   desligamento do prefers-reduced-motion (uma classe) e a barra que desce continuaria animando com
   a preferencia LIGADA. Quem achou foi o teste, nao o olho: a diferenca e invisivel num screenshot.
   O repo nao usa `!important` em lugar nenhum, e nao vai comecar por aqui. */

/* ⚠️ `to` implicito de proposito em quase todos: o estado final e o VALOR COMPUTADO do elemento,
   que vem do atributo que o C# calculou. Escrever um `to` aqui seria repetir a geometria em CSS e
   abrir a porta para os dois discordarem. A excecao e o traco da curva, logo abaixo, onde o `to`
   implicito cairia em `none` — que nao interpola com um dasharray e daria um salto no meio. */

/* A BARRA sobe do eixo. fill-box, e nao view-box, porque a base da barra em pe JA E o eixo, e a
   ponta da deitada JA E o zero: a propria caixa do desenho da a ancora certa sem nenhuma conta. */
:where(.rvm-chart--barra) .rvm-chart__barra {
  transform-box: fill-box;
  transform-origin: 50% 100%;
  animation: rvm-cresce-de-baixo var(--rvm-motion-duration) var(--rvm-motion-ease) both;
}

:where(.rvm-chart--barra.rvm-chart--horizontal) .rvm-chart__barra {
  transform-origin: 0 50%;
  animation-name: rvm-cresce-da-esquerda;
}

/* No divergente a origem e a LINHA DO ZERO, que e o topo da barra que desce — nao a base dela.
   Sem esta regra a segunda serie cresceria de baixo para cima e atravessaria o eixo no caminho. */
:where(.rvm-chart--barra.rvm-chart--divergente) .rvm-chart__barra--desce {
  transform-origin: 50% 0;
  animation-name: rvm-cresce-de-cima;
}

/* A CURVA se desenha. `pathLength="1"` no <path> (RvmLineChart) normaliza o comprimento para 1, e e
   o que permite desenhar o traco sem JavaScript: sem ele so o navegador sabe quanto mede o caminho.
   ⚠️ O `stroke-dasharray: 1` fica PERMANENTE: com pathLength 1 ele e um traco do tamanho exato do
   caminho seguido de um vao que nunca aparece — ou seja, uma linha solida. Precisa ficar porque
   `dasharray: none` nao interpola com um dasharray, e a animacao saltaria na metade. */
:where(.rvm-chart--linha) .rvm-chart__curva {
  stroke-dasharray: 1;
  animation: rvm-desenha-traco var(--rvm-motion-duration) var(--rvm-motion-ease) both;
}

@keyframes rvm-desenha-traco {
  from { stroke-dashoffset: 1; }
  to { stroke-dashoffset: 0; }
}

/* A FATIA abre do centro do circulo. view-box aqui, ao contrario da barra: a ancora e o centro do
   DESENHO, nao o da fatia — uma fatia de 10% tem o proprio centro la na borda, e crescer a partir
   dele faria o pedaco brotar de fora para dentro. */
/* ⚠️ A TRILHA entra junto com as fatias aqui, e NAO entra no medidor. Nao e inconsistencia: no
   anel a trilha e a fatia ocupam o MESMO circulo, e crescer uma sem a outra le como desalinhamento,
   nao como movimento (visto na tela, a fatia aparecia por dentro da borda cinza). No medidor as duas
   ficam LADO A LADO, e e justamente a trilha parada que faz a barra parecer encher. */
:where(.rvm-chart--rosca) .rvm-chart__fatia,
:where(.rvm-chart--rosca) .rvm-chart__trilha,
:where(.rvm-chart--pizza) .rvm-chart__fatia,
:where(.rvm-chart--pizza) .rvm-chart__trilha,
:where(.rvm-chart--radar) .rvm-chart__area-serie {
  transform-box: view-box;
  transform-origin: 50% 50%;
  animation: rvm-abre-do-centro var(--rvm-motion-duration) var(--rvm-motion-ease) both;
}

/* A meia rosca e recortada na altura (o viewBox tem metade do lado), entao o centro do circulo cai
   na BORDA DE BAIXO do quadro, nao no meio dele. */
:where(.rvm-chart--rosca.rvm-chart--meia) .rvm-chart__fatia,
:where(.rvm-chart--rosca.rvm-chart--meia) .rvm-chart__trilha { transform-origin: 50% 100%; }

/* O MEDIDOR corre da esquerda da barra inteira — view-box, e nao fill-box, porque cada segmento
   comeca onde o anterior acabou: se cada um crescesse do proprio canto, eles se separariam durante
   a animacao e a barra apareceria furada. */
:where(.rvm-chart--medidor) .rvm-chart__fatia {
  transform-box: view-box;
  transform-origin: 0 50%;
  animation: rvm-cresce-da-esquerda var(--rvm-motion-duration) var(--rvm-motion-ease) both;
}

/* A BOLHA estufa do proprio centro: aqui cada uma e uma ilha, e a ancora de verdade e ela mesma. */
:where(.rvm-chart--bolha) .rvm-chart__fatia {
  transform-box: fill-box;
  transform-origin: 50% 50%;
  animation: rvm-estufa var(--rvm-motion-duration) var(--rvm-motion-ease) both;
}

/* O numero ESCRITO POR CIMA de uma forma (o rotulo do medidor e da bolha, e o valor no meio da
   rosca) entra junto com ela. Sem isto, a porcentagem do medidor
   fica um segundo inteiro flutuando sobre uma barra vazia e o grafico parece quebrado.
   ⚠️ So o rotulo interno. O eixo e a categoria NAO entram: eles sao a moldura, nao o dado, e apagar
   a moldura por um segundo e que deixaria o grafico ilegivel enquanto anima.
   ⚠️ E entra na SEGUNDA METADE, nao no comeco: o rotulo fica parado na posicao final enquanto o
   segmento desliza por baixo, entao nascendo junto ele aparece sobre a trilha vazia, longe do pedaco
   que descreve. Visto na tela do medidor: o "25%" legivel sobre cinza. A conta fecha em 1s. */
.rvm-chart__rotulo-interno,
.rvm-chart__centro {
  animation: rvm-surge calc(var(--rvm-motion-duration) / 2) var(--rvm-motion-ease)
             calc(var(--rvm-motion-duration) / 2) both;
}

/* A TROCA DE DADO. Propriedades de geometria do SVG2: e o que o Blazor reescreve quando o valor
   muda, e nao tem intersecao nenhuma com o que a entrada anima.
   ⚠️ `points` do poligono (radar) NAO e propriedade de CSS e nao ha o que transicionar la: o radar
   troca de valor em salto, nos tres navegadores. Nao ha caminho sem JavaScript para isso. */
.rvm-chart__barra,
.rvm-chart__fatia,
.rvm-chart__curva,
.rvm-chart__trilha {
  transition:
    x var(--rvm-motion-duration) var(--rvm-motion-ease),
    y var(--rvm-motion-duration) var(--rvm-motion-ease),
    width var(--rvm-motion-duration) var(--rvm-motion-ease),
    height var(--rvm-motion-duration) var(--rvm-motion-ease),
    cx var(--rvm-motion-duration) var(--rvm-motion-ease),
    cy var(--rvm-motion-duration) var(--rvm-motion-ease),
    r var(--rvm-motion-duration) var(--rvm-motion-ease),
    d var(--rvm-motion-duration) var(--rvm-motion-ease);
}

/* 🔴 A TRAVA DE ACESSIBILIDADE. Nao e opcional e nao se negocia: movimento na tela provoca enjoo e
   desorientacao em quem tem disturbio vestibular (WCAG 2.3.3). Quem liga "reduzir movimento" no
   sistema ve o grafico PRONTO — nao uma versao mais lenta dele.
   ⚠️ `animation: none` e `transition: none`, e nao uma duracao de 0s: o estado final tem de ser o
   unico estado que existe, e isso da para provar DE FORA (E2E com reducedMotion: 'reduce'), que e o
   que o card exige. O dasharray da curva tambem sai, senao ficaria um traco calculado a toa. */
@media (prefers-reduced-motion: reduce) {
  .rvm-chart__barra,
  .rvm-chart__barra--desce,
  .rvm-chart__fatia,
  .rvm-chart__curva,
  .rvm-chart__trilha,
  .rvm-chart__area-serie,
  .rvm-chart__rotulo-interno,
  .rvm-chart__centro {
    animation: none;
    transition: none;
    stroke-dasharray: none;
  }
}

/* O desligamento por aplicativo (Animated="false"). Mesmo efeito da preferencia do sistema, por
   escolha de quem monta a tela — um grafico decorativo dentro de um cartao que ja diz o numero, por
   exemplo, nao ganha nada em animar. */
.rvm-chart--sem-animacao .rvm-chart__barra,
.rvm-chart--sem-animacao .rvm-chart__barra--desce,
.rvm-chart--sem-animacao .rvm-chart__fatia,
.rvm-chart--sem-animacao .rvm-chart__curva,
.rvm-chart--sem-animacao .rvm-chart__trilha,
.rvm-chart--sem-animacao .rvm-chart__area-serie,
.rvm-chart--sem-animacao .rvm-chart__rotulo-interno,
.rvm-chart--sem-animacao .rvm-chart__centro {
  animation: none;
  transition: none;
  stroke-dasharray: none;
}

/* ─── Agenda de eventos (💠 Calendar, onda 6) ──────────────────────────────────────────────────
   Medidas: purple-full-width-calendar.json (quadro raio 20, borda Grey-100; cabecalho 96 com
   padding 24 e vao 12; faixa de dias 56, texto text-l/600 Grey-700) e event-month.json (celula
   160x186, padding 16, vao 8; o numero num alvo redondo de 34 com borda Grey-100).
   ⚠️ A LINHA NAO E FIXA em 186: aqui ela e altura MINIMA e o dia cheio a faz crescer. Agenda real
   tem dia lotado, e cortar compromisso em silencio e pior do que a linha ficar mais alta. */
.rvm-event-calendar {
  background: var(--rvm-white);
  border: 1px solid var(--rvm-neutral-100);
  border-radius: 20px;
  overflow: hidden;
}

.rvm-event-calendar__cabecalho {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-24);
  border-bottom: 1px solid var(--rvm-neutral-100);
}

/* O bloco do mes fica no meio e as acoes na direita: o botao de hoje e o unico a esquerda. */
.rvm-event-calendar__mes {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-24);
  margin-inline: auto;
}

.rvm-event-calendar__titulo { white-space: nowrap; }

.rvm-event-calendar__acoes {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
}

/* table-layout fixo: sem ele um titulo longo alarga a coluna dele e a semana deixa de ter sete
   colunas iguais. */
.rvm-event-calendar__grade {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
}

/* ⚠️ A cor sai do TOKEN DE ESQUEMA, nao do Grey-700 literal do kit: #868686 sobre branco da 3,5:1
   e reprova AA em texto de 16px (o axe pegou). No esquema acessivel ele escurece para #686868
   (5,7:1); no esquema do kit volta ao Grey-700 exato. Vale para os tres textos da moldura. */
.rvm-event-calendar__grade th {
  box-sizing: border-box;
  height: 56px;
  padding: var(--rvm-space-16);
  text-align: start;
  border: 1px solid var(--rvm-neutral-100);
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

/* Altura no <td> vale como minimo: a celula cresce com o conteudo sem quebrar a tabela.
   ⚠️ border-box: sem ele o padding de 16+16 se soma e a linha sai com 218 em vez dos 186 do kit.
   Foi o lado a lado que pegou — os testes conferem classe, e a medida certa nao estava em nenhum. */
.rvm-event-calendar__dia {
  box-sizing: border-box;
  height: 186px;
  padding: var(--rvm-space-16);
  vertical-align: top;
  border: 1px solid var(--rvm-neutral-100);
}

/* O empilhamento vive numa camada interna: <td> com display:flex perde o alinhamento das colunas. */
.rvm-event-calendar__conteudo {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-8);
}

/* Dia fora do mes: o kit hachura a celula com 17 retangulos de 240x8 girados 25 graus dentro de um
   quadro girado -90, empilhados de 20,68 em 20,68 (medido no .fig). Aqui a mesma trama sai de uma
   regra so — o gradiente repetido desenha igual sem os 17 nos.
   ⚠️ 20,68 e o passo ao longo do EIXO EMPILHADO, que esta girado em relacao a perpendicular das
   faixas; o periodo que o gradiente quer e o perpendicular: 20,68 x cos(25) = 18,74. Pintar 20,68
   deixa a trama 11% mais rala que a do kit — diferenca que o lado a lado mediu (18,6 contra 20,8). */
.rvm-event-calendar__dia--fora {
  background: repeating-linear-gradient(
    -65deg,
    var(--rvm-neutral-50) 0 8px,
    transparent 8px 18.74px);
}

.rvm-event-calendar__numero {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: 34px;
  block-size: 34px;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: 100px;
  /* O alvo fica no MEIO da celula (Container com alinhamento CENTER na medida), e nao encostado a
     esquerda como as pilulas. */
  align-self: center;
  flex: none;
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-event-calendar__dia--fora .rvm-event-calendar__numero { color: var(--rvm-s-text-muted); }

/* Hoje: o kit pinta o alvo com o destaque. A cor por cima vem do mesmo token que o resto da
   biblioteca usa sobre o degrau 500 — e e ele que faz o destaque preto inverter sozinho. */
.rvm-event-calendar__dia--hoje .rvm-event-calendar__numero {
  background: var(--rvm-accent-500);
  border-color: var(--rvm-accent-500);
  color: var(--rvm-s-on-accent-500);
}

/* ─── Semana e dia: a grade de horas ───────────────────────────────────────────────────────────
   Medidas (purple-full-width-calendar.json, Type=Week): coluna de hora 100 de largura; colunas de
   dia 147; faixa do cabecalho 100 e linha de hora 96, ambas com padding 16. O texto do dia e da
   hora sai em text-l/600 Grey-700, centrado.
   ⚠️ No dia a celula estica para 1028: a largura e consequencia de haver UMA coluna, nao medida. */
/* ⚠️ table-layout FIXO tambem aqui: com "auto", a coluna que tem um compromisso de titulo longo
   rouba largura das vizinhas e a semana deixa de ter sete colunas iguais — o kit desenha 147 em
   todas. Fixo, a coluna de hora fica com os 100 pedidos e o resto se divide por igual. */
.rvm-event-calendar__canto,
.rvm-event-calendar__hora {
  /* Os 100 do kit sao a largura TOTAL da coluna: sem border-box o padding se soma e ela sai com 132. */
  box-sizing: border-box;
  inline-size: 100px;
  padding: var(--rvm-space-16);
  text-align: center;
  vertical-align: top;
  border: 1px solid var(--rvm-neutral-100);
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  white-space: nowrap;
}

/* O cabecalho do dia empilha o alvo e o nome, centrados (vao 10 na medida). */
.rvm-event-calendar__conteudo--dia {
  align-items: center;
  gap: 10px;
}

.rvm-event-calendar__nome-do-dia {
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-l-size);
  line-height: var(--rvm-text-l-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-event-calendar__celula-hora {
  box-sizing: border-box;
  height: 96px;
  padding: var(--rvm-space-16);
}

.rvm-event-calendar__celula-hora .rvm-event-calendar__conteudo { gap: var(--rvm-space-12); }

/* A marca do "agora": o kit desenha um ponto de 5x10 colado numa linha, os dois em Red-500. Ela
   atravessa a celula inteira, entao sai do fluxo — empurrar os compromissos para baixo mudaria a
   altura da linha so porque deu a hora. */
.rvm-event-calendar__dia--agora { position: relative; }

.rvm-event-calendar__agora {
  position: absolute;
  inset-inline: 0;
  /* A altura vem do MINUTO, calculado em C#: as 10h30 caem na metade da linha das 10. Fixar 50%
     poria a marca no meio da hora qualquer que fosse o relogio. */
  inset-block-start: var(--rvm-calendar-agora, 50%);
  block-size: 10px;
  margin-block-start: -5px;
  pointer-events: none;
  /* O ponto e um circulo de 5 na ponta esquerda; a linha e 1px no meio da altura. */
  background:
    radial-gradient(circle 2.5px at 2.5px 5px, var(--rvm-danger-500) 0 100%, transparent 100%),
    linear-gradient(var(--rvm-danger-500), var(--rvm-danger-500)) no-repeat 0 4.5px / 100% 1px;
}

/* ─── Pilula de compromisso (conjunto "Event") ─────────────────────────────────────────────────
   event.json: altura 32, raio 8, vao 4, padding 6/8; com foto a esquerda cai para 6. */
.rvm-event-pill {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-4);
  inline-size: 100%;
  block-size: 32px;
  padding: var(--rvm-space-6) var(--rvm-space-8);
  border: 0;
  border-radius: 8px;
  background: var(--rvm-c-fill);
  color: var(--rvm-c-on-fill);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  font-family: inherit;
  text-align: start;
}

.rvm-event-pill:has(.rvm-event-pill__foto) { padding-inline-start: var(--rvm-space-6); }

button.rvm-event-pill { cursor: pointer; }

/* O "State=On" do kit e o degrau 700 — o mesmo que ja serve de hover em toda a biblioteca. */
button.rvm-event-pill:hover,
.rvm-event-pill--selected { background: var(--rvm-c-fill-hover); }

button.rvm-event-pill:focus-visible {
  outline: 2px solid var(--rvm-accent-500);
  outline-offset: 2px;
}

.rvm-event-pill__foto {
  inline-size: 20px;
  block-size: 20px;
  border-radius: 100px;
  object-fit: cover;
  flex: none;
}

/* Corta com reticencias: em 32px o titulo nunca quebra em duas linhas, e o nome inteiro continua
   no DOM para quem usa leitor de tela. */
.rvm-event-pill__titulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ─── Cartao de compromisso (💠 Calendar, conjunto "Event Card") ────────────────────────────────
   Medidas (event-card.json): 304x90 com faixa e 304x82 sem; raio 12, borda Grey-100; corpo com
   padding 16 e vao 6; titulo text-m/600; detalhe com vao 8, horario em text-s/500. */
.rvm-event-card {
  display: flex;
  flex-direction: column;
  inline-size: 100%;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: 12px;
  background: var(--rvm-white);
  overflow: hidden;
  text-align: start;
  font-family: inherit;
  padding: 0;
}

button.rvm-event-card { cursor: pointer; }

button.rvm-event-card:hover { border-color: var(--rvm-neutral-200); }

button.rvm-event-card:focus-visible {
  outline: 2px solid var(--rvm-accent-500);
  outline-offset: 2px;
}

.rvm-event-card__corpo {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-6);
  padding: var(--rvm-space-16);
}

.rvm-event-card__titulo {
  margin: 0;
  color: var(--rvm-ink-500);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

/* O horario fica a esquerda e o grupo de pessoas empurrado para a direita: e o arranjo do kit,
   que no .fig e um espaco elastico entre os dois. */
.rvm-event-card__detalhes {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-8);
}

.rvm-event-card__horario {
  display: inline-flex;
  align-items: center;
  gap: var(--rvm-space-4);
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
}

.rvm-event-card__pessoas { flex: none; }

/* A faixa do rodape: 8px na cor do papel. E o unico lugar colorido do cartao. */
.rvm-event-card__faixa {
  display: block;
  block-size: 8px;
  background: var(--rvm-c-fill);
}

/* ─── Chat (💠 Chat, onda 6) ───────────────────────────────────────────────────────────────────
   Medidas: casca 588x908 raio 20 borda Grey-100; cabecalho e rodape de 80 com padding 20 e vao 16;
   area de mensagens em Grey-50 com padding 20 e vao 20. */
.rvm-chat {
  display: flex;
  flex-direction: column;
  block-size: 908px;
  max-block-size: 100%;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: 20px;
  background: var(--rvm-white);
  overflow: hidden;
}

.rvm-chat__cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-20);
  border-bottom: 1px solid var(--rvm-neutral-100);
  flex: none;
}

.rvm-chat__quem {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  min-inline-size: 0;
}

.rvm-chat__titulos { min-inline-size: 0; }

.rvm-chat__titulo {
  margin: 0;
  color: var(--rvm-ink-500);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-chat__subtitulo {
  margin: 0;
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
}

.rvm-chat__acoes {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
  flex: none;
}

/* justify-content flex-end e o alinhamento MAX do kit: a conversa cresce de baixo para cima, e com
   poucas mensagens elas ficam coladas no rodape em vez de flutuando no topo. */
.rvm-chat__mensagens {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: var(--rvm-space-20);
  padding: var(--rvm-space-20);
  background: var(--rvm-neutral-50);
  overflow-y: auto;
  flex: 1;
}

.rvm-chat__rodape {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-16);
  padding: var(--rvm-space-16);
  border-top: 1px solid var(--rvm-neutral-100);
  flex: none;
}

/* ─── Grupo de mensagens ─────────────────────────────────────────────────────────────────────── */
.rvm-chat-group {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-8);
}

/* O avatar fica alinhado ao RODAPE do grupo — encosta no ultimo balao, como o kit desenha. */
.rvm-chat-group__linha {
  display: flex;
  align-items: flex-end;
  gap: var(--rvm-space-12);
}

.rvm-chat-group__avatar { flex: none; }

.rvm-chat-group__baloes {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-8);
  min-inline-size: 0;
  /* Os 120 do kit: mensagem que atravessa a largura inteira fica ilegivel. */
  max-inline-size: calc(100% - 120px);
}

/* O horario nasce alinhado com os baloes: 52 = o avatar de 40 mais o vao de 12. */
.rvm-chat-group__horario {
  margin: 0;
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
}

.rvm-chat-group--esquerda .rvm-chat-group__horario { padding-inline-start: 52px; }

.rvm-chat-group--direita .rvm-chat-group__linha { flex-direction: row-reverse; }

.rvm-chat-group--direita .rvm-chat-group__baloes { align-items: flex-end; }

.rvm-chat-group--direita .rvm-chat-group__horario {
  padding-inline-end: 52px;
  text-align: end;
}

/* ─── Baloes ───────────────────────────────────────────────────────────────────────────────────
   O raio e ASSIMETRICO e e o que da o rabinho: o canto de baixo do lado de quem escreveu fica reto.
   A cor vem do lado, como no kit — nao ha parametro de cor. */
.rvm-chat-bubble {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-8);
  padding: var(--rvm-space-12);
  inline-size: fit-content;
  max-inline-size: 100%;
}

.rvm-chat-bubble--esquerda {
  border-radius: 12px 12px 12px 0;
  background: var(--rvm-white);
  color: var(--rvm-ink-500);
}

.rvm-chat-bubble--direita {
  border-radius: 12px 12px 0 12px;
  background: var(--rvm-accent-500);
  color: var(--rvm-s-on-accent-500);
}

.rvm-chat-bubble--texto {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  /* A mensagem quebra onde precisar: uma URL longa nao pode esticar o balao alem da conversa. */
  overflow-wrap: anywhere;
}

/* ─── Balao de audio ─────────────────────────────────────────────────────────────────────────── */
.rvm-chat-bubble--voz { gap: var(--rvm-space-12); }

.rvm-chat-voz__botao { flex: none; }

.rvm-chat-voz__onda {
  display: flex;
  align-items: center;
  gap: 6px;
  block-size: 32px;
}

/* As barras que faltam ouvir ficam no degrau 300; as tocadas, na cor por cima do balao. */
.rvm-chat-voz__barra {
  inline-size: 2px;
  block-size: var(--rvm-chat-barra, 16px);
  border-radius: 10px;
  background: var(--rvm-accent-300);
  flex: none;
}

.rvm-chat-bubble--esquerda .rvm-chat-voz__barra { background: var(--rvm-neutral-300); }

.rvm-chat-voz__barra--tocada { background: var(--rvm-s-on-accent-500); }

.rvm-chat-bubble--esquerda .rvm-chat-voz__barra--tocada { background: var(--rvm-accent-500); }

.rvm-chat-voz__duracao {
  flex: none;
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}

.rvm-chat-bubble--direita .rvm-chat-voz__duracao,
.rvm-chat-bubble--direita .rvm-chat-arquivo__tamanho { color: var(--rvm-s-on-accent-muted); }

/* ─── Balao de arquivo ───────────────────────────────────────────────────────────────────────── */
.rvm-chat-bubble--arquivo { gap: var(--rvm-space-16); }

.rvm-chat-arquivo__texto {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-inline-size: 0;
}

.rvm-chat-arquivo__nome {
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.rvm-chat-arquivo__tamanho {
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
  font-weight: var(--rvm-font-weight-medium);
  color: var(--rvm-s-text-secondary);
}

/* ─── Contato na lista ─────────────────────────────────────────────────────────────────────────
   264x76 por fora, miolo de 248x68 com raio 12, padding 14/12 e vao 12. */
.rvm-chat-contact {
  display: block;
  inline-size: 100%;
  padding: var(--rvm-space-4) var(--rvm-space-8);
  border: 0;
  background: none;
  cursor: pointer;
  font-family: inherit;
  text-align: start;
}

.rvm-chat-contact__miolo {
  display: flex;
  align-items: center;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-14) var(--rvm-space-12);
  border-radius: 12px;
}

.rvm-chat-contact:hover .rvm-chat-contact__miolo { background: var(--rvm-neutral-50); }

.rvm-chat-contact--selecionado .rvm-chat-contact__miolo {
  background: var(--rvm-accent-500);
  color: var(--rvm-s-on-accent-500);
}

.rvm-chat-contact:focus-visible {
  outline: 2px solid var(--rvm-accent-500);
  outline-offset: -2px;
  border-radius: 12px;
}

.rvm-chat-contact__avatar {
  position: relative;
  flex: none;
  display: inline-flex;
}

/* A bolinha de online tem uma borda de 2 na cor do fundo, para nao encostar no retrato. */
.rvm-chat-contact__online {
  position: absolute;
  inset-block-end: 0;
  inset-inline-end: 0;
  inline-size: 10px;
  block-size: 10px;
  border-radius: 100px;
  background: var(--rvm-success-500);
  box-shadow: 0 0 0 2px var(--rvm-white);
}

.rvm-chat-contact--selecionado .rvm-chat-contact__online { box-shadow: 0 0 0 2px var(--rvm-accent-500); }

.rvm-chat-contact__texto {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-inline-size: 0;
  flex: 1;
}

.rvm-chat-contact__nome,
.rvm-chat-contact__previa {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.rvm-chat-contact__nome {
  color: var(--rvm-ink-500);
  font-size: var(--rvm-text-m-size);
  line-height: var(--rvm-text-m-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-chat-contact__previa {
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
}

/* Selecionado, o miolo inteiro e o destaque: nome e previa herdam a cor por cima. */
.rvm-chat-contact--selecionado .rvm-chat-contact__nome,
.rvm-chat-contact--selecionado .rvm-chat-contact__previa,
.rvm-chat-contact--selecionado .rvm-chat-contact__horario { color: inherit; }

.rvm-chat-contact__horario,
.rvm-chat-contact__badge { flex: none; }

.rvm-chat-contact__horario {
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
}

/* ─── Quadro de tarefas (📋 Project, onda 6) ───────────────────────────────────────────────────
   Medidas (project-project-details-tas-drag-drop-task.json): colunas de 266 com vao 16 entre elas
   e entre os cartoes; titulo de 40 com vao 5; area de soltar 266x244 em Violet-50, com borda
   Violet-500 TRACEJADA 6/6 e raio 16. */
.rvm-kanban {
  display: flex;
  align-items: flex-start;
  gap: var(--rvm-space-16);
  overflow-x: auto;
  padding-block-end: var(--rvm-space-8);
}

.rvm-kanban__coluna {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  inline-size: 266px;
  flex: none;
  border-radius: 16px;
}

/* A coluna sob o cursor se acende junto com a area de soltar: sem isso, quem arrasta com a mao
   sobre o cartao nao ve onde vai cair. */
.rvm-kanban__coluna--alvo { outline: 2px dashed var(--rvm-accent-500); outline-offset: 8px; }

.rvm-kanban__titulo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 5px;
  block-size: 40px;
}

.rvm-kanban__nome {
  margin: 0;
  color: var(--rvm-ink-500);
  font-size: var(--rvm-text-xl-size);
  line-height: var(--rvm-text-xl-line-height);
  font-weight: var(--rvm-font-weight-semibold);
}

.rvm-kanban__contagem {
  color: var(--rvm-s-text-secondary);
  font-weight: var(--rvm-font-weight-medium);
}

.rvm-kanban__cartoes {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-16);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* O cartao e a area de arrastar inteira. O menu de mover fica por cima, no canto. */
.rvm-kanban__cartao {
  position: relative;
  cursor: grab;
}

.rvm-kanban__cartao:active { cursor: grabbing; }

/* A area de soltar do kit: Violet-50 por dentro, e o tracejado 6/6 desenhado em SVG por cima — o
   `dashed` do CSS deixaria o traco a cargo do navegador. A cor do traco vem do currentColor. */
.rvm-kanban__area {
  display: block;
  inline-size: 100%;
  block-size: 244px;
  border-radius: 16px;
  background: var(--rvm-accent-50);
  color: var(--rvm-accent-500);
}

@media (prefers-reduced-motion: reduce) {
  .rvm-kanban__coluna--alvo { outline-style: solid; }
}

/* ─── Cartao de mapa (💠 Map, onda 6) ──────────────────────────────────────────────────────────
   Medidas (purple-map.json): quadro raio 20 com borda Grey-100; cabecalho com padding 24 e vao 12;
   o desenho tem 260 de altura sobre Grey-50; a lista vem abaixo com padding 24 e vao 20. */
.rvm-map {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--rvm-neutral-100);
  border-radius: 20px;
  background: var(--rvm-white);
  overflow: hidden;
}

.rvm-map__cabecalho {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--rvm-space-12);
  padding: var(--rvm-space-24);
}

.rvm-map__titulos {
  display: flex;
  flex-direction: column;
  gap: var(--rvm-space-8);
  min-inline-size: 0;
}

.rvm-map__acoes { flex: none; }

/* O desenho e os marcadores ficam empilhados na MESMA caixa: e o que faz a projecao valer, porque
   os dois compartilham o sistema de coordenadas do viewBox. */
.rvm-map__desenho {
  position: relative;
  background: var(--rvm-neutral-50);
  padding-block: var(--rvm-space-24);
}

.rvm-map__mundo,
.rvm-map__marcadores {
  display: block;
  inline-size: 100%;
  block-size: auto;
  /* A proporcao do desenho gerado do kit: 407 por 172. */
  aspect-ratio: 407 / 172;
}

/* ⚠️ O desenho entra como MASCARA, e nao como imagem pintada. Um SVG carregado por <img> e um
   documento isolado: o `currentColor` dele nao enxerga o host e cai no preto — foi exatamente o que
   a tela mostrou, um mapa-mundi todo preto. Como mascara, quem pinta e o `background`, e a cor
   volta a sair do token, como manda o projeto. */
.rvm-map__mundo {
  background: var(--rvm-neutral-300);
  mask: url("mapa/mundo.svg") no-repeat center / contain;
  -webkit-mask: url("mapa/mundo.svg") no-repeat center / contain;
}

.rvm-map__marcadores {
  position: absolute;
  inset-block-start: var(--rvm-space-24);
  inset-inline: 0;
}

.rvm-map__ponto {
  fill: var(--rvm-c-fill);
  stroke: var(--rvm-white);
  stroke-width: 1.5;
}

.rvm-map__lista { padding: 0 var(--rvm-space-24) var(--rvm-space-24); }

/* O aviso de marcador fora do desenho: o kit corta os extremos norte e sul, e sumir com o dado em
   silencio faria o aplicativo achar que mostrou algo que nunca apareceu. */
.rvm-map__aviso {
  margin: 0;
  padding: 0 var(--rvm-space-24) var(--rvm-space-24);
  color: var(--rvm-s-text-secondary);
  font-size: var(--rvm-text-s-size);
  line-height: var(--rvm-text-s-line-height);
}
