:root { --oxrc1-cache-contract: "avatar-life-v226"; }

.oxrc1-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
  opacity: 0;
}

:root {
  color-scheme: dark;
  --oxrc1-bg: #1f1f1d;
  --oxrc1-side: #20201e;
  --oxrc1-side-deep: #191917;
  --oxrc1-composer: #2d2d2a;
  --oxrc1-hover: #343431;
  --oxrc1-active: #40403c;
  --oxrc1-line: rgba(255, 255, 255, 0.09);
  --oxrc1-line-strong: rgba(255, 255, 255, 0.16);
  --oxrc1-text: #f4f3ee;
  --oxrc1-muted: #c0beb6;
  --oxrc1-dim: #928f86;
  --oxrc1-soft: #d6d3c9;
  --oxrc1-accent: #b71922;
  --oxrc1-blue: #6ea0ff;
  --oxrc1-danger: #ff7777;
  --oxrc1-left-width: 244px;
  --oxrc1-right-width: 286px;
  --oxrc1-left-collapsed: 56px;
  --oxrc1-right-collapsed: 48px;
  --oxrc1-radius: 8px;
  --oxrc1-sidebar-icon: 20px;
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

* { box-sizing: border-box; }

html,
body {
  margin: 0;
  min-height: 100%;
  background: var(--oxrc1-bg);
  color: var(--oxrc1-text);
  /* design v145 — SUAVIZAÇÃO DE FONTE GLOBAL (tell nº1 de "software caro" no macOS).
     Achado real e render-free: `-webkit-font-smoothing: antialiased` existia em UMA
     única superfície — os blocos de código (.oxrc1-code pre, v65) — e em nenhum outro
     lugar. Todo o resto do produto (chat, sidebars, header, composer, botões) renderiza
     texto com o smoothing PADRÃO do navegador; num UI dark warm, o default deixa o
     claro-sobre-escuro mais PESADO e levemente borrado. Linear/Vercel/Claude.ai fixam
     grayscale/antialiased no body — é o que separa "página web" de "produto nativo".
     Elevo a regra que o code-block já falava sozinho pro idioma do produto inteiro.
     Só APRESENTAÇÃO: zero data-rc1-*/comportamento/microcopy; identidade preservada. */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* design v146 — MATA O FLASH CINZA DE TOQUE (tell de "web", não de "app", no mobile).
     Achado real e render-free: `-webkit-tap-highlight-color` tinha 0 ocorrências no
     stylesheet inteiro. Sem ela, tocar QUALQUER botão/link/aba no iOS/Android pinta por
     ~200ms o retângulo cinza translúcido padrão do WebKit por cima do próprio hover/active
     desenhado à mão — o produto tem estados :active caprichados e o navegador os atropela
     com um flash que grita "página web". Zero em Linear/Vercel/Claude.ai. A propriedade
     cascateia a partir do html, então uma linha cobre todas as superfícies tocáveis; o
     feedback tátil real continua sendo os :active/:hover do design. Critério de escopo:
     transparent (não outra cor) porque o produto já tem o toque desenhado — só removo o
     ruído do browser por cima. Relevante ao alvo "responsivo até 390px" da persona.
     Só APRESENTAÇÃO: zero data-rc1-*/comportamento/microcopy; identidade preservada. */
  -webkit-tap-highlight-color: transparent;
  /* design v147 — TRAVA A ESCALA TIPOGRÁFICA NO MOBILE (tell de "software caro" vs "página").
     Achado real e render-free: `text-size-adjust` tinha 0 ocorrências no stylesheet inteiro.
     Sem ela, Safari/Chrome mobile aplicam "auto-inflation" — inflam certos tamanhos de fonte
     por conta própria (mais visível ao girar retrato→paisagem e em blocos de texto longo),
     atropelando a escala 4/8px afinada à mão e desalinhando header/sidebars/bolhas. É o mesmo
     idioma das duas linhas acima (font-smoothing v145, tap-highlight v146): endurecimento de
     tipografia/mobile no html,body. Linear/Vercel/Claude.ai fixam 100% para que a hierarquia
     desenhada seja a que o usuário vê, sempre. Critério de escopo: 100% (não `none`) — `none`
     desliga o ajuste inclusive quando o usuário aumenta a fonte por acessibilidade; 100% só
     impede a inflação AUTOMÁTICA do browser e preserva o zoom intencional (padrão Linear/MDN).
     Zero efeito no desktop (propriedade só age no motor mobile). Relevante ao alvo "responsivo
     até 390px" da persona. Só APRESENTAÇÃO: zero data-rc1-*/comportamento/microcopy. */
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  /* design v156 — KERNING/LIGADURAS CONSISTENTES (fecha o quarteto de endurecimento tipográfico).
     Achado real e render-free: `text-rendering` tinha 0 ocorrências no stylesheet inteiro —
     é o ÚNICO irmão ausente da família que o html,body já fala (font-smoothing v145,
     tap-highlight v146, text-size-adjust v147). Sem ela o navegador decide sozinho, por
     heurística, quando aplicar kerning e ligaduras — então o mesmo texto (header, sidebars,
     bolhas do chat, composer) pode espaçar pares de letras de um jeito num bloco e de outro
     noutro, um micro-desalinho que lê como "página web". `optimizeLegibility` fixa kerning +
     ligaduras SEMPRE, no idioma do produto inteiro, casando com o antialiasing do v145 —
     é o par natural que Linear/Vercel/Claude.ai usam pra tipografia "nativa". Critério de
     escopo: optimizeLegibility (não `geometricPrecision`, que pode distorcer em corpos
     pequenos, nem deixar `auto`, que devolve a decisão à heurística do browser). Zero corpo
     de texto novo, só como o já-existente é desenhado. Só APRESENTAÇÃO: zero data-rc1-*/
     comportamento/microcopy; identidade (dark, gradiente roxo/rosa OXXY) preservada. */
  text-rendering: optimizeLegibility;
}

button,
textarea,
input {
  font: inherit;
}

button {
  color: inherit;
}

/* design v149 — AZUL DA CASA COM FONTE ÚNICA. Achado real de design-system: o token
   --oxrc1-blue (#6ea0ff) já existia e era usado onde não precisa de alpha (6 refs), mas
   toda vez que o azul precisava de transparência o código caía num LITERAL cru
   rgba(110,160,255,X) — 9 ocorrências (anel de foco base, progress, painel-vivo,
   keyframe do progress-live). Os próprios comentários (v64/v120/v128) admitiam ser "o
   MESMO --oxrc1-blue", mas sem mecanismo de alpha-sobre-token ficavam como literal e
   podiam divergir silenciosamente se a marca mudasse. Adotado color-mix(in srgb,
   var(--oxrc1-blue) X%, transparent) — 1ª vez no arquivo (color-mix: 0→9) — trazendo os
   9 para a MESMA fonte única do token. Render byte-idêntico (srgb-mix = rgba na mesma
   %), zero risco de contraste, zero data-rc1-*/comportamento/microcopy; identidade
   reforçada, não reinventada. O anel azul de foco permanece azul de propósito: é a cor
   de MAIOR contraste sobre o dark (AA), padrão de acessibilidade — só passou a apontar
   pro token em vez do literal. */
button:focus-visible,
textarea:focus-visible,
input:focus-visible,
a:focus-visible {
  outline: 2px solid color-mix(in srgb, var(--oxrc1-blue) 85%, transparent);
  outline-offset: 2px;
}

/* design v137 — CARET NA COR DA CASA. Achado real: o caret de texto (o traço que
   pisca ao digitar) nunca foi tocado — em toda entrada de texto do produto (composer
   da conversa, busca, qualquer input) ele caía no branco cru padrão do SO, o mesmo
   "sem-marca" que o ::selection do v120 já corrigira para o realce. Traz o caret pro
   vermelho da casa (--oxrc1-accent), fechando o par com a seleção: digitar e selecionar
   passam a falar a MESMA língua de destaque. Só apresentação; nenhum data-rc1-*/
   comportamento/microcopy/markup; zero cor/token novo (reusa --oxrc1-accent);
   identidade reforçada, não reinventada. */
textarea,
input {
  caret-color: var(--oxrc1-accent);
}

.oxrc1-shell {
  width: 100vw;
  height: 100vh;
  min-width: 0;
  overflow: hidden;
  display: grid;
  grid-template-columns: var(--oxrc1-left-width) minmax(0, 1fr) var(--oxrc1-right-width);
  background: radial-gradient(circle at 50% -10%, rgba(255, 255, 255, 0.035), transparent 32%), var(--oxrc1-bg);
  isolation: isolate;
}

.oxrc1-shell.is-left-collapsed {
  --oxrc1-left-width: var(--oxrc1-left-collapsed);
}

.oxrc1-shell.is-right-collapsed {
  --oxrc1-right-width: var(--oxrc1-right-collapsed);
}

.oxrc1-left,
.oxrc1-right,
.oxrc1-chat {
  min-width: 0;
  min-height: 0;
}

.oxrc1-left,
.oxrc1-right {
  position: relative;
  z-index: 3;
  background: var(--oxrc1-side);
  border-color: var(--oxrc1-line);
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow: hidden;
}

.oxrc1-left {
  grid-column: 1;
  border-right: 1px solid var(--oxrc1-line);
  padding: 10px 12px;
}

.oxrc1-right {
  grid-column: 3;
  width: 100%;
  max-width: 100%;
  border-left: 1px solid var(--oxrc1-line);
  padding: 12px 12px 14px;
  overflow-y: auto;
  overflow-x: hidden;
}

.oxrc1-left-top,
.oxrc1-right-head,
.oxrc1-user,
.oxrc1-topbar-actions,
.oxrc1-composer-tools,
.oxrc1-composer-actions,
.oxrc1-section-head {
  display: flex;
  align-items: center;
}

.oxrc1-left-top {
  justify-content: center;
  gap: 6px;
  min-height: 48px;
  margin-bottom: 10px;
  position: relative;
}

.oxrc1-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  max-width: calc(100% - 44px);
  min-width: 0;
  overflow: hidden;
  color: var(--oxrc1-text);
  text-decoration: none;
}

.oxrc1-left-top > .oxrc1-icon-button:not(.oxrc1-mobile-close) {
  position: absolute;
  right: 0;
  top: 7px;
}

.oxrc1-logo-frame {
  width: 166px;
  height: 62px;
  display: grid;
  align-items: center;
  justify-items: center;
  overflow: visible;
  position: relative;
  flex: 0 0 auto;
  pointer-events: none;
  padding: 4px 0;
}

.oxrc1-logo-frame img {
  width: auto;
  height: auto;
  max-width: 166px;
  max-height: 54px;
  object-fit: contain;
  display: block;
}

.oxrc1-logo-mark {
  display: none !important;
}

.oxrc1-avatar {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: 7px;
  background: linear-gradient(140deg, #77202b, #242424);
  border: 1px solid var(--oxrc1-line-strong);
  font-size: 11px;
  font-weight: 760;
  letter-spacing: 0;
}

.oxrc1-icon-button,
.oxrc1-nav-action,
.oxrc1-thread,
.oxrc1-prompt-row button,
.oxrc1-tool,
.oxrc1-send,
.oxrc1-copy,
.oxrc1-pdf-download,
.oxrc1-image-download,
.oxrc1-engine-button,
.oxrc1-persona-button,
.oxrc1-menu-more,
.oxrc1-menu-item,
.oxrc1-menu-option,
.oxrc1-section-head button {
  border: 0;
  border-radius: var(--oxrc1-radius);
  background: transparent;
  cursor: pointer;
}

.oxrc1-icon-button {
  position: relative;
  z-index: 2;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  color: var(--oxrc1-muted);
}

.oxrc1-icon-button:hover,
.oxrc1-nav-action:hover,
.oxrc1-thread:hover,
.oxrc1-settings:hover,
.oxrc1-prompt-row button:hover,
.oxrc1-tool:hover,
.oxrc1-send:hover,
.oxrc1-engine-button:hover,
.oxrc1-persona-button:hover,
.oxrc1-menu-more:hover,
.oxrc1-section-head button:hover {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

.oxrc1-left-actions {
  display: grid;
  gap: 4px;
  margin: 0 0 8px;
}

.oxrc1-left-scroll {
  min-height: 0;
  flex: 1 1 auto;
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 2px;
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}

.oxrc1-left-scroll::-webkit-scrollbar {
  width: 8px;
}

.oxrc1-left-scroll::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
}

.oxrc1-sidebar-align-group {
  padding: 0;
}

.oxrc1-sidebar-row {
  min-height: 30px;
  width: 100%;
}

.oxrc1-nav-action,
.oxrc1-search,
.oxrc1-thread,
.oxrc1-settings {
  width: 100%;
}

.oxrc1-nav-action {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 8px;
  color: var(--oxrc1-soft);
  background: transparent;
}

.oxrc1-sidebar-icon {
  width: var(--oxrc1-sidebar-icon);
  height: var(--oxrc1-sidebar-icon);
  flex: 0 0 var(--oxrc1-sidebar-icon);
  display: grid;
  place-items: center;
  border-radius: 6px;
  color: var(--oxrc1-muted);
  font-size: 14px;
  line-height: 1;
}

.oxrc1-nav-action strong {
  font-size: 14px;
  line-height: 1.25;
  font-weight: 560;
}

.oxrc1-search {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 8px;
  border-radius: var(--oxrc1-radius);
  background: transparent;
  color: var(--oxrc1-muted);
}

.oxrc1-nav-action:focus-visible,
.oxrc1-search:focus-within {
  background: var(--oxrc1-hover);
}

.oxrc1-search input {
  width: 100%;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--oxrc1-soft);
  font-size: 14px;
  line-height: 1.25;
}

.oxrc1-search input::placeholder,
.oxrc1-composer textarea::placeholder {
  color: #aaa79f;
}

.oxrc1-search-panel {
  display: grid;
  gap: 6px;
  margin: 0 0 10px;
  padding: 6px 0 2px;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-search-panel[hidden] {
  display: none !important;
}

.oxrc1-search-status {
  padding: 0 8px;
  color: var(--oxrc1-dim);
  font-size: 12px;
  line-height: 1.35;
}

.oxrc1-search-results {
  display: grid;
  gap: 3px;
}

.oxrc1-search-result {
  width: 100%;
  display: grid;
  gap: 2px;
  padding: 7px 8px;
  text-align: left;
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: transparent;
}

.oxrc1-search-result:hover,
.oxrc1-search-result:focus-visible {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

.oxrc1-search-result strong,
.oxrc1-search-result span,
.oxrc1-search-result small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-search-result strong {
  font-size: 13px;
  line-height: 1.3;
  font-weight: 500;
}

.oxrc1-search-result span {
  font-size: 12px;
  line-height: 1.35;
  color: var(--oxrc1-soft);
}

.oxrc1-search-result small {
  font-size: 11px;
  line-height: 1.3;
  color: var(--oxrc1-dim);
}

.oxrc1-search-more {
  justify-self: start;
  min-height: 28px;
  padding: 0 8px;
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: transparent;
}

.oxrc1-search-more:hover {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

.oxrc1-left-section,
.oxrc1-list {
  display: grid;
  gap: 3px;
}

.oxrc1-left-section[hidden] {
  display: none !important;
}

/* design v133 — sidebar esquerda / vazios das seções (.oxrc1-sidebar-empty:
   "Nenhum projeto ainda…", "Nenhum chat ainda…", "Fixe chats importantes…").
   Eram os vazios que a varredura AA dim->muted (v72 centrais / v132 browser)
   não alcançou — aquela série cobriu só os vazios centralizados de repouso;
   estes são finos, alinhados à esquerda e ficaram no --oxrc1-dim #928f86, o
   texto mais fraco (~5.0:1 sobre --oxrc1-side #20201e, no piso do AA para 12px).
   Sobem ao --oxrc1-muted já usado pelos irmãos de repouso: ~8.8:1, folga de
   leitura sem sair da hierarquia secundária. Só apresentação: reúso de token,
   zero token/cor novo, nenhum data-rc1-*/seletor/comportamento/microcopy/
   identidade tocado. */
.oxrc1-sidebar-empty {
  padding: 7px 8px 8px;
  color: var(--oxrc1-muted);
  font-size: 12px;
  line-height: 1.35;
}

.oxrc1-thread,
.oxrc1-settings {
  text-align: left;
  color: var(--oxrc1-soft);
  padding: 5px 8px;
}

.oxrc1-thread.is-selected {
  color: var(--oxrc1-text);
  background: var(--oxrc1-active);
  box-shadow: inset 2px 0 0 var(--oxrc1-accent);
  font-weight: 560;
}

.oxrc1-left-section {
  margin-top: 2px;
}

.oxrc1-section-head {
  justify-content: space-between;
  min-height: 20px;
  margin: 0 0 1px;
}

.oxrc1-section-toggle {
  width: 100% !important;
  min-width: 0;
  height: 26px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 0 8px;
  font-size: 11px;
  line-height: 1.25;
  /* design v88 — eyebrows das seções da sidebar esquerda (FIXADOS/PROJETOS/
     CHATS/HISTÓRICO/ARQUIVADOS) eram os últimos rótulos em caixa-alta do produto
     fora do idioma premium (Linear/Vercel) já adotado nos 5 irmãos:
     .oxrc1-right-head span, .oxrc1-project-home-header span, .oxrc1-empty p,
     .oxrc1-frota-head span, .oxrc1-frota-section h3 — todos uppercase/0.08em/600.
     Saíam com tracking 0 e peso 650 (destoante). Alinho ao idioma: 0.08em / 600.
     Só apresentação; cor --oxrc1-dim herdada preservada; nenhum data-rc1-* ou
     comportamento tocado. */
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--oxrc1-dim);
  text-transform: uppercase;
}

.oxrc1-section-arrow {
  width: var(--oxrc1-sidebar-icon);
  flex: 0 0 var(--oxrc1-sidebar-icon);
  text-align: center;
  display: inline-block;
  font-size: 10px;
  transform: rotate(0deg);
  transition: transform 140ms ease;
}

/* design v196 — sidebar esquerda / chevrons das seções: fecha o último tell de
   iconografia inconsistente. O contrato desta rotação é UM chevron-base `⌄` (pra
   baixo = seção aberta) que a classe .is-section-collapsed gira -90° (vira ▸ =
   fechada) — é o que já acontece quando o usuário recolhe uma seção interativamente
   (applySectionStates só alterna a classe, nunca reescreve o glifo). Mas três
   seções foram AUTORADAS no HTML com o glifo `›` (já apontando pra direita) em vez
   de `⌄`: Departamentos e Arquivados nascem recolhidas (default true) → `›` + giro
   -90° = chevron apontando pra CIMA (errado), e Histórico nascia com `›` sem giro
   enquanto abre por default (default false) → chevron pra direita numa seção ABERTA
   (errado). Resultado: recolhida "de fábrica" ≠ recolhida "na mão". Normalizei os
   seis glifos estáticos pra `⌄` (index.html) e deixo a rotação ser a única fonte da
   direção. Só apresentação: nenhum data-rc1-*/seletor/comportamento/microcopy/
   identidade tocado — o JS nunca lê nem escreve esse glifo. */
.oxrc1-left-section.is-section-collapsed .oxrc1-section-arrow {
  transform: rotate(-90deg);
}

.oxrc1-left-section.is-section-collapsed .oxrc1-list {
  display: none;
}

.oxrc1-section-head > button:not(.oxrc1-section-toggle) {
  width: 24px;
  height: 24px;
  color: var(--oxrc1-muted);
}

.oxrc1-thread {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 5px;
  min-height: 28px;
}

.oxrc1-thread-main {
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 5px;
  flex-wrap: wrap;
}

.oxrc1-thread span,
.oxrc1-user strong,
.oxrc1-settings strong {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
  line-height: 1.25;
  font-weight: 450;
}

.oxrc1-thread small,
.oxrc1-thread-time,
.oxrc1-user span,
.oxrc1-right-head span,
.oxrc1-title span {
  color: var(--oxrc1-dim);
  font-size: 12px;
  line-height: 1.25;
}

/* v151 — timestamp da lista de conversas (sidebar) em figuras tabulares.
   Rima com a convenção da casa: header v62, placar v70, contador de custo v76,
   meta do chat (.oxrc1-message-time). Este era o ÚLTIMO timestamp AUTÔNOMO sem
   tnum: renderiza formatRelativeTime ("5 min" → "12 h" → "3 dias") right-aligned
   (justify-self:end), então a coluna "dançava" de largura a cada tick (o 1 é mais
   estreito que o 8 em figuras proporcionais). Tabular assenta os dígitos numa
   coluna firme — o padrão de todo dashboard caro; fecha a paridade com a bolha.
   Só apresentação: nenhum data-rc1-* / seletor / comportamento / microcopy /
   markup tocado; zero token/cor novo; identidade dark warm + accent OXXY preservada. */
.oxrc1-thread-time {
  justify-self: end;
  white-space: nowrap;
  min-width: max-content;
  font-variant-numeric: tabular-nums;
}

.oxrc1-menu-more {
  width: 24px;
  height: 24px;
  color: var(--oxrc1-dim);
}

.oxrc1-project-group {
  display: grid;
  gap: 1px;
}

.oxrc1-project-children {
  display: grid;
  gap: 3px;
  margin: 2px 0 4px 13px;
  padding-left: 7px;
}

.oxrc1-project-children .oxrc1-thread {
  min-height: 31px;
  padding-block: 4px;
}

.oxrc1-show-more {
  width: 100%;
  justify-content: flex-start;
  min-height: 28px;
  padding: 4px 8px 4px 14px;
  color: var(--oxrc1-muted);
  font-size: 12px;
  font-weight: 500;
}

.oxrc1-show-more:hover {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
}

.oxrc1-project-arrow {
  width: 12px;
  flex: 0 0 12px;
  color: var(--oxrc1-dim);
  font-size: 12px !important;
  line-height: 1;
}

.oxrc1-project-status-badges {
  display: flex;
  flex: 1 1 100%;
  flex-wrap: wrap;
  gap: 3px;
  min-width: 0;
  padding-left: 17px;
  overflow: visible;
  white-space: normal;
}

.oxrc1-project-status-badge {
  min-height: 18px;
  max-width: 100%;
  padding: 2px 6px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 999px;
  color: var(--oxrc1-dim);
  background: rgba(255, 255, 255, 0.025);
  font-size: 11px;
  line-height: 1.2;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-project-status-badge.is-attention {
  color: var(--oxrc1-text);
  border-color: rgba(255, 124, 124, 0.45);
}

.oxrc1-project-status-badge.is-stage {
  color: var(--oxrc1-text);
}

.oxrc1-project-status-badge:hover,
.oxrc1-project-status-badge:focus-visible {
  background: var(--oxrc1-hover);
}

.oxrc1-founder-queue-shortcut {
  margin-bottom: 8px;
}

.oxrc1-founder-home-shortcut {
  margin-bottom: 8px;
}

.oxrc1-founder-home-button,
.oxrc1-founder-queue-button {
  width: 100%;
  display: grid;
  gap: 3px;
  min-height: 64px;
  padding: 9px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.025);
  text-align: left;
  cursor: pointer;
}

.oxrc1-founder-queue-button:hover,
.oxrc1-founder-queue-button:focus-visible,
.oxrc1-founder-home-button:hover,
.oxrc1-founder-home-button:focus-visible {
  background: var(--oxrc1-hover);
}

.oxrc1-founder-home-button.is-active {
  border-color: rgba(123, 167, 255, 0.5);
  background: rgba(123, 167, 255, 0.08);
}

.oxrc1-founder-queue-button.has-attention,
.oxrc1-founder-home-button.has-attention {
  border-color: rgba(247, 197, 102, 0.45);
}

.oxrc1-founder-home-button span,
.oxrc1-founder-home-button small,
.oxrc1-founder-queue-button span,
.oxrc1-founder-queue-button small {
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-founder-home-button strong,
.oxrc1-founder-queue-button strong {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
}

.oxrc1-left-footer {
  flex: 0 0 auto;
  margin-top: 8px;
  display: block;
  padding-top: 10px;
  border-top: 1px solid var(--oxrc1-line);
  background: var(--oxrc1-side);
}

.oxrc1-settings {
  flex: 0 0 auto;
  min-width: 38px;
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  margin-left: auto;
  padding: 4px;
  background: transparent;
  border: 0;
  border-radius: var(--oxrc1-radius);
  cursor: pointer;
}

.oxrc1-settings span {
  width: 26px;
  text-align: center;
  color: var(--oxrc1-muted);
  font-size: 1.45em;
  line-height: 1;
}

.oxrc1-user {
  position: relative;
  gap: 9px;
  padding: 6px 2px 3px;
  min-width: 0;
}

.oxrc1-account-trigger {
  min-width: 0;
  flex: 1 1 auto;
  min-height: 34px;
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 3px 4px;
  border: 0;
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-text);
  background: transparent;
  cursor: pointer;
}

.oxrc1-account-trigger:hover,
.oxrc1-account-trigger[aria-expanded="true"],
.oxrc1-settings[aria-expanded="true"] {
  background: var(--oxrc1-hover);
}

.oxrc1-account-copy {
  min-width: 0;
  display: grid;
  flex: 1 1 auto;
}

/* design v199 — rodapé da conta (.oxrc1-account-copy): hierarquia tipográfica nome↔legenda.
   Tell real e render-free: .oxrc1-account-copy só carregava LAYOUT (grid) — ZERO tratamento
   tipográfico dos filhos. Efeito servido: o nome (<strong data-rc1-account-name>) e a legenda
   (<span data-rc1-account-subtitle> "OXXY · Preview") caíam AMBOS no font-size herdado do body
   (16px default do browser — FORA da escala 14px que as linhas da sidebar já falam) e na MESMA
   cor mais clara (--oxrc1-text): legenda com o mesmo peso visual do nome = hierarquia zero. Ainda:
   o <strong> herdava o bold-700 do browser, mais pesado que o semibold 560 do idioma da casa
   (.oxrc1-nav-action strong e .oxrc1-account-menu-head strong = 560). E, sem overflow, um nome ou
   workspace longo estouraria o rodapé — enquanto o IRMÃO .oxrc1-account-menu-head já trunca os
   seus três campos. Alinho ao MESMO par do menu-head: nome 14px/560 com ellipsis; legenda
   12px/--oxrc1-muted (~8.8:1 sobre --oxrc1-side, folga de AA) com ellipsis. Só APRESENTAÇÃO:
   nenhum data-rc1-*/seletor/comportamento/microcopy/identidade tocado; reúso de tokens
   existentes, zero cor/token novo. */
.oxrc1-account-copy > strong {
  font-size: 14px;
  font-weight: 560;
  line-height: 1.25;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-account-copy > span {
  font-size: 12px;
  line-height: 1.3;
  color: var(--oxrc1-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* design v128 — menu da conta: entra na MESMA família de superfície dos outros popovers.
   Tell de consistência (precedente duro 2-contra-1): o app tem TRÊS menus suspensos irmãos
   — motor/persona + menu de contexto (`.oxrc1-engine-menu, .oxrc1-context-menu`) e o menu da
   conta (`.oxrc1-account-menu`). Os três já compartilham border (--oxrc1-line-strong),
   raio (12px) e padding (7px) — mas o par motor+contexto assenta em `#343431` com sombra
   `0 22px 70px rgba(0,0,0,.42)` (macia, difusa, "flutuando caro"), enquanto o menu da conta
   sozinho derivou para `#30302d` + `0 22px 54px rgba(0,0,0,.45)` — uma sombra mais CURTA e
   mais ESCURA (blur 54 vs 70), que lê como elevação mais dura/barata que as irmãs. Drift de
   autoria (v68 conta vs v64 motor), não decisão. Alinhado aos MESMOS literais já usados pelo
   par irmão: os três popovers agora projetam a mesma sombra e sentam na mesma cor de vidro —
   uma família, não três elevações quase-iguais. Zero token/cor novo; nenhum data-rc1-*/
   seletor/comportamento/microcopy/markup tocado; identidade (dark warm + accent OXXY) intacta. */
.oxrc1-account-menu {
  position: absolute;
  left: 0;
  bottom: calc(100% + 8px);
  z-index: 260;
  width: min(260px, calc(100vw - 24px));
  padding: 7px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 12px;
  background: #343431;
  box-shadow: 0 22px 70px rgba(0, 0, 0, 0.42);
  color: var(--oxrc1-text);
}

.oxrc1-account-menu[hidden] {
  display: none !important;
}

.oxrc1-account-menu-head {
  display: grid;
  gap: 3px;
  padding: 8px 9px 9px;
  border-bottom: 1px solid var(--oxrc1-line);
  margin-bottom: 5px;
}

.oxrc1-account-menu-head strong,
.oxrc1-account-menu-head span,
.oxrc1-account-menu-head small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-account-menu-head strong {
  font-size: 14px;
  font-weight: 560;
}

.oxrc1-account-menu-head span {
  color: var(--oxrc1-muted);
  font-size: 12px;
}

.oxrc1-account-menu-head small {
  color: var(--oxrc1-dim);
  font-size: 11px;
}

.oxrc1-account-menu button {
  width: 100%;
  min-height: 32px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 0 9px;
  border: 0;
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: transparent;
  text-align: left;
  cursor: pointer;
}

.oxrc1-account-menu button:hover,
.oxrc1-account-menu button:focus-visible {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
}

.oxrc1-account-menu button[aria-disabled="true"] {
  color: var(--oxrc1-dim);
  cursor: default;
}

.oxrc1-account-menu button[aria-disabled="true"]:hover {
  background: transparent;
}

/* design v104 — menu da conta (2a volta): o selo "em breve" da acao desabilitada
   (Preferencias) saia como texto cru cinza — o ultimo "tell" de barato que sobrou do
   v68 nesta superficie. Vira um micro-chip (pilula com borda + uppercase + tracking),
   o idioma de "soon/beta" de menu premium (Linear/Vercel). Alinhado a direita pelo
   space-between que o botao ja tinha. So apresentacao: nenhum data-rc1-*, seletor,
   comportamento ou microcopy tocado; identidade preservada (tokens OXXY, dark warm). */
.oxrc1-account-menu button span {
  flex: none;
  color: var(--oxrc1-dim);
  font-size: 9.5px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 2px 6px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 999px;
}

.oxrc1-account-menu .is-logout {
  color: #ffb6b6;
}

.oxrc1-account-menu .is-logout:hover,
.oxrc1-account-menu .is-logout:focus-visible {
  color: #ffd7d7;
  background: rgba(255, 119, 119, 0.12);
}

.oxrc1-shell.is-left-collapsed .oxrc1-logo-frame {
  width: 34px;
  height: 34px;
  border-radius: var(--oxrc1-radius);
  place-items: center;
}

.oxrc1-shell.is-left-collapsed .oxrc1-logo-wordmark {
  display: none !important;
}

.oxrc1-shell.is-left-collapsed .oxrc1-logo-mark {
  display: block !important;
  width: 31px;
  height: 31px;
}

.oxrc1-shell.is-left-collapsed .oxrc1-nav-action strong,
.oxrc1-shell.is-left-collapsed .oxrc1-search input,
.oxrc1-shell.is-left-collapsed .oxrc1-search span,
.oxrc1-shell.is-left-collapsed .oxrc1-search-panel,
.oxrc1-shell.is-left-collapsed .oxrc1-left-section,
.oxrc1-shell.is-left-collapsed .oxrc1-account-copy,
.oxrc1-shell.is-left-collapsed .oxrc1-settings strong {
  display: none;
}

.oxrc1-shell.is-left-collapsed .oxrc1-left {
  align-items: center;
  padding-inline: 7px;
}

.oxrc1-shell.is-left-collapsed .oxrc1-brand,
.oxrc1-shell.is-left-collapsed .oxrc1-left-top {
  justify-content: center;
}

.oxrc1-shell.is-left-collapsed .oxrc1-brand {
  width: 34px;
  max-width: 34px;
}

.oxrc1-shell.is-left-collapsed .oxrc1-left-top {
  flex-direction: column;
}

.oxrc1-shell.is-left-collapsed .oxrc1-left-actions {
  width: 100%;
}

.oxrc1-shell.is-left-collapsed .oxrc1-nav-action {
  justify-content: center;
  padding: 0;
}

.oxrc1-chat {
  grid-column: 2;
  width: 100%;
  max-width: 100%;
  container: oxrc1-chat / inline-size;
  display: grid;
  grid-template-rows: auto minmax(0, 1fr);
  /* trava a coluna em minmax(0,1fr): sem isso a coluna implícita vira max-content
     e o composer (min-content ~730px) transborda a coluna central em telas ~1120px,
     sendo cortado bem na borda da sidebar direita ("engolindo o chat"). */
  grid-template-columns: minmax(0, 1fr);
  height: 100vh;
  background: var(--oxrc1-bg);
  overflow: hidden;
}

.oxrc1-chat-topbar {
  min-height: 50px;
  padding: 8px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  border-bottom: 1px solid rgba(255,255,255,.035);
  background:
    radial-gradient(circle at 88% 0, rgba(226,55,145,.045), transparent 28%),
    linear-gradient(90deg, rgba(26,26,25,.96), rgba(24,24,24,.86));
  box-shadow: 0 12px 34px rgba(0,0,0,.1);
  backdrop-filter: blur(22px) saturate(120%);
}

.oxrc1-topbar-zone {
  min-width: 0;
  display: flex;
  align-items: center;
}

.oxrc1-topbar-left {
  flex: 1 1 0;
  justify-content: flex-start;
  gap: 10px;
}

.oxrc1-topbar-center {
  flex: 0 1 auto;
  justify-content: center;
}

.oxrc1-topbar-right {
  flex: 1 1 0;
  justify-content: flex-end;
  gap: 10px;
}

.oxrc1-center-tabs {
  display: inline-flex;
  align-items: center;
  gap: 0;
  padding: 0 2px;
  border-bottom: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius) var(--oxrc1-radius) 0 0;
  background: rgba(255, 255, 255, 0.018);
  flex: 0 0 auto;
}

.oxrc1-center-tab {
  min-width: 56px;
  height: 28px;
  border: 0;
  border-bottom: 2px solid transparent;
  border-radius: 7px 7px 0 0;
  background: transparent;
  color: var(--oxrc1-muted);
  cursor: pointer;
  font-size: 12px;
  font-weight: 620;
  letter-spacing: 0;
  padding: 0 10px;
}

/* design v112 — abas Chat/Browser do header no idioma de token (unificação com o irmão).
   Rotação: sidebar esquerda (v111) -> HEADER/TOPBAR. Reauditoria cruzando CSS×CSS.
   ACHADO (tell REAL de consistência, não invenção): a `.oxrc1-center-tab` é um controle
   SEGMENTADO cujo PRESS (`:active`, v51) já assenta no token canônico `--oxrc1-active`,
   mas cujo HOVER e SELECIONADO (`is-active`) nasceram em brancos translúcidos avulsos
   (0.045 / 0.06) — frios e mais fracos que o token. Dois problemas concretos:
     1) Escada interna quebrada: hover/selecionado (branco frio) -> press (--oxrc1-active,
        cinza quente do token). O mesmo botão troca de TEMPERATURA ao ser pressionado.
     2) É o ÚNICO segmentado do produto fora do token: o irmão direto
        `.oxrc1-founder-queue-tabs button` (apontado como gêmeo no v98) usa
        `background: var(--oxrc1-hover)` no hover E no is-active; e os icon-buttons ◷/⋯
        AO LADO na mesma zona acendem em --oxrc1-hover. As abas Chat/Browser destoavam.
   Correção: hover e is-active passam a `var(--oxrc1-hover)` (idêntico ao gêmeo e aos
   vizinhos), mantendo o sublinhado accent (`border-bottom-color: var(--oxrc1-accent)`)
   como marcador de "você está aqui". A escada fica correta: hover/selecionado --oxrc1-hover
   -> press --oxrc1-active (o `:active` vem depois na cascata, então o press segue ganhando).
   Zero token/cor novo; nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado;
   identidade (dark warm + accent OXXY) preservada — só troco branco avulso pelo token. */
.oxrc1-center-tab:hover {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

.oxrc1-center-tab.is-active {
  border-bottom-color: var(--oxrc1-accent);
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

.oxrc1-center-view {
  min-width: 0;
  min-height: 0;
}

.oxrc1-center-view[hidden] {
  display: none !important;
}

.oxrc1-chat-view {
  display: grid;
  /* A coluna interna tambem precisa poder encolher. Sem isso o composer define
     uma coluna implicita max-content e continua largo sob a sidebar direita. */
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr) auto;
  height: 100%;
  overflow: hidden;
}

.oxrc1-browser-view {
  display: grid;
  grid-template-rows: auto auto minmax(0, 1fr);
  height: 100%;
  overflow: hidden;
  background: var(--oxrc1-bg);
}

.oxrc1-browser-bar {
  min-width: 0;
  display: grid;
  grid-template-columns: 34px 34px minmax(0, 1fr) auto;
  gap: 8px;
  padding: 12px 18px 8px;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-browser-tool,
.oxrc1-browser-go {
  height: 34px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.03);
  color: var(--oxrc1-soft);
  cursor: pointer;
}

.oxrc1-browser-tool {
  width: 34px;
  display: grid;
  place-items: center;
  font-size: 20px;
  line-height: 1;
}

.oxrc1-browser-go {
  padding: 0 16px;
  background: var(--oxrc1-accent);
  border-color: rgba(255, 255, 255, 0.12);
  color: #fff;
  font-weight: 720;
}

.oxrc1-browser-tool:hover,
.oxrc1-browser-go:hover {
  filter: brightness(1.08);
}

.oxrc1-browser-bar input {
  min-width: 0;
  height: 34px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: var(--oxrc1-radius);
  background: var(--oxrc1-side-deep);
  color: var(--oxrc1-text);
  padding: 0 12px;
  outline: 0;
}

/* design v144 — placeholder da barra do navegador entra no idioma canonico.
   O <input> da browser-bar tinha caixa/borda/foco OXXY, mas o texto-dica caia em
   --oxrc1-dim (#928f86, o cinza de texto mais fraco do sistema) — mais apagado que
   o #aaa79f cinza-quente que search+composer+modal ja usam. Mesmo "tell de quase-
   caro" que o v124 corrigiu nos inputs do modal. So cor; zero data-rc1-*/comportamento. */
.oxrc1-browser-bar input::placeholder {
  color: #aaa79f;
}

.oxrc1-browser-fallback {
  display: none;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 18px;
  border-bottom: 1px solid var(--oxrc1-line);
  color: var(--oxrc1-dim);
  font-size: 12px;
  line-height: 1.35;
}

.oxrc1-browser-view[data-rc1-browser-state="fallback"] .oxrc1-browser-fallback {
  display: flex;
}

.oxrc1-browser-fallback a {
  flex: 0 0 auto;
  color: var(--oxrc1-soft);
  text-decoration: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.22);
}

/* design v132 — estados vazios (3ª volta): o vazio de tela-cheia do Browser era
   o ÚLTIMO empty-state centralizado ainda no --oxrc1-dim (#928f86), o texto mais
   fraco do sistema. Todos os irmãos de MESMA categoria (repouso centralizado de
   painel/tela) já subiram dim→muted pelo piso de leitura AA: o vazio-herói do
   chat (v71) e os três vazios finos decision/founder-queue/founder-home (v72),
   ambos citando "o mesmo piso de leitura AA" — e o project-home-empty p já nasce
   muted. O browser-empty ("Digite uma URL acima para navegar") ficou de fora das
   duas voltas: sozinho num painel inteiro, centralizado, ele lia como placeholder
   apagado em vez de repouso intencional. Alinho ao piso: dim→muted.
   Contraste sobre --oxrc1-bg #1f1f1d: dim #928f86 ~5.1:1 → muted #c0beb6 ~7.9:1
   (folga confortável de AA). Só apresentação; reuso de token existente, zero
   token/cor novo; nenhum data-rc1-*/seletor/comportamento/microcopy/identidade
   tocado (a regra de grid-row .oxrc1-browser-empty,.oxrc1-browser-frame que os
   testes pinam fica intacta — este bloco só mexe na cor). */
.oxrc1-browser-empty {
  display: none;
  min-width: 0;
  min-height: 0;
  place-items: center;
  padding: 24px;
  color: var(--oxrc1-muted);
  font-size: 13px;
  text-align: center;
}

.oxrc1-browser-view[data-rc1-browser-state="empty"] .oxrc1-browser-empty {
  display: grid;
}

.oxrc1-browser-view[data-rc1-browser-state="empty"] .oxrc1-browser-frame {
  display: none;
}

.oxrc1-browser-frame {
  width: 100%;
  height: 100%;
  min-width: 0;
  min-height: 0;
  border: 0;
  background: #fff;
}

/* empty e frame ocupam a MESMA linha 1fr do grid (sao mutuamente exclusivos);
   sem isso o iframe cai numa linha implicita 'auto' e encolhe pra ~150px, cortando o conteudo. */
.oxrc1-browser-empty,
.oxrc1-browser-frame {
  grid-row: 3;
  grid-column: 1;
}

.oxrc1-title {
  min-width: 0;
  display: grid;
  gap: 2px;
  text-align: left;
  flex: 1 1 auto;
}

.oxrc1-title strong {
  font-size: 14px;
  font-weight: 640;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-cost-counter {
  flex: 0 1 auto;
  min-width: 0;
  max-width: 480px;
  min-height: 24px;
  display: grid;
  place-items: center;
  padding: 0 10px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: rgba(255, 255, 255, 0.025);
  font-size: 12px;
  line-height: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.oxrc1-drawer-button,
.oxrc1-mobile-close {
  display: none;
}

.oxrc1-messages {
  overflow-y: auto;
  overflow-x: hidden;
  min-width: 0;
  padding: 32px 20px 158px;
  scroll-behavior: smooth;
}

.oxrc1-empty,
.oxrc1-message {
  width: min(100%, 1180px);
  margin-inline: auto;
}

.oxrc1-empty[hidden] {
  display: none !important;
}

.oxrc1-empty {
  min-height: 56vh;
  display: grid;
  align-content: center;
  justify-items: center;
  text-align: center;
  gap: 12px;
}

.oxrc1-empty p {
  margin: 0;
  color: var(--oxrc1-muted);
  font-size: 13px;
}

.oxrc1-empty small {
  max-width: 440px;
  color: var(--oxrc1-dim);
  font-size: 13px;
  line-height: 1.45;
}

.oxrc1-empty h1 {
  margin: 0;
  font-size: clamp(28px, 4vw, 44px);
  font-weight: 620;
  letter-spacing: 0;
}

.oxrc1-prompt-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  margin-top: 12px;
}

.oxrc1-prompt-row button {
  min-height: 34px;
  padding: 0 12px;
  border: 1px solid var(--oxrc1-line);
  color: var(--oxrc1-muted);
}

.oxrc1-message {
  display: grid;
  gap: 6px;
  margin-bottom: 22px;
  line-height: 1.58;
}

.oxrc1-message.is-user {
  justify-items: end;
}

.oxrc1-message.is-assistant {
  justify-items: stretch;
}

.oxrc1-meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  min-height: 24px;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-assistant-meta {
  min-height: 36px;
}

.oxrc1-claudio-avatar,
.oxrc1-persona-response-avatar {
  width: 32px;
  height: 32px;
  flex: 0 0 32px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid rgba(255, 255, 255, 0.12);
  box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.18);
  background: #1d1d1b;
}

.oxrc1-persona-name {
  color: var(--oxrc1-text);
  font-weight: 650;
}

.oxrc1-engine-preview {
  color: #aaa79f;
}

.oxrc1-cost-preview {
  color: #8faca2;
}

.oxrc1-message-state {
  color: #8e8a82;
  font-size: 11px;
  transition: color 150ms ease;
}

/* design v136 — bolhas de mensagem: o rótulo de estado da FALHA veste o
   vermelho da própria falha. A mensagem falhada já acende a borda vermelha
   (.is-failed .oxrc1-bubble, rgba 255,127,127,0.54), mas o rótulo ao lado
   ("Falhou…") continuava no cinza neutro de repouso (#8e8a82) — sinal partido:
   borda vermelha em cima, rótulo cinza embaixo, o texto que NOMEIA a falha
   desligado da cor que a anuncia. Mesmo princípio do v135 (o elemento que
   carrega o erro veste o erro). Agora o rótulo sobe pro #ff8f8f (mesma família
   do 255,127,127 da borda, um passo mais claro pra legibilidade AA em 11px:
   ~6.6:1 sobre o fundo do chat) — rótulo + borda leem como uma unidade, e a
   transição de 150ms suaviza pendente(cinza)→falhou(vermelho). Só apresentação:
   reúso da família de vermelho existente (zero token/cor nova de identidade),
   nenhum data-rc1-*, seletor, comportamento ou microcopy tocado; transição
   zerada sob prefers-reduced-motion. */
.oxrc1-message.is-failed .oxrc1-message-state {
  color: #ff8f8f;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-message-state { transition: none; }
}

.oxrc1-message-time {
  /* design v210 — bolhas de mensagem: o horário da meta sobe pro piso de
     contraste da casa. Tell REAL e mensurável: rgba(192,190,182,0.58) sobre
     --oxrc1-bg #1f1f1d rende ~#7c7b76 ≈ 3.9:1 — REPROVA AA (4.5:1) justamente
     em texto de 11px, o menor corpo do turno. O próprio arquivo documenta o
     piso da casa (linha ~1284): "dim #928f86 ~5.1:1". O timestamp era o ÚNICO
     texto da linha de meta abaixo desse piso (estado #8e8a82 ~5.0:1, custo
     #8faca2 acima). Correção: token canônico var(--oxrc1-dim) — mesma família
     warm gray, zero cor nova, e o horário passa a rimar com o resto da meta
     (.oxrc1-meta já é dim). Só apresentação: nenhum data-rc1-* / seletor /
     comportamento / microcopy tocado; identidade dark warm preservada. */
  color: var(--oxrc1-dim);
  font-size: 11px;
  line-height: 1;
}

.oxrc1-message.is-pending .oxrc1-bubble {
  opacity: 0.82;
}

.oxrc1-message.is-failed .oxrc1-bubble {
  border-color: rgba(255, 127, 127, 0.54);
}

.oxrc1-bubble h1,
.oxrc1-bubble h2,
.oxrc1-bubble h3,
.oxrc1-thinking-body h1,
.oxrc1-thinking-body h2,
.oxrc1-thinking-body h3 {
  margin: 12px 0 6px;
  color: var(--oxrc1-text);
  font-weight: 650;
  line-height: 1.22;
}

.oxrc1-bubble h1,
.oxrc1-thinking-body h1 {
  font-size: 20px;
}

.oxrc1-bubble h2,
.oxrc1-thinking-body h2 {
  font-size: 17px;
}

.oxrc1-bubble h3,
.oxrc1-thinking-body h3 {
  font-size: 15px;
}

.oxrc1-message.is-user .oxrc1-meta {
  justify-self: end;
}

.oxrc1-thinking {
  max-width: min(100%, 680px);
  margin: 0 0 2px 40px;
  border: 1px solid rgba(142, 174, 160, 0.22);
  border-radius: var(--oxrc1-radius);
  background: rgba(142, 174, 160, 0.055);
  color: var(--oxrc1-muted);
  font-size: 13px;
}

.oxrc1-thinking summary {
  min-height: 32px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 10px;
  cursor: pointer;
  color: #c9d5ce;
  font-weight: 560;
  letter-spacing: 0;
}

.oxrc1-thinking summary::marker {
  color: #8faca2;
}

.oxrc1-thinking-body {
  padding: 0 12px 10px;
  color: #b8c3bd;
}

.oxrc1-thinking-body p {
  margin: 0 0 8px;
}

.oxrc1-thinking-body p:last-child {
  margin-bottom: 0;
}

.oxrc1-bubble {
  max-width: 100%;
  border-radius: 14px;
  padding: 14px 16px;
  color: var(--oxrc1-text);
  overflow-wrap: anywhere;
}

.oxrc1-message.is-user .oxrc1-bubble {
  max-width: min(100%, 680px);
  background: #2a2a28;
  border: 1px solid var(--oxrc1-line);
}

.oxrc1-message.is-assistant .oxrc1-bubble {
  padding-inline: 4px;
  background: transparent;
}

.oxrc1-bubble p {
  margin: 0 0 10px;
  /* design v166 — MATA ÓRFÃS TIPOGRÁFICAS NA PROSA DO CHAT (tell nº1 de "texto
     desenhado" vs "texto jogado" — o oposto exato de página web barata). Achado real
     e render-free: `text-wrap` tinha 0 ocorrências no produto INTEIRO (CSS+JS+HTML).
     O corpo da resposta (.oxrc1-bubble p) é o texto MAIS LIDO do produto e, com quebra
     gulosa padrão, sobra a clássica órfã — uma última linha com uma única palavra solta
     pendurada. `pretty` reequilibra só as últimas linhas p/ evitar a órfã e o rag ruim;
     é o mesmo tell que Claude.ai/Linear/Vercel fixam na prosa. Escopo cirúrgico ao
     parágrafo de corpo: NÃO aplico em eyebrows/rótulos (.oxrc1-empty p é kicker, não
     prosa) nem em títulos (balance mudaria distribuição de linhas — render-dependente).
     Segurança: `pretty` degrada gracioso (não-suportado → normal), não aumenta a
     contagem de linhas além da gulosa (sem layout shift), zero efeito em linha única.
     Só APRESENTAÇÃO: nenhum data-rc1-*/seletor/comportamento/microcopy/token/cor;
     identidade dark warm intocada. */
  text-wrap: pretty;
}

.oxrc1-bubble p:last-child {
  margin-bottom: 0;
}

.oxrc1-bubble h2,
.oxrc1-bubble h3 {
  margin: 0 0 10px;
  letter-spacing: 0;
  font-weight: 650;
}

.oxrc1-bubble h2 {
  font-size: 20px;
}

.oxrc1-bubble h3 {
  font-size: 16px;
}

.oxrc1-bubble ul,
.oxrc1-bubble ol {
  margin: 8px 0 12px 22px;
  padding: 0;
}

.oxrc1-bubble li + li {
  margin-top: 4px;
}

.oxrc1-bubble a {
  color: #9eb5ff;
  text-decoration: none;
}

.oxrc1-bubble a:hover {
  text-decoration: underline;
}

.oxrc1-bubble code {
  padding: 2px 5px;
  border-radius: 5px;
  background: rgba(255, 255, 255, 0.08);
  color: #f4d6a3;
}

.oxrc1-code {
  margin: 12px 0;
  overflow: hidden;
  border: 1px solid var(--oxrc1-line);
  border-radius: 10px;
  background: #171715;
}

/* Tabela comparativa: legível, com zebra e cabeçalho destacado. */
.oxrc1-table-wrap {
  margin: 14px 0;
  overflow-x: auto;
  border: 1px solid var(--oxrc1-line);
  border-radius: 10px;
}
.oxrc1-table {
  border-collapse: collapse;
  width: 100%;
  font-size: 0.94em;
  line-height: 1.45;
  /* design v158 — figuras tabulares nas células da tabela comparativa. A tabela
     já tinha zebra, cabeçalho destacado, hover de linha (v134) e rolagem-x
     temática, mas os NÚMEROS caíam em figuras proporcionais: numa coluna de
     valores ("1.234,56" / "987,00" / "12,30") os dígitos têm larguras diferentes
     e a coluna "dança", desalinhada — tell clássico de tabela de software barato
     num cockpit que é sobre números (margem, preço, frota). `tabular-nums` fixa
     cada dígito na MESMA largura, então as colunas de números alinham casa a casa.
     Estende às tabelas o mesmo idioma de figuras tabulares que o produto já usa
     em timestamps/sidebar/custo (v51/v62/v151). font-feature-settings: "tnum" 1
     como cinto-e-suspensório p/ WebKit antigo (mesmo par do bloco de custo).
     Só apresentação: nenhum data-rc1-*, seletor, comportamento, microcopy ou
     identidade tocados; texto não-numérico é intocado (só larguras de dígito). */
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
.oxrc1-table th,
.oxrc1-table td {
  padding: 9px 13px;
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--oxrc1-line);
}
.oxrc1-table th {
  background: rgba(255, 255, 255, 0.06);
  font-weight: 650;
  white-space: nowrap;
}
.oxrc1-table tbody tr:nth-child(even) {
  background: rgba(255, 255, 255, 0.025);
}
/* design v134 — tabela comparativa: realce de linha no :hover. A tabela já
   tinha zebra + cabeçalho destacado, mas a linha sob o cursor não respondia —
   em tabelas largas (único eixo-x rolável) o olho perdia o trilho ao cruzar
   colunas. Realce sutil (rgba branco 0.05, acima da zebra 0.025 e abaixo do
   cabeçalho 0.06), transição de 140ms guardada por prefers-reduced-motion —
   mesmo idioma do scrollbar-thumb:hover. Só apresentação: nenhum data-rc1-*,
   seletor, comportamento, afordância de clique, microcopy ou identidade
   tocados. Precedente de hover já existente no produto. */
.oxrc1-table tbody tr {
  transition: background-color 140ms ease;
}
.oxrc1-table tbody tr:hover {
  background: rgba(255, 255, 255, 0.05);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-table tbody tr { transition: none; }
}
.oxrc1-table tbody tr:last-child td {
  border-bottom: none;
}

.oxrc1-code pre {
  margin: 0;
  padding: 16px;
  overflow: auto;
}

.oxrc1-code code {
  padding: 0;
  background: transparent;
  color: #e6e0d1;
}

/* design v65 — blocos de código: afinamento tipográfico + barra de rolagem
   horizontal custom. Antes: o <pre> usava o scrollbar nativo do SO (destoava do
   thin translúcido do sidebar esquerdo) e o tab default de 8 espaços fazia código
   indentado sprawlar até a rolagem. Só apresentação; nenhum data-rc1-*/comportamento. */
.oxrc1-code pre {
  tab-size: 2;
  -moz-tab-size: 2;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
  overscroll-behavior-x: contain;
}

.oxrc1-code pre::-webkit-scrollbar {
  height: 8px;
}

.oxrc1-code pre::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}

.oxrc1-code pre::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-code pre::-webkit-scrollbar-thumb { transition: none; }
}

/* design v120 — SELEÇÃO DE TEXTO GLOBAL na cor da casa. Achado real: a seleção
   custom (::selection) só existia DENTRO dos blocos de código (v109). Em toda a
   outra superfície — bolhas da conversa, títulos, composer, nomes de projeto,
   sidebars, admin — selecionar texto caía no azul cru do SO, a única cor fora da
   paleta quente OXXY, e logo na superfície MAIS vista do produto. Traz o realce
   translúcido no vermelho da casa (--oxrc1-accent #b71922) com o texto reforçado
   pra garantir contraste AA sobre qualquer fundo escuro. O código segue no âmbar
   (v109) porque `.oxrc1-code ::selection` é mais específico e ganha o cascade —
   o motivo "código = âmbar" fica intacto. Só apresentação; nenhum data-rc1-*/
   comportamento/microcopy/markup; identidade reforçada, não reinventada. */
::selection {
  background: rgba(183, 25, 34, 0.30);
  color: #fbeeee;
}
::-moz-selection {
  background: rgba(183, 25, 34, 0.30);
  color: #fbeeee;
}

/* design v109 — blocos de código: seleção de texto na cor da casa. Antes: selecionar
   código para copiar caía no azul cru de seleção do SO — a única cor fora da paleta
   quente do produto, e logo na superfície onde mais se seleciona-para-copiar. Traz o
   mesmo âmbar do código inline (#f4d6a3) num realce translúcido, com o texto reforçado
   pra manter o contraste AA. Só apresentação; nenhum data-rc1-*/comportamento/microcopy;
   identidade preservada (reforça o motivo "código = âmbar" que já existe no inline). */
.oxrc1-code ::selection {
  background: rgba(244, 214, 163, 0.22);
  color: #f7efdd;
}
.oxrc1-code ::-moz-selection {
  background: rgba(244, 214, 163, 0.22);
  color: #f7efdd;
}

.oxrc1-copy {
  margin-left: auto;
  min-height: 26px;
  padding: 0 8px;
  color: var(--oxrc1-muted);
  background: rgba(255, 255, 255, 0.04);
}

.oxrc1-pdf-download {
  min-height: 26px;
  display: inline-flex;
  align-items: center;
  padding: 0 9px;
  color: #ffffff;
  text-decoration: none;
  background: rgba(183, 25, 34, 0.86);
  border: 1px solid rgba(255, 255, 255, 0.12);
  font-size: 12px;
  font-weight: 650;
}

.oxrc1-image-download {
  min-height: 26px;
  display: inline-flex;
  align-items: center;
  padding: 0 9px;
  color: #ffffff;
  text-decoration: none;
  background: color-mix(in srgb, var(--oxrc1-blue) 72%, transparent);
  border: 1px solid rgba(255, 255, 255, 0.12);
  font-size: 12px;
  font-weight: 650;
}

.oxrc1-generated-image {
  margin: 12px 0 0;
  max-width: min(100%, 640px);
}

.oxrc1-generated-image img {
  display: block;
  width: 100%;
  height: auto;
  max-height: 720px;
  object-fit: contain;
  border-radius: var(--oxrc1-radius);
  border: 1px solid var(--oxrc1-line);
  background: #171715;
}

.oxrc1-generated-image a {
  display: inline-flex;
  margin-top: 8px;
  color: #9eb5ff;
  text-decoration: none;
  font-size: 13px;
}

/* Card de entrega de vídeo: player carregado + Visualizar/Download/Ver na pasta. */
.oxrc1-generated-video {
  margin: 12px 0 0;
  max-width: min(100%, 640px);
}
.oxrc1-generated-video video {
  display: block;
  width: 100%;
  height: auto;
  max-height: 640px;
  border-radius: var(--oxrc1-radius);
  border: 1px solid var(--oxrc1-line);
  background: #000;
}
.oxrc1-video-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 10px;
}
.oxrc1-video-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 12px;
  border-radius: var(--oxrc1-radius);
  border: 1px solid var(--oxrc1-line);
  background: rgba(255, 255, 255, 0.05);
  color: #e6ece8;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
}
.oxrc1-video-btn:hover {
  background: rgba(255, 255, 255, 0.1);
}

.oxrc1-artifact {
  margin-top: 12px;
  width: min(100%, 360px);
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px;
  border-radius: 10px;
  border: 1px solid var(--oxrc1-line);
  background: rgba(255, 255, 255, 0.04);
}

.oxrc1-artifact-icon {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: var(--oxrc1-radius);
  background: #262624;
  color: var(--oxrc1-muted);
  font-size: 11px;
}

.oxrc1-artifact div:last-child {
  min-width: 0;
  display: grid;
  gap: 2px;
}

.oxrc1-artifact strong {
  font-size: 13px;
}

.oxrc1-artifact span {
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-composer {
  z-index: 2;
  width: min(calc(100% - 40px), 820px);
  margin: 0 auto 22px;
  display: grid;
  grid-template-columns: auto minmax(180px, 1fr) auto;
  align-items: end;
  gap: 10px;
  padding: 10px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 18px;
  background: var(--oxrc1-composer);
  box-shadow: 0 18px 48px rgba(0, 0, 0, 0.28);
}

.oxrc1-attachment-tray {
  grid-column: 1 / -1;
  min-width: 0;
}

.oxrc1-attachment-chip {
  max-width: 100%;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 5px 7px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.055);
  color: var(--oxrc1-soft);
  font-size: 12px;
  line-height: 1.25;
}

.oxrc1-attachment-chip::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: #71d38a;
  box-shadow: 0 0 0 3px rgba(113, 211, 138, 0.12);
  flex: 0 0 auto;
}

.oxrc1-attachment-chip[data-attachment-kind="image"] {
  padding: 4px 7px 4px 4px;
}

.oxrc1-attachment-thumb {
  width: 34px;
  height: 34px;
  border-radius: 7px;
  object-fit: cover;
  border: 1px solid var(--oxrc1-line);
  background: rgba(0, 0, 0, 0.22);
  flex: 0 0 auto;
}

.oxrc1-attachment-label {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-attachment-status {
  flex: 0 0 auto;
  padding: 2px 6px;
  border: 1px solid rgba(113, 211, 138, 0.24);
  border-radius: 999px;
  color: #b9eec5;
  background: rgba(113, 211, 138, 0.09);
  font-size: 10px;
  line-height: 1.2;
  white-space: nowrap;
}

.oxrc1-attachment-chip button {
  width: 22px;
  height: 22px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--oxrc1-muted);
  cursor: pointer;
  transition: background 150ms ease, color 150ms ease;
}

.oxrc1-attachment-chip button:hover {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

/* design v202 — composer / botão remover-anexo (.oxrc1-attachment-chip button):
   era o ÚLTIMO controle do composer com hover instantâneo e sem retorno de press.
   Os irmãos (tool/send/engine/persona/modo-option) já fundem em 150ms ease e
   afundam 0.5px ao clique; o × de remover anexo destoava — trocava fundo/cor num
   corte seco. Ganha o MESMO fade de 150ms e o MESMO press-0.5px. Só apresentação;
   zero data-rc1-*/comportamento/microcopy/identidade. Transição e transform
   guardadas por prefers-reduced-motion, no idioma da casa. */
.oxrc1-attachment-chip button:active {
  transform: translateY(0.5px);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-attachment-chip button {
    transition: none;
  }
  .oxrc1-attachment-chip button:active {
    transform: none;
  }
}

.oxrc1-composer-tools,
.oxrc1-composer-actions {
  gap: 6px;
  align-items: center;
}

.oxrc1-tool,
.oxrc1-send {
  width: 32px;
  height: 32px;
  display: grid;
  place-items: center;
  color: var(--oxrc1-muted);
  flex: 0 0 auto;
}

.oxrc1-send {
  background: var(--oxrc1-text);
  color: #1f1f1d;
}

.oxrc1-composer textarea {
  width: 100%;
  max-height: 160px;
  min-height: 32px;
  resize: none;
  border: 0;
  outline: 0;
  padding: 7px 2px;
  color: var(--oxrc1-text);
  background: transparent;
  line-height: 1.45;
}

.oxrc1-engine {
  position: relative;
}

.oxrc1-modo-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  height: 32px;
  padding: 3px;
  gap: 2px;
  border-radius: 10px;
  border: 1px solid var(--oxrc1-line-strong);
  background: rgba(255, 255, 255, 0.035);
  white-space: nowrap;
}

.oxrc1-modo-option {
  height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 10px;
  border: none;
  border-radius: 7px;
  font-size: 12px;
  font-weight: 600;
  color: var(--oxrc1-muted);
  background: transparent;
  cursor: pointer;
  transition: background 150ms ease, color 150ms ease;
}

.oxrc1-modo-option:hover {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
}

.oxrc1-modo-option[aria-pressed="true"] {
  color: #fff;
  background: linear-gradient(90deg, var(--oxrc1-blue), var(--oxrc1-accent));
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.28);
}

/* design — press tátil no toggle Perguntar/Agir (.oxrc1-modo-option): era o ÚNICO
   controle do composer sem retorno de press. Os irmãos afundam ao clique
   (send/browser-tool/icon-buttons com translateY(0.5px)); os segmentos do modo só
   tinham hover/selecionado/foco. Ganham o MESMO afundar-0.5px. translateY (não troca
   de fundo) de propósito: o fundo achataria o gradiente do segmento selecionado; o
   transform funciona igual pro segmento ativo (gradiente) e pro inativo. Só apresentação;
   zero data-rc1-*/seletor estrutural/comportamento/microcopy/identidade. (reduced-motion
   não precisa de guarda extra: :active é troca de estado instantânea, não animação — igual
   aos irmãos icon-button.) */
.oxrc1-composer .oxrc1-modo-option:active {
  transform: translateY(0.5px);
}

.oxrc1-persona-selector {
  position: relative;
}

.oxrc1-engine-button {
  height: 32px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 9px;
  color: var(--oxrc1-muted);
  background: rgba(255, 255, 255, 0.035);
  border: 1px solid transparent;
  white-space: nowrap;
}

.oxrc1-engine-button[aria-expanded="true"] {
  color: var(--oxrc1-text);
  border-color: var(--oxrc1-line-strong);
  background: rgba(255, 255, 255, 0.06);
}

.oxrc1-engine-button i {
  font-style: normal;
  color: var(--oxrc1-dim);
}

.oxrc1-persona-button img,
.oxrc1-persona-option-avatar {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid rgba(255, 255, 255, 0.13);
  background: #1d1d1b;
  flex: 0 0 auto;
}

.oxrc1-persona-option-avatar {
  width: 24px;
  height: 24px;
}

.oxrc1-engine-menu,
.oxrc1-context-menu {
  position: fixed;
  z-index: 80;
  min-width: 190px;
  max-width: min(320px, calc(100vw - 20px));
  max-height: min(420px, calc(100vh - 20px));
  overflow: auto;
  padding: 7px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 12px;
  background: #343431;
  box-shadow: 0 22px 70px rgba(0, 0, 0, 0.42);
}

.oxrc1-engine-menu {
  right: 0;
  bottom: calc(100% + 8px);
}

.oxrc1-menu-option,
.oxrc1-menu-item {
  width: 100%;
  min-height: 34px;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 9px;
  color: var(--oxrc1-text);
  text-align: left;
}

.oxrc1-menu-option:hover,
.oxrc1-menu-item:hover,
.oxrc1-menu-option.is-selected,
.oxrc1-menu-item.is-active {
  background: rgba(255, 255, 255, 0.08);
}

.oxrc1-menu-option[aria-disabled="true"],
.oxrc1-menu-item[aria-disabled="true"] {
  color: #89877f;
  cursor: not-allowed;
}

.oxrc1-menu-mark,
.oxrc1-menu-icon {
  width: 18px;
  color: var(--oxrc1-muted);
  text-align: center;
}

.oxrc1-menu-text {
  min-width: 0;
  display: grid;
  gap: 1px;
}

.oxrc1-menu-text small {
  color: #aaa79f;
  font-size: 11px;
}

.oxrc1-menu-divider {
  height: 1px;
  margin: 7px 4px;
  background: rgba(255, 255, 255, 0.1);
}

.oxrc1-menu-item.is-danger {
  color: var(--oxrc1-danger);
}

.oxrc1-right-head {
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 12px;
}

.oxrc1-right-head div {
  min-width: 0;
}

/* design v173 — ritmo eyebrow→título na escala 4/8. Os dois cabeçalhos que já
   compartilham o MESMO tratamento de eyebrow premium (uppercase/0.08em/600/11px)
   — "Pedido atual" (right-head) e "Projeto atual" (project-home-header) — colavam
   no título com gaps arbitrários e fora da grade (2px aqui, 7px na home). O v54 já
   dizia "eyebrow devia colar no título"; agora ambos hugam a 4px, o menor degrau
   4/8 — mesmo respiro deliberado nos dois, sem mexer em título→subtexto. Só ritmo. */
.oxrc1-right-head h2 {
  margin: 4px 0 0;
  font-size: 14px;
  line-height: 1.25;
  font-weight: 400;
}

/* Founder Control View v1 — extensão da sidebar real, sem segunda interface.
   Valores vêm do read model autenticado da frota; ausência permanece explícita. */
.oxrc1-control-view {
  margin: 10px 10px 4px;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: color-mix(in srgb, var(--oxrc1-side) 88%, transparent);
}

.oxrc1-control-view-head,
.oxrc1-control-source {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 8px;
}

.oxrc1-control-view-head h3 {
  margin: 2px 0 0;
  font-size: 13px;
  line-height: 1.25;
}

.oxrc1-control-view-head span,
.oxrc1-control-grid article > span {
  color: var(--oxrc1-muted);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
}

.oxrc1-control-language { display: inline-flex; gap: 2px; }

.oxrc1-control-language button {
  min-width: 26px;
  min-height: 26px;
  padding: 0 5px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 6px;
  color: var(--oxrc1-muted);
  background: transparent;
  font: inherit;
  font-size: 10px;
  cursor: pointer;
}

.oxrc1-control-language button:hover,
.oxrc1-control-language button[aria-pressed="true"] {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
}

.oxrc1-control-language button:focus-visible {
  outline: 2px solid color-mix(in srgb, var(--oxrc1-accent) 85%, white);
  outline-offset: 2px;
}

.oxrc1-control-source {
  align-items: center;
  margin-top: 10px;
  padding: 8px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 7px;
}

.oxrc1-control-source small {
  color: var(--oxrc1-muted);
  font-size: 10px;
  line-height: 1.35;
  text-align: right;
}

.oxrc1-control-state {
  flex: 0 0 auto;
  padding: 3px 6px;
  border-radius: 999px;
  color: var(--oxrc1-muted);
  background: var(--oxrc1-hover);
  font-size: 9px;
  font-weight: 750;
  letter-spacing: .04em;
}

.oxrc1-control-view[data-state="LIVE"] .oxrc1-control-state { color: #3fd08a; }
.oxrc1-control-view[data-state="STALE"] .oxrc1-control-state { color: #f0b85b; }
.oxrc1-control-view[data-state="NOT_CONNECTED"] .oxrc1-control-state { color: #ff8b8b; }

.oxrc1-control-grid { display: grid; gap: 0; margin-top: 8px; }

.oxrc1-control-grid article {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  padding: 8px 0;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-control-grid article:last-child { border-bottom: 0; }

.oxrc1-control-grid article strong {
  max-width: 130px;
  color: var(--oxrc1-text);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
  text-align: right;
}

.oxrc1-control-grid article small {
  grid-column: 1 / -1;
  margin-top: 3px;
  color: var(--oxrc1-muted);
  font-size: 10px;
  line-height: 1.35;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-control-language button { transition: none; }
}

.oxrc1-right .oxrc1-farol {
  display: inline-flex;
}

.oxrc1-shell.is-right-collapsed .oxrc1-right {
  align-items: center;
  padding-inline: 8px;
}

.oxrc1-shell.is-right-collapsed .oxrc1-right-head div,
.oxrc1-shell.is-right-collapsed .oxrc1-progress,
.oxrc1-shell.is-right-collapsed .oxrc1-progress-note {
  display: none;
}

.oxrc1-progress {
  overflow-y: auto;
  min-height: 0;
  display: grid;
  gap: 2px;
  list-style: none;
  margin: 0;
  padding: 0 2px 8px;
}

/* design v161 — sidebar direita / passos do progresso (.oxrc1-progress li +
   círculo de estado): quando um passo avança (pendente→atual→concluído) o fundo,
   a cor do texto e o preenchimento do círculo TROCAVAM no talho — estalavam.
   Era a última superfície de estado ao vivo da coluna direita fora do idioma:
   logo abaixo, a barra do norte (.oxrc1-frota-norte-fill) desliza 400ms e o app
   inteiro glida em 150ms ease (~75 usos). Agora o avanço do passo desliza no
   mesmo idioma da casa (150ms ease), guardado por prefers-reduced-motion.
   Só apresentação — reúso exato do valor padronizado; zero token/cor novo,
   nenhum data-rc1-*/comportamento/microcopy/identidade tocado. */
.oxrc1-progress li {
  min-height: 32px;
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr);
  gap: 7px;
  align-items: center;
  color: var(--oxrc1-dim);
  border-radius: var(--oxrc1-radius);
  padding: 4px 5px;
  transition: background-color 150ms ease, color 150ms ease;
}

.oxrc1-progress li span {
  width: 16px;
  height: 16px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1px solid var(--oxrc1-line-strong);
  background: transparent;
  transition: background-color 150ms ease, border-color 150ms ease,
    box-shadow 150ms ease;
}

.oxrc1-progress li p {
  margin: 0;
  min-width: 0;
  font-size: 14px;
  line-height: 1.25;
  font-weight: 400;
}

/* C3-04 — carimbo de tempo humano por passo (status em tempo real) */
.oxrc1-progress-when {
  grid-column: 2;
  justify-self: start;
  margin-top: 1px;
  font-size: 11px;
  line-height: 1.1;
  font-weight: 400;
  color: var(--oxrc1-dim);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.01em;
}

.oxrc1-progress li.is-current .oxrc1-progress-when {
  color: var(--oxrc1-muted);
}

.oxrc1-progress li.is-done {
  color: var(--oxrc1-muted);
}

.oxrc1-progress li.is-done span {
  background: var(--oxrc1-blue);
  border-color: var(--oxrc1-blue);
}

.oxrc1-progress li.is-done span::before {
  content: "✓";
  color: #101010;
  font-size: 12px;
  font-weight: 760;
}

.oxrc1-progress li.is-current {
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.06);
}

.oxrc1-progress li.is-current span {
  border-color: var(--oxrc1-blue);
  box-shadow: inset 0 0 0 5px color-mix(in srgb, var(--oxrc1-blue) 24%, transparent);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-progress li,
  .oxrc1-progress li span { transition: none; }
}

.oxrc1-progress-note {
  margin-top: auto;
  padding: 10px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: transparent;
  font-size: 12px;
  line-height: 1.25;
}

/* ux.painel_frota — bloco "Frota OXXY" na sidebar direita: acompanhamento humano
   dos agentes/lanes, sem jargão técnico. Consistente com o resto (dark, sem poluição). */
.oxrc1-frota {
  display: grid;
  /* design v86 — ritmo em escala: 10px destoava do 4/8 do resto da coluna. */
  gap: 12px;
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--oxrc1-line);
}

/* design v86 — eyebrow da frota entra no idioma premium da própria coluna:
   "PEDIDO ATUAL" (.oxrc1-right-head span) e o header da home já são
   uppercase/tracked 0.08em/semibold/11px; "FROTA OXXY" saía 0.04em e peso 400
   (herdado) — o único eyebrow frouxo da sidebar direita, lado a lado com o
   irmão premium logo acima. Alinho tracking e peso. Só apresentação; cor
   --oxrc1-dim herdada preservada; nenhum data-rc1-*/comportamento tocado. */
.oxrc1-frota-head span {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  color: var(--oxrc1-dim);
}

.oxrc1-frota-norte-bar {
  height: 6px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.08);
  overflow: hidden;
  margin-top: 6px;
}

.oxrc1-frota-norte-fill {
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, var(--oxrc1-blue), var(--oxrc1-accent));
  width: 0%;
  transition: width 400ms ease;
}

.oxrc1-frota-norte-frase {
  margin: 6px 0 0;
  font-size: 12px;
  line-height: 1.3;
  color: var(--oxrc1-muted);
}

.oxrc1-frota-section h3 {
  margin: 0 0 6px;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  /* design v86 — mesmo tracking do eyebrow-irmão (0.08em); antes 0.03em. */
  letter-spacing: 0.08em;
  color: var(--oxrc1-dim);
}

.oxrc1-frota-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 4px;
}

.oxrc1-frota-list li {
  font-size: 13px;
  line-height: 1.3;
  color: var(--oxrc1-text);
  padding: 5px 8px;
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.04);
}

.oxrc1-frota-list li strong {
  color: var(--oxrc1-text);
  font-weight: 600;
}

.oxrc1-frota-footer {
  font-size: 11px;
  line-height: 1.3;
  color: var(--oxrc1-dim);
}

/* --- Painel Vivo (ux.painel_vivo): destaque adaptativo + vida do orbi --- */
.oxrc1-frota-head {
  display: flex;
  align-items: center;
  gap: 7px;
  cursor: pointer;
  user-select: none;
  /* design v186 — Painel Vivo / cabecalho recolhivel da Frota (sidebar direita).
     Rotacao: fugi de login (v180), bolhas (v181), sidebar-esq (v182), badge (v183),
     sidebar-dir scrollbar (v184) e no da arvore do Modo Departamento (v185).
     ACHADO: .oxrc1-frota-head:hover era o UNICO :hover por opacidade do stylesheet
     inteiro (varredura confirmou 1/1) e o ULTIMO fora do contrato "sem estalo" (v160).
     O head e clicavel (abre/fecha o Painel Vivo) e sinaliza com opacity:.92 no hover —
     decisao deliberada: e um cabecalho de secao, nao uma linha de lista, e nao carrega
     padding/raio pra receber um background-plate como o irmao .oxrc1-section-toggle da
     coluna esquerda. Mas a troca ESTALAVA (sem transicao): o mesmo "estalo seco" que o
     v160 removeu de toda superficie interativa. Suavizo no idioma que o proprio arquivo
     ja usa pra opacidade — transition: opacity 160ms ease (mesma linha do
     .oxrc1-thinking-live) — + guarda de reduced-motion. RESTRICAO DELIBERADA: NAO
     converti pra background-plate (exigiria adicionar padding/border-radius = mudanca
     estrutural = reinventar, nao refinar); mantive a afordancia de opacidade, so tirei
     o estalo. So apresentacao; zero token/cor/comportamento/microcopy/data-rc1-*/markup
     novo; identidade dark warm + accent OXXY intacta. */
  transition: opacity 160ms ease;
}
.oxrc1-frota-head:hover { opacity: .92; }
@media (prefers-reduced-motion: reduce) {
  .oxrc1-frota-head { transition: none; }
}
.oxrc1-farol { font-size: 12px; line-height: 1; flex: 0 0 auto; }
.oxrc1-frota-caret { font-size: 12px; transition: transform 150ms ease; }
/* design v205 — painel direito / caret da "Linha de produção" (.oxrc1-frota-caret):
   entra no MESMO idioma de caret-de-disclosure que a casa fixou no v196 pros chevrons
   das seções da sidebar esquerda ("UM glifo-base ⌄, e a ROTAÇÃO é a única fonte da
   direção"). Achado real e render-free: o caret já carregava `transition: transform
   150ms ease` (linha acima) — a intenção clara de GIRAR suave ao recolher — mas o
   giro nunca acontecia: o toggle do JS trocava o GLIFO no braço (⌄ ↔ ›, textContent),
   um estalo instantâneo, e o `transform` jamais mudava. Resultado: transição MORTA
   (anima uma propriedade que ninguém mexe) + o ÚNICO caret do produto que troca de
   glifo em vez de girar — os dois exatos "tells" que o v196 já tinha erradicado nos
   irmãos da sidebar. Agora o JS mantém o glifo fixo em ⌄ e o estado `.is-collapsed`
   gira -90° (⌄→▸), idêntico a `.is-section-collapsed .oxrc1-section-arrow` (v196):
   a transição de 150ms que já estava lá finalmente VIVE, o caret assenta suave.
   Só apresentação: nenhum data-rc1-*/seletor/comportamento/microcopy/token/cor
   tocado (o collapse segue por `.is-collapsed` + aria-expanded, intactos); direção
   idêntica à de antes (recolhido apontava pra direita, segue pra direita), só que
   agora ANIMADA. Guardado por prefers-reduced-motion (zera o giro). */
.oxrc1-frota.is-collapsed .oxrc1-frota-caret {
  transform: rotate(-90deg);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-frota-caret { transition: none; }
}
/* recolhido: some tudo menos o cabeçalho (clique no head abre/fecha) */
.oxrc1-frota.is-collapsed > *:not(.oxrc1-frota-head) { display: none !important; }

/* O canvas do orbe (data-orbe-emocao) sobrepunha a lista "esperando você" e comia os
   cliques. Eleva o conteúdo interativo do painel acima do canvas decorativo, e faz o
   canvas do orbe não capturar cliques (é enfeite). */
.oxrc1-frota-section { position: relative; z-index: 2; }
/* orbe (#oxxy-avatar) fica clicável e ACIMA do painel — clicar nele ativa/dispensa,
   nunca fica preso. z-index alto pra não ser coberto pelas seções do painel. */
#oxxy-avatar { z-index: 6 !important; pointer-events: auto !important; }

/* % do norte pulsa verde quando SOBE (entrega acabou de rolar) */
/* design v183 — badge do norte (header do painel direito / frota) entra na convenção
   de FIGURAS VIVAS da casa. Rotação: header/badge; fugi de login (v180), bolhas (v181),
   sidebar esq (v182). ACHADO (convenção documentada, não invenção): o `.oxrc1-norte-badge`
   é uma figura numérica VIVA (aria-live — renderiza "🎯 alvo 142/326 · 44%" e reatualiza a
   cada tick do estado vivo). A casa já assentou tabular-nums em TODA outra figura viva —
   relógio do header (v62), placar (v70), contador de custo (v76), timestamp da sidebar
   (v151), meta da bolha — e este badge era o ÚLTIMO fora da convenção: com dígitos
   proporcionais a largura "dança" a cada atualização (o 1 é mais estreito que o 8), o
   tell clássico de dashboard barato. Correção: `tabular-nums` (dígitos numa coluna firme)
   + `white-space: nowrap` (garante a linha única do frota-head — nunca quebra pra 2ª linha).
   RESTRIÇÃO DELIBERADA: NÃO adicionei `overflow:hidden`/ellipsis aqui de propósito — este
   mesmo elemento carrega o glow verde do `is-bump` (text-shadow no scale); clipar a caixa
   mataria o brilho da comemoração. Preservar o delight existente > apará-lo. Zero token/cor
   novo; nenhum data-rc1-*/seletor/comportamento/microcopy/markup tocado; identidade dark
   warm + accent OXXY intacta. */
.oxrc1-norte-badge {
  display: inline-block;
  transition: color .2s ease;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.oxrc1-norte-badge.is-bump { animation: oxrc1-norte-bump 1.05s cubic-bezier(.22,1,.36,1); }
@keyframes oxrc1-norte-bump {
  0% { transform: scale(1); }
  22% { transform: scale(1.28); color: var(--oxrc1-accent); text-shadow: 0 0 12px rgba(63,208,138,.75); }
  60% { color: var(--oxrc1-accent); }
  100% { transform: scale(1); text-shadow: none; }
}
@media (prefers-reduced-motion: reduce) { .oxrc1-norte-badge.is-bump { animation: none; } }

/* ===== F1 · Modo Departamento ===== */
/* design v153 — eyebrow uppercase 11px alinhado ao tracking-padrão da casa
   (0.08em, mesmo idioma de frota-head/project-home/right-head/empty); antes .6px
   px-hardcoded destoava (0.6px vs 0.88em-equiv). Só apresentação; em escala com a fonte. */
.oxrc1-dept-launcher .oxrc1-dept-title { padding: 6px 10px; color: var(--oxrc1-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; }
.oxrc1-dept-btn, .oxrc1-dept-menu-item, .oxrc1-dept-open-panel, .oxrc1-dept-exit { cursor: pointer; }
.oxrc1-dept-current { display: flex; align-items: center; gap: 8px; padding: 8px 8px 4px; color: var(--oxrc1-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; }
.oxrc1-dept-exit { color: var(--oxrc1-muted); }
.oxrc1-tree-caret { color: var(--oxrc1-muted); margin-right: 8px; }
/* No modo departamento, o sidebar esquerdo some as seções genéricas e mostra só o depto (mantém Novo chat). */
.oxrc1-shell[data-oxxy-dept] [data-rc1-section="fixados"],
.oxrc1-shell[data-oxxy-dept] [data-rc1-section="projetos"],
.oxrc1-shell[data-oxxy-dept] [data-rc1-section="chats"],
.oxrc1-shell[data-oxxy-dept] [data-rc1-section="historico"],
.oxrc1-shell[data-oxxy-dept] [data-rc1-section="arquivados"],
.oxrc1-shell[data-oxxy-dept] .oxrc1-dept-launcher { display: none; }
/* Sidebar direito vira a árvore de arquivos; esconde progresso/linha de produção. */
.oxrc1-shell[data-oxxy-dept] [data-rc1-progress],
.oxrc1-shell[data-oxxy-dept] [data-rc1-progress-note],
.oxrc1-shell[data-oxxy-dept] [data-rc1-frota] { display: none; }
.oxrc1-dept-banner { margin: 10px 16px 0; padding: 8px 12px; border-radius: 10px; font-size: 12.5px; line-height: 1.5;
  background: rgba(255,255,255,.03); border: 1px solid var(--oxrc1-line); color: var(--oxrc1-muted); }
.oxrc1-dept-banner strong { color: var(--oxrc1-text); font-weight: 600; }
.oxrc1-dept-files { padding: 10px 14px; }
.oxrc1-dept-files-head { font-size: 11px; font-weight: 600; color: var(--oxrc1-muted); padding: 6px 4px; text-transform: uppercase; letter-spacing: 0.08em; }
/* design v185 — Modo Departamento / arvore de arquivos (.oxrc1-tree-node): a ULTIMA
   linha clicavel do produto fora dos contratos da casa. Os irmaos do launcher de
   departamento (.oxrc1-dept-btn/-menu-item/-open-panel/-exit) carregam .oxrc1-nav-action
   e ja herdam transicao (grupo v50), hover->--oxrc1-hover e press->--oxrc1-active (v96/v182).
   Mas o no da arvore de arquivos e um <div> solto que ganhou um :hover ad-hoc: cor CRUA
   rgba(255,255,255,.05) fora do token, SEM transicao (o fundo estalava — exatamente o
   "estalo seco" que o v160 tirou das superficies interativas) e SEM press (clicar abre o
   painel via data-rc1-dept-open, mas o mouse-down nao devolvia peso). Trago o MESMO idioma
   exato: --oxrc1-hover no hover, --oxrc1-active no press, transicao 150ms + guarda de
   reduced-motion. So apresentacao; nenhum data-rc1-*/comportamento/microcopy/markup/token
   novo; identidade dark warm preservada. */
.oxrc1-tree-node {
  padding: 8px 10px;
  border-radius: var(--oxrc1-radius);
  cursor: pointer;
  font-size: 13.5px;
  transition: background-color 150ms ease;
}
.oxrc1-tree-node:hover { background: var(--oxrc1-hover); }
.oxrc1-tree-node:active { background: var(--oxrc1-active); }
@media (prefers-reduced-motion: reduce) {
  .oxrc1-tree-node { transition: none; }
}
.oxrc1-tree-hint { padding: 10px; font-size: 11.5px; color: var(--oxrc1-dim); opacity: .75; }

.oxrc1-frota-pulse {
  width: 8px;
  height: 8px;
  border-radius: 999px;
  background: var(--oxrc1-dim);
  flex: 0 0 auto;
}

.oxrc1-frota-vivo[data-estado="ativo"] .oxrc1-frota-pulse {
  background: var(--oxrc1-blue);
  animation: oxrc1-frota-breathe 2.4s ease-in-out infinite;
}

.oxrc1-frota-vivo[data-estado="alerta"] .oxrc1-frota-pulse {
  background: var(--oxrc1-accent, #f5a623);
  animation: oxrc1-frota-breathe 1.2s ease-in-out infinite;
}

@keyframes oxrc1-frota-breathe {
  0%, 100% { opacity: 0.45; transform: scale(0.85); }
  50% { opacity: 1; transform: scale(1.15); }
}

.oxrc1-frota-destaque {
  padding: 9px 11px;
  border-radius: 10px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--oxrc1-line);
}

/* design v110 — sidebar direita / Painel Vivo: completa a escada de estados do
   cartão de destaque. O JS (renderFrotaPainel) emite data-estado calmo->ativo->alerta.
   O "alerta" já coordena cartão E pulso (ambos âmbar). O "ativo" tingia só o PULSO de
   azul e deixava o CARTÃO no neutro idêntico ao "calmo" — o único estado sem eco de cor
   na sua própria superfície, quebrando a leitura de escalada (neutro -> ? -> âmbar).
   Dou ao cartão "ativo" um sussurro do MESMO azul do pulso (rgb do --oxrc1-blue, a
   linguagem do anel .is-current), bem mais suave que o âmbar do alerta: "ativo" é
   confiança calma ("trabalhando, nada precisa de você"), não alarme. Reaproveita a
   transição de 200ms do v92 (assenta suave na troca de estado). Só apresentação; zero
   cor/token novo, zero data-rc1-*/seletor/comportamento/microcopy; identidade preservada. */
.oxrc1-frota-vivo[data-estado="ativo"] .oxrc1-frota-destaque {
  background: color-mix(in srgb, var(--oxrc1-blue) 6%, transparent);
  border-color: color-mix(in srgb, var(--oxrc1-blue) 22%, transparent);
}

/* design v129 — sidebar direita / Painel Vivo, estado "alerta": fecha um choque de
   cor DENTRO do mesmo cartão. O pulso, o h3 da seção e o alerta-dot deste estado já
   pintam em var(--oxrc1-accent) = #b71922 (o VERMELHO DA CASA — o token está definido,
   então o fallback ",#f5a623" nunca dispara: rendem vermelho, não âmbar). Só o FUNDO/
   borda do cartão de destaque tinha ficado num âmbar cru hardcoded (245,166,35): dois
   quentes brigando na mesma superfície. Pior, o âmbar é reservado por precedente ao
   CONTEXTO DE CÓDIGO (v109/v120 — ::selection do code block); num cartão de status ele
   lê como cor fora do sistema. O comentário do v110 até afirmava "ambos âmbar", mas o
   render sempre foi vermelho+âmbar. Unifico o cartão no MESMO vermelho da casa que seus
   3 irmãos do mesmo estado já usam (rgba(183,25,34, .10/.35), o rgb de --oxrc1-accent,
   idêntico à opacidade do ::selection e do realce do project-home). Escalada agora limpa:
   calmo (neutro) -> ativo (azul, "trabalhando, calmo") -> alerta (vermelho da casa,
   "precisa de você"). Reusa a transição de 200ms (v92/v110). Só apresentação; zero
   token/cor NOVO (o vermelho já é --oxrc1-accent); nenhum data-rc1-*/seletor/
   comportamento/microcopy tocado; identidade REFORÇADA (âmbar off-system removido). */
.oxrc1-frota-vivo[data-estado="alerta"] .oxrc1-frota-destaque {
  background: rgba(183, 25, 34, 0.10);
  border-color: rgba(183, 25, 34, 0.35);
}

.oxrc1-frota-destaque-titulo {
  margin: 0;
  font-size: 13px;
  font-weight: 600;
  color: var(--oxrc1-text);
}

.oxrc1-frota-destaque-sub {
  margin: 3px 0 0;
  font-size: 12px;
  line-height: 1.3;
  color: var(--oxrc1-muted);
}

.oxrc1-frota-section--alerta h3 {
  display: flex;
  align-items: center;
  gap: 6px;
  color: var(--oxrc1-accent, #f5a623);
}

.oxrc1-frota-alerta-dot {
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: var(--oxrc1-accent, #f5a623);
  animation: oxrc1-frota-breathe 1.2s ease-in-out infinite;
}

.oxrc1-frota-hoje {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
}

.oxrc1-frota-chip {
  font-size: 11px;
  color: var(--oxrc1-muted);
  padding: 3px 8px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.05);
}

.oxrc1-frota-tick {
  font-size: 11px;
  line-height: 1.3;
  color: var(--oxrc1-dim);
  font-variant-numeric: tabular-nums;
}

.oxrc1-shell.is-right-collapsed .oxrc1-frota {
  display: none;
}

.oxrc1-resizer {
  position: absolute;
  top: 0;
  bottom: 0;
  z-index: 200;
  width: 8px;
  cursor: col-resize;
  touch-action: none;
  background: rgba(255, 255, 255, 0.018);
}

.oxrc1-left-resizer { right: 0; }
.oxrc1-right-resizer { left: 0; }
/* design v121 — resizer hover: idioma de chrome neutro (não a cor de status "live").
   O hover do divisor de painel usava rgba(110,160,255,.08) — o MESMO --oxrc1-blue (#6ea0ff)
   reservado como semântica de "ao vivo/agora/trabalhando" (halo do passo .is-current, cartão
   .frota ativo). Um divisor é chrome estrutural, não um estado "acontecendo agora": pegar
   emprestada a cor de status para um mero hover-para-arrastar é um cruzamento semântico sutil.
   Agora brilha no PRÓPRIO idioma branco-translúcido do resizer (base .018 → hover .09), a mesma
   família do anel de chrome unificado (rgba(255,255,255,.16)). Libera o azul p/ significar só
   "live". Zero cor/token novo; nenhum data-rc1-*/seletor/comportamento/microcopy tocado. */
.oxrc1-resizer:hover { background: rgba(255, 255, 255, 0.09); }
.oxrc1-shell.is-resizing { user-select: none; cursor: col-resize; }

.oxrc1-hidden-file { display: none; }

.oxrc1-modal-layer {
  position: fixed;
  inset: 0;
  z-index: 120;
  display: grid;
  place-items: center;
  padding: 20px;
  background: rgba(0, 0, 0, 0.38);
}

.oxrc1-context-menu[hidden],
.oxrc1-engine-menu[hidden],
.oxrc1-modal-layer[hidden] {
  display: none !important;
}

.oxrc1-modal {
  width: min(420px, 100%);
  max-height: calc(100vh - 40px);
  overflow-y: auto;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 14px;
  background: #2f2f2c;
  box-shadow: 0 28px 80px rgba(0, 0, 0, 0.46);
  padding: 18px;
}

.oxrc1-modal-wide {
  width: min(760px, calc(100vw - 28px));
}

.oxrc1-modal h3 {
  margin: 0 0 8px;
  font-size: 17px;
}

.oxrc1-modal p {
  margin: 0 0 14px;
  color: var(--oxrc1-muted);
  line-height: 1.45;
}

.oxrc1-modal input,
.oxrc1-modal select {
  width: 100%;
  height: 38px;
  padding: 0 10px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 9px;
  color: var(--oxrc1-text);
  background: #242422;
}

/* design v123 — o <select> nativo dos modais (mover chat, criar chat "destino",
   anexar a projeto) herdava a caixa OXXY (bg/borda/raio/altura) mas NAO tinha
   appearance:none: o WebKit ainda desenhava a seta/chrome nativo do sistema
   dentro da caixa escura e so honrava o fundo em parte — tell classico de
   "software barato" num modal premium. Mato o chrome nativo e desenho a MINHA
   seta (chevron dim, no idioma da casa: --oxrc1-dim #928f86), reservando espaco
   a direita. Combina com o input irmao. So apresentacao; zero token/cor novo;
   nenhum data-rc1-*/seletor/comportamento/microcopy/markup tocado. */
.oxrc1-modal select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 32px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23928f86' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 10px 6px;
  cursor: pointer;
}

.oxrc1-modal dl {
  display: grid;
  grid-template-columns: 116px minmax(0, 1fr);
  gap: 8px;
  margin: 12px 0 0;
  font-size: 13px;
}

.oxrc1-modal dt { color: var(--oxrc1-dim); }
.oxrc1-modal dd { margin: 0; color: var(--oxrc1-text); overflow-wrap: anywhere; }

.oxrc1-modal-actions {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 16px;
}

.oxrc1-modal-error {
  display: block;
  margin-top: 6px;
  color: var(--oxrc1-danger);
  font-size: 12px;
}

.oxrc1-modal-actions button {
  min-height: 34px;
  padding: 0 12px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 9px;
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.05);
  cursor: pointer;
}

.oxrc1-modal-actions .is-danger {
  border-color: rgba(255, 119, 119, 0.45);
  color: #ffd1d1;
  background: rgba(255, 80, 80, 0.16);
}

.oxrc1-toast {
  position: fixed;
  left: 50%;
  bottom: 96px;
  z-index: 130;
  transform: translateX(-50%);
  max-width: min(520px, calc(100vw - 32px));
  padding: 10px 14px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 999px;
  color: var(--oxrc1-text);
  background: #343431;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06),
    0 16px 42px rgba(0, 0, 0, 0.36);
  font-size: 13px;
}

.oxrc1-project-home {
  width: min(920px, 100%);
  margin: 0 auto;
  padding: 28px 20px 110px;
  display: grid;
  gap: 18px;
}

.oxrc1-project-home-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 18px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-project-home-header span {
  display: block;
  margin-bottom: 4px; /* design v173 — ritmo eyebrow→título 4/8 (era 7px), gêmeo do right-head */
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-project-home h1,
.oxrc1-project-home h2,
.oxrc1-project-home p {
  margin: 0;
}

.oxrc1-project-home h1 {
  font-size: clamp(26px, 4vw, 42px);
  line-height: 1.05;
  letter-spacing: 0;
}

.oxrc1-project-home-header p,
.oxrc1-project-home-note,
.oxrc1-project-home-empty p {
  color: var(--oxrc1-muted);
  line-height: 1.45;
}

.oxrc1-project-home-actions,
.oxrc1-project-home-quick {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

/* design v160 — home do projeto / superfícies interativas (.oxrc1-project-home-action
   e .oxrc1-project-home-chat). As duas mudam o fundo no :hover/:focus-visible para
   --oxrc1-hover, mas eram as raras que faziam isso SEM transição — o fundo estalava
   enquanto o resto do produto desliza no idioma da casa (background-color 150ms ease,
   ~75 usos consistentes no arquivo). Alinho ambas ao mesmo 150ms ease: o hover/focus
   passa a deslizar como os irmãos (ações do composer, threads, botões). Só apresentação:
   reúso do valor de transição já padronizado, zero token/cor novo; nenhum data-rc1-*/
   seletor/comportamento/microcopy/identidade tocado. */
.oxrc1-project-home-action {
  min-height: 34px;
  padding: 0 12px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.04);
  cursor: pointer;
  transition: background-color 150ms ease;
}

.oxrc1-project-home-action:hover,
.oxrc1-project-home-action:focus-visible,
.oxrc1-project-home-chat:hover,
.oxrc1-project-home-chat:focus-visible {
  background: var(--oxrc1-hover);
}

.oxrc1-project-home-summary {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.oxrc1-project-home-summary div {
  min-width: 0;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.025);
}

.oxrc1-project-home-summary span,
.oxrc1-project-home-chat span,
.oxrc1-project-home-chat small {
  display: block;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

/* design v203 — home do projeto: RIMA do par rótulo→valor no grid 4/8.
   O v173 fixou o eyebrow do header em 4px, mas os outros pares rótulo(dim 12px)→valor
   da mesma tela ficaram em 5px off-grid: os cards-herói de número (.oxrc1-project-home-
   summary), os cards da .oxrc1-activity-summary e o eyebrow do Mission Center. Alinho as
   três a 4px: um só ritmo rótulo→valor na home. Só apresentação — reúso do 4/8 canônico
   (v173), zero token/cor novo; nenhum data-rc1-*/seletor/comportamento/markup tocado. */
.oxrc1-project-home-summary strong {
  display: block;
  margin-top: 4px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 18px;
}

.oxrc1-project-home-section {
  display: grid;
  gap: 10px;
}

.oxrc1-activity-summary {
  display: grid;
  gap: 12px;
  padding: 16px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.025);
}

.oxrc1-activity-summary header {
  display: flex;
  justify-content: space-between;
  gap: 12px;
}

.oxrc1-activity-summary header span,
.oxrc1-activity-summary-grid span {
  display: block;
  margin-bottom: 4px; /* design v203 — rima rótulo→valor no 4/8 (gêmeo do eyebrow v173) */
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-activity-summary h2 {
  font-size: 16px;
}

.oxrc1-activity-summary-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.oxrc1-activity-summary-grid article {
  min-width: 0;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.02);
}

.oxrc1-activity-summary-grid strong {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
}

.oxrc1-activity-summary-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.oxrc1-decision-center {
  display: grid;
  gap: 12px;
  padding: 16px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.02);
}

.oxrc1-decision-center header span,
.oxrc1-decision-item span,
.oxrc1-decision-item small {
  display: block;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-decision-center h2 {
  font-size: 16px;
}

.oxrc1-decision-list {
  display: grid;
  gap: 8px;
}

.oxrc1-decision-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px;
  align-items: center;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.018);
}

.oxrc1-decision-item.is-blocked {
  border-color: rgba(255, 124, 124, 0.45);
}

.oxrc1-decision-item.is-attention {
  border-color: rgba(247, 197, 102, 0.45);
}

.oxrc1-decision-item strong,
.oxrc1-decision-item p,
.oxrc1-decision-item small {
  min-width: 0;
  overflow-wrap: anywhere;
}

.oxrc1-decision-item p {
  margin: 4px 0;
}

.oxrc1-decision-actions {
  display: flex;
  justify-content: flex-end;
}

.oxrc1-decision-empty {
  padding: 12px;
  border: 1px dashed var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-dim);
}

.oxrc1-founder-queue {
  display: grid;
  gap: 12px;
}

.oxrc1-founder-queue header span,
.oxrc1-founder-queue-item span,
.oxrc1-founder-queue-item small,
.oxrc1-founder-queue-more {
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-founder-queue h2 {
  font-size: 20px;
}

.oxrc1-founder-queue-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.oxrc1-founder-queue-tabs button {
  min-height: 30px;
  padding: 0 10px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: rgba(255, 255, 255, 0.025);
  cursor: pointer;
}

.oxrc1-founder-queue-tabs button:hover,
.oxrc1-founder-queue-tabs button:focus-visible,
.oxrc1-founder-queue-tabs button.is-active {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
}

.oxrc1-founder-queue-list {
  display: grid;
  gap: 8px;
}

.oxrc1-founder-queue-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 12px;
  align-items: center;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.018);
}

.oxrc1-founder-queue-item.is-blocked {
  border-color: rgba(255, 124, 124, 0.45);
}

.oxrc1-founder-queue-item.is-attention {
  border-color: rgba(247, 197, 102, 0.45);
}

.oxrc1-founder-queue-item.is-reviewed {
  opacity: 0.76;
}

.oxrc1-founder-queue-item strong,
.oxrc1-founder-queue-item p,
.oxrc1-founder-queue-item small {
  min-width: 0;
  overflow-wrap: anywhere;
}

.oxrc1-founder-queue-item p {
  margin: 4px 0;
}

.oxrc1-founder-queue-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  justify-content: flex-end;
}

.oxrc1-founder-queue-empty {
  padding: 12px;
  border: 1px dashed var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-dim);
}

.oxrc1-founder-home {
  width: min(920px, 100%);
  margin: 0 auto;
  padding: 28px 20px 110px;
  display: grid;
  gap: 18px;
}

.oxrc1-founder-home > header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 18px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-founder-home h1,
.oxrc1-founder-home h2,
.oxrc1-founder-home p {
  margin: 0;
}

.oxrc1-founder-home h1 {
  font-size: clamp(26px, 4vw, 42px);
  line-height: 1.05;
  letter-spacing: 0;
}

.oxrc1-founder-home header span,
.oxrc1-founder-home-item span,
.oxrc1-founder-home-item small,
.oxrc1-founder-home-block header p {
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-founder-home-block {
  display: grid;
  gap: 10px;
}

.oxrc1-founder-home-list {
  display: grid;
  gap: 8px;
}

.oxrc1-founder-home-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px;
  align-items: center;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.018);
}

.oxrc1-founder-home-item.is-blocked {
  border-color: rgba(255, 124, 124, 0.45);
}

.oxrc1-founder-home-item.is-reviewed {
  opacity: 0.78;
}

.oxrc1-founder-home-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  justify-content: flex-end;
}

.oxrc1-founder-home-empty {
  padding: 12px;
  border: 1px dashed var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-dim);
}

.oxrc1-decision-review {
  display: grid;
  gap: 14px;
}

.oxrc1-decision-review header span,
.oxrc1-decision-review dt {
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-decision-review h2 {
  font-size: 20px;
}

.oxrc1-decision-review p,
.oxrc1-decision-review dd {
  overflow-wrap: anywhere;
}

.oxrc1-decision-review-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.oxrc1-decision-review-badges span {
  padding: 5px 9px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 999px;
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.035);
  font-size: 12px;
}

.oxrc1-decision-review dl {
  display: grid;
  grid-template-columns: 160px minmax(0, 1fr);
  gap: 8px 12px;
}

.oxrc1-decision-review dd {
  margin: 0;
}

.oxrc1-decision-review-artifact {
  display: grid;
  gap: 10px;
}

.oxrc1-decision-review-artifact article {
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.02);
}

.oxrc1-decision-review-artifact h4 {
  margin-bottom: 6px;
}

.oxrc1-mission-center {
  display: grid;
  gap: 12px;
  padding: 16px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.02);
}

.oxrc1-mission-center-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 12px;
}

.oxrc1-mission-center-head span {
  display: block;
  margin-bottom: 4px; /* design v203 — eyebrow gêmeo do header no ritmo 4/8 (v173) */
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-mission-center-head h2,
.oxrc1-mission-empty h3 {
  margin: 0;
  font-size: 16px;
}

.oxrc1-mission-list {
  display: grid;
  gap: 8px;
}

.oxrc1-mission-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px;
  align-items: center;
  min-width: 0;
  padding: 11px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(0, 0, 0, 0.08);
}

.oxrc1-mission-item span,
.oxrc1-mission-item small {
  display: block;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-mission-item span {
  width: fit-content;
  max-width: 100%;
  padding: 3px 7px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 999px;
  color: var(--oxrc1-text);
  background: rgba(255, 255, 255, 0.04);
}

.oxrc1-mission-item strong,
.oxrc1-mission-item p,
.oxrc1-mission-item small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-mission-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 7px;
}

.oxrc1-mission-empty {
  display: grid;
  gap: 9px;
  padding: 14px;
  border: 1px dashed var(--oxrc1-line-strong);
  border-radius: var(--oxrc1-radius);
}

.oxrc1-mission-empty p {
  color: var(--oxrc1-muted);
  line-height: 1.45;
}

.oxrc1-mission-detail {
  display: grid;
  gap: 14px;
}

.oxrc1-mission-detail dl {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  gap: 8px 14px;
  margin: 0;
}

.oxrc1-mission-detail dt {
  color: var(--oxrc1-dim);
}

.oxrc1-mission-detail dd {
  margin: 0;
}

.oxrc1-mission-detail ol {
  margin: 0;
  padding-left: 18px;
  color: var(--oxrc1-muted);
}

.oxrc1-planner-panel,
.oxrc1-planner-confirm {
  display: grid;
  gap: 10px;
  margin-top: 14px;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.025);
}

.oxrc1-planner-panel h4,
.oxrc1-planner-panel p,
.oxrc1-planner-confirm p {
  margin: 0;
}

.oxrc1-planner-panel span {
  display: inline-block;
  width: fit-content;
  padding: 3px 7px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 999px;
  color: var(--oxrc1-dim);
  font-size: 11px;
}

.oxrc1-planner-panel ul,
.oxrc1-planner-panel ol,
.oxrc1-planner-confirm ul {
  margin: 0;
  padding-left: 18px;
  color: var(--oxrc1-muted);
}

.oxrc1-planner-panel small {
  color: var(--oxrc1-dim);
}

.oxrc1-mission-funnel {
  display: grid;
  gap: 14px;
}

.oxrc1-funnel-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 12px;
  align-items: start;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--oxrc1-line);
}

.oxrc1-funnel-head span,
.oxrc1-funnel-head small {
  display: block;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-funnel-head h4 {
  margin: 3px 0 7px;
  font-size: 18px;
  line-height: 1.2;
}

.oxrc1-funnel-head p {
  margin: 0;
}

.oxrc1-funnel-head strong {
  align-self: start;
  white-space: nowrap;
  padding: 5px 9px;
  border: 1px solid rgba(120, 180, 150, 0.42);
  border-radius: 999px;
  color: #d9f7e4;
  background: rgba(62, 132, 95, 0.16);
  font-size: 12px;
}

.oxrc1-funnel-head small {
  grid-column: 1 / -1;
}

.oxrc1-funnel-steps {
  display: grid;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.oxrc1-funnel-steps li {
  display: grid;
  grid-template-columns: 126px minmax(0, 1fr);
  gap: 12px;
  align-items: start;
  padding: 11px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.018);
}

.oxrc1-funnel-steps li > span {
  width: fit-content;
  max-width: 100%;
  padding: 4px 8px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 999px;
  color: var(--oxrc1-muted);
  font-size: 12px;
}

.oxrc1-funnel-steps li.is-completed > span {
  border-color: rgba(120, 180, 150, 0.46);
  color: #d9f7e4;
}

.oxrc1-funnel-steps li.is-running > span {
  border-color: rgba(120, 168, 255, 0.54);
  color: #dbe7ff;
}

.oxrc1-funnel-steps li.is-blocked > span,
.oxrc1-funnel-steps li.is-failed > span {
  border-color: rgba(255, 150, 120, 0.48);
  color: #ffdccc;
}

.oxrc1-funnel-steps strong,
.oxrc1-funnel-steps p,
.oxrc1-funnel-steps small {
  display: block;
  min-width: 0;
}

.oxrc1-funnel-steps strong {
  font-size: 14px;
}

.oxrc1-funnel-steps p,
.oxrc1-funnel-result p {
  margin: 3px 0 0;
  color: var(--oxrc1-muted);
}

.oxrc1-funnel-steps small {
  margin-top: 5px;
  color: var(--oxrc1-dim);
  font-size: 12px;
}

.oxrc1-funnel-result,
.oxrc1-funnel-history {
  display: grid;
  gap: 9px;
  padding: 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.02);
}

.oxrc1-funnel-result h4,
.oxrc1-funnel-history h4 {
  margin: 0;
  font-size: 14px;
}

.oxrc1-funnel-result article {
  display: grid;
  gap: 6px;
}

.oxrc1-funnel-result ul,
.oxrc1-funnel-history ol {
  margin: 0;
  padding-left: 18px;
  color: var(--oxrc1-muted);
}

.oxrc1-funnel-result small {
  color: var(--oxrc1-dim);
}

.oxrc1-funnel-affected-files {
  display: grid;
  gap: 6px;
}

.oxrc1-funnel-affected-files span {
  padding: 8px 10px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: rgba(255, 255, 255, 0.04);
  font-size: 12px;
  line-height: 1.4;
}

.oxrc1-funnel-result pre {
  margin: 0;
  padding: 10px;
  overflow: auto;
  white-space: pre-wrap;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-muted);
  background: rgba(0, 0, 0, 0.16);
  font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}

.oxrc1-project-home-section h2,
.oxrc1-project-home-empty h2 {
  font-size: 16px;
  line-height: 1.25;
}

.oxrc1-project-home-list {
  display: grid;
  gap: 7px;
}

.oxrc1-project-home-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 8px;
  align-items: center;
}

.oxrc1-project-home-chat {
  min-width: 0;
  min-height: 48px;
  padding: 9px 10px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-text);
  background: transparent;
  text-align: left;
  cursor: pointer;
  transition: background-color 150ms ease;
}

.oxrc1-project-home-chat strong,
.oxrc1-project-home-chat span,
.oxrc1-project-home-chat small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-project-home-empty {
  display: grid;
  gap: 10px;
  padding: 22px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.025);
}

@media (max-width: 920px) {
  .oxrc1-shell {
    grid-template-columns: minmax(0, 1fr);
  }

  .oxrc1-chat {
    grid-column: 1;
  }

  .oxrc1-left,
  .oxrc1-right {
    grid-column: 1;
  }

  .oxrc1-project-home {
    padding: 22px 14px 112px;
  }

  .oxrc1-project-home-header {
    display: grid;
  }

  .oxrc1-project-home-summary {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .oxrc1-activity-summary-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .oxrc1-mission-center-head,
  .oxrc1-mission-item,
  .oxrc1-decision-item {
    display: grid;
    grid-template-columns: 1fr;
  }

  .oxrc1-mission-actions,
  .oxrc1-decision-actions {
    justify-content: flex-start;
  }

  .oxrc1-decision-review dl {
    grid-template-columns: 1fr;
  }

  .oxrc1-funnel-head,
  .oxrc1-funnel-steps li {
    grid-template-columns: 1fr;
  }

  .oxrc1-funnel-head strong {
    width: fit-content;
  }

  .oxrc1-left,
  .oxrc1-right {
    position: fixed;
    top: 0;
    bottom: 0;
    z-index: 100;
    width: min(84vw, 320px);
    transform: translateX(-105%);
    transition: transform 160ms ease;
    box-shadow: 0 22px 80px rgba(0, 0, 0, 0.4);
  }

  .oxrc1-left { left: 0; }
  .oxrc1-right {
    right: 0;
    left: auto;
    transform: translateX(105%);
  }

  .oxrc1-shell.is-mobile-left-open .oxrc1-left,
  .oxrc1-shell.is-mobile-right-open .oxrc1-right {
    transform: translateX(0);
  }

  .oxrc1-backdrop {
    position: fixed;
    inset: 0;
    z-index: 90;
    background: rgba(0, 0, 0, 0.44);
  }

  .oxrc1-backdrop[hidden] {
    display: none;
  }

  .oxrc1-drawer-button,
  .oxrc1-mobile-close {
    display: grid;
  }

  .oxrc1-resizer {
    display: none;
  }

  .oxrc1-shell.is-left-collapsed .oxrc1-left,
  .oxrc1-shell.is-right-collapsed .oxrc1-right {
    align-items: stretch;
  }

  .oxrc1-shell.is-left-collapsed .oxrc1-logo-frame,
  .oxrc1-shell.is-left-collapsed .oxrc1-nav-action strong,
  .oxrc1-shell.is-left-collapsed .oxrc1-search input,
  .oxrc1-shell.is-left-collapsed .oxrc1-search span,
  .oxrc1-shell.is-left-collapsed .oxrc1-left-section,
  .oxrc1-shell.is-left-collapsed .oxrc1-user div,
  .oxrc1-shell.is-left-collapsed .oxrc1-settings strong,
  .oxrc1-shell.is-right-collapsed .oxrc1-right-head div,
  .oxrc1-shell.is-right-collapsed .oxrc1-progress,
  .oxrc1-shell.is-right-collapsed .oxrc1-progress-note {
    display: revert;
  }

  .oxrc1-shell.is-left-collapsed .oxrc1-logo-frame {
    width: 118px;
    height: 44px;
    overflow: visible;
    padding: 3px 0;
  }

  .oxrc1-shell.is-left-collapsed .oxrc1-brand {
    width: auto;
    max-width: calc(100% - 34px);
  }

  .oxrc1-shell.is-left-collapsed .oxrc1-logo-frame img {
    width: auto;
    max-width: 118px;
    max-height: 38px;
    object-fit: contain;
    transform: none;
  }

  .oxrc1-chat-topbar {
    flex-wrap: wrap;
    /* border-bottom-color promovido pra regra base no design v97 (fronteira do chrome
       consistente em todos os breakpoints) — override redundante removido aqui. */
  }

  .oxrc1-topbar-left {
    order: 1;
    flex: 1 1 calc(100% - 92px);
  }

  .oxrc1-topbar-center {
    order: 3;
    flex: 1 1 auto;
    justify-content: flex-start;
  }

  .oxrc1-topbar-right {
    order: 2;
    flex: 0 0 auto;
  }

  .oxrc1-center-tabs {
    order: 1;
  }

  .oxrc1-center-tab {
    min-width: 54px;
  }

  .oxrc1-title {
    flex: 1 1 150px;
  }

  .oxrc1-cost-counter {
    max-width: none;
  }

  .oxrc1-topbar-actions {
    order: 2;
  }

  .oxrc1-browser-bar {
    grid-template-columns: 34px 34px minmax(0, 1fr);
    padding-inline: 10px;
  }

  .oxrc1-browser-go {
    grid-column: 1 / -1;
  }

  .oxrc1-browser-fallback {
    align-items: flex-start;
    flex-direction: column;
    padding-inline: 10px;
  }

  .oxrc1-composer {
    width: calc(100% - 20px);
    grid-template-columns: 1fr;
  }

  .oxrc1-composer-tools,
  .oxrc1-composer-actions {
    justify-content: space-between;
  }

  .oxrc1-engine-menu,
  .oxrc1-context-menu {
    max-width: calc(100vw - 16px);
  }
}

/* PA-3 Pensar Alto: live "thinking" strip. Same palette as .oxrc1-thinking. */
.oxrc1-thinking-live {
  max-width: min(100%, 680px);
  margin: 0 0 2px 40px;
  border: 1px solid rgba(142, 174, 160, 0.22);
  border-radius: var(--oxrc1-radius);
  background: rgba(142, 174, 160, 0.055);
  color: var(--oxrc1-muted);
  font-size: 13px;
  transition: opacity 160ms ease;
}

.oxrc1-thinking-live summary {
  min-height: 32px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 10px;
  cursor: pointer;
  color: #c9d5ce;
  font-weight: 560;
  letter-spacing: 0;
  animation: oxrc1-thinking-live-pulse 1800ms ease-in-out infinite;
}

.oxrc1-thinking-live summary::marker {
  color: #8faca2;
}

.oxrc1-thinking-live-body {
  min-height: 24px;
  max-height: 260px;
  overflow-y: auto;
  padding: 0 12px 10px;
  color: #b8c3bd;
  white-space: pre-wrap;
  font-size: 0.92em;
  line-height: 1.5;
}

@keyframes oxrc1-thinking-live-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.72; }
}

/* design v50 — sidebar esquerdo: microtransições rest->hover->ativo (150ms) + press tátil */
.oxrc1-left .oxrc1-icon-button,
.oxrc1-nav-action,
.oxrc1-search,
.oxrc1-search-result,
.oxrc1-search-more,
.oxrc1-section-toggle,
.oxrc1-section-head > button:not(.oxrc1-section-toggle),
.oxrc1-thread,
.oxrc1-account-trigger,
.oxrc1-settings,
.oxrc1-account-menu button {
  transition: background-color 150ms ease, color 150ms ease, box-shadow 150ms ease;
}

.oxrc1-nav-action:active,
.oxrc1-section-toggle:active,
.oxrc1-thread:active,
.oxrc1-account-trigger:active,
.oxrc1-account-menu button:not([aria-disabled="true"]):active {
  background: var(--oxrc1-active);
}

/* design v182 — sidebar esquerda / painel de busca (5ª volta): fecha o contrato tátil
   das linhas de resultado. Rotação: fugi do login (v180), das bolhas (v181) e do
   corpo da sidebar (v96 fechou nav-action/section-toggle/thread/account/+Novo projeto).
   Reauditoria de designer atrás do último tell REAL de press na coluna esquerda.

   Achado (feedback tátil — exatamente o padrão que o v96 documentou): as linhas do
   painel de busca — .oxrc1-search-result (cada conversa achada) e .oxrc1-search-more
   ("Mostrar mais") — JÁ entram no contrato de TRANSIÇÃO (grupo v50, background-color
   150ms) e no de HOVER (acendem pra --oxrc1-hover/--oxrc1-text), mas nunca foram
   incluídas no contrato de PRESS. Resultado: têm a transição preparada pra um afundar
   que nunca acontece — clicar um resultado de busca pra pular pra conversa não devolve
   nenhuma pressão, enquanto TODA outra linha clicável da mesma coluna afunda pra
   --oxrc1-active. São geradas por JS dentro do painel, então escaparam das varreduras
   de press anteriores (que miraram o markup estático). Completo o sistema com o MESMO
   --oxrc1-active dos irmãos — nenhum número/token/cor novo.

   Só apresentação — ZERO data-rc1-*/seletor estrutural/comportamento/microcopy tocado;
   identidade (dark, gradiente OXXY) preservada. (transição já é coberta por reduced-motion
   no bloco existente; :active é troca de estado instantânea, não animação — igual aos
   irmãos, sem guarda extra.) */
.oxrc1-search-result:active,
.oxrc1-search-more:active {
  background: var(--oxrc1-active);
}

.oxrc1-left .oxrc1-icon-button:active {
  background: var(--oxrc1-active);
  transform: translateY(0.5px);
}

/* design v168 — engrenagem da conta (account gear, rodapé da sidebar esquerda): tell tátil.
   O gear (.oxrc1-settings) e seu irmão imediato no rodapé (.oxrc1-account-trigger) abrem o
   MESMO menu, compartilham o mesmo realce de hover (--oxrc1-hover) e a mesma transição de
   150ms — mas só o trigger afundava no clique (:active → --oxrc1-active). Clicar a engrenagem
   não dava nenhum retorno de pressão enquanto o vizinho colado afundava, e enquanto TODOS os
   icon-buttons da coluna esquerda também afundam. Última superfície de clique do rodapé fora
   do idioma tátil da casa. Agora o gear afunda no mesmo passo (reúso exato de --oxrc1-active,
   nenhum número/token/cor novo). Só apresentação: nenhum data-rc1-*, seletor, comportamento,
   microcopy ou identidade tocado. (reduced-motion já cobre .oxrc1-settings na guarda existente.) */
.oxrc1-settings:active {
  background: var(--oxrc1-active);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-thinking-live {
    transition: none;
  }
  .oxrc1-thinking-live summary {
    animation: none;
  }
  .oxrc1-left .oxrc1-icon-button,
  .oxrc1-nav-action,
  .oxrc1-search,
  .oxrc1-search-result,
  .oxrc1-search-more,
  .oxrc1-section-toggle,
  .oxrc1-section-head > button:not(.oxrc1-section-toggle),
  .oxrc1-thread,
  .oxrc1-account-trigger,
  .oxrc1-settings,
  .oxrc1-account-menu button {
    transition: none;
  }
  .oxrc1-left .oxrc1-icon-button:active {
    transform: none;
  }
}


/* design v51 — header/topbar: consistência das microtransições (150ms) + press tátil,
   estendendo o tratamento do sidebar v50 às abas centrais e aos icon-buttons do topbar.
   Só apresentação — nenhum data-rc1-* ou comportamento tocado. */
.oxrc1-center-tab,
.oxrc1-chat-topbar .oxrc1-icon-button {
  transition: background-color 150ms ease, color 150ms ease,
    border-color 150ms ease, box-shadow 150ms ease;
}

.oxrc1-center-tab:active {
  background: var(--oxrc1-active);
}

.oxrc1-chat-topbar .oxrc1-icon-button:active {
  background: var(--oxrc1-active);
  transform: translateY(0.5px);
}

/* design v197 — header/topbar: estado ABERTO do gatilho de menu ⋯ (mais opções da conversa).
   Rotação: header/badge. ACHADO (tell REAL de consistência, não invenção): a casa mantém TODO
   gatilho de popover ACESO enquanto seu menu está aberto via `[aria-expanded="true"]` — o
   `.oxrc1-account-trigger` e o `.oxrc1-settings` (v?, l.850) e o `.oxrc1-engine-button` (l.2125)
   acendem em token quando abertos, pra que o gatilho não apague no instante em que o cursor sai
   dele pra entrar no próprio menu. MAS o ⋯ (`data-rc1-current-more`) — que TAMBÉM abre um menu de
   contexto e JÁ alterna `aria-expanded` no JS (true ao abrir / false ao fechar, sem estado preso) —
   era o ÚNICO gatilho de menu do topbar sem esse aceso: ao abrir o menu da conversa, o ⋯ voltava
   ao muted de repouso enquanto seu menu seguia aberto (o hover só o segurava sob o cursor).
   Correção: acende em `var(--oxrc1-hover)` + `color: var(--oxrc1-text)` enquanto aberto — o MESMO
   token do hover do próprio botão e do open-state do account-trigger (paridade exata). Escopo
   deliberadamente restrito ao `[data-rc1-current-more]`: os irmãos ☰/◷ do topbar também carregam
   `aria-expanded="true"` (refletem o painel aberto, default no desktop) e NÃO devem acender à toa.
   `:active` (pseudo-classe) vence na cascata → o press segue afundando no `--oxrc1-active`.
   Só apresentação: nenhum data-rc1-* quebrado (uso o atributo como seletor, não o removo),
   zero comportamento/microcopy/token novo tocado; identidade dark warm + accent OXXY intacta. */
.oxrc1-chat-topbar .oxrc1-icon-button[data-rc1-current-more][aria-expanded="true"] {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-center-tab,
  .oxrc1-chat-topbar .oxrc1-icon-button {
    transition: none;
  }
  .oxrc1-chat-topbar .oxrc1-icon-button:active {
    transform: none;
  }
}


/* design v52 — composer do chat: fecha a lacuna das microtransições (v50 sidebar / v51 header)
   e resolve dois "tells" do input mais usado do produto. Só apresentação —
   nenhum data-rc1-* ou comportamento tocado. Identidade preservada (dark warm + accent OXXY). */

/* 1) microtransições consistentes (150ms) nos controles do composer */
.oxrc1-composer .oxrc1-tool,
.oxrc1-composer .oxrc1-send,
.oxrc1-composer .oxrc1-engine-button,
.oxrc1-composer .oxrc1-persona-button {
  transition: background-color 150ms ease, color 150ms ease,
    border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease;
}

/* 2) foco no composer: digitar não dava nenhum retorno visual. Agora a borda
   sobe e um anel neutro sutil aparece (premium, sem virar vermelho de "erro"). */
.oxrc1-composer {
  transition: border-color 180ms ease, box-shadow 180ms ease;
}

.oxrc1-composer:focus-within {
  border-color: rgba(255, 255, 255, 0.26);
  box-shadow: 0 18px 48px rgba(0, 0, 0, 0.28), 0 0 0 1px rgba(255, 255, 255, 0.07);
}

/* 3) botão Enviar (primário preenchido): o hover compartilhado o rebaixava para
   o tratamento de botão-fantasma (fundo escuro). Agora ele CLAREIA e ganha leve
   elevação; press afunda. Continua sendo o CTA. */
.oxrc1-composer .oxrc1-send:hover {
  background: #ffffff;
  color: #1f1f1d;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.30);
}

.oxrc1-composer .oxrc1-send:active {
  background: #e9e7df;
  color: #1f1f1d;
  box-shadow: none;
  transform: translateY(0.5px);
}

/* press tátil nos demais controles do composer (igual sidebar/header) */
.oxrc1-composer .oxrc1-tool:active,
.oxrc1-composer .oxrc1-engine-button:active,
.oxrc1-composer .oxrc1-persona-button:active {
  background: var(--oxrc1-active);
}

/* 4) foco de teclado visível nos controles do composer (acessibilidade)
   design v126 — o toggle Perguntar/Agir (.oxrc1-modo-option) é o único
   controle do composer que faltava nesta lista: sem a regra, o foco de
   teclado caía no outline azul global (2px offset) em vez do anel branco
   suave que TODOS os irmãos do composer usam. Agora rima com o sistema. */
.oxrc1-composer .oxrc1-tool:focus-visible,
.oxrc1-composer .oxrc1-send:focus-visible,
.oxrc1-composer .oxrc1-engine-button:focus-visible,
.oxrc1-composer .oxrc1-persona-button:focus-visible,
.oxrc1-composer .oxrc1-modo-option:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-composer,
  .oxrc1-composer .oxrc1-tool,
  .oxrc1-composer .oxrc1-send,
  .oxrc1-composer .oxrc1-engine-button,
  .oxrc1-composer .oxrc1-persona-button,
  .oxrc1-composer .oxrc1-modo-option {
    transition: none;
  }
  .oxrc1-composer .oxrc1-send:active {
    transform: none;
  }
}

/* design v53 — bolhas de mensagem: fecha os "tells" de barato do turno de conversa.
   5ª rodada da rotação (login v?/sidebar v50/header v51/composer v52 -> bolhas v53).
   Só apresentação — nenhum data-rc1-* ou comportamento tocado. O streaming só muta o
   textContent da .oxrc1-bubble; o <article>.oxrc1-message persiste, então a animação de
   entrada dispara uma vez por turno. Identidade preservada (dark warm + accent OXXY). */

/* 1) entrada suave do turno: mensagens surgiam instantâneas (pop). Agora sobem 6px e
   fazem fade em ~220ms — o "assentar" premium de chat caro. Guardado por reduced-motion. */
@keyframes oxrc1-msg-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}
.oxrc1-message {
  animation: oxrc1-msg-in 220ms ease-out both;
}

/* 2) profundidade do card do usuário: era chapado (#2a2a28 + 1px linha), destoando do
   composer que ganhou elevação no v52. Lift sutil + transição pros estados (pending/failed)
   deixarem de "estalar" e passarem a easing. */
.oxrc1-message.is-user .oxrc1-bubble {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
  transition: background-color 180ms ease, border-color 180ms ease,
    box-shadow 180ms ease, opacity 180ms ease;
}

/* 3) pending lia como "apagado/quebrado" (opacity chapada). Agora respira devagar —
   sinaliza "trabalhando", não "erro". Reduced-motion cai no estático 0.82 já existente. */
@keyframes oxrc1-pending-pulse {
  0%, 100% { opacity: 0.62; }
  50%      { opacity: 0.86; }
}
.oxrc1-message.is-pending .oxrc1-bubble {
  animation: oxrc1-pending-pulse 1.6s ease-in-out infinite;
}

/* 4) falha era só uma borda fininha vermelha (fácil de perder). Adiciona um wash
   vermelho de baixíssima alpha no card do usuário — claro sem ser alarmante. */
.oxrc1-message.is-failed.is-user .oxrc1-bubble {
  background: rgba(255, 127, 127, 0.06);
}

/* 5) disclosure de raciocínio (.oxrc1-thinking summary) é clicável e não tinha nenhum
   retorno de hover/foco. Ganha realce sutil + foco de teclado visível (acessibilidade). */
.oxrc1-thinking summary {
  border-radius: var(--oxrc1-radius);
  transition: background-color 150ms ease, color 150ms ease;
}
.oxrc1-thinking summary:hover {
  background: rgba(142, 174, 160, 0.10);
  color: #dbe5df;
}
.oxrc1-thinking summary:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(142, 174, 160, 0.30);
}

/* 6) botão Copiar do bloco de código não tinha hover/press nem foco visível. */
.oxrc1-copy {
  transition: background-color 150ms ease, color 150ms ease;
}
.oxrc1-copy:hover {
  background: rgba(255, 255, 255, 0.09);
  color: var(--oxrc1-text);
}
.oxrc1-copy:active {
  background: var(--oxrc1-active);
}
.oxrc1-copy:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-message { animation: none; }
  .oxrc1-message.is-user .oxrc1-bubble { transition: none; }
  .oxrc1-message.is-pending .oxrc1-bubble { animation: none; opacity: 0.82; }
  .oxrc1-thinking summary,
  .oxrc1-copy { transition: none; }
}

/* design v181 — bolhas de mensagem: as PÍLULAS DE DOWNLOAD (.oxrc1-pdf-download
   vermelha "Baixar PDF" / .oxrc1-image-download azul "Baixar") eram os únicos
   CTAs da linha de meta sem contrato de estado. O irmão .oxrc1-copy (v53/v69) já
   tinha hover+press+transição; estas duas âncoras coloridas ficavam INERTES ao
   mouse — sem realce ao passar, sem afundar ao clicar — o "tell de barato" que a
   casa persegue (o anel de foco de teclado elas já herdam do a:focus-visible
   canônico do topo). Fecho o contrato no MESMO idioma do copy: 150ms ease, hover
   ILUMINA o próprio preenchimento (não troca a cor — reforça a identidade
   vermelha/azul), press assenta um tom, a borda ganha um fio de luz. Só
   apresentação; zero token/cor novo (reúso dos mesmos rgba / --oxrc1-blue),
   nenhum data-rc1-*/comportamento/microcopy/markup; reduced-motion respeitado. */
.oxrc1-pdf-download,
.oxrc1-image-download {
  transition: background-color 150ms ease, border-color 150ms ease;
}
.oxrc1-pdf-download:hover {
  background: rgba(183, 25, 34, 1);
  border-color: rgba(255, 255, 255, 0.22);
}
.oxrc1-pdf-download:active {
  background: rgba(150, 20, 28, 0.95);
}
.oxrc1-image-download:hover {
  background: color-mix(in srgb, var(--oxrc1-blue) 88%, transparent);
  border-color: rgba(255, 255, 255, 0.22);
}
.oxrc1-image-download:active {
  background: color-mix(in srgb, var(--oxrc1-blue) 78%, transparent);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-pdf-download,
  .oxrc1-image-download { transition: none; }
}

/* ===================== design v54 — home do projeto ===================== */
/* Rotacao: login (v50) -> sidebar esq -> header (v51) -> composer (v52) ->
   bolhas (v53) -> HOME DO PROJETO (v54). Superficie de "aterrissagem" do
   projeto: a primeira coisa que o Founder ve ao abrir um projeto. So
   apresentacao e microdetalhe; nenhum seletor data-rc1-* nem comportamento
   tocado. Mesma linguagem do v53 (transicoes 150-180ms, foco salvia,
   elevacao sutil, guardas de reduced-motion). Identidade preservada. */

/* 1) entrada: a home surgia instantanea (pop). Agora assenta -- fade + sobe
   8px em 240ms (superficie de pagina inteira, um tico mais ampla que a bolha
   de 6px do v53). Guardado por reduced-motion. */
@keyframes oxrc1-home-in {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
.oxrc1-project-home {
  animation: oxrc1-home-in 240ms ease-out both;
}

/* 2) eyebrow "Projeto atual" era so 12px dim minusculo, sem o tratamento
   premium de sobrescrito (Linear/Vercel). Vira uppercase, tracked-out e
   semibold -- da hierarquia sem pesar. */
.oxrc1-project-home-header span {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  font-size: 11px;
}

/* 3) cards de numero (Chats/Fixados/Recentes/Sessao) eram chapados
   (rgba .025 + 1px linha), destoando da elevacao que composer/bolha ganharam.
   Ganham lift sutil + borda um tico mais viva -- os numeros-heroi deixam de
   parecer flat. */
.oxrc1-project-home-summary div {
  border-color: var(--oxrc1-line-strong);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.14);
}

/* 4) botoes de acao e linhas de chat trocavam o fundo no hover sem transicao
   (estalo). Agora fazem easing; e o foco de teclado ganha anel salvia proprio
   (antes hover == foco, indistinguivel pra quem navega por teclado). */
.oxrc1-project-home-action,
.oxrc1-project-home-chat {
  transition: background-color 150ms ease, border-color 150ms ease,
    box-shadow 150ms ease;
}
/* design v130 — home do projeto: migra o anel de foco de teclado pro token canônico
   do app. Rotação: header/topbar (confirmado impecável nesta volta) -> HOME DO PROJETO.
   ACHADO (tell REAL de consistência, não invenção): o app inteiro padronizou o foco de
   teclado num anel INTERNO NEUTRO `box-shadow: 0 0 0 2px rgba(255,255,255,.16); outline:0`
   — composer (v52), browser (v63), menus (v64), modais (v58), abas+icon-buttons do header
   (v75) e a COLUNA ESQUERDA inteira (v76): 13 usos do MESMO literal. A home do projeto é a
   única superfície que ficou pra trás: seus controles (ações, linhas de chat, a ação
   primária com barra-accent e o primário do empty-state) ainda carregam um anel SÁLVIA
   `rgba(142,174,160,.30)` — emprestado da paleta da tira "Pensar Alto" (.oxrc1-thinking),
   onde o sálvia É a cor do componente. Aqui não é: a paleta da home é neutra + accent OXXY
   (vermelho da casa na ação primária). Resultado concreto: ao tabular da sidebar (anel
   branco) PRA DENTRO da home, o indicador de foco TROCA DE COR no meio do fluxo — exatamente
   o "tell" de default que v75/v76 fecharam em todo o resto. Migro os 3 focos da home pro
   anel branco canônico (mantendo as barras-accent nas primárias intactas); o anel sálvia
   fica SÓ na tira de pensamento, onde é internamente coerente. Zero token/cor novo (reuso o
   literal já usado 13×); nenhum data-rc1-*/seletor/comportamento/microcopy tocado; identidade
   (dark warm + accent OXXY) preservada — só troco um anel forasteiro pelo token do sistema. */
.oxrc1-project-home-action:focus-visible,
.oxrc1-project-home-chat:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

/* 5) linha de chat: hover so preenchia o fundo. Ganha tambem a borda mais
   viva -- afordancia mais clara de "isto e clicavel". */
.oxrc1-project-home-chat:hover {
  border-color: var(--oxrc1-line-strong);
}

/* 6) empty state ("Nenhum chat neste projeto ainda") era um card cru alinhado
   a esquerda. Centraliza, respira mais e ganha profundidade sutil -- vira um
   estado desenhado, nao um placeholder. */
.oxrc1-project-home-empty {
  justify-items: center;
  text-align: center;
  padding: 30px 22px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.14);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-project-home { animation: none; }
  .oxrc1-project-home-action,
  .oxrc1-project-home-chat { transition: none; }
}

/* ------------------------------------------------------------------ *
 * design v57 -- sidebar direita ("Progresso"). Painel sempre presente;
 * so apresentacao/microdetalhe, zero data-rc1-*, zero comportamento.
 * ------------------------------------------------------------------ */

/* 1) o passo ATUAL do progresso era estatico -- nenhum sinal de "trabalhando".
   Um produto senior da vida ao estado em curso: o ponto do passo corrente
   respira num halo sutil, mantendo o anel interno ja existente. Le como
   "isto esta acontecendo agora" sem chamar atencao demais. */
@keyframes oxrc1-progress-live {
  0%, 100% {
    box-shadow: inset 0 0 0 5px color-mix(in srgb, var(--oxrc1-blue) 24%, transparent),
      0 0 0 0 color-mix(in srgb, var(--oxrc1-blue) 0%, transparent);
  }
  50% {
    box-shadow: inset 0 0 0 5px color-mix(in srgb, var(--oxrc1-blue) 32%, transparent),
      0 0 0 4px color-mix(in srgb, var(--oxrc1-blue) 14%, transparent);
  }
}
.oxrc1-progress li.is-current span {
  animation: oxrc1-progress-live 1800ms ease-in-out infinite;
}

/* 2) a nota de rodape do progresso ("Pronto para comecar.") era so uma borda
   sobre fundo transparente -- lia como placeholder solto. Ganha uma superficie
   discreta (mesma linguagem de elevacao do composer/cards): vira um chip de
   status assentado no rodape do painel. */
.oxrc1-progress-note {
  background: rgba(255, 255, 255, 0.02);
}

/* 3) o resizer (divisa arrastavel das laterais) trocava de cor no hover num
   estalo seco. Agora faz easing de 150ms -- micro-afordancia suave, consistente
   com o resto das transicoes. Aplica aos dois resizers (esq+dir): melhoria
   simetrica de chrome. */
.oxrc1-resizer {
  transition: background-color 150ms ease;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-progress li.is-current span { animation: none; }
  .oxrc1-resizer { transition: none; }
}


/* design v58 -- modais/dialogs. 8a rodada da rotacao (login/sidebar/header/composer/
   bolhas/home/sidebar-direita -> modais v58). So apresentacao: nenhum data-rc1-*,
   seletor ou comportamento tocado. Os modais sao (re)construidos e re-anexados a
   [data-rc1-modal-layer] a cada abertura, entao animacoes disparam uma vez por
   abertura (mesma tecnica das bolhas/home). Identidade preservada (dark warm + accent).
   Os "tells" de barato fechados nesta rodada:
   (1) Sem entrada -- o dialog aparecia num estalo (pop), sem o "assentar" que o
       resto do produto ja ganhou. Agora o scrim faz fade e o card sobe+assenta.
   (2) Scrim chapado -- rgba(0,0,0,0.38) sem separacao do conteudo atras. Ganha um
       blur discreto + um tom levemente mais fundo (foco vai pro dialog).
   (3) Inputs sem retorno -- campos do modal nao tinham hover nem anel de foco
       proprio (so o outline azul global). Agora borda sobe no hover e um anel
       neutro sutil aparece no foco (premium, nao vira azul/vermelho de "erro").
   (4) Botoes estalavam -- as acoes (Cancelar/confirmar/perigo) trocavam de estado
       sem transicao e sem hover/active/foco de teclado. Agora tem microestados
       suaves e press tatil, iguais ao composer/sidebar. */

@keyframes oxrc1-modal-layer-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes oxrc1-modal-rise {
  from { transform: translateY(10px) scale(0.985); }
  to { transform: translateY(0) scale(1); }
}

/* (2) scrim mais fundo + blur discreto -- separa o dialog do conteudo atras */
.oxrc1-modal-layer {
  background: rgba(0, 0, 0, 0.46);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}

/* (1) entrada: o scrim faz fade, o card sobe e assenta (dispara ao abrir) */
.oxrc1-modal-layer:not([hidden]) {
  animation: oxrc1-modal-layer-in 160ms ease-out;
}

.oxrc1-modal-layer:not([hidden]) .oxrc1-modal {
  animation: oxrc1-modal-rise 210ms cubic-bezier(0.2, 0.8, 0.2, 1);
}

/* (3) foco/hover nos campos: borda sobe e anel neutro sutil (mata o outline azul
   global so nos campos do modal, mantendo a linguagem calma do composer) */
.oxrc1-modal input,
.oxrc1-modal select {
  transition: border-color 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
}

.oxrc1-modal input:hover,
.oxrc1-modal select:hover {
  border-color: rgba(255, 255, 255, 0.24);
}

.oxrc1-modal input:focus,
.oxrc1-modal select:focus {
  outline: 0;
  border-color: rgba(255, 255, 255, 0.30);
  box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.07);
  /* background-color (nao o shorthand) para nao apagar o chevron do <select> no foco (v123) */
  background-color: #262624;
}

/* (3b) placeholder dos campos do modal (v124): os inputs de "Novo projeto"/"Renomear"/
   "Mover" tinham caixa/borda/foco OXXY mas o TEXTO-DICA caia no cinza-frio DEFAULT do
   browser (~#a9a9a9) — destoando do #aaa79f cinza-quente que search+composer ja usam.
   Tell de "quase caro" num modal premium. Agora o placeholder fala o mesmo idioma dos
   campos de texto do app. So <input> (o <select> nao tem placeholder). So cor.
   design v144 — o modal "Instrucoes do projeto" tambem monta um <textarea> cujo
   placeholder ("Ex.: Este projeto e sobre...") ainda caia no cinza-frio default do
   browser; incluo textarea no rule pra fechar o unico placeholder do modal fora do
   idioma #aaa79f. So cor; zero data-rc1-*/comportamento. */
.oxrc1-modal input::placeholder,
.oxrc1-modal textarea::placeholder {
  color: #aaa79f;
}

/* (4) botoes das acoes: microestados suaves + press tatil + foco de teclado */
.oxrc1-modal-actions button {
  transition: background-color 150ms ease, border-color 150ms ease,
    box-shadow 150ms ease, transform 120ms ease;
}

.oxrc1-modal-actions button:hover {
  background: rgba(255, 255, 255, 0.09);
  border-color: rgba(255, 255, 255, 0.24);
}

.oxrc1-modal-actions button:active {
  background: rgba(255, 255, 255, 0.06);
  transform: translateY(0.5px);
}

.oxrc1-modal-actions button:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

.oxrc1-modal-actions .is-danger:hover {
  background: rgba(255, 80, 80, 0.24);
  border-color: rgba(255, 119, 119, 0.60);
}

.oxrc1-modal-actions .is-danger:focus-visible {
  box-shadow: 0 0 0 2px rgba(255, 119, 119, 0.35);
}

/* design v206 — modais (2ª volta, ação destrutiva): o botão .is-danger das ações
   do modal (Excluir/Apagar/Remover) era o ÚNICO CTA do modal SEM um :active
   escopado à sua própria família. O primário afunda dentro do branco-alpha
   (.is-primary:not(:disabled):active) e o "Sair" do menu afunda dentro do
   vermelho (.is-danger:not([aria-disabled="true"]):active, v198); mas o .is-danger
   dos modais caía no press GENÉRICO neutro (.oxrc1-modal-actions button:active, bg
   rgba(255,255,255,.06)). No mouse o :hover vermelho coexiste e mascara isso, mas
   no TOQUE/TECLADO (:active SEM :hover) o press genérico (0,2,1) vence o vermelho
   base (.is-danger 0,2,0) e o botão pisca CINZA-NEUTRO no instante de maior
   compromisso da ação destrutiva — o clássico "quase igual, mas não". Escopo o
   press dentro da própria família vermelha, num tom entre o base (.16) e o hover
   (.24), guardado por :not(:disabled) pra não reacender o botão travado em
   processamento. Só apresentação — reusa o rgba(255,80,80)/rgba(255,119,119) já no
   arquivo (zero token/cor nova); nenhum data-rc1-*/comportamento/microcopy/markup
   tocado; o transform de press herda do v58 e some sob prefers-reduced-motion. */
.oxrc1-modal-actions .is-danger:not(:disabled):active {
  background: rgba(255, 80, 80, 0.20);
  border-color: rgba(255, 119, 119, 0.60);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-modal-layer:not([hidden]),
  .oxrc1-modal-layer:not([hidden]) .oxrc1-modal {
    animation: none;
  }
  .oxrc1-modal input,
  .oxrc1-modal select,
  .oxrc1-modal-actions button {
    transition: none;
  }
  .oxrc1-modal-actions button:active {
    transform: none;
  }
}


/* ===================== design v59 — estados vazios ===================== */
/* Rotacao: login (v50) -> sidebar esq -> header (v51) -> composer (v52) ->
   bolhas (v53) -> home (v54) -> sidebar direita -> modais (v58) ->
   ESTADOS VAZIOS (v59). (admin foi pulado: e so um link escondido no menu de
   conta -- data-rc1-admin-link hidden -- sem superficie de design pra polir.)
   A tela vazia do chat e a PRIMEIRA coisa que um usuario novo ve: onde o "cara
   de software caro" se ganha ou se perde. So apresentacao e microdetalhe;
   nenhum seletor data-rc1-* nem comportamento tocado. Mesma linguagem dos
   v53-v58 (entrada que assenta, eyebrow tracked, transicoes ~150ms, guardas de
   reduced-motion). Identidade preservada (dark warm + accent OXXY).

   Diagnostico (os "tells" de barato):
   (1) Sem entrada -- a tela vazia surgia num estalo (pop), enquanto bolha/home/
       modal ja "assentam". Inconsistencia de linguagem.
   (2) Eyebrow "OXXY" sem tratamento -- era um <p> 13px muted, do MESMO tamanho
       do subtexto: zero hierarquia e nenhum tratamento de sobrescrito premium
       (o que a home ja ganhou no v54).
   (3) Ritmo chapado -- gap uniforme de 12px entre eyebrow/titulo/subtexto, sem
       hierarquia de respiro (eyebrow devia colar no titulo; subtexto respirar).
   (4) Titulo-heroi sem tracking -- display grande com letter-spacing 0 fica
       "solto"; tipo caro em tamanho grande e levemente tracked-in.
   (5) Subtexto fraco -- --oxrc1-dim (#928f86) segurava a unica linha explicativa
       da tela; sobe pra --oxrc1-muted (conforto de leitura / AA).
   (6) Vazio do browser -- "Digite uma URL..." era 13px dim seco, sem assentar;
       ganha entrada suave e legibilidade.
   (7) Link do fallback do browser sem hover/foco -- ganha retorno de teclado
       e mouse. */

/* (1) entrada: a tela vazia assenta -- fade + sobe 10px em 260ms (superficie de
   view inteira, um tico mais ampla que a home de 8px). Dispara ao aparecer. */
@keyframes oxrc1-empty-in {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: translateY(0); }
}
.oxrc1-empty:not([hidden]) {
  animation: oxrc1-empty-in 260ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}

/* (2) eyebrow "OXXY" vira wordmark/sobrescrito: tracked-out + semibold + menor,
   mesma linguagem do eyebrow da home (v54). Cor permanece muted (herdada). */
.oxrc1-empty p {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.14em;
}

/* (3) ritmo + (4) tracking-in do titulo-heroi: eyebrow cola mais no titulo,
   subtexto ganha respiro. */
.oxrc1-empty h1 {
  margin-top: -3px;
  letter-spacing: -0.01em;
}
.oxrc1-empty small {
  margin-top: 4px;
  color: var(--oxrc1-muted);
  line-height: 1.5;
}

/* (6) vazio do browser: assenta + legibilidade */
/* design v204 — estado vazio do browser: alinho a curva de entrada à família de
   settle da casa (cubic-bezier canônica 0.2,0.8,0.2,1). Era o único vazio ainda em
   `ease-out`, um perfil de desaceleração distinto. Mantém os 240ms; só apresentação,
   zero token/cor/comportamento/data-rc1-* tocado; reduced-motion já compartilhado abaixo. */
.oxrc1-browser-view[data-rc1-browser-state="empty"] .oxrc1-browser-empty {
  animation: oxrc1-empty-in 240ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}
.oxrc1-browser-empty {
  color: var(--oxrc1-muted);
}

/* (7) link do fallback do browser ganha hover + foco de teclado visivel */
.oxrc1-browser-fallback a {
  transition: color 150ms ease, border-color 150ms ease;
}
.oxrc1-browser-fallback a:hover {
  color: var(--oxrc1-text);
  border-bottom-color: rgba(255, 255, 255, 0.45);
}
.oxrc1-browser-fallback a:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
  border-radius: 2px;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-empty:not([hidden]),
  .oxrc1-browser-view[data-rc1-browser-state="empty"] .oxrc1-browser-empty {
    animation: none;
  }
  .oxrc1-browser-fallback a { transition: none; }
}


/* design v61 — sidebar esquerda: atalhos do Founder (home/queue) + resíduos de hover.
   Os dois cards mais proeminentes da coluna (Home do Founder / Fila) ainda "estalavam"
   no hover/ativo/atenção enquanto o resto do sidebar (v50) respira a 150ms com press tátil.
   Fecha essa lacuna e estende o mesmo tratamento a "mostrar mais" e aos badges de status.
   Só apresentação — nenhum data-rc1-*/seletor/comportamento tocado. Identidade preservada. */

/* 1) microtransição consistente (150ms) nos cards de atalho + em mostrar-mais/badges */
.oxrc1-founder-home-button,
.oxrc1-founder-queue-button,
.oxrc1-show-more,
.oxrc1-project-status-badge {
  transition: background-color 150ms ease, color 150ms ease,
    border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease;
}

/* 2) press tátil nos cards de atalho — mesma língua dos icon-buttons/composer */
.oxrc1-founder-home-button:active,
.oxrc1-founder-queue-button:active {
  background: var(--oxrc1-active);
  transform: translateY(0.5px);
}

/* design v188 — completa a linguagem de press tátil da superfície de atalho.
   .oxrc1-show-more e .oxrc1-project-status-badge já estavam no grupo de transição
   acima (com `transform 150ms` DECLARADO) mas nunca recebiam o :active — o transform
   ficava armado e não disparava nunca. Eram os 2 únicos controles do grupo sem retorno
   ao pressionar, enquanto os gêmeos founder-home/queue afundavam 0.5px. Uso SÓ translateY
   (mesmo idioma tátil da casa: send/icon-buttons/composer) em vez de trocar o fundo: os
   dois têm hover/selecionado próprios (badge muda de tom, show-more clareia) e um bg no
   press brigaria com eles; o transform funciona igual e não achata nada. Zero token/cor/
   comportamento novo. */
.oxrc1-show-more:active,
.oxrc1-project-status-badge:active {
  transform: translateY(0.5px);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-founder-home-button,
  .oxrc1-founder-queue-button,
  .oxrc1-show-more,
  .oxrc1-project-status-badge {
    transition: none;
  }
  .oxrc1-founder-home-button:active,
  .oxrc1-founder-queue-button:active,
  .oxrc1-show-more:active,
  .oxrc1-project-status-badge:active {
    transform: none;
  }
}



/* design v62 — header/topbar: dois microdetalhes de "software caro" que sobraram do v51
   (que já cuidou de transições/press nas abas e icon-buttons do topbar).
   Só apresentação — nenhum data-rc1-*/seletor/comportamento tocado. Identidade preservada. */

/* 1) sobrescrito do título (eyebrow "HC_Investimentos") trunca igual ao strong —
   antes só o <strong> tinha ellipsis; o <span> podia vazar/quebrar a topbar de 1 linha
   em nomes longos e em telas estreitas (≤390px). */
.oxrc1-title span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}

/* 2) contador de custo (aria-live) — dígitos tabulares para o valor não "pular" de largura
   a cada atualização (Custo 30d: US$ 0.00 → 12.48), + transição calma no update. */
.oxrc1-cost-counter {
  font-variant-numeric: tabular-nums;
  transition: color 150ms ease, border-color 150ms ease, background-color 150ms ease;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-cost-counter { transition: none; }
}


/* design v63 — barra do browser interno: fecha a lacuna de microestados que o resto
   do produto ja tem (composer v52 / sidebar v50-v61 / header v62). O vazio e o link de
   fallback ja respiravam (v59), mas os CONTROLES da barra (voltar/recarregar/Ir + campo
   de URL) ainda "estalavam" no hover e — pior — o input de URL tinha outline:0 SEM nenhum
   foco de substituicao: digitar um endereco nao dava retorno visual algum. So apresentacao;
   nenhum data-rc1-* ou comportamento tocado. Identidade preservada (dark warm + accent OXXY). */

/* 1) microtransicoes consistentes (150ms) nos controles da barra — some o "estalo" */
.oxrc1-browser-tool,
.oxrc1-browser-go {
  transition: background-color 150ms ease, color 150ms ease,
    border-color 150ms ease, box-shadow 150ms ease, filter 150ms ease, transform 150ms ease;
}
.oxrc1-browser-bar input {
  transition: border-color 180ms ease, box-shadow 180ms ease, background-color 180ms ease;
}

/* 2) botoes fantasma (voltar/recarregar): hover clareia o fundo alem do brilho, press afunda */
.oxrc1-browser-tool:hover {
  background: rgba(255, 255, 255, 0.06);
  border-color: var(--oxrc1-line-strong);
  color: var(--oxrc1-text);
}
.oxrc1-browser-tool:active {
  background: var(--oxrc1-active);
  transform: translateY(0.5px);
}

/* 3) botao Ir (primario, accent): press tatil sem perder o CTA */
.oxrc1-browser-go:active {
  filter: brightness(0.97);
  transform: translateY(0.5px);
}

/* 4) foco de teclado visivel nos botoes da barra (acessibilidade — antes so mouse) */
.oxrc1-browser-tool:focus-visible,
.oxrc1-browser-go:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

/* 5) campo de URL: foco antes era invisivel (outline:0 puro). Agora a borda sobe e um anel
   neutro sutil aparece — premium, consistente com o :focus-within do composer, sem virar
   vermelho de "erro". Vale para foco de mouse e teclado. */
.oxrc1-browser-bar input:focus,
.oxrc1-browser-bar input:focus-visible {
  border-color: rgba(255, 255, 255, 0.26);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.07);
  background: var(--oxrc1-side-deep);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-browser-tool,
  .oxrc1-browser-go,
  .oxrc1-browser-bar input {
    transition: none;
  }
  .oxrc1-browser-tool:active,
  .oxrc1-browser-go:active {
    transform: none;
  }
}

/* design v64 — menus suspensos (motor / persona / menu de contexto): a ultima
   superficie "crua" que faltava alinhar ao resto do produto. Tres tells de menu barato:
   (1) o realce de hover era um RETANGULO de cantos vivos dentro de um menu arredondado
   (12px); (2) o item SELECIONADO e o item sob o mouse tinham EXATAMENTE o mesmo fundo —
   impossivel saber qual motor/persona estava ativo ao passar o mouse; (3) o hover
   "estalava" sem transicao. So apresentacao; nenhum data-rc1-*/comportamento tocado;
   identidade preservada (dark warm + accent OXXY, reaproveitando a barra inset accent do
   nav ativo). Cobre engine + persona (mesma classe .oxrc1-engine-menu) + context menu. */

/* 1) realce de hover arredondado + transicao calma (some o retangulo de canto vivo) */
.oxrc1-menu-option,
.oxrc1-menu-item {
  border-radius: var(--oxrc1-radius);
  transition: background-color 150ms ease, color 150ms ease, box-shadow 150ms ease;
}

/* 2) item selecionado ganha a MESMA barra-accent inset do nav ativo — le como "atual"
   mesmo com outro item sob o mouse (antes: fundo identico ao hover); o check ✓ clareia */
.oxrc1-menu-option.is-selected,
.oxrc1-menu-item.is-active {
  box-shadow: inset 2px 0 0 var(--oxrc1-accent);
}
.oxrc1-menu-option.is-selected .oxrc1-menu-mark {
  color: var(--oxrc1-text);
}

/* 3) foco de teclado que segue o novo raio e nao e cortado pelo overflow do menu
   (anel interno em vez do outline externo com offset, que a rolagem podia clipar) */
/* design v107 — menus suspensos (2a volta): o anel de FOCO DE TECLADO dos itens era o
   ultimo orfao do azul-navegador cru (rgba(110,160,255,.85)) do v64, enquanto TODO o
   resto do produto (composer, modais, anexos, topbar, chips do vazio-heroi no v106) ja
   migrou pro anel de chrome unificado branco-sutil rgba(255,255,255,.16). Mantido INSET
   (o overflow:auto do menu clipa outline externo — razao original do v64); so a COR muda,
   fechando o ultimo tell de foco-azul-generico entre as superficies clicaveis. */
.oxrc1-menu-option:focus-visible,
.oxrc1-menu-item:focus-visible {
  outline: none;
  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.16);
}
.oxrc1-menu-option.is-selected:focus-visible,
.oxrc1-menu-item.is-active:focus-visible {
  box-shadow: inset 2px 0 0 var(--oxrc1-accent), inset 0 0 0 2px rgba(255, 255, 255, 0.16);
}

/* design v122 — item DESTRUTIVO em menu suspenso: `.is-danger` (ex.: "Excluir" no
   context-menu, renderizado pelo JS) tinha só o texto vermelho, mas o hover caía no
   MESMO branco-neutro (rgba(255,255,255,.08)) das linhas seguras — um destrutivo que
   realça igual a um item inócuo é tell genérico. O modal já resolveu isso (a11y do
   .is-danger no modal ganha fundo/borda/anel vermelhos). Espelho aqui o mesmo idioma,
   REUTILIZANDO os vermelhos exatos do modal (255,80,80 / 255,119,119 = --oxrc1-danger),
   calibrado ao peso mais leve de uma linha de menu. Anel INSET (o overflow:auto do menu
   clipa outline externo — mesma razão do v64/v107). Zero cor/token novo. Especificidade
   (0,3,0)/(0,3,1) ganha do hover compartilhado (0,2,0); transição 150ms herdada da base. */
.oxrc1-menu-option.is-danger:hover,
.oxrc1-menu-item.is-danger:hover {
  background: rgba(255, 80, 80, 0.14);
}
.oxrc1-menu-option.is-danger:focus-visible,
.oxrc1-menu-item.is-danger:focus-visible {
  box-shadow: inset 0 0 0 2px rgba(255, 119, 119, 0.40);
}

/* design v175 — press tatil nas linhas de menu suspenso (.oxrc1-menu-option / -item):
   engine/persona/context-menu. Era a ultima superficie CLICAVEL do produto sem retorno
   de :active — todo irmao ja afunda no toque (composer tools/send v52, chip de anexo v83,
   gear da conta v168, chips do heroi v171, passos do progresso v161). A linha de menu ja
   tinha hover (v64), barra-accent do selecionado (v64), anel de foco (v107) e realce
   destrutivo (v122) — mas no mouse-down NADA mudava: o clique de selecao nao tinha peso.
   Trago a MESMA lingua exata: var --oxrc1-active neutro nas linhas seguras; no destrutivo,
   o vermelho da casa mais escuro que o hover .14 (mesmo idioma do v122). Excluo
   aria-disabled (mantem not-allowed, sem press). So apresentacao; zero
   data-rc1-*/comportamento/microcopy/token novo; identidade preservada. Transicao 150ms +
   guarda de reduced-motion herdadas da base do bloco. Especificidade do destrutivo (0,4,0)
   ganha do seguro (0,3,0) nos itens .is-danger. */
.oxrc1-menu-option:not([aria-disabled="true"]):active,
.oxrc1-menu-item:not([aria-disabled="true"]):active {
  background: var(--oxrc1-active);
}
.oxrc1-menu-option.is-danger:not([aria-disabled="true"]):active,
.oxrc1-menu-item.is-danger:not([aria-disabled="true"]):active {
  background: rgba(255, 80, 80, 0.20);
}

/* 4) entrada suave ao abrir — fade + assentamento de 3px (Linear/Vercel), direcao-
   agnostico (serve pro engine/persona que abre pra cima e pro context-menu posicionado) */
.oxrc1-engine-menu:not([hidden]),
.oxrc1-context-menu:not([hidden]) {
  animation: oxrc1-menu-in 150ms ease;
}
@keyframes oxrc1-menu-in {
  from { opacity: 0; transform: translateY(3px); }
  to   { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-menu-option,
  .oxrc1-menu-item { transition: none; }
  .oxrc1-engine-menu:not([hidden]),
  .oxrc1-context-menu:not([hidden]) { animation: none; }
}

/* mobile.pwa sub-2: responsivo profundo (phone <=560px) + safe-area para PWA instalada */
@media (max-width: 560px) {
  /* mobile.pwa sub-2: responsivo profundo (phone <=560px) + safe-area para PWA instalada */
  .oxrc1-project-home {
    padding: 18px 12px 112px;
  }

  .oxrc1-project-home-summary,
  .oxrc1-activity-summary-grid {
    grid-template-columns: minmax(0, 1fr);
  }

  .oxrc1-chat-topbar {
    padding: 8px 12px;
  }

  .oxrc1-composer {
    width: min(calc(100% - 24px), 820px);
  }

  .oxrc1-center-tab {
    min-width: 44px;
    padding: 0 7px;
  }
}

/* mobile.pwa sub-2: responsivo profundo (phone <=560px) + safe-area para PWA instalada */
@supports (padding: max(0px)) {
  @media (max-width: 560px) {
    .oxrc1-left {
      padding-top: max(10px, env(safe-area-inset-top));
    }

    .oxrc1-right {
      padding-top: max(12px, env(safe-area-inset-top));
    }

    .oxrc1-composer {
      margin-bottom: max(22px, env(safe-area-inset-bottom));
    }
  }
}


/* design v66 -- sidebar direita (painel de Progresso). Rodada de rotacao:
   sidebar-direita. Os passos do pedido atualizam ao vivo (aria-live) conforme a
   ordem avanca, mas a transicao de estado pendente->atual->concluido era um
   ESTALO SECO: a cor do texto, o fundo do passo atual e o preenchimento do
   bullet trocavam sem easing -- destoando do resto do app, que respira em
   150-250ms desde as rodadas anteriores (sidebar-esq, header, composer, bolhas,
   menus, barra do browser). Agora o passo assenta suave quando conclui e o
   bullet se preenche de azul com calma. So apresentacao; nenhum data-rc1-*,
   seletor ou comportamento tocado; identidade preservada (dark warm + accent). */
.oxrc1-progress li {
  transition: color 200ms ease, background-color 200ms ease;
}

.oxrc1-progress li span {
  transition: background-color 200ms ease, border-color 200ms ease,
    box-shadow 200ms ease;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-progress li,
  .oxrc1-progress li span {
    transition: none;
  }
}


/* design v68 — menu da conta (superficie do "Painel Admin"): a ultima area sem bloco
   de design. O menu ja vinha bem-construido (hover/focus/ativo/desabilitado, transicoes
   v50, guarda reduced-motion, truncagem no cabecalho, "Sair" em vermelho). Sobraram dois
   tells de barato: (1) o menu ABRIA num estalo -- display:none -> visivel sem transicao --
   enquanto o resto do app respira em 150-250ms; (2) a acao destrutiva "Sair" ficava colada
   na lista, sem separacao das acoes normais (conta, founder view, admin). Agora o menu
   cresce suave a partir da propria ancora (canto inferior esquerdo, sentido em que ele
   abre pra cima) e "Sair" ganha um divisor discreto e recuado, como em menus premium.
   So apresentacao; nenhum data-rc1-*, seletor ou comportamento tocado; identidade
   preservada (dark warm + accent OXXY, mesmos tokens). */
@keyframes oxrc1-account-menu-in {
  from { opacity: 0; transform: translateY(6px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

.oxrc1-account-menu:not([hidden]) {
  transform-origin: bottom left;
  animation: oxrc1-account-menu-in 160ms cubic-bezier(.22, 1, .36, 1);
}

.oxrc1-account-menu .is-logout {
  position: relative;
  margin-top: 6px;
}

.oxrc1-account-menu .is-logout::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -4px;
  height: 1px;
  background: var(--oxrc1-line);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-account-menu:not([hidden]) {
    animation: none;
  }
}

/* ===================== design v69 — bolhas de mensagem (2ª volta) =====================
   Reauditoria da superfície mais vista do produto (a conversa). O tratamento v53 já
   cuidou de entrada/pending/falha/thinking/copiar; sobraram dois "tells" de barato no
   corpo renderizado da resposta (renderMarkdown -> ul/ol/li, a). Só apresentação:
   nenhum data-rc1-*, seletor estrutural ou comportamento tocado. Identidade preservada. */

/* 1) marcadores de lista (bullets/números) vinham na cor cheia do texto, competindo
   com o conteúdo. Passam a ler como andaime (dim) — o padrão Linear/Vercel/Claude:
   o marcador orienta, o texto é o protagonista. */
.oxrc1-bubble ul li::marker,
.oxrc1-bubble ol li::marker {
  color: var(--oxrc1-dim);
}

/* 2) links da resposta: (a) ganham transição de cor (antes o hover só ligava o
   sublinhado num estalo), (b) sublinhado com respiro (offset 2px, mais "software
   caro" que o grudado no baseline) e (c) FOCO DE TECLADO VISÍVEL — o link era
   navegável por Tab e não tinha anel algum (lacuna real de acessibilidade AA). */
/* design v201 — bolhas de mensagem: SUBLINHADO PERSISTENTE nos links da prosa.
   Achado real e mensurável: no repouso, `.oxrc1-bubble a` ficava `text-decoration:
   none` (a v-anterior só ligava o sublinhado no :hover) — então o link inline era
   distinguido do corpo APENAS pela cor. O azul do link (#9eb5ff) contra o texto do
   corpo (--oxrc1-text #f4f3ee) rende ~1,8:1, abaixo do 3:1 que a WCAG 1.4.1 exige
   quando a COR é o único diferenciador e não há segunda pista. Resultado: no meio de
   um parágrafo denso, quem não distingue bem azul de creme (ou qualquer um em leitura
   rápida) não enxergava o que é clicável — tell de "página web", não de "produto caro".
   Claude.ai/Linear/Stripe sublinham o link de corpo SEMPRE (repouso), reforçando no
   hover. Trago o mesmo idioma: sublinhado sutil em repouso (offset 2px já da casa,
   espessura 1px = a linha canônica do produto, cor reusando o EXATO literal
   rgba(158,181,255,0.42) que o anel de foco deste mesmo bloco já usa) e, no hover, o
   sublinhado sobe pra currentColor (cheio) junto com a cor mais clara. Degrada gracioso
   (navegador antigo ignora as longhands → sublinhado padrão, ainda uma pista não-cor).
   Só apresentação: ZERO token/cor novo, nenhum data-rc1-*/seletor/comportamento/
   microcopy/markup tocado; identidade (azul OXXY do link) intacta. Transição de cor do
   sublinhado espelha a de `color` já não-guardada aqui (fade de estado, não animação em
   laço — mesmo critério do resto dos links). */
.oxrc1-bubble a {
  border-radius: 3px;
  text-decoration: underline;
  text-decoration-color: rgba(158, 181, 255, 0.42);
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
  transition: color 150ms ease, text-decoration-color 150ms ease;
}
.oxrc1-bubble a:hover {
  color: #b8c6ff;
  text-decoration-color: currentColor;
}
.oxrc1-bubble a:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(158, 181, 255, 0.42);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-bubble a { transition: none; }
}


/* ===================== design v70 — home do projeto (2ª volta) =====================
   Reauditoria da home do projeto (a tela que abre ao entrar num projeto). A 1ª volta
   (v55) já resolveu entrada animada, eyebrow premium, lift dos cards, transições,
   anel de foco, hover das linhas, empty state centrado e responsivo até 390px.
   Sobraram três "tells" de barato — só apresentação, nenhum data-rc1-*, seletor
   estrutural ou comportamento tocado; identidade preservada (dark warm + accent OXXY).

   1) NÚMEROS-HERÓI NÃO ERAM TABULARES. Os cards de placar (Chats/Fixados/Recentes)
      renderavam os dígitos em figuras proporcionais — 1 mais estreito que 8, então a
      coluna de números "dançava" e não lia como métrica desenhada. Figuras tabulares
      alinham os dígitos (o padrão de todo dashboard caro). Inofensivo no card de texto
      ("Sessão"). */
.oxrc1-project-home-summary strong {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* 2) TÍTULO DO PROJETO SOLTO. O h1 chega a 42px (clamp) com letter-spacing: 0 — nesse
      tamanho o display type lê frouxo. Tipografia de display grande pede tracking
      negativo sutil (Linear/Vercel/Claude): -0.02em fecha as letras e dá o peso de
      "software caro" sem mexer no tamanho nem na fonte. */
.oxrc1-project-home h1 {
  letter-spacing: -0.02em;
}

/* 3) AÇÃO PRIMÁRIA SEM HIERARQUIA. A fileira de ações rápidas tratava "Novo chat neste
      projeto" (o CTA principal da tela) igual a "Adicionar chat existente" ou
      "Sincronizar pasta" — tudo cinza, tudo do mesmo peso. O olho não sabia onde pousar.
      A primeira ação ganha um realce discreto no idioma que o app JÁ usa para estado
      ativo/atual (a barra-accent inset de 2px, vista no item ativo da sidebar e no
      progresso): borda um tico mais viva + fundo levemente tingido de accent. Fica
      claramente primária, sem virar botão vermelho gritante — refino, não reinvenção.
      A borda tingida persiste no hover (o hover só troca o fundo). */
.oxrc1-project-home-quick .oxrc1-project-home-action:first-child {
  border-color: rgba(183, 25, 34, 0.55);
  background: rgba(183, 25, 34, 0.10);
  box-shadow: inset 2px 0 0 var(--oxrc1-accent);
}
.oxrc1-project-home-quick .oxrc1-project-home-action:first-child:hover {
  border-color: rgba(183, 25, 34, 0.75);
}
/* mantém o anel de foco de teclado por cima da barra-accent, sem perder um nem outro */
.oxrc1-project-home-quick .oxrc1-project-home-action:first-child:focus-visible {
  box-shadow: inset 2px 0 0 var(--oxrc1-accent),
    0 0 0 2px rgba(255, 255, 255, 0.16);
}


/* ============================================================================
   design v71 -- sidebar direita (2a volta). Rotacao: home do projeto (v70) ->
   sidebar direita. So APRESENTACAO: nenhum data-rc1-* / seletor estrutural /
   comportamento tocado. Identidade preservada (dark warm + accent OXXY).
   Hooks usados: .is-terminal e data-progress-state, AMBOS ja emitidos pelo JS
   (renderProgressList) -- read-only, nao altero o JS.

   ACHADO PRINCIPAL (tell de barato): os estados terminais do progresso
   (FAILED / INTERRUPTED / CANCELLED) recebiam a classe .is-terminal mas NAO
   tinham CSS nenhum. Resultado: um passo que FALHOU herdava o marcador azul de
   "done" (check ✓) ou, quando corrente, PULSAVA azul como se ainda estivesse
   trabalhando. Um produto senior distingue: PAROU != CONCLUIU. Correcao abaixo.
   ========================================================================== */

/* nada esta "acontecendo" num passo terminal corrente: mata o pulso vivo e o
   anel azul de "em curso" (herdados de .is-current). */
.oxrc1-progress li.is-current.is-terminal span {
  animation: none;
  box-shadow: none;
}

/* marcador terminal neutro por padrao (parou, sem sucesso azul): anel solido,
   sem preenchimento, glifo "x" discreto. Sobrepoe o ::before "✓" de .is-done
   caso o passo terminal caia na trilha como done. */
.oxrc1-progress li.is-terminal span {
  background: transparent;
  border-color: var(--oxrc1-line-strong);
  box-shadow: none;
}
.oxrc1-progress li.is-terminal span::before {
  content: "\00d7";
  color: var(--oxrc1-muted);
  font-size: 12px;
  font-weight: 600;
  line-height: 1;
}

/* FAILED e o unico erro REAL -> tom de perigo (marcador tingido + rotulo
   legivel), usando a --oxrc1-danger que o app ja tem. Sem cor nova. */
.oxrc1-progress li.is-terminal[data-progress-state="FAILED"] {
  color: var(--oxrc1-text);
}
.oxrc1-progress li.is-terminal[data-progress-state="FAILED"] span {
  border-color: var(--oxrc1-danger);
  background: rgba(255, 119, 119, 0.14);
}
.oxrc1-progress li.is-terminal[data-progress-state="FAILED"] span::before {
  color: var(--oxrc1-danger);
  font-weight: 760;
}

/* INTERRUPTED (parcial preservada) e CANCELLED (o usuario pediu) NAO sao erro
   vermelho gritante -- ficam no neutro/muted acima. Realco so o rotulo pra
   leitura firme, sem alarme. */
.oxrc1-progress li.is-terminal[data-progress-state="INTERRUPTED"],
.oxrc1-progress li.is-terminal[data-progress-state="CANCELLED"] {
  color: var(--oxrc1-muted);
}

/* consistencia de linguagem: o eyebrow "Pedido atual" do topo da sidebar
   direita era 12px dim solto -- destoava do sobrescrito premium ja adotado no
   header da home do projeto ("Projeto atual": uppercase, tracked, semibold,
   11px). Alinho os dois pro mesmo idioma Linear/Vercel. Alvo especifico, nao
   vaza pros outros usos de <span> dim (thread/user/title). */
.oxrc1-right-head span {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  font-size: 11px;
}


/* design v82 — eyebrow do vazio-herói do chat entra no mesmo idioma premium.
   O kicker "OXXY" do estado vazio principal (.oxrc1-empty p) — a PRIMEIRA
   superfície que o Founder vê numa conversa em branco — era o único eyebrow que
   ficou de fora do tratamento Linear/Vercel já adotado em "Projeto atual"
   (.oxrc1-project-home-header span) e "Pedido atual" (.oxrc1-right-head span):
   saía 13px muted, sem caixa-alta, tracking ou peso — colado ao 13px da
   descrição logo abaixo, sem hierarquia. Alinho ao mesmo idioma: uppercase,
   tracked-out, semibold, 11px. Só o eyebrow (seletor específico .oxrc1-empty p,
   não vaza pro <small>/<h1>); mantém a cor --oxrc1-muted herdada; zero token/cor
   novo; identidade preservada; sem animação. */
.oxrc1-empty p {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  font-size: 11px;
}


/* design v72 — estados vazios (2ª volta): os três "vazios finos" da rotação.
   .oxrc1-decision-empty / .oxrc1-founder-queue-empty / .oxrc1-founder-home-empty
   compartilhavam o MESMO tratamento cru: uma única linha em --oxrc1-dim (a cor
   de texto mais fraca do sistema), encostada à esquerda, sem respiro nem entrada
   — leem como "placeholder de TODO", não como estado de repouso intencional.
   O vazio-herói do chat (bloco anterior) já subiu dim→muted por AA/leitura e
   ganhou settle; o mission-empty já respira. Trago esses três pro mesmo idioma.
   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado;
   identidade (borda tracejada) preservada, apenas refinada. */
.oxrc1-decision-empty,
.oxrc1-founder-queue-empty,
.oxrc1-founder-home-empty {
  /* (1) contraste/consistência: dim→muted, o mesmo piso de leitura AA que o
     vazio-herói adotou; (2) respiro: centraliza a única linha e dá padding em
     escala (16px) pra virar repouso, não caixa vazia. */
  padding: 16px;
  color: var(--oxrc1-muted);
  text-align: center;
  font-size: 13px;
  line-height: 1.45;
  /* (3) entrada: assenta suave ao aparecer, reusando a curva do vazio-herói. */
  animation: oxrc1-empty-in 220ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-decision-empty,
  .oxrc1-founder-queue-empty,
  .oxrc1-founder-home-empty {
    animation: none;
  }
}


/* design v73 — composer do chat (2ª volta): a perna que faltava da tríade
   hover/focus/DISABLED. O ciclo de envio/boot alterna input.disabled e
   [data-rc1-send][disabled] (enableComposer), mas NENHUM estilo respondia a
   isso: o botão Enviar seguia branco e com cara de clicável mesmo inerte, e o
   campo não sinalizava travamento — um "tell" clássico de software não-caro.
   Agora ambos esmaecem, o cursor vira not-allowed e o hover do v52 não
   reacende o Enviar travado. Só apresentação; nenhum data-rc1-*/seletor/
   comportamento/microcopy tocado; identidade preservada (dark warm + accent OXXY). */
.oxrc1-composer textarea:disabled {
  color: var(--oxrc1-muted);
  cursor: not-allowed;
  opacity: 0.7;
}

.oxrc1-composer .oxrc1-send:disabled,
.oxrc1-composer .oxrc1-tool:disabled,
.oxrc1-composer .oxrc1-engine-button:disabled,
.oxrc1-composer .oxrc1-persona-button:disabled {
  opacity: 0.45;
  cursor: not-allowed;
  box-shadow: none;
}

/* disabled vence o hover herdado do v52: passar o mouse no Enviar travado
   não pode "reacender" o CTA (senão parece clicável quando não é). */
.oxrc1-composer .oxrc1-send:disabled:hover {
  background: var(--oxrc1-text);
  color: #1f1f1d;
  box-shadow: none;
  transform: none;
}


/* ===================== design v74 — modais/dialogs (2ª volta): a perna DISABLED ==
   Rotacao: ... -> modais v58 (1a volta) -> composer v73 (disabled) -> MODAIS v74.
   O v58 fechou entrada/scrim/hover-foco de campos/microestados de botao — tudo
   segue impecavel, NAO toquei. O gap que sobrou e o mesmo "tell" que o composer
   fechou no v73, agora no dialog: os botoes de acao ficam :disabled durante uma
   confirmacao em andamento (o JS faz `primary.disabled = true` e troca o texto pra
   "Gerando plano..." enquanto a chamada async corre — founder-rc1.js ~2724), mas
   NENHUMA regra CSS respondia a :disabled. Resultado: o botao continuava branco,
   com cursor de clique e — pior — o :hover do v58 REACENDIA o botao inerte. Classico
   sinal de software nao-caro (um confirm que ainda parece clicavel enquanto processa).
   So apresentacao; zero data-rc1-*/seletor/comportamento/microcopy tocado; identidade
   preservada (dark warm + accent OXXY). */
.oxrc1-modal-actions button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  box-shadow: none;
}

/* :disabled vence o hover herdado do v58 — passar o mouse num botao travado
   nao pode reacender o CTA (senao finge ser clicavel durante o processamento). */
.oxrc1-modal-actions button:disabled:hover {
  background: rgba(255, 255, 255, 0.05);
  border-color: var(--oxrc1-line-strong);
  box-shadow: none;
  transform: none;
}

.oxrc1-modal-actions .is-danger:disabled:hover {
  background: rgba(255, 80, 80, 0.16);
  border-color: rgba(255, 119, 119, 0.45);
}


/* design v75 — header/topbar (2ª volta): unifica o anel de foco de teclado.
   Rotação: o header já fechou transições/press (v51) e título/custo tabular (v62);
   a perna que sobrava era o FOCO. Composer (v52), browser (v63), menus (v64) e modais
   (v58) já falam a mesma língua premium: anel INTERNO neutro (box-shadow 2px branco a
   16%, outline 0). As abas centrais (Chat/Browser) e os icon-buttons do topbar (☰ ◷ ⋯)
   ainda caíam no fallback global azul-navegador (outline 2px rgba(110,160,255,.85)) —
   foco de teclado com cor E geometria fora da identidade, o clássico "tell" de default
   ao tabular pelo topo do produto. Fecha essa última inconsistência do chrome superior.
   O box-shadow já entra na transição de 150ms do v51 (fade calmo) e o reduced-motion do
   v51 já zera essa transição. Só apresentação — nenhum data-rc1-*/seletor/comportamento
   tocado. Identidade preservada (dark warm + accent OXXY). */
.oxrc1-center-tab:focus-visible,
.oxrc1-chat-topbar .oxrc1-icon-button:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}


/* ===================== design v76 — sidebar esquerda (3a volta): foco de teclado ===================== */
/* v75 unificou o anel de foco de teclado do CHROME SUPERIOR (abas centrais + icon-buttons do topbar)
   pro anel interno branco 16% (outline 0), a mesma lingua de composer/browser/menus/modais. Mas a
   COLUNA DE NAVEGACAO ESQUERDA inteira nunca entrou nessa lingua: ao tabular pela sidebar (Novo
   chat/acoes, toggles de secao Historico/Arquivados, linhas de conversa, resultados de busca e o
   rodape da conta -- gatilho + engrenagem + itens do menu) o foco caia no fallback global
   azul-navegador (outline 2px rgba(110,160,255,.85)) -- cor E geometria fora da identidade, o mesmo
   "tell" de default que v75 fechou no topo. Pior: o retorno era inconsistente entre si (alguns davam
   superficie de hover no foco, outros so o outline azul). Esta rodada leva TODA a coluna esquerda pro
   mesmo padrao premium: superficie de hover + anel interno branco 16%, zero outline azul. So
   apresentacao -- nenhum data-rc1-*/seletor/comportamento/microcopy tocado. Identidade preservada. */
.oxrc1-nav-action:focus-visible,
.oxrc1-section-toggle:focus-visible,
.oxrc1-search-result:focus-visible,
.oxrc1-thread:focus-visible,
.oxrc1-account-trigger:focus-visible,
.oxrc1-settings:focus-visible,
.oxrc1-account-menu button:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}
/* superficie de hover no foco de teclado pros controles da esquerda que ainda nao tinham (nav-action
   e search-result ja ganhavam bg via 305/362; o menu da conta preserva o vermelho do "Sair" via regra
   propria, por isso fica de fora deste bloco de background). */
.oxrc1-section-toggle:focus-visible,
.oxrc1-thread:not(.is-selected):focus-visible,
.oxrc1-account-trigger:focus-visible,
.oxrc1-settings:focus-visible {
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
}
/* conversa selecionada mantem a barra de accent (inset) somada ao anel de foco. */
.oxrc1-thread.is-selected:focus-visible {
  box-shadow: inset 2px 0 0 var(--oxrc1-accent), 0 0 0 2px rgba(255, 255, 255, 0.16);
}

/* ===================== design v79 — composer (2ª volta, camada a11y) ============
   Rotação: header a11y v78 -> composer v79. O visual do composer já estava
   impecável (v52: focus-within + hover/press do Enviar + focus-visible; v73:
   perna disabled). Nenhum pixel tocado nesta volta — só semântica.
   Achado real: o <textarea data-rc1-input> tinha só placeholder="Mensagem para o
   OXXY", que SOME ao digitar, deixando o campo primário do produto SEM nome
   acessível durante a digitação. Correção cirúrgica em index.html: aria-label
   persistente "Mensagem para o OXXY" (placeholder mantido como dica). Zero
   comportamento/data-rc1-*/identidade tocados. CSS aqui só carrega o cache-contract
   (--oxrc1-cache-contract: "avatar-life-v226") e este comentário de rastreio. */


/* ===================== design v80 — bolhas de mensagem (3ª volta) =====================
   Rotação: composer a11y v79 -> BOLHAS v80. A conversa é a superfície mais vista do
   produto; v53/v69 já cuidaram de entrada, pending, falha, thinking, copiar, marcadores
   de lista e links. Reauditoria de designer encontrou dois "tells" de barato que
   sobreviveram — ambos SÓ APRESENTAÇÃO, zero data-rc1-*/comportamento/microcopy/identidade.

   ACHADO 1 — hierarquia de títulos QUEBRADA. renderMarkdown emite <h1>/<h2>/<h3> para
   #/##/###. Dois blocos de regra colidiam: o bloco base pedia escala 20/17/15, mas um
   bloco POSTERIOR (.oxrc1-bubble h2/h3) reescrevia h2 para 20px — IGUAL ao <h1>. Efeito
   real: "#" e "##" saíam do MESMO tamanho (sem hierarquia) e h2/h3 perdiam a folga
   superior que separa um título do parágrafo anterior. Corrigido para escala real
   20/17/15 com respiro superior consistente; o primeiro bloco da resposta não ganha
   folga extra (reset no primeiro filho do root do markdown). */
.oxrc1-bubble h1 { font-size: 20px; margin: 18px 0 8px; }
.oxrc1-bubble h2 { font-size: 17px; margin: 16px 0 8px; }
.oxrc1-bubble h3 { font-size: 15px; margin: 14px 0 6px; }
.oxrc1-bubble > div > :first-child { margin-top: 0; }

/* ACHADO 2 — código do chat na FONTE ERRADA. O código do chat (inline <code> e blocos
   .oxrc1-code) não fixava família mono e caía no keyword "monospace" cru do navegador,
   enquanto o painel .oxrc1-funnel-result já usava a stack refinada ui-monospace/SF Mono/
   Menlo. A superfície de código MAIS vista do produto ficava mais barata que uma
   secundária. Fixa a mesma stack premium no código do chat. */
.oxrc1-bubble code,
.oxrc1-code pre,
.oxrc1-code code {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}


/* design v171 — chips de sugestão do estado vazio-herói (.oxrc1-prompt-row button): a perna
   :active que faltou do v106. O v106 já trouxe hover com easing + anel de foco de teclado
   unificado — mas o press tátil nunca chegou. Esses chips são a PRIMEIRA superfície interativa
   de uma conversa em branco (a tela que mais se vê ao abrir o produto), e eram o único grupo de
   pílulas clicáveis fora do idioma de pressão da casa: .oxrc1-thread, .oxrc1-nav-action,
   .oxrc1-account-trigger e os botões do menu da conta TODOS afundam pra --oxrc1-active no clique.
   Clicar um chip de sugestão não dava retorno tátil nenhum antes da conversa preencher. Agora
   afunda igual aos irmãos. Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy
   tocado; zero token/cor novo (reusa --oxrc1-active/--oxrc1-text, exatamente os do resto do
   produto); identidade preservada. A transição de 150ms (v106) já embala o afundar, e o guard de
   reduced-motion (v106) já o cobre — nenhuma regra nova de motion. */
.oxrc1-prompt-row button:active {
  background: var(--oxrc1-active);
  color: var(--oxrc1-text);
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* design v81 — sidebar direita (rotação): a lista de progresso (.oxrc1-progress,
   overflow-y:auto) caía no scrollbar NATIVO do SO quando um pedido tem muitos
   passos — destoava das DUAS outras superfícies roláveis do produto que já
   ganharam o scrollbar fino premium: .oxrc1-left-scroll (navegação) e
   .oxrc1-code pre (blocos de código). Era o último rolável de fora do idioma.
   Trago a MESMA linguagem exata: trilho fino, polegar arredondado 999px, realce
   suave no hover (150ms) e respeito a prefers-reduced-motion. Só apresentação —
   nenhum data-rc1-*/seletor/comportamento/microcopy tocado; identidade preservada. */
.oxrc1-progress {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-progress::-webkit-scrollbar {
  width: 8px;
}
.oxrc1-progress::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-progress::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-progress::-webkit-scrollbar-thumb { transition: none; }
}


/* design v83 — chips de anexo do composer (bandeja .oxrc1-attachment-tray): a última
   sub-superfície do input mais usado que ainda não respirava. O composer (v52) já cuidou
   de tools/send/engine/persona com microtransição 150ms, press tátil e foco de teclado
   visível — mas o botão de REMOVER anexo (×) dentro de cada chip ficou de fora: só tinha
   :hover, sem transição (estalava), sem estado de press e — pior — sem foco de teclado
   nenhum (era navegável por Tab mas invisível ao focar, um furo de acessibilidade no
   único controle destrutivo do composer). Trago a MESMA língua exata do resto do produto.
   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado; zero token
   ou cor novo (reaproveita --oxrc1-hover/--oxrc1-active/--oxrc1-text); identidade preservada. */

/* 1) microtransição consistente (150ms) — some o estalo do hover */
.oxrc1-attachment-chip button {
  transition: background-color 150ms ease, color 150ms ease, box-shadow 150ms ease;
}

/* 2) press tátil no remover — mesma língua dos controles do composer (var --oxrc1-active) */
.oxrc1-attachment-chip button:active {
  background: var(--oxrc1-active);
  color: var(--oxrc1-text);
}

/* 3) foco de teclado visível — antes o único controle destrutivo do composer não dava
   retorno nenhum ao Tab; agora um anel neutro sutil, consistente com tools/send do composer */
.oxrc1-attachment-chip button:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-attachment-chip button { transition: none; }
}


/* ===================== design v84 — toast (feedback transitório) =====================
   Rotação: modais/dialogs já tiveram 2 voltas (v58 entrada+scrim, v74 disabled) — descartei
   nova volta neles. Peguei o TOAST (.oxrc1-toast), a superfície de feedback mais usada do
   produto (~40 chamadas em founder-rc1.js: sessão expirada, erros, "revisão humana
   registrada", missões, dry-run…) e a ÚNICA que nunca passou pela lupa: nascia num ESTALO
   (append no body sem entrada) e sumia noutro (node.remove() aos 1800ms). Toda a esteira
   respira desde v50; a mensagem que mais aparece era a que menos respirava — tell clássico
   de "quase-caro".
   Correção: entrada suave (fade + leve subida de 8px), 180ms, MESMO easing calmo do
   modal-rise (cubic-bezier(0.2,0.8,0.2,1)) — a animação dispara sozinha a cada toast porque
   o node é recriado a cada chamada; zero mudança de JS/comportamento.
   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado; zero token ou
   cor novo; identidade preservada; a centragem translateX(-50%) é preservada dentro do
   keyframe; prefers-reduced-motion respeitado. */
@keyframes oxrc1-toast-in {
  from { opacity: 0; transform: translateX(-50%) translateY(8px); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0); }
}
/* ===================== design v159 — toast (3ª volta): animação de SAÍDA ==============
   Rotação: login já teve 5 mãos (v67/v85/v95/v105/v125), tabela fechou (v134/v158),
   scrollbar/tipografia saturados — o próximo tell REAL, herdado da nota da rotação anterior,
   era a SAÍDA do toast. A v84 deu ENTRADA suave (fade + subida 8px, 180ms) e a v113 a
   superfície ("vidro caro"), mas o toast ainda MORRIA num estalo: o JS o remove seco aos
   1800ms (setTimeout→node.remove() em founder-rc1.js) — nascia respirando e sumia num corte.
   ACHADO (assimetria entrada×saída): toda superfície flutuante do app entra E sai suave
   (os modais têm rise/fade nos dois sentidos); só o toast — a superfície de feedback mais
   usada do produto (~40 chamadas) — entrava macio e saía no talho. Tell clássico de "quase-caro".
   Correção (SÓ CSS, ZERO JS): troco a animação de ENTRADA-só por uma única animação de CICLO
   DE VIDA cronometrada ao tempo real do node (1800ms, idêntico ao setTimeout do JS). Ela
   reproduz a entrada v84 IDÊNTICA nos primeiros 10% (0→10% = 180ms, mesmo from/to, mesmo
   easing), segura no meio (10→90%) e adiciona um FADE-OUT gracioso + leve descida (6px) nos
   últimos 10% (90→100% ≈ 180ms), terminando exatamente quando o JS remove o node — sem corte
   visível. Nenhuma linha de JS tocada: o node é recriado a cada chamada, então a animação
   dispara sozinha, como na v84. A centragem translateX(-50%) é preservada em TODOS os
   keyframes; prefers-reduced-motion continua zerando a animação (aparece/some instantâneo).
   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado; zero token/cor
   novo; identidade (dark + gradiente) preservada. O keyframe oxrc1-toast-in acima fica no
   arquivo (histórico, sem custo). */
@keyframes oxrc1-toast-life {
  0%   { opacity: 0; transform: translateX(-50%) translateY(8px); }
  10%  { opacity: 1; transform: translateX(-50%) translateY(0); }
  90%  { opacity: 1; transform: translateX(-50%) translateY(0); }
  100% { opacity: 0; transform: translateX(-50%) translateY(6px); }
}
.oxrc1-toast {
  animation: oxrc1-toast-life 1800ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-toast { animation: none; }
}

/* ===================== design v113 — toast (2ª volta): profundidade "vidro caro" ==
   Rotação: bolhas já teve 4 mãos (v53/v69/v80/v103), login 4 (v67/v85/v95/v105) — descartei
   nova volta. Peguei o TOAST (.oxrc1-toast), a 2ª mão da superfície de feedback mais usada
   do produto (~40 chamadas em founder-rc1.js). A v84 deu ENTRADA suave, mas nunca tocou a
   SUPERFÍCIE em si.
   ACHADO (tell de consistência REAL, cruzando CSS×CSS): o toast é uma superfície FLUTUANTE
   elevada (fixed, bottom, sombra ambiente forte), mas era a ÚNICA das flutuantes do produto
   SEM o fio de luz no topo que todas as outras já ganharam — o composer elevado
   (`0 0 0 1px rgba(255,255,255,.07)`, v52), os menus suspensos (mesmo hairline, v64) e o card
   de login (`inset 0 1px 0 rgba(255,255,255,.06)`, v105). Só tinha sombra pra baixo
   (`0 16px 42px /.36`) + borda chata de mesmo valor — lia mais CHAPADO que os drops do
   produto, justamente na mensagem que mais aparece.
   Correção: prefixado `inset 0 1px 0 rgba(255,255,255,.06)` — 1px de luz só na aresta
   superior, "luz vindo de cima", EXATAMENTE o idioma do card de login (v105). A sombra
   ambiente 0 16px 42px /.36 fica intacta; a entrada v84 e a centragem translateX(-50%)
   preservadas. Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy;
   zero cor/token novo (o rgba(255,255,255,.06) já é o do login); identidade preservada. */

/* ===================== design v89 — header/topbar (3a volta): ritmo de altura + par de ícones ===================== */
/* v51 cuidou de transições/press, v62 do title-ellipsis + tabular-nums, v75 do foco de teclado.
   Sobraram dois "tells" de toolbar de software caro, ambos SÓ apresentação — nenhum
   data-rc1-*/seletor/comportamento/microcopy tocado; zero token ou cor novo; identidade preservada.

   1) Par de icon-buttons da direita (◷ progresso + ⋯ mais) estava COLADO: .oxrc1-topbar-actions
      era flex sem gap, então as duas pastilhas de hover se encostavam borda-a-borda. Todo o resto
      da topbar respira (zona esq gap 10px, zona dir gap 10px) — só o par interno não. Gap 4px
      (na escala 4/8 já usada em .oxrc1-left-actions) separa as pastilhas sem alargar a zona. */
.oxrc1-topbar-actions {
  gap: 4px;
}

/* 2) Altura dos controles da barra desalinhada: o pill central de custo era 24px enquanto a
      tira de abas é 28px e os icon-buttons 30px — o readout ficava visivelmente mais baixo que
      os vizinhos, quebrando a linha de altura da toolbar. Sobe pra 28px (place-items:center +
      line-height:1 já centram o texto → só adiciona respiro vertical, zero reflow) e encosta
      na altura da tira de abas pra um chrome superior de altura consistente. */
.oxrc1-cost-counter {
  min-height: 28px;
}



/* ===================== design v90 — composer (2a volta): presença do CTA Enviar ===================== */
/* Rotação: composer. v52 fechou transições/press/foco-de-teclado dos controles, v73 a perna
   DISABLED, v83 o × dos chips de anexo. Sobrou UM tell óptico no controle mais importante do app:
   o botão ENVIAR (data-rc1-send) — o CTA primário — herdava font 16px do body sem peso, então o
   glifo ↑ ficava fino e pequeno dentro da pastilha branca preenchida de 32px, lendo como "default"
   e não como ação principal; e a pastilha nascia CHAPADA (sem sombra em repouso) e só ganhava
   elevação no hover, destoando de um filled-button caro que assenta levemente elevado desde o
   repouso. Correção em duas mãos, mesmo raciocínio (dar corpo ao CTA):
   1) glifo com presença — 17px + peso 600 + line-height 1 (place-items:center já centra), a seta
      passa a ler como ícone de ação, não caractere solto;
   2) micro-elevação em repouso — sombra sutil (0 1px 3px /24) que o hover do v52 (0 2px 12px) segue
      superando com folga (delta de lift preservado, agora mais suave via a transição de box-shadow
      já declarada no v52).
   Só o ENVIAR — mic (○) e 📎 seguem ghost/quietos DE PROPÓSITO (hierarquia de dois níveis: tools
   silenciosos até o hover, CTA sempre presente). As pernas :disabled (v73) e :active/:hover (v52)
   têm especificidade maior (pseudo-classe) e continuam vencendo — o repouso elevado não vaza pro
   estado travado nem para o press. Só apresentação: nenhum data-rc1-*/seletor/comportamento/microcopy
   tocado; zero token ou cor novo; identidade preservada (CTA branco quente OXXY). */
.oxrc1-composer .oxrc1-send {
  font-size: 17px;
  font-weight: 600;
  line-height: 1;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.24);
}


/* ===================== design v91 — home do projeto (aterrissagem): press tátil ===================== */
/* Rotação: composer (v90) -> HOME DO PROJETO. A home já teve mãos fortes (v54 entrada/eyebrow/cards/
   hover+foco/empty; v70 tracking do display + hierarquia da ação primária). Auditando o que sobrou de
   tell REAL, achei uma lacuna de CONSISTÊNCIA de produto: TODO controle clicável do app afunda ~0.5px
   no :active — nav-action, section-toggle, thread, icon-buttons (sidebar+topbar), abas centrais e os 5
   controles do composer (send/tool/engine/persona). MAS a home do projeto — a tela de aterrissagem com
   a MAIOR densidade de botões (3 ações do header, 5 ações rápidas, N linhas de chat) — não tinha
   NENHUM estado de press. Clicar em qualquer botão da home lia como \"morto\" comparado ao resto do
   produto. Fecho a lacuna no MESMO idioma já cravado no app: fundo -> --oxrc1-active + micro-sink
   translateY(0.5px), tudo guardado por reduced-motion. Detalhes de cascata verificados:
   - a AÇÃO PRIMÁRIA (.oxrc1-project-home-quick .oxrc1-project-home-action:first-child, a barra-accent
     do v70) tem especificidade maior (0,3,0) que o :active genérico (0,2,0): mantém o tingido de accent
     no press, só ganha o sink — identidade preservada;
   - linhas de chat passam a usar --oxrc1-active no press, igual ao .oxrc1-thread da sidebar (mesma
     superfície conceitual: uma linha de conversa clicável);
   - redeclaro a transition (superset da do v54 + transform) e re-afirmo transition:none sob
     reduced-motion, pra não vazar a animação que o v54 guardou.
   Só apresentação: nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado; zero token ou
   cor novo (--oxrc1-active já existe e é o idioma de press do app); identidade preservada. */
.oxrc1-project-home-action,
.oxrc1-project-home-chat {
  transition: background-color 150ms ease, border-color 150ms ease,
    box-shadow 150ms ease, transform 150ms ease;
}
.oxrc1-project-home-action:active,
.oxrc1-project-home-chat:active {
  background: var(--oxrc1-active);
  transform: translateY(0.5px);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-project-home-action,
  .oxrc1-project-home-chat {
    transition: none;
  }
  .oxrc1-project-home-action:active,
  .oxrc1-project-home-chat:active {
    transform: none;
  }
}



/* ===================== design v92 — sidebar direita / Painel Vivo: escalada de estado ===================== */
/* Rotação: home do projeto (v91) -> SIDEBAR DIREITA. A coluna já teve mãos fortes (v66 easing dos
   passos de progresso, v71 estados terminais + eyebrow "Pedido atual", v81 scrollbar fino, v86 ritmo
   4/8 + tracking dos eyebrows da frota). Auditando o que sobrou de tell REAL, achei o MESMO "estalo
   seco" que o v66 corrigiu na lista de progresso — só que agora no PAINEL VIVO, o coração adaptativo
   da sidebar. O painel muda de estado calmo -> ativo -> alerta conforme a frota trabalha ou passa a
   esperar o Founder (data-estado, emitido pelo JS renderFrotaPainel — read-only, não toco). A barra do
   norte já preenche suave (width .4s), MAS o cartão de destaque adaptativo e o ponto de pulso trocavam
   de fundo/borda/cor num ESTALO: quando a frota escala pra "alerta", o cartão PISCAVA âmbar em vez de
   assentar. Um produto sênior faz a escalada de atenção parecer deliberada, não um flicker.
   Correção: a mudança de estado do destaque e do pulso assenta em 200ms (mesmo tempo/curva do v66).
   O keyframe de respiro do pulso (oxrc1-frota-breathe) e o pulse animation coexistem com a transição
   de background — a transição só suaviza a troca da cor-base ao mudar de estado; o breathe segue igual.
   Só apresentação: nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado; zero token ou
   cor novo (reaproveita as cores já pintadas por [data-estado]); identidade preservada (dark warm +
   accent OXXY); prefers-reduced-motion respeitado. */
.oxrc1-frota-destaque {
  transition: background-color 200ms ease, border-color 200ms ease;
}
.oxrc1-frota-pulse {
  transition: background-color 200ms ease;
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-frota-destaque,
  .oxrc1-frota-pulse {
    transition: none;
  }
}



/* ===================== design v93 — modais/dialogs (3ª volta): scrollbar do card ===================== */
/* Rotação: sidebar direita (v92) -> MODAIS. Os modais já tiveram duas mãos fortes (v58: entrada que
   assenta + scrim com blur + hover/foco dos campos + microestados dos botões; v74: a perna :disabled).
   Auditando atrás de tell REAL sobrante, achei um único ponto barato: o próprio CARD do modal rola.
   `.oxrc1-modal` tem `overflow-y: auto` + `max-height: calc(100vh - 40px)`, então quando o conteúdo
   passa da altura — modal-wide (760px) com uma <dl> de detalhes longa, ou qualquer modal num viewport
   baixo / mobile <=390px — aparece a barra de rolagem NATIVA e grossa do SO. Mas o resto do produto já
   fala outra língua: o sidebar esquerdo (v-scroll) e os blocos de código (`.oxrc1-code pre`, v-scroll
   fino) já ganharam a barra fina translúcida da identidade. Uma superfície de rolagem refinada e a do
   dialog não é o clássico tell de \"software não-caro\": inconsistência entre trilhos de scroll.
   Correção: aplico ao `.oxrc1-modal` EXATAMENTE o mesmo tratamento já pintado nos blocos de código —
   scrollbar-width thin, cor translúcida rgba(255,255,255,.18), thumb 8px raio total rgba(255,255,255,.16)
   com hover a .26 e transição de 150ms (a mesma linguagem do v81/scroll do código).
   Só apresentação: nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado; zero token ou
   cor novo (reaproveita os mesmos valores de scrollbar já no arquivo); identidade preservada (dark warm
   + accent OXXY); prefers-reduced-motion respeitado (só zera a transição do thumb, como no bloco do código). */
.oxrc1-modal {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-modal::-webkit-scrollbar {
  width: 8px;
}
.oxrc1-modal::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-modal::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-modal::-webkit-scrollbar-thumb { transition: none; }
}


/* ===================== design v94 — estados vazios (3ª volta): o vazio-RICO órfão ==
   Rotação: modais v93 -> ESTADOS VAZIOS v94. A área já teve duas mãos fortes
   (v59: vazio-herói do chat + browser; v72: os três "vazios finos"
   decision/queue/home unificados). Reauditoria de designer achou o ÚNICO estado
   vazio que ficou fora do idioma: o `.oxrc1-mission-empty`.

   Achado real (consistência de composição, não invenção): o mission-empty é o
   estado vazio MAIS completo do produto — título (<h3> "Nenhuma missão neste
   projeto."), subtexto explicativo E um CTA primário ("Criar primeira missão").
   Mesmo assim seguia tratado como PLACEHOLDER cru: alinhado à esquerda, padding
   apertado (14px), sem profundidade. Enquanto isso, seu GÊMEO ESTRUTURAL — que
   vive na MESMA superfície (a home do projeto), tem a MESMA anatomia (frase +
   CTA) e a MESMA função ("nada aqui ainda, comece por aqui") — o
   `.oxrc1-project-home-empty` já virou estado DESENHADO no v54: centralizado,
   respira e ganha profundidade sutil ("vira um estado desenhado, não um
   placeholder"). Dois vazios-com-CTA lado a lado na home do projeto com
   composições divergentes = clássico tell de "quase caro".

   Correção: trago o mission-empty pro MESMO idioma do gêmeo — centralizado,
   mesmo respiro e a MESMA profundidade (reusa o shadow exato do v54). NÃO ganha
   entrada própria de propósito: a superfície `.oxrc1-project-home` já assenta o
   bloco inteiro ao aparecer (é a mesma razão pela qual o project-home-empty
   nunca precisou de animação própria — evita duplo-assentar).

   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado; a
   borda tracejada (identidade do estado vazio) preservada; zero token/cor novo
   (o subtexto já era --oxrc1-muted; o shadow é o mesmo do gêmeo). */
.oxrc1-mission-empty {
  justify-items: center;
  text-align: center;
  padding: 26px 22px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.14);
}

/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */

/* ===================== design v96 — sidebar esquerda (4ª volta): fecha o contrato tátil + ritmo ==
   Rotação: estados vazios v94 -> SIDEBAR ESQUERDA v96. A área teve v76 (anel de
   foco de teclado) e v88 (eyebrows das seções no idioma premium). Reauditoria de
   designer atrás de tell REAL sobrante — a sidebar é a moldura que o usuário vê o
   tempo todo, então o padrão de acabamento é alto.

   Achado 1 (o principal — feedback tátil): TODO controle interativo da sidebar
   esquerda afunda no clique — .oxrc1-nav-action, .oxrc1-section-toggle,
   .oxrc1-thread, .oxrc1-account-trigger e .oxrc1-left .oxrc1-icon-button já têm
   :active { background: var(--oxrc1-active) }. O ÚNICO fora do contrato era o
   botão "+ Novo projeto" (.oxrc1-section-head > button:not(.oxrc1-section-toggle)):
   ele já entrava no contrato de TRANSIÇÃO (background-color 150ms) e no de HOVER,
   mas não tinha estado :active — então tinha a transição preparada para um afundar
   que nunca acontecia. Ao clicar, ele "pulava" sem devolver pressão. Completo o
   sistema com o MESMO --oxrc1-active dos irmãos: agora o botão que mais parece um
   CTA de ação na sidebar responde ao toque como todos os outros.

   Achado 2 (ritmo de motion): a seta das seções (.oxrc1-section-arrow) girava em
   140ms — a ÚNICA transição da sidebar fora do ritmo unificado de 150ms (o
   contrato compartilhado de transição da sidebar toda roda em 150ms). 2px de
   duração ninguém nomeia, mas o olho sente o desencaixe. Alinho ao sistema: 150ms.
   E era também a única motion da sidebar que ignorava prefers-reduced-motion —
   entra no bloco de reduced-motion junto com os irmãos.

   Só apresentação — ZERO data-rc1-*/seletor estrutural/comportamento/microcopy
   tocado; identidade (dark, gradiente OXXY) preservada; nenhum token ou cor novo
   (--oxrc1-active já é o mesmo dos 5 irmãos). Deixei DE PROPÓSITO: NÃO troquei o
   glifo da seta nem mexi no toggle de seção (é comportamento/JS); NÃO adicionei
   translateY ao "+ Novo projeto" — o padrão de translate na sidebar é exclusivo
   do .oxrc1-icon-button (botões de moldura), não das ações de seção. */
.oxrc1-section-head > button:not(.oxrc1-section-toggle):active {
  background: var(--oxrc1-active);
}
.oxrc1-section-arrow {
  transition: transform 150ms ease;
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-section-arrow {
    transition: none;
  }
}


/* ===================== design v97 — header/topbar (4ª volta): fronteira do chrome superior ==
   Rotação: sidebar esquerda v96 -> HEADER/TOPBAR v97. A barra já teve mãos fortes
   (v51 transições/press, v62 title-ellipsis + tabular-nums, v75 anel de foco de
   teclado, v89 gap do par de ícones + ritmo de altura). Reauditoria de designer
   atrás do último tell REAL.

   Achado (consistência entre breakpoints — não invenção): a `.oxrc1-chat-topbar`
   nasce com `border-bottom: 1px solid transparent` — 1px reservado mas NUNCA pintado
   no desktop. Confirmei que NÃO há scroll-shadow: nenhum handler no JS mexe no
   borderBottom e não existe classe `.is-scrolled` — o espaço fica reservado e a
   linha simplesmente não aparece em tela larga. MAS o MESMO seletor, dentro do
   media query estreito (<=~720px), já reativa a linha com `border-bottom-color:
   var(--oxrc1-line)` pra separar a toolbar quando ela quebra em duas fileiras.
   Ou seja: a MESMA banda estrutural tem fronteira no mobile e PERDE a fronteira no
   desktop, sem razão de design. E toda a linguagem de divisória do produto já é
   `--oxrc1-line` (pill de custo, tira de abas, sidebar) — a toolbar do topo era a
   ÚNICA banda de chrome sem contorno em tela larga. Clássico tell de "quase caro":
   o app bar flutua sem assentar sobre a conversa.

   Correção: promovo a MESMA divisória que já existe no mobile pra regra base —
   `border-bottom-color: var(--oxrc1-line)` no `.oxrc1-chat-topbar` em todos os
   breakpoints. Zero reflow (o 1px já estava reservado desde sempre), zero token/cor
   novo (reusa `--oxrc1-line`, a hairline canônica do produto), identidade preservada.
   Removi também o override redundante de `border-bottom-color` do bloco mobile (a base
   agora entrega a mesma linha em toda largura → a regra do media query virou morta).

   Deixei DE PROPÓSITO: mantive `--oxrc1-line` (hairline sutil) e NÃO `--oxrc1-line-strong`
   — a intenção é assentar a barra, não cravar um traço duro; a tira de abas segue com
   sua própria baseline (é um controle segmentado auto-contido, não abas full-width).
   Só apresentação: nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado. */
.oxrc1-chat-topbar {
  border-bottom-color: var(--oxrc1-line);
}


/* ===================== design v98 — tabs da fila de decisões (founder queue) =====================
   Rotação: header (v97) -> founder queue. Reauditoria de designer varrendo o ÚLTIMO
   controle segmentado do produto fora do idioma de microtransição.

   ACHADO (tell REAL de "quase caro"): `.oxrc1-founder-queue-tabs button` é um controle
   SEGMENTADO (as abas de filtro do painel de decisões do Founder) — irmão direto de
   `.oxrc1-center-tab` (abas Chat/Browser do header). O irmão já fala o idioma premium
   desde o v51: transição de 150ms em background/color/border/box-shadow + press tátil
   `:active` (afunda pra --oxrc1-active) + guarda de reduced-motion. As abas da fila,
   porém, nasceram SEM transição: hover, foco de teclado E — pior — a TROCA de aba ativa
   (`.is-active`) ESTALAVAM (o fundo aparecia num pop instantâneo), destoando de todo o
   resto da superfície (75 microtransições de 150ms no produto). Um controle segmentado
   que estala é o clássico tell de barato lado a lado com um que desliza.

   Correção: alinho ao idioma EXATO do irmão center-tab — mesma transição de 150ms e o
   mesmo press `:active` (--oxrc1-active), mais a guarda de reduced-motion. Não invento
   idioma novo; aplico o já documentado ao único segmentado que ficou de fora.

   Regras duras: SÓ apresentação — nenhum `data-rc1-*`/seletor estrutural/comportamento/
   microcopy tocado; zero token ou cor novo (reuso --oxrc1-active, --oxrc1-hover já usados
   pelo hover/is-active existentes); identidade preservada. */
.oxrc1-founder-queue-tabs button {
  transition: background-color 150ms ease, color 150ms ease,
    border-color 150ms ease, box-shadow 150ms ease;
}

.oxrc1-founder-queue-tabs button:active {
  background: var(--oxrc1-active);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-founder-queue-tabs button {
    transition: none;
  }
}

/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* ===================== design v99 — botão "⋯" das linhas da sidebar esquerda ==================
   Rotação: founder queue (v98) -> SIDEBAR ESQUERDA / linhas. Tell deixado explícito pela
   rodada anterior (v98) como o ÚLTIMO resíduo de microtransição do produto.

   ACHADO (tell REAL de "quase caro"): `.oxrc1-menu-more` é o botão "⋯" que aparece em cada
   linha de thread/projeto da sidebar esquerda. Ele JÁ está no contrato de HOVER (linha ~221:
   muda `background`/`color` para --oxrc1-hover/--oxrc1-text), mas nasceu FORA do contrato de
   TRANSIÇÃO — não estava na lista de `.oxrc1-thread, .oxrc1-nav-action, …` que roda 150ms.
   Resultado: a própria linha (`.oxrc1-thread`, sua irmã e container) DESLIZA suave no hover,
   enquanto o "⋯" aninhado dentro dela ESTALA (fundo aparece num pop instantâneo). Dois
   elementos sobrepostos, o de fora desliza e o de dentro estala — o clássico tell de barato.
   Também não tinha estado `:active` (press), então era o único controle da sidebar sem o
   afundar tátil dos irmãos (thread, nav-action, section-toggle, account-trigger, icon-button).

   Correção: aplico ao `.oxrc1-menu-more` o MESMO contrato dos irmãos de linha — transição de
   150ms em background/color/box-shadow (idêntica à do `.oxrc1-thread`, SEM border-color porque
   linhas da sidebar não animam borda, ao contrário dos controles segmentados) + press `:active`
   (--oxrc1-active) + guarda de reduced-motion. Não invento idioma; estendo o já documentado ao
   único filho de linha que ficou de fora.

   Regras duras: SÓ apresentação — nenhum `data-rc1-*`/seletor estrutural/comportamento/microcopy
   tocado; zero token ou cor novo (reuso --oxrc1-active/--oxrc1-hover já usados pelo hover/press
   dos irmãos); identidade (dark, gradiente OXXY) preservada. Deixei DE PROPÓSITO: SEM translateY
   — o padrão de translate na sidebar é exclusivo do `.oxrc1-icon-button` (botões de moldura), e o
   "⋯" é ação de linha, não de moldura, então afunda só por cor como thread/nav-action. */
.oxrc1-menu-more {
  transition: background-color 150ms ease, color 150ms ease, box-shadow 150ms ease;
}

.oxrc1-menu-more:active {
  background: var(--oxrc1-active);
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-menu-more {
    transition: none;
  }
}

/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */



/* ===================== design v100 — Painel Vivo (sidebar direita): respiro respeita reduced-motion =====================
   Rotação: sidebar esquerda / botão "⋯" (v99) -> SIDEBAR DIREITA / Painel Vivo (frota).
   A coluna já teve mãos fortes (v66 easing dos passos, v71 estados terminais, v81 scrollbar,
   v86 ritmo 4/8 + tracking dos eyebrows, v92 escalada de estado do destaque/pulso). Reauditoria
   de designer atrás de tell NOVO e REAL — não estético desta vez, e sim de acessibilidade.

   ACHADO (WCAG 2.2.2 "Pause, Stop, Hide" — tell concreto): o Painel Vivo tem DUAS motions
   AMBIENTES, infinitas, que IGNORAVAM prefers-reduced-motion:
     1) `oxrc1-frota-breathe` — o respiro do ponto de pulso (`.oxrc1-frota-pulse` nos estados
        ativo/alerta) e do `.oxrc1-frota-alerta-dot`, `infinite` a 1.2-2.4s. O v92 tratou só a
        TRANSIÇÃO de cor-base do pulso e deixou explícito que "o breathe segue igual" — ou seja,
        para quem pede menos movimento no SO, o ponto seguia pulsando sem parar.
     2) `.oxrc1-frota-norte-fill` — a barra do norte anima `width .4s`; ao atualizar o progresso a
        barra deslizava mesmo com reduced-motion ligado.
   Um produto sênior (Linear/Vercel/Claude) mata as animações ambientes quando o usuário pede
   menos movimento — e ESTA era a última motion da sidebar direita que ainda ignorava o pedido.

   Correção: sob `prefers-reduced-motion: reduce`, zero o `animation` do respiro (o ponto fica
   estático na sua cor de estado — a informação de estado É a COR, não o movimento, então nada se
   perde) e zero a `transition` de width da barra do norte (o preenchimento salta direto ao alvo).
   ZERO mudança para quem NÃO pede reduced-motion: o produto respira exatamente igual.

   Regras duras: SÓ apresentação — nenhum `data-rc1-*`/seletor estrutural/comportamento/microcopy
   tocado; zero token ou cor novo; identidade (dark warm + accent OXXY) preservada. */
@media (prefers-reduced-motion: reduce) {
  .oxrc1-frota-vivo[data-estado="ativo"] .oxrc1-frota-pulse,
  .oxrc1-frota-vivo[data-estado="alerta"] .oxrc1-frota-pulse,
  .oxrc1-frota-alerta-dot {
    animation: none;
  }
  .oxrc1-frota-norte-fill {
    transition: none;
  }
}

/* ===================== design v101 — modais/dialogs (4ª volta): hierarquia do CTA primário ==
   Rotação: sidebar direita (v100 reduced-motion) -> MODAIS. Os modais já tiveram três mãos
   (v58: entrada/scrim/foco/microestados; v74: :disabled; v93: scrollbar fino do card). Reauditando
   como designer sênior, o tell REAL que sobrava é de HIERARQUIA, não de motion: numa linha de ações
   o botão afirmativo (\"Criar projeto\", \"Criar missão\", \"Gerar plano\", \"Entendi\") era pintado
   EXATAMENTE igual ao \"Cancelar\" — mesmo fundo branco a 5%, mesma borda. Só o destrutivo (.is-danger)
   tinha ênfase. Resultado: o olho não sabia onde pousar; num dialog premium (Linear/Vercel/Stripe) a
   ação primária é sempre a âncora visual. Clássico sinal de \"software não-caro\": confirm e cancelar
   indistinguíveis.

   Correção: o construtor canônico `modalActions` agora marca o botão afirmativo com `.is-primary`
   (exclusivo do `.is-danger` — destrutivo continua vermelho; navegação neutra de modais custom, como
   o review de decisão \"Voltar ao funil / Fechar\", fica SEM ênfase, que é o certo). No CSS, `.is-primary`
   ganha o tratamento \"neutro elevado\": fundo branco a 13% (vs 5% do cancelar), borda a 30%, peso 500 —
   três degraus limpos de hierarquia (quieto → primário → perigo) SEM inventar hue (o vermelho já é do
   danger; usar o accent crimson brigaria com ele). Hover/active sobem o branco (18%/15%); guardados com
   `:not(:disabled)` para NÃO reacender o CTA travado (respeita a intenção do v74 — em processamento o
   primário volta ao neutro quieto). Foco de teclado herda o anel branco do v58.

   Regras duras: só apresentação — o `.is-primary` é classe puramente visual (nenhum data-rc1-*/seletor
   estrutural/comportamento/microcopy tocado; nenhum teste pina o markup dos botões); reaproveita o
   idioma branco-alpha já no arquivo (zero token/cor novo); identidade preservada (dark warm + accent
   OXXY); a transição já existente é zerada sob reduced-motion pelo bloco do v58 (sem motion nova). */
.oxrc1-modal-actions .is-primary:not(:disabled) {
  background: rgba(255, 255, 255, 0.13);
  border-color: rgba(255, 255, 255, 0.30);
  color: var(--oxrc1-text);
  font-weight: 500;
}
.oxrc1-modal-actions .is-primary:not(:disabled):hover {
  background: rgba(255, 255, 255, 0.18);
  border-color: rgba(255, 255, 255, 0.38);
}
.oxrc1-modal-actions .is-primary:not(:disabled):active {
  background: rgba(255, 255, 255, 0.15);
  transform: translateY(0.5px);
}

/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* design v102 — composer (barra de digitar): a microtransição rest→hover→press
   que o resto do app já fala (sidebar esq. v50, header v51, copiar v53) faltava
   nos DOIS botões do composer — .oxrc1-tool (anexar/ferramentas) e .oxrc1-send.
   Eles trocavam fundo/cor no :hover (grupo compartilhado do v52) SNAPANDO, sem
   os 150ms, e sem press tátil. Sendo o composer a superfície MAIS tocada do
   produto, era o tell de "software barato" mais visível que sobrou. Alinho ao
   mesmo idioma: transição 150ms + press 0.5px. Só apresentação — nenhuma cor/
   token novo, nenhum data-rc1-*/comportamento/microcopy tocado; as cores de
   hover permanecem as já definidas (só passam a assentar suave). O press é
   guardado com :not(:disabled) pra não reacender o Enviar travado (respeita o
   v52-disabled), e a transição some sob prefers-reduced-motion. */
.oxrc1-tool,
.oxrc1-send {
  transition: background-color 150ms ease, color 150ms ease;
}
.oxrc1-tool:not(:disabled):active,
.oxrc1-send:not(:disabled):active {
  transform: translateY(0.5px);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-tool,
  .oxrc1-send {
    transition: none;
  }
  .oxrc1-tool:not(:disabled):active,
  .oxrc1-send:not(:disabled):active {
    transform: none;
  }
}


/* ===================== design v103 — bolhas de mensagem (4ª volta): peso do negrito inline ==
   Rotação: composer (v102) -> BOLHAS (v103). A conversa é a superfície MAIS vista do produto;
   v53/v65/v69/v80 já cuidaram de entrada/pending/falha/thinking/copiar/marcadores/links/escala
   de títulos/stack mono. Reauditoria de designer achou UM tell tipográfico real que sobrou:

   ACHADO — hierarquia de peso INVERTIDA no corpo da resposta. renderInline emite <strong> para
   **negrito**, mas nao havia regra .oxrc1-bubble strong → caia no `bold` cru do navegador (700).
   Os titulos de secao da propria resposta (.oxrc1-bubble h1/h2/h3) usam 650. Efeito real: uma
   palavra em **negrito** no meio do paragrafo saia MAIS pesada que um TITULO — o texto gritava
   mais alto que o cabecalho, invertendo a hierarquia (o oposto do padrao Linear/Vercel/Claude).
   Fixa o negrito inline em 640: inequivoco sobre o corpo (400) e um passo ABAIXO dos titulos
   (650), devolvendo a ordem de leitura. So apresentacao — nenhum data-rc1-*/comportamento/
   microcopy/identidade tocado; nenhuma cor/token novo. */
.oxrc1-bubble strong {
  font-weight: 640;
}


/* ===================== design v106 — estados vazios (4ª volta): anel de foco + transição dos chips de sugestão ==
   Rotação: bolhas (v103) -> ESTADOS VAZIOS (v106). A área já teve três mãos fortes
   (v59 vazio-herói do chat + browser; v72 os três vazios-finos; v82 eyebrow do herói;
   v94 unificou o último órfão, o mission-empty). Reauditoria de designer achou UM tell
   real que sobrou — e é justamente na PRIMEIRA superfície interativa de uma conversa em
   branco: os chips de sugestão do estado vazio-herói (.oxrc1-prompt-row button).

   ACHADO 1 (foco de teclado órfão): todo controle-pílula do produto já migrou do outline
   azul cru do :root (button:focus-visible) para o anel de chrome unificado
   `outline:0; box-shadow: 0 0 0 2px rgba(255,255,255,.16)` — composer (engine/persona),
   modal-actions, chips de anexo, ícones do topbar. Os chips de sugestão eram o único
   grupo de pílulas que ainda caía no outline azul genérico do navegador — inconsistente
   com o idioma do resto, e logo na tela que mais se vê ao abrir uma conversa nova.

   ACHADO 2 (hover sem easing): o hover trocava o fundo num estalo seco (sem transição),
   enquanto os primos estruturais (.oxrc1-thread, botões do composer, modal-actions) já
   fazem easing de 150ms. Fecho as duas lacunas no mesmo bloco.

   Só apresentação — nenhum data-rc1-*/seletor/comportamento/microcopy tocado; a pílula
   com borda (identidade) preservada; zero token/cor novo (o anel .16 e a curva 150ms já
   são os do resto do produto). */
.oxrc1-prompt-row button {
  transition: background-color 150ms ease, color 150ms ease, box-shadow 150ms ease;
}
.oxrc1-prompt-row button:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-prompt-row button { transition: none; }
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* design v108 — campo de URL do browser interno: estado de ERRO visível.
   O JS já marca data-rc1-browser-error no input em duas situações reais — URL inválida
   ("invalid_url") e tentativa de abrir o próprio OXXY dentro dele ("oxxy_recursion") —
   e dispara um toast. Mas o CAMPO em si não dava retorno algum: ficava no anel neutro
   branco do v63 (feito de propósito pra NÃO parecer erro no foco normal), então o erro só
   existia no toast efêmero — some em 1-2s e o campo continua "ok". Reauditoria de designer:
   é o único input do produto que seta um data-error sem consumo visual. Fecho reusando o
   token --oxrc1-danger que menus (is-danger) e modais já usam — zero cor/token novo.
   Só apresentação: o data-attr já existe e é setado/limpo pelo JS (delete no sucesso);
   aqui só o CONSUMO visual. Nenhum data-rc1-*/seletor/comportamento/microcopy tocado;
   identidade dark warm + accent OXXY intacta. */
.oxrc1-browser-bar input[data-rc1-browser-error] {
  border-color: var(--oxrc1-danger);
  box-shadow: 0 0 0 1px rgba(255, 119, 119, 0.28);
}
/* erro vence o anel neutro de foco do v63 (mesma trilha: só a cor muda pro danger) */
.oxrc1-browser-bar input[data-rc1-browser-error]:focus,
.oxrc1-browser-bar input[data-rc1-browser-error]:focus-visible {
  border-color: var(--oxrc1-danger);
  box-shadow: 0 0 0 2px rgba(255, 119, 119, 0.38);
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */



/* ===================== design v111 — foco de teclado: os 2 últimos botões da coluna esquerda no padrão premium =====================
   Rotação: sidebar direita (v110) -> SIDEBAR ESQUERDA. A coluna já teve mãos fortes
   (v76 unificou o FOCO de teclado de toda a esquerda pro anel branco interno, matando o
   outline azul do default; v88 eyebrows; v99 transição/press do "⋯"; v-'+' :active).

   ACHADO (tell REAL de consistência + a11y, cruzando CSS×CSS): o bloco do v76 declarou
   explicitamente levar "TODA a coluna esquerda pro mesmo padrão premium ... zero outline azul"
   e listou nav-action, section-toggle, search-result, thread, account-trigger, settings e
   account-menu button. Mas DOIS botões de ação da coluna ficaram de fora e ainda caíam no
   `button:focus-visible` global (outline AZUL 2px, offset 2px):
     1) `.oxrc1-menu-more` — o "⋯" que aparece em CADA linha de thread/projeto (o controle
        focável mais repetido da sidebar). Já estava no hover (v-221) e no press/transição (v99),
        mas nunca no foco premium. Tab até ele: a própria linha mostra o anel branco enquanto o
        "⋯" dentro dela pisca a caixa azul do default. Exatamente a inconsistência que o v76 saiu
        pra matar — dois elementos sobrepostos, um com anel branco e o filho com outline azul.
     2) `.oxrc1-section-head > button:not(.oxrc1-section-toggle)` — o "+" de novo projeto. Mesmo
        caso: hover + press já no contrato desde v99-era, foco de teclado ainda no azul default.

   Correção: estendo aos dois o MESMO padrão do v76 — outline 0 + anel branco interno
   (box-shadow 0 0 0 2px rgba(255,255,255,.16)) + superfície de hover no foco. Fecha o último
   resíduo de outline azul da coluna esquerda. Zero token/cor novo (o anel .16 e o --oxrc1-hover
   já são os do v76); nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado;
   identidade (dark warm + accent OXXY) preservada. A especificidade classe+pseudo vence o
   `button:focus-visible` global (elemento+pseudo) sem !important. */
.oxrc1-menu-more:focus-visible,
.oxrc1-section-head > button:not(.oxrc1-section-toggle):focus-visible {
  outline: 0;
  background: var(--oxrc1-hover);
  color: var(--oxrc1-text);
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.16);
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */



/* ===================== design v114 — barra de rolagem da CONVERSA (.oxrc1-messages) =====================
   Rotação/staleness: toast (v113) -> a superfície MAIS ROLADA do produto inteiro. Cruzei
   CSS×CSS todos os containers com overflow-y:auto e achei o tell REAL de consistência + "cara de
   software caro": TODAS as irmãs roláveis já ganharam o scrollbar fino premium translúcido —
   .oxrc1-left-scroll (navegação), .oxrc1-progress (sidebar direita, v81), .oxrc1-modal (v93) e
   .oxrc1-code pre (v65) — mas a LISTA DE MENSAGENS, o container que mais se rola no produto,
   ainda caía no scrollbar NATIVO do SO: a barra clara/chunky do macOS/Windows rasgando o dark
   quente premium exatamente onde o Founder mais olha. Era a última rolável fora do idioma.

   Correção: aplico o MESMO contrato fino já presente no arquivo (scrollbar-width:thin + trilho
   transparente + thumb translúcido 8px raio total, hover .26 com transição 150ms e guarda de
   prefers-reduced-motion) — reuso exato dos valores do .oxrc1-code pre/.oxrc1-left-scroll, zero
   token/cor novo. Nenhum data-rc1-*/seletor estrutural/comportamento/microcopy tocado; identidade
   (dark warm + accent OXXY) preservada. Só CONSUMO visual de um overflow que já existia. */
.oxrc1-messages {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-messages::-webkit-scrollbar {
  width: 8px;
}
.oxrc1-messages::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-messages::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-messages::-webkit-scrollbar-thumb { transition: none; }
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */

/* design v115 — FECHAMENTO 100% do contrato de scrollbar fino premium.
   Auditoria CSS×CSS de TODOS os overflow:auto/scroll do produto: já no idioma fino estavam
   .oxrc1-left-scroll (v?), .oxrc1-code pre (v65), .oxrc1-progress (v81), .oxrc1-modal (v93) e
   .oxrc1-messages (v114). Sobravam QUATRO roláveis ainda caindo no scrollbar NATIVO do SO —
   a barra clara/chunky do macOS/Windows rasgando o dark quente:
     • .oxrc1-thinking-live-body  → o "pensando ao vivo" (streaming, max-height 260px) que o Founder
       encara enquanto o OXXY raciocina — alta visibilidade;
     • .oxrc1-funnel-result pre   → blocos pré-formatados de resultado (dry-run/missão);
     • .oxrc1-context-menu        → menu de contexto flutuante (rola só quando passa de 420px);
     • .oxrc1-table-wrap          → rolagem HORIZONTAL de tabelas largas (único no eixo-x).
   Correção: reuso EXATO do mesmo contrato já no arquivo (scrollbar-width:thin + trilho
   transparente + thumb translúcido raio total, hover .26 com transição 150ms e guarda de
   prefers-reduced-motion). width E height 8px no thumb webkit para cobrir os dois eixos (o
   table-wrap é horizontal). Zero token/cor novo; nenhum data-rc1-*/seletor estrutural/comportamento/
   microcopy tocado; identidade (dark warm + accent OXXY) preservada. Só CONSUMO visual de overflows
   que já existiam. Com isto, 100% das superfícies roláveis do produto falam o mesmo idioma. */
.oxrc1-thinking-live-body,
.oxrc1-funnel-result pre,
.oxrc1-context-menu,
.oxrc1-table-wrap {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-thinking-live-body::-webkit-scrollbar,
.oxrc1-funnel-result pre::-webkit-scrollbar,
.oxrc1-context-menu::-webkit-scrollbar,
.oxrc1-table-wrap::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
.oxrc1-thinking-live-body::-webkit-scrollbar-thumb,
.oxrc1-funnel-result pre::-webkit-scrollbar-thumb,
.oxrc1-context-menu::-webkit-scrollbar-thumb,
.oxrc1-table-wrap::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-thinking-live-body::-webkit-scrollbar-thumb:hover,
.oxrc1-funnel-result pre::-webkit-scrollbar-thumb:hover,
.oxrc1-context-menu::-webkit-scrollbar-thumb:hover,
.oxrc1-table-wrap::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-thinking-live-body::-webkit-scrollbar-thumb,
  .oxrc1-funnel-result pre::-webkit-scrollbar-thumb,
  .oxrc1-context-menu::-webkit-scrollbar-thumb,
  .oxrc1-table-wrap::-webkit-scrollbar-thumb { transition: none; }
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* ============================================================================
   design v118 — home do projeto: HIERARQUIA DO CTA NOS ESTADOS VAZIOS.
   Rotação: reauditei a home do projeto (última passada dedicada em v70/v72).
   Tell real: no momento em que a hierarquia MAIS importa — o estado vazio, onde
   só existe UMA coisa a fazer — o botão de ação ("Criar primeiro chat",
   "Criar primeira missão") vinha com o MESMO cinza chapado de qualquer ação
   secundária. Nada dizia ao olho "é aqui". A tela já define uma linguagem de
   ação PRIMÁRIA (v70): barra-accent inset de 2px + borda/fundo levemente
   tingidos de accent, no primeiro chip da fila rápida. Os CTAs dos vazios
   ficavam de fora dela. Aqui estendo EXATAMENTE esse mesmo tratamento — mesmos
   valores, mesmo hover (só a borda persiste, o fundo vira hover neutro), mesmo
   anel de foco de teclado por cima da barra. Zero token/cor novo; nenhum
   data-rc1-* / seletor estrutural / comportamento / microcopy tocado.
   Identidade preservada (dark warm + accent OXXY). Reuso, não reinvenção.
   (Este bump v117->v118 também completa o cache-contract que a rodada anterior
   deixou parcial: 18 pins de teste ainda em v116 + assets em v117.) */
.oxrc1-project-home-empty .oxrc1-project-home-action,
.oxrc1-mission-empty .oxrc1-project-home-action {
  border-color: rgba(183, 25, 34, 0.55);
  background: rgba(183, 25, 34, 0.10);
  box-shadow: inset 2px 0 0 var(--oxrc1-accent);
}
.oxrc1-project-home-empty .oxrc1-project-home-action:hover,
.oxrc1-mission-empty .oxrc1-project-home-action:hover {
  border-color: rgba(183, 25, 34, 0.75);
}
.oxrc1-project-home-empty .oxrc1-project-home-action:focus-visible,
.oxrc1-mission-empty .oxrc1-project-home-action:focus-visible {
  box-shadow: inset 2px 0 0 var(--oxrc1-accent),
    0 0 0 2px rgba(255, 255, 255, 0.16);
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */



/* ============================================================================
   design v119 — modais: RIMA VERTICAL entre campos empilhados.
   Rotação: modais (última mão dedicada v101 — hierarquia do botão primário).
   Reauditando o dialog como designer sênior, o único tell REAL que sobrava é de
   ESPAÇAMENTO, não de motion nem de cor: o `.oxrc1-modal` é um bloco puro (sem
   flex/grid, sem gap) e os controles de formulário (`input`/`select`) não têm
   nenhuma margem vertical. Nos modais de um campo só (Novo projeto) isso é
   invisível. Mas nos que empilham DOIS controles — o "Criar chat" (nome do chat
   + destino do projeto) é o caso vivo — as duas caixas encostam BORDA-COM-BORDA,
   0px de respiro. Descrição (`p`, 14px abaixo), erro (`small`, margin-top 6px) e
   ações (margin-top 16px) já têm ritmo; só o vão CAMPO→CAMPO ficou colado — o
   clássico sinal de "software barato": formulário sem rima. Linear/Vercel/Stripe
   sempre dão à pilha de campos um respiro consistente.
   Correção cirúrgica: 12px (escala 4/8) só quando DOIS controles são irmãos
   adjacentes — dispara exatamente onde se quer e some sozinho nos modais de campo
   único (sem irmão → regra não acende → zero mudança). Só apresentação: nenhum
   token/cor novo, nenhum data-rc1-* / seletor estrutural / comportamento /
   microcopy / markup tocado (nenhum teste pina o espaçamento dos campos);
   identidade preservada (dark warm + accent OXXY); sem motion nova. */
.oxrc1-modal input + input,
.oxrc1-modal input + select,
.oxrc1-modal select + input,
.oxrc1-modal select + select {
  margin-top: 12px;
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */




/* ============================================================================
   design v127 — funil de missão (Painel Vivo): as pílulas de etapa entram no
   idioma de pílula de status da casa.
   Rotação/varredura: o funil (.oxrc1-funnel-steps) é uma superfície RICA — cards
   de etapa com estados is-completed / is-running / is-blocked / is-failed — que
   nunca teve mão dedicada da lane de design (todas as passadas anteriores do
   Painel Vivo foram na lista de progresso e na escada de estado, não no funil).
   Tell REAL com precedente concreto: TODA pílula 999px do app senta numa lavagem
   branca neutra levíssima — `.oxrc1-project-status-badge` (a pílula de status
   canônica) usa `background: rgba(255,255,255,0.025)`; `.oxrc1-decision-review-
   badges span` usa `rgba(255,255,255,0.035)`. A pílula de etapa do funil
   (`.oxrc1-funnel-steps li > span`, também 999px) era a ÚNICA pílula de status do
   app FLUTUANDO em transparente — borda + texto tingidos por estado, mas sem o
   assento de vidro que todas as irmãs têm. Lida como outline solto, não como chip
   desenhado: o clássico tell de "quase caro". Correção: dou à pílula-base a MESMA
   lavagem neutra da pílula canônica (0.025, valor idêntico ao project-status-
   badge). Os estados (is-completed/running/blocked/failed) já mudam só borda+texto
   — exatamente a convenção da casa (project-status-badge.is-attention muda só
   cor+borda, mantém a lavagem neutra) — então a lavagem neutra corre por baixo da
   borda colorida sem tocar as cores de estado. Rima, não reinvenção.
   Segundo microdetalhe da MESMA superfície: o card de etapa (`.oxrc1-funnel-steps
   li`) usava padding 11px — fora do ritmo de card da coluna direita, onde o irmão
   direto `.oxrc1-decision-item` e os primos `.oxrc1-funnel-result`/`-history`
   usam 12px (mesmo precedente de normalização de escala do v86). Sobe pra 12px:
   o card de etapa passa a rimar com todos os cards da coluna.
   Só apresentação: ZERO token/cor novo (reuso o rgba exato do project-status-
   badge), nenhum data-rc1-* / seletor estrutural / comportamento / microcopy /
   markup tocado; nenhum teste pina o fundo da pílula nem o padding do card;
   identidade preservada (dark warm + accent OXXY); sem motion nova. */
.oxrc1-funnel-steps li > span {
  background: rgba(255, 255, 255, 0.025);
}
.oxrc1-funnel-steps li {
  padding: 12px;
}


/* ============================================================================
   design v164 — funil de missão (2a volta): o eyebrow "Missão" entra na família
   de overline da casa. Rotação/varredura: o funil foi a superfície menos tocada
   da coluna direita (só o v127 deu mão dedicada — pílula-base + padding do card).
   Reauditando o CABEÇALHO do funil como designer.

   ACHADO (tell REAL de consistência, com precedente EXPLÍCITO no v153): o rótulo
   "Missão" do topo do funil (`.oxrc1-funnel-head span`) é um EYEBROW/overline —
   mesmo papel estrutural do eyebrow da frota (v86), do departamento (v153), do
   right-head, do project-home e do vazio-herói. O v153 ENUMERA essa família e
   fixa o idioma da casa: uppercase, 11px, letter-spacing 0.08em, weight 600. Mas
   "Missão" nasceu como texto miúdo cru (title-case, 12px, sem tracking, sem peso),
   agrupado na MESMA regra do `<small>` de meta. Era o ÚNICO eyebrow de seção da
   coluna direita fora da família — lia como legenda solta, não como overline
   desenhado. Clássico tell de "quase caro": a mesma etiqueta de seção fala dois
   idiomas dependendo do painel.

   Correção: dou a `.oxrc1-funnel-head span` o idioma EXATO do v153/v86 (uppercase
   + 0.08em + 11px + 600). Escopo cirúrgico ao `span` (o overline); o `<small>`
   irmão ("Triagem local") é CAPTION de meta e fica intocado em 12px dim — não é
   eyebrow. Reuso a cor herdada (--oxrc1-dim), zero token/cor novo, em escala com
   a fonte (11px, não px cravado). Rima com a casa, não reinventa.

   Regras duras: SÓ apresentação — nenhum data-rc1-*/seletor estrutural/
   comportamento/microcopy tocado (o texto "Missão" segue idêntico, só é caixado
   via CSS); nenhum teste pina o case/tracking do eyebrow; identidade preservada
   (dark warm + accent OXXY); sem motion nova. */
.oxrc1-funnel-head span {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* ============================================================================
   design v131 — bolhas de mensagem: figuras tabulares na linha de meta.
   Rotação/varredura: as passadas anteriores nas bolhas cuidaram do CORPO da
   resposta (entrada v52, pending/falha/thinking/copiar, marcadores/links v67,
   negrito v-strong, scrollbar da conversa v114) — mas a LINHA DE META de cada
   mensagem (hora + custo, .oxrc1-meta) nunca entrou na língua de figuras
   tabulares que já corre pelo resto do produto.
   Tell REAL com precedente concreto: dígitos proporcionais "dançam" — o 1 é mais
   estreito que o 8, então quando as mensagens empilham a coluna de horários
   (.oxrc1-message-time, "HH:MM", em TODA mensagem) fica com a borda direita
   irregular e o dois-pontos escorrega de linha pra linha. É EXATAMENTE o tell que
   o v70 matou nos números-herói do placar da home e que o v62 já tinha matado no
   custo do header: `font-variant-numeric: tabular-nums`. O mesmo se aplica ao
   .oxrc1-cost-preview (o "$…" que acompanha toda resposta do assistente): valor
   monetário que pula de largura conforme os dígitos mudam.
   Correção: as duas peças numéricas da meta passam a usar figuras tabulares —
   os horários assentam numa coluna firme e o custo para de respirar de largura.
   Rima com a convenção da casa (header v62, placar v70, contador de custo v76),
   zero token/cor novo.
   Só apresentação: nenhum data-rc1-* / seletor estrutural / comportamento /
   microcopy / markup tocado; identidade preservada (dark warm + accent OXXY);
   sem motion nova. */
.oxrc1-message-time,
.oxrc1-cost-preview {
  font-variant-numeric: tabular-nums;
}



/* ============================================================================
   design v135 — modais/dialogs (5a volta): o CAMPO inválido veste o vermelho do
   próprio erro.
   Rotação: a mão anterior (v134, tabela :hover) deixou os modais explícitos como
   próxima da rotação — auditar foco-trap visual, timing e consistência. Os modais
   já tiveram QUATRO mãos dedicadas (v58 entrada/scrim/foco/microestados; v74
   :disabled; v93 scrollbar do card; v101 hierarquia do CTA primário) + v123 chevron
   do <select>, v124 placeholder, v125 respiro campo→campo. Reauditando como designer
   sênior, um tell REAL sobrou — e não é motion nem espaçamento, é de ESTADO SEMÂNTICO.
   ACHADO — quando a validação falha ("Novo projeto"/"Criar chat" com nome vazio), o
   JS mostra `.oxrc1-modal-error` (texto vermelho --oxrc1-danger) E dá foco de volta
   ao campo. Só que o campo, focado, acende o anel NEUTRO branco do v58 — mensagem
   vermelha embaixo, campo cinza-neutro em cima. O olho não liga o erro ao campo que
   o causou. Clássico "quase caro": num dialog premium (Stripe/Linear/Vercel) o campo
   inválido SEMPRE veste a cor do próprio erro, ancorando a mensagem no controle.
   Precedente DURO no próprio modal: o vermelho já é a língua de erro daqui
   (`.oxrc1-modal-error` texto + `.is-danger` borda/anel do botão destrutivo) — mesma
   lógica do v101 (reusar o danger existente, não inventar hue).
   CORREÇÃO (pura CSS, sem tocar JS/markup): quando o modal exibe um erro visível, o
   campo de texto veste borda + anel vermelhos — os MESMOS rgba do `.is-danger`
   (255,119,119 borda / 255,80,80 anel = família --oxrc1-danger #ff7777), no idioma de
   anel do v58 (box-shadow 3px), só trocando o branco pelo vermelho. Escopo por
   `:has()` no `input` (ambos os modais com erro têm exatamente 1 <input>, e o erro é
   sempre sobre ele — nunca sobre o <select> de destino), então acende só o campo
   certo e some junto com a mensagem no sucesso→fecha (lockstep, sem limpeza viva
   nova). Ganha da regra de foco neutro do v58 por especificidade, então o vermelho lê
   mesmo com o campo focado (o JS refoca o campo no erro).
   Só apresentação: ZERO token/cor novo (reuso os rgba exatos do .is-danger já no
   arquivo), nenhum data-rc1-* / seletor estrutural / comportamento / microcopy /
   markup tocado; nenhum teste pina isto; identidade preservada (dark warm + accent
   OXXY); a transição border/shadow já existe do v58 e já é zerada sob
   prefers-reduced-motion (bloco do v58), sem motion nova. Degradação graciosa: sem
   `:has()`, o campo fica neutro (comportamento de hoje) — enhancement progressivo,
   zero quebra. */
.oxrc1-modal:has(.oxrc1-modal-error:not([hidden])) input {
  border-color: rgba(255, 119, 119, 0.55);
  box-shadow: 0 0 0 3px rgba(255, 80, 80, 0.12);
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */

/* Cabeçalho: badges não cortam o valor (custo dia/mês + gpu); Norte destacado. */
.oxrc1-topbar-center { gap: 8px; display: flex; align-items: center; }
.oxrc1-cost-counter { max-width: 480px; }
/* design v200 — badge do norte (.oxrc1-norte-badge, "🎯 alvo 26/82 · 44%"): completa a
   trinca de truncagem. Rotação: header/badge (v197 fechou o aceso do ⋯; badge = a outra
   metade). ACHADO (tell REAL de consistência, não invenção): o badge já declarava intenção
   de ser LIMITADO — `max-width:150px` + `white-space:nowrap` (l.2547) — mas SEM as duas
   propriedades que fazem o limite realmente conter texto (`overflow:hidden` +
   `text-overflow:ellipsis`). Sem elas, `max-width` é guarda INERTE: quando a string cresce
   (ex.: contagem de pontos de 3 dígitos, "🎯 alvo 126/802 · 44%") o texto TRANSBORDA a
   caixa em vez de assentar — podendo colidir com o caret/borda da sidebar direita, já que
   o badge é o último item do `.oxrc1-frota-head` (flex, margin-left:8px). É a MESMA trinca
   incompleta que o eyebrow do título levou (v62, l.4718) e o padrão documentado da casa
   (pill de custo, linhas da conta, título): text bounded = overflow:hidden + ellipsis +
   nowrap. Completo a trinca — o `max-width` passa a funcionar de fato. Em operação normal
   a string fica ~145px (abaixo do teto), então a reticência quase nunca dispara; é guarda
   defensiva alinhada à convenção, e mesmo no caso patológico clipar-com-ellipsis é melhor
   que o transbordo atual não-controlado. O head é flex/align-items:center → overflow:hidden
   NÃO desloca o badge verticalmente (alinhamento é do flex, não do baseline inline).
   Só apresentação: nenhum data-rc1-*/seletor/comportamento/microcopy/token/cor novo;
   identidade dark warm + accent OXXY intacta. */
.oxrc1-norte-badge { color: var(--oxrc1-accent); font-weight: 600; max-width: 150px; overflow: hidden; text-overflow: ellipsis; }

/* ===== orbe.emocoes · SUB-2a — halo de emocao (front-only, ADITIVO, staging) =====
   Reflexo VISUAL sutil da emocao ja exposta pelo hook data-orbe-emocao (avatar.js SUB-1).
   E um SUSSURRO, nao uma fantasia: um halo de cor tenue via ::after (pseudo-elemento — nao
   colide com o style inline do #oxxy-avatar), sem tocar layout/posicao/tamanho do orbe, sem
   !important, sem mexer no canvas. Cores reusam a linguagem da casa (COL do avatar.js:
   rosa=falar, roxo=pensar/atento, ambar-suave=aguardar, azul-frio=sereno). Gene da honestidade:
   o halo some junto com o atributo (sem emocao => sem halo). PROPOSTA de design pro Founder —
   100% reversivel apagando este bloco. */
#oxxy-avatar[data-orbe-emocao]::after{
  content:""; position:absolute; inset:-6%; border-radius:50%;
  pointer-events:none; z-index:-1; opacity:.4;
  background: radial-gradient(circle at 50% 50%, var(--oxxy-emo-col, transparent) 0%, transparent 68%);
  animation: oxxy-emo-breath var(--oxxy-emo-dur, 3.6s) ease-in-out infinite;
}
#oxxy-avatar[data-orbe-emocao="falante"]{ --oxxy-emo-col: rgba(214,82,154,.28); --oxxy-emo-dur: 2.2s; }
#oxxy-avatar[data-orbe-emocao="atento"]{ --oxxy-emo-col: rgba(150,120,255,.26); --oxxy-emo-dur: 2.8s; }
#oxxy-avatar[data-orbe-emocao="aguardando"]{ --oxxy-emo-col: rgba(230,170,70,.22); --oxxy-emo-dur: 4.2s; }
#oxxy-avatar[data-orbe-emocao="sereno"]{ --oxxy-emo-col: rgba(90,150,246,.18); --oxxy-emo-dur: 6.5s; }
@keyframes oxxy-emo-breath{ 0%,100%{ opacity:.30; transform:scale(1); } 50%{ opacity:.60; transform:scale(1.05); } }
@media (prefers-reduced-motion: reduce){
  #oxxy-avatar[data-orbe-emocao]::after{ animation: none; opacity:.4; }
}


/* ============================================================================
   design v184 — FECHAMENTO REAL do contrato de scrollbar (o painel direito INTEIRO).
   Rotação/staleness: sidebar-direita. Reauditei CSS×CSS todos os overflow:auto/scroll
   contra o "contrato fino premium" que o v115 declarou 100%. Ele cobriu as roláveis
   INTERNAS (.oxrc1-progress v81, .oxrc1-modal v93, .oxrc1-messages v114, thinking-live-body,
   funnel-result pre, context-menu, table-wrap v115) — mas o CONTAINER externo do painel
   direito, .oxrc1-right, tem overflow-y:auto próprio (height:100vh) e ficou de fora: quando
   o Painel Vivo cresce (muitos passos de Progresso + funil de missão) e o painel inteiro
   rola, a barra que aparece é a NATIVA do SO — a barra clara/chunky do macOS/Windows
   rasgando o dark quente exatamente no painel que o Founder mais encara. O irmão .oxrc1-left
   não tinha esse furo porque rola por um wrapper interno (.oxrc1-left-scroll, já no contrato);
   o direito rola no próprio painel, e essa assimetria escapou de v81 e de v115.
   Correção: reuso EXATO do mesmo contrato já no arquivo (scrollbar-width:thin + trilho
   transparente + thumb translúcido 8px raio total, hover .26 com transição 150ms e guarda
   de prefers-reduced-motion). Zero token/cor novo; nenhum data-rc1-*/seletor estrutural/
   comportamento/microcopy/markup tocado; identidade (dark warm + accent OXXY) preservada.
   Só CONSUMO visual de um overflow que já existia. Agora sim: 100% das superfícies roláveis
   do produto — externas e internas — falam o mesmo idioma. */
.oxrc1-right {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-right::-webkit-scrollbar {
  width: 8px;
}
.oxrc1-right::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-right::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-right::-webkit-scrollbar-thumb { transition: none; }
}
/* cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */


/* ===================== design v189 — textarea dos modais entra na MESMA caixa OXXY ==========
   Rotação: modais/dialogs — reauditando o ÚNICO controle de campo do grupo ainda fora do idioma.
   ACHADO (consistência; precedente duro no próprio dialog): o modal "Instruções do projeto"
   monta um <textarea> (founder-rc1.js: createElement("textarea") + style inline width/box-sizing/
   resize/min-height) SEM classe. A caixa-base dos campos do modal (.oxrc1-modal input,
   .oxrc1-modal select → bg #242422, borda --oxrc1-line-strong, raio 9px, cor --oxrc1-text) e o
   hover + anel de foco neutro do v58 NUNCA o alcançaram: só a COR do placeholder (v124/v144) e o
   respiro campo→campo (v125) foram estendidos a ele — a CAIXA e o FOCO, não. Resultado: o campo
   de contexto MAIS LONGO do projeto veste o controle default do SO (borda/raio/fundo do sistema
   sob color-scheme:dark) enquanto seus irmãos input/select do MESMO dialog vestem a caixa OXXY.
   Tell clássico de "quase-caro" no dialog premium — o olho lê dois materiais no mesmo cartão.
   CORREÇÃO (SÓ CSS, ZERO JS/markup): o textarea herda a MESMA caixa dos irmãos (mesmos literais/
   tokens já no arquivo), com padding multilinha 8/10 (escala 4/8) no lugar da altura fixa de 38px
   (é multilinha; min-height/rows vêm do inline do JS, intactos), e entra nas MESMAS regras de
   transição + hover + foco-neutro do v58, além do reset sob prefers-reduced-motion. line-height 1.5
   pra leitura confortável do parágrafo. O outline azul de teclado global (v149 :focus-visible) e o
   caret --oxrc1-accent (v137) já valiam e seguem valendo. Reuso EXATO dos rgba do v58; zero token/
   cor novo; nenhum data-rc1-* / seletor estrutural / comportamento / microcopy / markup tocado;
   nenhum teste pina isto; identidade (dark warm + accent OXXY) preservada. Degradação graciosa:
   box-sizing:border-box (inline do JS) garante que padding+borda não estouram o width:100%. */
.oxrc1-modal textarea {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 9px;
  color: var(--oxrc1-text);
  background: #242422;
  line-height: 1.5;
  transition: border-color 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
}
.oxrc1-modal textarea:hover {
  border-color: rgba(255, 255, 255, 0.24);
}
.oxrc1-modal textarea:focus {
  outline: 0;
  border-color: rgba(255, 255, 255, 0.30);
  box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.07);
  background-color: #262624;
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-modal textarea { transition: none; }
}

/* ===================== design v191 — scrollbar fino nos DOIS textareas de entrada ==========
   cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226").
   Rotação: composer + modais/dialogs. ACHADO (consistência de design-system — fecha a
   história do scrollbar): TODAS as superfícies roláveis da casa já vestem o scrollbar fino
   premium translúcido (trilho rgba(255,255,255,.18) + thumb rgba(255,255,255,.16), 8px, raio
   total) — .oxrc1-left-scroll (v?), .oxrc1-code pre (v65), .oxrc1-progress (v81), .oxrc1-modal
   (v93), .oxrc1-messages (v?), árvore/sidebar-dir (v184/v185). Sobravam DOIS controles — e
   justamente os DOIS campos de TEXTO onde o usuário mais digita: o <textarea> do composer
   (.oxrc1-composer textarea, max-height 160px → rola no SO quando a mensagem passa de ~7 linhas)
   e o <textarea> do modal "Instruções do projeto" (.oxrc1-modal textarea, multilinha, min-height
   do inline do JS → também rola). Quando transbordam, caem no scrollbar NATIVO do SO: a barra
   clara/chunky do macOS/Windows rasgando o campo escuro — o MESMO tell de "web, não app" que o
   resto do produto já matou. O composer é o input-joia da casa; ele exibindo scrollbar de sistema
   é o tell mais visível que restava.
   CORREÇÃO (SÓ CSS, ZERO JS/markup): aplico o MESMO contrato fino já presente no arquivo (reuso
   EXATO dos literais rgba do bloco canônico do v93) aos dois seletores. Nenhum token/cor novo;
   nenhum data-rc1-* / seletor estrutural / comportamento / microcopy / markup tocado; nenhum
   teste pina isto; identidade (dark warm + accent OXXY) preservada. Guarda de prefers-reduced-
   motion zera a transição do thumb, igual às irmãs. */
.oxrc1-composer textarea,
.oxrc1-modal textarea {
  scrollbar-width: thin;
  scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.oxrc1-composer textarea::-webkit-scrollbar,
.oxrc1-modal textarea::-webkit-scrollbar {
  width: 8px;
}
.oxrc1-composer textarea::-webkit-scrollbar-thumb,
.oxrc1-modal textarea::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 150ms ease;
}
.oxrc1-composer textarea::-webkit-scrollbar-thumb:hover,
.oxrc1-modal textarea::-webkit-scrollbar-thumb:hover {
  background: rgba(255, 255, 255, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-composer textarea::-webkit-scrollbar-thumb,
  .oxrc1-modal textarea::-webkit-scrollbar-thumb { transition: none; }
}


/* design v193 — estados vazios (fecho da família de ENTRADA): os dois vazios em
   CARTÃO (.oxrc1-mission-empty e .oxrc1-project-home-empty) eram os únicos estados
   de repouso do produto que ainda ENTRAVAM SECOS. O idioma de settle já cobre todos
   os irmãos — herói do chat (.oxrc1-empty, 260ms), vazio do browser (240ms) e os três
   vazios-finos decision/founder-queue/founder-home (v72, 220ms) — todos assentam com
   fade + subir via @keyframes oxrc1-empty-in. Estes dois, renderizados sob demanda
   quando a seção fica sem itens (missões / home do projeto), apareciam num ESTALO,
   quebrando a única família de estados vazios que já falava a mesma língua. Trago-os
   pro mesmo settle (curva + duração dos vazios-finos, 220ms), reusando a keyframe
   canônica — zero token/cor novo. Só apresentação: nenhum data-rc1-*/seletor
   estrutural/comportamento/microcopy/markup tocado; guarda de prefers-reduced-motion
   espelhada, igual às scrollbars/vazios irmãos. Identidade (dark warm + accent OXXY)
   preservada. */
.oxrc1-mission-empty,
.oxrc1-project-home-empty {
  animation: oxrc1-empty-in 220ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-mission-empty,
  .oxrc1-project-home-empty { animation: none; }
}


/* ===================== design v194 — engrenagem da conta (⚙, rodapé sidebar esquerda) =====
   Colheita (lane3): o glifo ⚙ mora num <span aria-hidden> com color: var(--oxrc1-muted) FIXO.
   O botão sobe --oxrc1-text em hover/focus/aberto, mas a cor morre no span (filho declara a
   própria cor, não herda) — o FUNDO acende e o ÍCONE fica apagado, sozinho entre os icon-buttons
   irmãos que clareiam o glifo. Correção SÓ CSS: o glifo clareia pra --oxrc1-text no mesmo 150ms
   tátil, reuso EXATO de token existente; guarda de reduced-motion zera a transição. Zero
   JS/markup/data-rc1-*/identidade. */
.oxrc1-settings span {
  transition: color 150ms ease;
}
.oxrc1-settings:hover span,
.oxrc1-settings:focus-visible span,
.oxrc1-settings[aria-expanded="true"] span {
  color: var(--oxrc1-text);
}
@media (prefers-reduced-motion: reduce) {
  .oxrc1-settings span { transition: none; }
}


/* ===================== design v198 — menu da conta / "Sair" (superfície do Painel Admin) =====
   Rotação: a área ADMIN (única do produto que nunca fora auditada — claim de lane paralela
   ativo o dia todo, agora expirado) é, na prática, o MENU DA CONTA: o link "Painel Admin —
   Usuários" (data-rc1-admin-link) é um item hidden dessa mesma superfície. O menu já vinha
   exaustivamente polido (v68 entrada+divisor do Sair, v104 chip "em breve", v76 anel de foco,
   v50 hover/press/transição, v128 família de sombra/vidro). Sobrou UM tell REAL, e é justamente
   na AÇÃO DESTRUTIVA — o momento mais crítico do menu.

   Achado (contrato tátil quebrado só no "Sair"): todo item do menu segue o idioma
   rest→hover→press. Os itens neutros: repouso muted → hover --oxrc1-hover → PRESS --oxrc1-active
   (afunda mais escuro, mantendo a família neutra). O "Sair" tem identidade PRÓPRIA: hover em
   VERMELHO (rgba(255,119,119,.12) + texto #ffd7d7), o idioma de ação destrutiva. MAS a regra
   genérica de press `.oxrc1-account-menu button:not([aria-disabled]):active → --oxrc1-active`
   (0,3,1) VENCE em especificidade a `.oxrc1-account-menu .is-logout:hover` (0,3,0): ao PRESSIONAR
   o "Sair" — o instante de maior compromisso da ação — o fundo VERMELHO era substituído pelo
   CINZA neutro, e a ação perdia sua identidade destrutiva exatamente quando o usuário a confirma.
   Todo irmão neutro afunda mantendo sua família; só o destrutivo trocava de família no press.

   Correção SÓ CSS: o "Sair" afunda DENTRO da própria família vermelha — um tom mais firme que o
   hover (0.18 vs 0.12), espelhando como os neutros vão hover→press (mais escuro). Reuso EXATO do
   literal vermelho já no arquivo (255,119,119); zero token/cor novo. Especificidade (0,4,1) —
   mesmo padrão da regra genérica + `.is-logout` — garante o override independente de ordem
   (logout nunca é aria-disabled, então o :not casa sempre). O texto #ffd7d7 do hover persiste no
   press (o :hover segue casando). Escopo cirúrgico ao `.is-logout`: nenhum outro item tocado.
   Só apresentação: nenhum data-rc1-*/seletor estrutural/comportamento/microcopy/markup tocado;
   identidade (dark warm + accent OXXY, vermelho destrutivo da casa) preservada. reduced-motion
   não se aplica (:active é troca de estado instantânea, não animação — igual aos irmãos de press).
   cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */
.oxrc1-account-menu button.is-logout:not([aria-disabled="true"]):active {
  background: rgba(255, 119, 119, 0.18);
}



/* ===================== design v207 — bolhas de mensagem: ritmo vertical dos subtítulos =========
   Rotação: MODAIS (v206) -> BOLHAS. A conversa é a superfície mais vista do produto e já teve
   mãos MUITO fortes (v53 entrada/pending/falha/thinking/copy, v103 peso do negrito inline, v136
   rótulo de falha, v166 órfãs da prosa, v181 pílulas de download, v201 sublinhado+foco dos links,
   + marcadores dim). Reauditoria de designer achou UM tell tipográfico real no RITMO VERTICAL
   dos subtítulos da resposta.

   Achado (ritmo de subtítulo invertido + inconsistência interna): o h1 do corpo respira no idioma
   premium — `margin: 12px 0 6px` (MAIS ar ACIMA que abaixo: o título se agrupa com a seção que
   ABRE). Mas o h2/h3 caíam em `margin: 0 0 10px` — ZERO acima: um subtítulo no meio da resposta
   COLAVA no parágrafo anterior e só respirava embaixo, invertendo o agrupamento (o subtítulo
   passava a "pertencer" ao texto que o precede, não ao que introduz). É o oposto do padrão
   Claude.ai/Linear/Stripe (espaço-antes > espaço-depois no subtítulo) e, pior, uma INCONSISTÊNCIA
   interna: h1 e h2/h3 do mesmo corpo seguiam ritmos opostos.

   Correção SÓ CSS, cirúrgica ao caso REAL: ar ACIMA (18px) apenas ao subtítulo PRECEDIDO por
   conteúdo (`* + h2/h3`), via adjacência — então o subtítulo de ABERTURA da resposta (primeiro
   filho, sem irmão anterior) segue colado ao topo, sem ar sobrando (NÃO regride o caso comum de
   resposta que começa por subtítulo). Resultado mid-resposta: 18 acima / 10 abaixo (espaço-antes >
   depois), alinhado ao h1 e ao padrão da casa. Especificidade (0,1,1) igual à regra base + ordem
   de fonte (fim do arquivo) garantem o override do margin-top. Só apresentação: nenhum
   data-rc1-*/seletor estrutural/comportamento/microcopy/token/cor tocado; margem colapsa gracioso;
   identidade (dark warm + accent OXXY) intacta. reduced-motion não se aplica (margem estática).
   cache contract carregado no :root (--oxrc1-cache-contract: "avatar-life-v226"). */
.oxrc1-bubble * + h2,
.oxrc1-bubble * + h3 {
  margin-top: 18px;
}

/* Sidebar truth pass — navegação operacional e painel direito compartilham a
   mesma régua visual. Dados e comportamento continuam nos contratos existentes. */
.oxrc1-sidebar-nav-tab {
  border-radius: var(--oxrc1-radius);
}
.oxrc1-sidebar-nav-tab.is-active {
  color: var(--oxrc1-text);
  background: var(--oxrc1-active);
  box-shadow: inset 2px 0 0 var(--oxrc1-accent);
}
.oxrc1-right .oxrc1-frota-head {
  display: grid;
  grid-template-columns: auto auto minmax(0, 1fr) auto;
  grid-template-areas:
    "pulse farol label caret"
    ". . speed badge";
  row-gap: 3px;
  width: 100%;
  min-width: 0;
  min-height: 30px;
  box-sizing: border-box;
  padding: 0 8px;
  border-radius: var(--oxrc1-radius);
}
.oxrc1-right .oxrc1-frota {
  width: 100%;
  min-width: 0;
  grid-template-columns: minmax(0, 1fr);
  overflow-x: clip;
}
.oxrc1-right .oxrc1-frota > * { min-width: 0; }
.oxrc1-right .oxrc1-frota-pulse { grid-area: pulse; }
.oxrc1-right .oxrc1-farol { grid-area: farol; }
.oxrc1-right .oxrc1-frota-label {
  grid-area: label;
  min-width: 0;
}
.oxrc1-right .oxrc1-speed-marker {
  grid-area: speed;
  justify-self: start;
}
.oxrc1-right .oxrc1-frota-caret {
  grid-area: caret;
  margin-left: 0;
}
.oxrc1-right .oxrc1-norte-badge {
  grid-area: badge;
  justify-self: end;
  max-width: 100%;
  margin-left: 0;
}
.oxrc1-right .oxrc1-frota-head:hover {
  opacity: 1;
  background: var(--oxrc1-hover);
}
.oxrc1-right .oxrc1-frota-label {
  color: #c9d5ce;
  font-size: 14px;
  line-height: 1.25;
  font-weight: 560;
  letter-spacing: 0;
  text-transform: none;
}

.oxrc1-speed-marker {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  padding: 1px 5px;
  border: 1px solid var(--ox-line, rgba(255, 255, 255, 0.12));
  border-radius: 999px;
  color: var(--ox-text-muted, #a6a6a6);
  font-size: 10px;
  font-weight: 650;
  line-height: 1.4;
  letter-spacing: 0.01em;
}
.oxrc1-lane-row {
  display: flex;
  align-items: center;
  gap: 8px;
  background: transparent;
}
.oxrc1-lane-row .oxrc1-thread-main {
  min-width: 0;
  display: grid;
  gap: 1px;
  flex: 1 1 auto;
}
.oxrc1-lane-row .oxrc1-thread-main > span {
  overflow: hidden;
  color: var(--oxrc1-muted);
  font-size: 11px;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.oxrc1-lane-id {
  font-size: 13px;
  font-weight: 560;
}

/* Agendados sai do topo e entra na sidebar sem trocar de tipografia. */
.oxrc1-agendados-view,
.oxrc1-alinhamentos-view {
  overflow: auto;
  padding: 18px 22px;
  color: var(--oxrc1-text);
}
.oxrc1-agendado-acoes button {
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
}

.oxrc1-alinhamentos-head h1 {
  margin: 0 0 4px;
  font-size: 20px;
}
.oxrc1-alinhamentos-head p,
.oxrc1-alinhamentos-summary {
  color: var(--oxrc1-muted);
  font-size: 13px;
  line-height: 1.4;
}
.oxrc1-alinhamentos-head p {
  margin: 0 0 14px;
}
.oxrc1-alinhamentos-summary {
  max-width: 760px;
  padding: 10px 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 10px;
  background: rgba(255, 255, 255, 0.03);
}
.oxrc1-alinhamentos-section {
  max-width: 760px;
  margin-top: 18px;
}
.oxrc1-alinhamentos-section h2 {
  margin: 0 0 8px;
  font-size: 13px;
  font-weight: 600;
  color: var(--oxrc1-soft);
}
.oxrc1-alinhamentos-lanes {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}
.oxrc1-alinhamento-card {
  min-width: 0;
  padding: 11px 12px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 10px;
  background: rgba(255, 255, 255, 0.025);
  cursor: pointer;
}
.oxrc1-alinhamento-card:hover,
.oxrc1-alinhamento-card:focus-visible,
.oxrc1-alinhamento-card.is-selected {
  border-color: var(--oxrc1-line-strong);
  background: var(--oxrc1-hover);
  outline: none;
}
.oxrc1-alinhamento-card-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.oxrc1-alinhamento-card-top strong {
  min-width: 0;
  overflow: hidden;
  font-size: 13px;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.oxrc1-alinhamento-card p {
  margin: 6px 0 0;
  color: var(--oxrc1-muted);
  font-size: 12px;
}
.oxrc1-alinhamento-detail {
  max-width: 760px;
  margin-top: 12px;
  padding: 12px;
  border: 1px solid var(--oxrc1-line-strong);
  border-radius: 10px;
  background: var(--oxrc1-active);
}
.oxrc1-alinhamento-detail[hidden] { display: none; }
.oxrc1-alinhamento-detail h2 { margin: 0; font-size: 14px; }
.oxrc1-alinhamento-detail p { margin: 7px 0 0; color: var(--oxrc1-muted); font-size: 12px; line-height: 1.45; }
@media (max-width: 900px) {
  .oxrc1-alinhamentos-lanes { grid-template-columns: 1fr; }
}


/* Produção — monitor dos sistemas OXXY (padrao visual da linha de producao) v226 */
.oxrc1-rotinas-list { display: flex; flex-direction: column; gap: 2px; }
.oxrc1-rotina-row {
  width: 100%;
  min-height: 38px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 5px 8px;
  border: 0;
  background: transparent;
  color: var(--oxrc1-text);
  text-align: left;
  cursor: pointer;
}
.oxrc1-rotina-row:hover,
.oxrc1-rotina-row:focus-visible { background: var(--oxrc1-hover); outline: none; }
.oxrc1-rotina-copy { min-width: 0; display: grid; gap: 1px; }
.oxrc1-rotina-copy strong,
.oxrc1-rotina-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.oxrc1-rotina-copy strong { color: var(--oxrc1-soft); font-size: 13px; font-weight: 560; }
.oxrc1-rotina-copy small { color: var(--oxrc1-dim); font-size: 10px; }
.oxrc1-rotinas-more { margin-top: 2px; }
.oxrc1-history-stack { display: flex; flex-direction: column; gap: 2px; }
.oxrc1-history-stack[hidden] { display: none; }
.oxrc1-left-section-nested { margin: 2px 0 0 14px; padding-left: 2px; border-left: 1px solid var(--oxrc1-line); }
.oxrc1-left-section-nested .oxrc1-section-toggle { min-height: 30px; }
.oxrc1-programado { margin-top: 10px; }
.oxrc1-programado-resumo { margin-left: auto; opacity: .6; font-size: 11px; }
.oxrc1-programado-list { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.oxrc1-programado-list li { display: flex; align-items: center; gap: 7px; font-size: 12px; line-height: 1.3; padding: 3px 2px; }
.oxprog-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
.oxprog-on { background: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,.15); }
.oxprog-off { background: #6b7280; opacity: .55; }
.oxprog-ico { flex: 0 0 auto; }
.oxprog-nome { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.oxprog-cad { margin-left: auto; opacity: .5; font-size: 11px; white-space: nowrap; }
.oxprog-badge { background: rgba(59,130,246,.18); color: #93c5fd; border-radius: 999px; padding: 1px 7px; font-size: 11px; font-weight: 600; white-space: nowrap; }


/* Programado v213 - secao da sidebar esquerda + bolinha que pisca quando ativo */
.oxrc1-programado-list:not([hidden]) { display: flex; flex-direction: column; gap: 2px; }
.oxrc1-programado-row { display: flex; align-items: center; gap: 8px; font-size: 13px; padding: 5px 8px; border-radius: 8px; }
.oxrc1-programado-row:hover { background: rgba(255,255,255,.04); }
.oxprog-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
.oxprog-on { background: #3b82f6; animation: oxprog-pulse 1.6s ease-in-out infinite; }
.oxprog-off { background: #6b7280; opacity: .5; animation: none; }
.oxprog-ico { flex: 0 0 auto; opacity: .85; }
.oxprog-nome { flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.oxprog-badge { background: rgba(255,255,255,.06); color: #9ca3af; border-radius: 999px; padding: 1px 8px; font-size: 11px; white-space: nowrap; flex: 0 0 auto; }
@keyframes oxprog-pulse { 0%,100% { box-shadow: 0 0 0 0 rgba(59,130,246,.55); opacity: 1; } 50% { box-shadow: 0 0 0 4px rgba(59,130,246,0); opacity: .5; } }


/* Programado v215 - bolinha mini-Orbit (cores do logo) + contador serio, sem emoji */
.oxrc1-programado-row { display: flex; align-items: center; gap: 8px; font-size: 13px; padding: 5px 8px; border-radius: 8px; }
.oxprog-dot { width: 11px; height: 11px; border-radius: 50%; flex: 0 0 auto; }
.oxprog-on { background: conic-gradient(from 0deg, var(--oxrc1-blue), #7a5af6, var(--oxrc1-accent), var(--oxrc1-blue)); box-shadow: 0 0 7px rgba(110,160,255,.45), 0 0 3px rgba(183,25,34,.5); animation: oxprog-orb 3.4s linear infinite; }
.oxprog-off { background: var(--oxrc1-dim); opacity: .4; box-shadow: none; animation: none; }
.oxprog-attention { background: #f5a623; opacity: 1; box-shadow: 0 0 0 3px rgba(245,166,35,.14); animation: none; }
.oxprog-nome { flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--oxrc1-soft); }
.oxprog-count { flex: 0 0 auto; color: var(--oxrc1-dim); font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap; }
@keyframes oxprog-orb { to { transform: rotate(360deg); } }


/* Programado v217 - submenu de lanes + balao da tarefa no hover */
.oxprog-caret { flex:0 0 auto; width:10px; opacity:.5; font-size:11px; display:inline-block; transition:transform .15s; text-align:center; }
.oxprog-haslanes.is-open .oxprog-caret { transform:rotate(90deg); }
.oxprog-caret-empty { visibility:hidden; }
.oxprog-haslanes { cursor:pointer; }
.oxprog-sublist:not([hidden]) { display:flex; flex-direction:column; gap:2px; margin:2px 0 4px 24px; }
.oxprog-subrow { display:flex; align-items:center; gap:7px; font-size:12px; padding:4px 8px; border-radius:7px; color:var(--oxrc1-muted); cursor:pointer; }
.oxprog-subrow:hover { background:rgba(255,255,255,.05); }
.oxprog-subrow .oxprog-dot { width:8px; height:8px; }
.oxprog-subnome { flex:1 1 auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.oxprog-subtar { flex:0 0 auto; opacity:.5; font-size:10px; white-space:nowrap; max-width:96px; overflow:hidden; text-overflow:ellipsis; }


/* Programado B2 - modo passageiro (visao ao vivo do agente no chat) v218 */
.oxrc1-passenger { position:absolute; inset:0; z-index:45; background:var(--oxrc1-bg); display:flex; flex-direction:column; }
.oxpass-head { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:14px 18px; border-bottom:1px solid rgba(255,255,255,.08); }
.oxpass-title { font-weight:700; font-size:15px; color:var(--oxrc1-text); }
.oxpass-sub { font-size:11px; color:var(--oxrc1-dim); }
.oxpass-close { background:var(--oxrc1-hover); border:none; color:var(--oxrc1-text); border-radius:8px; padding:7px 16px; cursor:pointer; font-size:13px; }
.oxpass-close:hover { background:var(--oxrc1-active); }
.oxpass-body { flex:1 1 auto; overflow:auto; padding:16px 18px; display:flex; flex-direction:column; gap:8px; }
.oxpass-cmd { align-self:flex-end; max-width:82%; background:var(--oxrc1-accent); color:#fff; border-radius:14px 14px 4px 14px; padding:10px 14px; font-size:14px; }
.oxpass-cmd-label { display:block; font-size:10px; text-transform:uppercase; opacity:.75; letter-spacing:.5px; margin-bottom:2px; }
.oxpass-ev { align-self:flex-start; max-width:86%; background:var(--oxrc1-composer); border-radius:14px 14px 14px 4px; padding:9px 13px; font-size:13px; color:var(--oxrc1-soft); display:flex; gap:8px; align-items:baseline; }
.oxpass-h { color:var(--oxrc1-dim); font-size:11px; flex:0 0 auto; font-variant-numeric:tabular-nums; }
.oxpass-resultado { border-left:3px solid #37e19a; }
.oxpass-alerta { border-left:3px solid var(--oxrc1-danger); }
.oxpass-empty { color:var(--oxrc1-dim); font-size:13px; margin:auto; text-align:center; }


/* v219 — fix.painel_direito_founder: as listas "Trabalhando agora" e "Entregas
   recentes" do painel direito adotam o MESMO padrao visual das linhas do sidebar
   esquerdo (.oxrc1-thread: tipografia 14px/450, grid, hover var(--oxrc1-hover),
   pill .oxrc1-project-status-badge). Regra de COLA apenas: neutraliza fundo/padding
   do li generico de .oxrc1-frota-list quando a linha e uma .oxrc1-thread — zero
   token/cor novo; identidade dark warm preservada. */
.oxrc1-frota-list li.oxrc1-thread {
  background: transparent;
  padding: 2px 8px;
}

/* pagina.agendados_esteira: pagina Agendados (molde da pagina de Tarefas Agendadas do
   Claude). Reusa o padrao visual existente (pill .oxrc1-project-status-badge, tokens de
   linha/cor); aqui so o layout da lista, o ponto de status e os botoes de acao. */
.oxrc1-agendados-view { overflow: auto; padding: 18px 22px; }
.oxrc1-agendados-head h1 { margin: 0 0 4px; font-size: 20px; }
.oxrc1-agendados-head p { margin: 0 0 14px; color: #9a98a4; font-size: 13px; }
.oxrc1-agendados-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; max-width: 760px; }
.oxrc1-agendado-card { display: flex; flex-direction: column; gap: 4px; border: 1px solid var(--oxrc1-line, #2c2c34); border-radius: 10px; padding: 10px 12px; }
.oxrc1-agendado-topo { display: flex; align-items: center; gap: 8px; }
.oxrc1-agendado-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; background: #777; }
.oxrc1-agendado-dot.is-running {
  width: 10px;
  height: 10px;
  background: conic-gradient(from 0deg, var(--oxrc1-blue), #7a5af6, var(--oxrc1-accent), var(--oxrc1-blue));
  box-shadow: 0 0 7px rgba(110,160,255,.45);
  animation: oxprog-orb 3.4s linear infinite;
}
.oxrc1-agendado-dot.is-idle { background: var(--oxrc1-dim); opacity: .45; animation: none; }
.oxrc1-agendado-card.is-selected { border-color: var(--oxrc1-line-strong); background: var(--oxrc1-active); }
.oxrc1-agendado-meta { color: #9a98a4; font-size: 12px; }
.oxrc1-agendado-acoes { display: flex; gap: 8px; margin-top: 4px; }
.oxrc1-agendado-acoes button { background: #1f3a52; border: 0; color: #eceaf2; padding: 5px 10px; border-radius: 8px; font: 600 12px system-ui; cursor: pointer; }
.oxrc1-agendado-acoes button:disabled { opacity: .5; cursor: default; }
.oxrc1-agendados-vazio { color: #9a98a4; font-size: 13px; padding: 8px 2px; max-width: 760px; }
.oxrc1-agendados-vazio[hidden] { display: none; }


/* Chat central + sidebar direita viva — bloco de experiência do Founder. */
.oxrc1-messages {
  /* O conteudo acompanha a coluna central: 1 cm real separa texto e sidebar. */
  padding: 24px 1cm 128px;
}

.oxrc1-empty,
.oxrc1-message {
  width: min(100%, 1080px);
}

.oxrc1-message {
  gap: 4px;
  margin-bottom: 14px;
  line-height: 1.48;
}

.oxrc1-assistant-meta {
  min-height: 32px;
}

.oxrc1-bubble {
  font-size: calc(14px * var(--oxrc1-chat-font-scale, 1));
}

.oxrc1-bubble p {
  margin-bottom: 7px;
}

.oxrc1-bubble ul,
.oxrc1-bubble ol {
  margin-block: 7px;
}

.oxrc1-bubble li + li {
  margin-top: 3px;
}

.oxrc1-bubble h1 { font-size: calc(20px * var(--oxrc1-chat-font-scale, 1)); }
.oxrc1-bubble h2 { font-size: calc(17px * var(--oxrc1-chat-font-scale, 1)); }
.oxrc1-bubble h3 { font-size: calc(15px * var(--oxrc1-chat-font-scale, 1)); }

.oxrc1-chat-font-controls {
  height: 28px;
  display: inline-flex;
  align-items: center;
  padding: 2px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 8px;
  background: transparent;
}

.oxrc1-chat-font-controls button {
  min-width: 29px;
  height: 22px;
  padding: 0 5px;
  border: 0;
  border-radius: 6px;
  color: var(--oxrc1-muted);
  background: transparent;
  font-family: inherit;
  font-size: 11px;
  font-weight: 600;
  line-height: 1;
  cursor: pointer;
}

.oxrc1-chat-font-controls button:hover,
.oxrc1-chat-font-controls button:focus-visible {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
  outline: none;
}

.oxrc1-chat-font-controls button:focus-visible {
  box-shadow: 0 0 0 1px var(--oxrc1-line-strong);
}

.oxrc1-chat-font-controls button:disabled {
  opacity: 0.35;
  cursor: default;
  background: transparent;
}

.oxrc1-composer {
  width: min(calc(100% - 2cm), 980px);
  min-width: 0;
  max-width: calc(100% - 2cm);
  grid-template-columns: auto minmax(0, 1fr) auto;
  gap: 6px;
  margin-bottom: 16px;
  padding: 8px;
}

.oxrc1-composer textarea {
  min-height: 36px;
  max-height: 240px;
  padding: 7px 4px;
}

@container oxrc1-chat (max-width: 680px) {
  .oxrc1-composer {
    grid-template-columns: auto minmax(0, 1fr);
  }

  .oxrc1-composer-actions {
    grid-column: 1 / -1;
    min-width: 0;
    flex-wrap: wrap;
    justify-content: flex-end;
  }
}

.oxrc1-modo-toggle {
  height: 26px;
  padding: 2px;
  gap: 1px;
  border-color: var(--oxrc1-line);
  border-radius: 8px;
  background: transparent;
}

.oxrc1-modo-option {
  height: 20px;
  padding: 0 6px;
  border-radius: 5px;
  color: var(--oxrc1-dim);
  font-size: 10.5px;
  font-weight: 560;
}

.oxrc1-modo-option[aria-pressed="true"] {
  color: var(--oxrc1-soft);
  background: var(--oxrc1-active);
  box-shadow: none;
}

.oxrc1-right-head {
  margin-bottom: 8px;
}

.oxrc1-right-head h2 {
  margin: 0;
  font-size: 14px;
  font-weight: 560;
}

.oxrc1-progress[hidden] {
  display: none;
}

.oxrc1-progress-note {
  margin-top: 0;
  padding: 6px 8px;
  border: 0;
  color: var(--oxrc1-dim);
  background: transparent;
}

.oxrc1-frota {
  gap: 8px;
  margin-top: 8px;
  padding-top: 8px;
}

.oxrc1-frota-destaque,
.oxrc1-frota-vivo[data-estado="ativo"] .oxrc1-frota-destaque,
.oxrc1-frota-vivo[data-estado="alerta"] .oxrc1-frota-destaque {
  padding: 3px 8px;
  border: 0;
  background: transparent;
}

.oxrc1-frota-section h3 {
  margin: 0 8px 4px;
  color: var(--oxrc1-muted);
  font-size: 12px;
  font-weight: 560;
  letter-spacing: 0;
  text-transform: none;
}

.oxrc1-frota-list {
  gap: 2px;
}

.oxrc1-frota-list li,
.oxrc1-frota-list li.oxrc1-thread {
  min-height: 28px;
  padding: 3px 8px;
  background: transparent;
}

.oxrc1-frota-list li:hover {
  background: var(--oxrc1-hover);
}

.oxrc1-frota-norte {
  padding-inline: 8px;
}

.oxrc1-frota-norte-bar {
  margin-top: 2px;
}

/* Linha de produção viva v227 — mesma gramática de Rotinas/Produção da esquerda. */
.oxrc1-frota-norte.oxrc1-rotina-row {
  min-height: 38px;
  padding: 5px 8px;
  border-radius: 8px;
  cursor: default;
}

.oxrc1-frota-norte .oxrc1-rotina-copy,
.oxrc1-production-row .oxrc1-rotina-copy {
  flex: 1 1 auto;
}

.oxrc1-frota-norte-frase {
  margin: 0;
  font-variant-numeric: tabular-nums;
}

.oxrc1-frota-norte-bar {
  width: 100%;
  height: 3px;
  overflow: hidden;
  border-radius: 999px;
}

.oxrc1-production-row {
  min-height: 38px;
  border-radius: 8px;
  cursor: default;
}

.oxrc1-production-dot-alert {
  background: var(--oxrc1-danger);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--oxrc1-danger) 16%, transparent);
}

.oxrc1-frota-vivo[data-estado="atencao"] .oxrc1-frota-pulse {
  background: #f5a623;
  animation: oxrc1-frota-breathe 1.8s ease-in-out infinite;
}

.oxrc1-frota-vivo[data-estado="atencao"] .oxrc1-frota-destaque {
  background: rgba(245, 166, 35, 0.08);
  border-color: rgba(245, 166, 35, 0.28);
}

/* P0 pipeline mission truth v1 — a esquerda resume; a direita explica. */
.oxrc1-pipeline-glance {
  width: 100%;
  min-width: 0;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 8px;
  margin: 0 0 8px;
  padding: 7px 8px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  color: var(--oxrc1-soft);
  background: rgba(255, 255, 255, 0.025);
  text-align: left;
  transition: background-color 150ms ease, border-color 150ms ease;
}

.oxrc1-pipeline-glance:hover,
.oxrc1-pipeline-glance:focus-visible {
  color: var(--oxrc1-text);
  background: var(--oxrc1-hover);
  border-color: color-mix(in srgb, var(--oxrc1-blue) 28%, var(--oxrc1-line));
}

.oxrc1-pipeline-glance-dot {
  width: 8px;
  height: 8px;
  border-radius: 999px;
  background: var(--oxrc1-dim);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--oxrc1-dim) 12%, transparent);
}

.oxrc1-pipeline-glance[data-state="WORKING"] .oxrc1-pipeline-glance-dot {
  background: var(--oxrc1-blue);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--oxrc1-blue) 18%, transparent);
  animation: oxrc1-frota-breathe 2.4s ease-in-out infinite;
}

.oxrc1-pipeline-glance[data-state="BLOCKED"] .oxrc1-pipeline-glance-dot,
.oxrc1-pipeline-glance[data-state="ATTENTION"] .oxrc1-pipeline-glance-dot {
  background: var(--oxrc1-danger);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--oxrc1-danger) 16%, transparent);
}

.oxrc1-pipeline-glance-copy {
  min-width: 0;
  display: grid;
  gap: 2px;
}

.oxrc1-pipeline-glance-copy strong,
.oxrc1-pipeline-glance-copy small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-pipeline-glance-copy strong {
  font-size: 12px;
  line-height: 1.25;
  font-weight: 600;
}

.oxrc1-pipeline-glance-copy small {
  color: var(--oxrc1-muted);
  font-size: 11px;
  line-height: 1.25;
}

.oxrc1-pipeline-glance-north {
  max-width: 72px;
  overflow: hidden;
  padding: 2px 5px;
  border: 1px solid var(--oxrc1-line);
  border-radius: 999px;
  color: var(--oxrc1-muted);
  font-size: 10px;
  font-weight: 650;
  font-variant-numeric: tabular-nums;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-shell.is-left-collapsed .oxrc1-pipeline-glance {
  display: none;
}

.oxrc1-pipeline-mission {
  display: grid;
  gap: 4px;
  padding: 8px;
  border: 1px solid var(--oxrc1-line);
  border-radius: var(--oxrc1-radius);
  background: rgba(255, 255, 255, 0.025);
}

.oxrc1-pipeline-mission[data-state="WORKING"] {
  border-color: color-mix(in srgb, var(--oxrc1-blue) 30%, var(--oxrc1-line));
  background: color-mix(in srgb, var(--oxrc1-blue) 5%, transparent);
}

.oxrc1-pipeline-mission[data-state="BLOCKED"],
.oxrc1-pipeline-mission[data-state="ATTENTION"] {
  border-color: color-mix(in srgb, var(--oxrc1-danger) 35%, var(--oxrc1-line));
}

.oxrc1-pipeline-mission-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}

.oxrc1-pipeline-state-badge {
  padding: 2px 6px;
  border-radius: 999px;
  color: var(--oxrc1-muted);
  background: var(--oxrc1-active);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.04em;
}

.oxrc1-pipeline-mission[data-state="WORKING"] .oxrc1-pipeline-state-badge {
  color: var(--oxrc1-soft);
  background: color-mix(in srgb, var(--oxrc1-blue) 18%, transparent);
}

.oxrc1-pipeline-mission[data-state="BLOCKED"] .oxrc1-pipeline-state-badge,
.oxrc1-pipeline-mission[data-state="ATTENTION"] .oxrc1-pipeline-state-badge {
  color: var(--oxrc1-soft);
  background: color-mix(in srgb, var(--oxrc1-danger) 20%, transparent);
}

.oxrc1-pipeline-scope {
  min-width: 0;
  overflow: hidden;
  color: var(--oxrc1-muted);
  font-size: 10px;
  font-variant-numeric: tabular-nums;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-pipeline-mission > strong {
  min-width: 0;
  overflow: hidden;
  color: var(--oxrc1-text);
  font-size: 13px;
  font-weight: 600;
  line-height: 1.3;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-pipeline-mission > small {
  color: var(--oxrc1-muted);
  font-size: 11px;
  line-height: 1.35;
}

.oxrc1-pipeline-queue-list {
  list-style: none;
  display: grid;
  gap: 2px;
  margin: 0;
  padding: 0;
}

.oxrc1-pipeline-queue-list li {
  min-width: 0;
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr);
  align-items: center;
  gap: 7px;
  min-height: 30px;
  padding: 3px 8px;
  border-radius: var(--oxrc1-radius);
}

.oxrc1-pipeline-queue-list li[data-status="NEXT"] {
  background: color-mix(in srgb, var(--oxrc1-blue) 7%, transparent);
}

.oxrc1-pipeline-queue-position {
  width: 20px;
  height: 20px;
  display: grid;
  place-items: center;
  border: 1px solid var(--oxrc1-line);
  border-radius: 999px;
  color: var(--oxrc1-muted);
  font-size: 10px;
  font-variant-numeric: tabular-nums;
}

.oxrc1-pipeline-queue-list li[data-status="NEXT"] .oxrc1-pipeline-queue-position {
  border-color: color-mix(in srgb, var(--oxrc1-blue) 45%, var(--oxrc1-line));
  color: var(--oxrc1-soft);
}

.oxrc1-pipeline-queue-copy {
  min-width: 0;
  display: grid;
  gap: 1px;
}

.oxrc1-pipeline-queue-copy strong,
.oxrc1-pipeline-queue-copy small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.oxrc1-pipeline-queue-copy strong {
  color: var(--oxrc1-soft);
  font-size: 12px;
  font-weight: 560;
}

.oxrc1-pipeline-queue-copy small {
  color: var(--oxrc1-dim);
  font-size: 10px;
}

@media (prefers-reduced-motion: reduce) {
  .oxrc1-pipeline-glance,
  .oxrc1-pipeline-glance[data-state="WORKING"] .oxrc1-pipeline-glance-dot {
    transition: none;
    animation: none;
  }
}

.oxrc1-production-flow-row {
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  min-height: 34px;
  cursor: default;
}

[data-rc1-frota-agents] .oxrc1-project-status-badge {
  flex: 0 0 auto;
  padding-inline: 5px;
  font-size: 10px;
}

.oxrc1-production-flow {
  min-width: 0;
  width: 100%;
  display: flex;
  align-items: center;
  gap: 5px;
  overflow: hidden;
}

/* Produção mora somente na sidebar direita: A–D acima, sistemas auxiliares abaixo. */
.oxrc1-frota-systems .oxrc1-programado-list {
  margin: 0;
  gap: 2px;
}

.oxrc1-frota-systems .oxrc1-programado-row,
.oxrc1-frota-systems .oxprog-subrow {
  min-height: 28px;
  padding: 3px 8px;
}

.oxrc1-frota-systems .oxprog-sublist:not([hidden]) {
  margin-left: 18px;
}

.oxrc1-production-stage {
  min-width: 0;
  flex: 1 1 0;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: var(--oxrc1-dim);
  font-size: 10.5px;
  white-space: nowrap;
}

.oxrc1-production-stage.is-stage { color: var(--oxrc1-soft); }
.oxrc1-production-stage .oxprog-dot { width: 7px; height: 7px; }
.oxrc1-production-stage > span:last-child { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.oxrc1-production-arrow { color: var(--oxrc1-dim); font-size: 10px; opacity: .55; }

@media (max-width: 760px) {
  .oxrc1-messages {
    padding-inline: 16px;
  }

  .oxrc1-composer {
    width: calc(100% - 24px);
    grid-template-columns: 1fr;
  }

  .oxrc1-chat-font-controls {
    order: -1;
  }
}

/* Global product shell v1 — troca Chat/Browser pelo seletor soberano de produtos. */
.oxrc1-chat-topbar {
  /* O menu sobrepõe a conversa também para hit-testing; sem esta camada a
     animação transformada do estado vazio recebe o clique através do menu. */
  position: relative;
  z-index: 160;
  overflow: visible;
}

.oxrc1-topbar-right > .oxxy-product-switcher {
  width: 205px;
  flex: 0 0 auto;
  margin-left: 2px;
  order: 99;
}

.oxrc1-topbar-right > .oxxy-product-switcher .oxxy-product-switcher__menu {
  right: 0;
}

@media (max-width: 1180px) {
  .oxrc1-topbar-right > .oxxy-product-switcher { width: 174px; }
  .oxrc1-topbar-right > .oxxy-product-switcher .oxxy-product-switcher__current small { display: none; }
}

@media (max-width: 760px) {
  .oxrc1-topbar-right > .oxxy-product-switcher { width: min(174px, 48vw); }
  .oxrc1-chat-topbar { padding-inline: 10px; }
}
