/* Projects::ScheduleComponent — o CRONOGRAMA do Projeto (campo 03.2 do dossiê de Execução; doc 60):
   um gantt-like que lê o estado das DATAS (o trio do A.23 — planejado/previsto/real) e desenha a
   tríade de cada Parte (definição → desenvolvimento → testagem) mais as atividades do Projeto.
   Porta o mockup aprovado (scratchpad/cronograma-mockup.html, v17) para BEM + tokens. Geometria
   sharp (radius 0): o cronograma NÃO está dentro de .c-editor-canvas, então a exceção de raio do
   editor não se aplica. O chrome do campo (badge "03.2", label, hint) vem do PhaseFieldsComponent —
   aqui só o gráfico.

   REGRAS DO SISTEMA VISUAL (aprovadas, invioláveis):
     · cor diz ESTADO, forma diz PAPEL — preenchido = fato; tracejado = expectativa/referência.
     · 4 cores no dado: --ink-3 (pendente/relação/referência) · --ok · --warn · --danger.
       --line-2 só em linha estrutural (grade/eixo/conector). Nada mais entra em elemento de dado.
     · toda faixa horizontal = 9px; todo marcador = 12×12; canto vivo em tudo.
   GEOMETRIA POR INLINE (caminho sancionado do CSP, doc 47): posições e larguras chegam do servidor
   em style="--x: …%; --w: …%" — o CSS as CONSOME, não as define. A única exceção é --labelw, cujo
   default (530px) é do componente: eixo, grade e faixas dependem TODAS do mesmo --labelw para
   alinhar. Texto em SVG fica em px (deliberado, doc 50). */

.c-schedule{ --labelw: 530px; position: relative; border: 1px solid var(--line-2); overflow-x: auto; }
/* No dossiê o cronograma ocupa a largura inteira do painel: como o mini-board (parts_monitor), fica
   FORA do clamp de 66ch do campo de prosa (.c-phase-fields__field, dossier.css:349). O componente
   marca a raiz com esta classe já em largura cheia; a regra reafirma o override caso o campo
   genérico chegue a envolver o widget (idioma parts-field.css:10; margin zerada como
   parts-quality-block.css:8). */
.c-phase-fields__entry > .c-schedule,
.c-phase-fields__field.c-schedule{ margin: var(--s4) 0 0; max-width: none; }

/* position:relative AQUI (não só no root): os overlays de grade/deps ancoram na área das FAIXAS —
   ancorados no root eles desciam por cima da legenda (bug real da validação: gridline cortando texto). */
.c-schedule__inner{ min-width: 1000px; position: relative; }

/* ── eixo do calendário ───────────────────────────────────────────────────────
   grid [rótulo | faixa]; a borda inferior preta (--ink) é a "régua" forte do gráfico. Os meses são
   posicionados por --x inline (fração do intervalo do eixo → % da faixa), sem modificadores fixos. */
.c-schedule__axis{
  display: grid; grid-template-columns: var(--labelw) 1fr;
  border-bottom: 1px solid var(--ink); background: var(--surface-sunken);
}
.c-schedule__corner{
  padding: var(--s3) var(--s4); border-right: 1px solid var(--line-2); align-self: end;
  font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: .1em; text-transform: uppercase; color: var(--ink-3);
}
.c-schedule__months{ position: relative; height: 100%; }
.c-schedule__month{
  position: absolute; bottom: var(--s2); left: var(--x); padding-left: 7px;
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .1em; color: var(--ink-2);
}

/* ── grade vertical + linha de HOJE ───────────────────────────────────────────
   overlay absoluto sobre as faixas, alinhado por left:var(--labelw). As gridlines de mês são
   elementos posicionados por --x (uma por tick, N variável) — não background-image de contagem fixa;
   a linha de HOJE é --ink esmaecida, com etiqueta preta no topo. */
.c-schedule__grid{ position: absolute; left: var(--labelw); right: 0; top: 0; bottom: 0; pointer-events: none; }
/* SÓ gridlines mensais (as semanais saíram — ~13 verticais liam como colunas de tabela; feedback
   real da validação). O ritmo fino de semana ninguém precisa ver: as datas estão escritas.
   Tom ABAIXO do --line das linhas de faixa: a vertical atravessa o gráfico inteiro e, no mesmo peso
   das horizontais, fechava uma malha de tabela que competia com as barras (feedback do PM). */
.c-schedule__gridline{
  position: absolute; top: 0; bottom: 0; left: var(--x); width: 1px;
  background: color-mix(in srgb, var(--line) 70%, transparent);
}
.c-schedule__today{ position: absolute; top: 0; bottom: 0; left: var(--today, var(--x)); width: 1px; background: var(--ink); opacity: .28; }
.c-schedule__todaylab{
  position: absolute; top: 2px; left: var(--today, var(--x)); transform: translateX(-50%);
  padding: 3px 6px; background: var(--ink); color: var(--surface);
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .1em;
}

/* ── banda de grupo (header de Parte ou "Atividades do Projeto") ──────────────── */
.c-schedule__grp{
  display: grid; grid-template-columns: var(--labelw) 1fr;
  border-top: 1px solid var(--line-2); background: var(--surface-sunken);
}
.c-schedule__grp-label{
  display: flex; align-items: center; gap: var(--s3);
  padding: var(--s3) var(--s4); border-right: 1px solid var(--line-2);
}
.c-schedule__grp-name{ font: 700 var(--fs-ui)/1.2 var(--font-ui); }
.c-schedule__grp-meta{
  margin-left: auto; font: 500 var(--fs-label)/1 var(--font-mono);
  letter-spacing: .08em; text-transform: uppercase; color: var(--ink-3);
}
.c-schedule__grp-track{ position: relative; }

/* ── linha (a unidade do gráfico) ─────────────────────────────────────────────
   coluna de rótulo com larguras FIXAS [badge 48px | nome 1fr | estado 62px]: conteúdo de largura
   variável empurrava o vizinho e desalinhava a coluna de nomes — o grid fixo resolve na estrutura.
   O nome quebra em até 2 linhas; o subtítulo NUNCA quebra (quebra desalinharia as alturas das
   faixas, que devem ser uniformes). A linha inteira fica ~56px (governada pela ficha); o track tem
   piso de 44px para as barras sempre caberem. */
.c-schedule__row{ display: grid; grid-template-columns: var(--labelw) 1fr; border-top: 1px solid var(--line); }
/* hover SÓ na coluna do rótulo — o realce não invade a área do desenho (feedback do PM, doc 61) */
.c-schedule__row:hover .c-schedule__row-label{ background: var(--paper); }
.c-schedule__row-label{
  /* 48px: A99 cabe com folga — os 92px do mockup original eram margem morta (feedback do PM) */
  display: grid; grid-template-columns: 48px minmax(0, 1fr) 62px; align-items: center; gap: var(--s3);
  padding: 10px var(--s4); border-right: 1px solid var(--line-2);
}
/* badge de índice C1/A3 — IDÊNTICO ao __ikey do dod-block: fundo --ink, texto --surface, mono.
   Largura MÍNIMA fixa e texto centrado: "A8" e "A13" têm contagens de caractere diferentes e, com
   largura só de conteúdo, a coluna virava um serrilhado (feedback do PM). O badge é um selo, não
   uma etiqueta que encolhe. */
.c-schedule__key{
  justify-self: start; min-width: 34px; text-align: center;
  padding: 4px 6px; background: var(--ink); color: var(--surface);
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .05em;
}
/* reunião ainda virtual: o PAPEL (D/T) em fantasma tracejado — vira "A<n>" cheio quando o registro
   nasce (primeira data). Tracejado = expectativa, o idioma do sistema; letra dentro, nunca vazio. */
.c-schedule__key--ghost{ background: none; border: 1px dashed var(--line-2); color: var(--ink-2); padding: 3px 5px; }
/* ── entrada do registro de qualidade (doc 63): a linha pende do item ─────────────────────────
   A LINHA INTEIRA recua — badge junto (indentar só o texto deixava a hierarquia pela metade, com o
   selo do filho alinhado ao do pai; feedback do PM). O vínculo se lê na régua (filete em L, o mesmo
   idioma de linha fina do desenho) e num véu da cor que chega inline em --hue (mesma regra do
   __natw--qual; fallback --warn) — sem ícone novo nem badge próprio. */
.c-schedule__row--verif .c-schedule__row-label{
  position: relative; padding-left: calc(var(--s4) + 20px);
  background: linear-gradient(90deg, color-mix(in srgb, var(--hue, var(--warn)) 6%, transparent), transparent 60%);
}
/* o conector nasce acima da linha (vem do item, que é a linha de cima) e morre na altura do badge */
.c-schedule__row--verif .c-schedule__row-label::before{
  content: ""; position: absolute; left: var(--s4); top: 0; height: 50%; width: 1px; background: var(--line-2);
}
.c-schedule__row--verif .c-schedule__row-label::after{
  content: ""; position: absolute; left: var(--s4); top: 50%; width: 12px; height: 1px; background: var(--line-2);
}
.c-schedule__txt{ min-width: 0; }
.c-schedule__name{
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
  font: 500 var(--fs-ui)/1.35 var(--font-ui);
}
.c-schedule__sub{
  display: block; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font: 400 var(--fs-label)/1.4 var(--font-mono); letter-spacing: .04em; text-transform: uppercase; color: var(--ink-3);
}
/* natureza da atividade como PALAVRA no subtítulo (o chip com borda quebrava o alinhamento da
   coluna 1, onde vive só o índice): GESTÃO/DEFINIÇÃO em grafite, QUALIDADE em âmbar da fase.
   O âmbar é a cor da fase Execução, que viaja inline em --hue (idioma parts_monitor/dod_check — a
   cor vive no catálogo, nunca em hex solto); o fallback --warn é o mesmo âmbar caso --hue falte. */
.c-schedule__natw{ font-weight: 600; color: var(--ink-2); }
.c-schedule__natw--qual{ color: var(--hue, var(--warn)); }
/* marca do caminho crítico no subtítulo ("folga 0 · crítico") */
.c-schedule__sub .c-schedule__crit{ color: var(--ink-2); font-weight: 600; }

/* estado/contador à direita (2/4 MUST, VENCIDA, +14D…): a cor é o modificador semântico */
.c-schedule__state{ font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .06em; white-space: nowrap; text-align: right; }
.c-schedule__state--ok{ color: var(--ok); }
.c-schedule__state--pend{ color: var(--ink-3); }
.c-schedule__state--late{ color: var(--warn); }
.c-schedule__state--over{ color: var(--danger); }
.c-schedule__state--fc{ color: var(--ink-2); }

.c-schedule__track{ position: relative; min-height: 44px; }

/* ── marcadores (12×12, canto vivo, sem rotação) ──────────────────────────────
   duas dimensões ORTOGONAIS: preenchimento = papel (cheio = entregável; vazado = atividade;
   tracejado = linha de base); cor = estado (--ink-3 pendente · --ok satisfeito · --warn deslize ·
   --danger vencido). Armadilha: .mk é position:absolute + translate(-50%,-50%); um modificador NUNCA
   redeclara `position` (o relative torna o span inline e colapsa o quadrado — bug real do v7). */
.c-schedule__mk{ position: absolute; top: 50%; left: var(--x); transform: translate(-50%, -50%); }
/* entregável = quadrado cheio (um produto) */
.c-schedule__mk--deliv{ width: 12px; height: 12px; background: var(--ink-3); }
.c-schedule__mk--deliv.is-apt{ background: var(--ok); }
/* atividade = quadrado vazado (um evento); núcleo cheio via ::after quando já aconteceu */
.c-schedule__mk--act{ width: 12px; height: 12px; border: 2px solid currentColor; background: var(--surface); color: var(--ink-3); }
.c-schedule__mk--act.is-late{ color: var(--warn); }
.c-schedule__mk--act.is-ok{ color: var(--ok); }
.c-schedule__mk--act.is-past::after{ content: ""; position: absolute; inset: 1px; background: currentColor; }
/* linha de base (data planejada), tracejada */
.c-schedule__mk--ghost{ width: 12px; height: 12px; border: 1px dashed var(--ink-3); background: transparent; }

/* ── barras (entregável com duração) ──────────────────────────────────────────
   toda faixa horizontal tem 9px (mede a mesma grandeza: dias). Fantasma = linha de base tracejada. */
.c-schedule__bar{ position: absolute; top: 50%; left: var(--x); width: var(--w); height: 9px; transform: translateY(-50%); background: var(--ink-3); }
.c-schedule__bar.is-apt{ background: var(--ok); }
.c-schedule__bar--ghost{ background: none; border: 1px dashed var(--ink-3); }

/* ── arrasto/deslize (mesmo corpo 9px; a cor diz o estado) ────────────────────
   3 casos: .drift âmbar fechado = aconteceu com atraso (histórico, congela); --over vermelho ABERTO
   (morre em HOJE, sem marcador no fim) = vencida sem registro, cresce sozinha; --fc tracejado
   grafite = remarcada/empurrada — ainda NÃO é atraso (punir quem avisou cedo foi rejeitado).
   As pontas recuam via calc no INLINE do servidor (para a faixa LIGAR os marcadores em vez de
   cobri-los); o CSS só dá altura, cor e o rótulo de dias acima da faixa. */
.c-schedule__drift{ position: absolute; top: 50%; left: var(--x); width: var(--w); height: 9px; transform: translateY(-50%); background: var(--warn); }
.c-schedule__drift::after{
  content: attr(data-days); position: absolute; left: 50%; top: -15px; transform: translateX(-50%);
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .06em; color: var(--warn); white-space: nowrap;
}
.c-schedule__drift--over{ background: var(--danger); }
.c-schedule__drift--over::after{ color: var(--danger); }
.c-schedule__drift--fc{ background: none; border: 1px dashed var(--ink-3); }
.c-schedule__drift--fc::after{ color: var(--ink-3); }

/* data ao lado do marcador (mono, tabular; posição/alinhamento decididos no servidor por --x inline) */
.c-schedule__mkdate{
  position: absolute; top: 50%; left: var(--x); transform: translateY(-50%);
  font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: .05em; color: var(--ink-2);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* INSET: quando nenhum dos lados tem espaço (fim colado à direita E base colada à esquerda), o
   rótulo entra DENTRO da faixa, logo após a base — o fundo o faz legível sobre o arrasto. */
.c-schedule__mkdate--inset{ background: var(--surface); padding: 1px 4px; }

/* ── overlay de dependências (SÓ o caminho crítico é desenhado) ────────────────
   as demais dependências vão em TEXTO no subtítulo ("após A6"). Armadilha: <svg> é elemento
   substituído — left/right NÃO o esticam; precisa de width/height explícitos (calc do labelw / 100%),
   senão fica 300×150 e clipa. O traçado é feito no cliente (schedule/connectors.js) a partir dos
   rects das barras; aqui só o estilo do traço e da seta. */
.c-schedule__deps{
  position: absolute; left: var(--labelw); top: 0; pointer-events: none;
  width: calc(100% - var(--labelw)); height: 100%;
}
.c-schedule__deps path{ fill: none; stroke: var(--line-2); stroke-width: 1; }
.c-schedule__deps path.is-critical{ stroke: var(--line-2); stroke-width: 1.5; }
.c-schedule__deps .c-schedule__arrow{ fill: var(--ink-3); stroke: none; }


/* ════════════════════════════════════════════════════════════════════════════
   AUTORIA no cronograma (doc 61): linhas A editáveis, editor in-place e a bancada.
   Idioma dos controles portado do extinto 03.3 (activities-block): campos "sem cara de caixa"
   (borda só no foco), mono uppercase + gabarito compacto --control-h-sm nos controles de data.
   ════════════════════════════════════════════════════════════════════════════ */

/* linha A editável: a linha INTEIRA é o alvo (stretched link); no hover o slot de estado vira
   EDITAR — nada muda de lugar, os dois vivem empilhados no mesmo slot do grid. */
.c-schedule__row{ position: relative; }
.c-schedule__rowlink{ position: absolute; inset: 0; z-index: 1; }
.c-schedule__statewrap{ justify-self: end; }
.c-schedule__edithint{
  display: none; font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .06em;
  color: var(--brand); white-space: nowrap;
}
.c-schedule__row--editable:hover .c-schedule__state{ display: none; }
.c-schedule__row--editable:hover .c-schedule__edithint{ display: inline; }

/* edição IN-PLACE: a coluna do rótulo vira o formulário (a linha cresce o que ele pedir; o track
   estica junto e os marcadores seguem centrados por top:50%). Régua grafite = modo edição. */
/* fundo confinado ao rótulo (como o hover): a régua grafite fica na linha, o desenho fica limpo */
.c-schedule__row--editing{ box-shadow: inset 3px 0 0 var(--brand); }
/* min-height = a altura da linha FECHADA (~56px, border-box): é o PISO das animações — sem ele o
   colapso de fechamento afundava até o piso da track (44px) e o swap "devolvia" a diferença num
   bounce; na abertura, idem ao contrário. Com o piso, os dois swaps acontecem na mesma altura. */
.c-schedule__row--editing .c-schedule__row-label{ background: var(--paper); min-height: 56px; }
/* grid de UMA linha (não block): é o que permite ANIMAR a abertura — grid-template-rows 0fr→1fr
   interpola em qualquer browser moderno, height:auto não. O form de DELETE (vazio) cai numa track
   implícita de altura 0. Armadilha real: a COLUNA precisa ser explícita (minmax(0,1fr)) — a
   implícita é auto, que NÃO estica, e o conteúdo colapsava na largura mínima sob o overflow:hidden. */
.c-schedule__row--editing .c-schedule__row-label{
  display: grid; grid-template-rows: 1fr; grid-template-columns: minmax(0, 1fr);
  /* stretch, NÃO center (herdado da régua base): centrado, o form ficava na altura natural vazando
     para fora da track de 0fr — o texto "saía de dentro do conteúdo" durante a abertura. Esticado,
     o form SEGUE a track e o overflow:hidden dele clipa o conteúdo enquanto a linha cresce. */
  align-items: stretch;
  padding: 12px var(--s4);
}
/* align-content: start — as linhas internas PINAM no topo do box que cresce/encolhe: o título entra
   inteiro desde o primeiro frame e os campos abaixo vão sendo revelados (sem isso o conteúdo
   flutuava centrado no clip e o título só completava no fim da animação — feedback do PM). */
.c-schedule__row--editing .c-schedule__ied{ min-height: 0; overflow: hidden; align-content: start; }
/* abertura (doc 61): a linha cresce de fechada → auto + fade curto do formulário. SÓ no momento de
   abrir (--entering, decidido no SERVIDOR — link EDITAR/criação pela bancada); o autosave
   re-renderiza sem a classe, senão a animação replayava a cada change. prefers-reduced-motion já
   zera pela regra blanket do componente. */
.c-schedule__row--entering .c-schedule__row-label{ animation: c-schedule-ied-open var(--t2) var(--ease); }
.c-schedule__row--entering .c-schedule__ied{ animation: c-schedule-ied-fade var(--t2) var(--ease); }
@keyframes c-schedule-ied-open{ from{ grid-template-rows: 0fr; } to{ grid-template-rows: 1fr; } }
@keyframes c-schedule-ied-fade{ from{ opacity: 0; } to{ opacity: 1; } }
/* fechamento/troca: SEM regra própria — o schedule_controller aplica o replace na hora e colapsa a
   linha recém-fechada por FLIP de altura (Web Animations API), simultâneo ao --entering da nova. */
/* grade do editor: [badge | conteúdo]. Os campos moram TODOS na coluna 2 — alinham sob o título,
   nunca sob o badge (era o que espremia os rótulos contra a borda). Dentro de cada campo, outra
   grade [rótulo fixo | controle]: todos os inputs nascem no mesmo x, coluna de formulário de
   verdade. --ied-labelw acomoda o rótulo mais longo (ACONTECEU EM). */
.c-schedule__ied{
  --ied-labelw: 104px;
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 12px 10px; align-items: start;
}
.c-schedule__ied > .c-schedule__key{ grid-column: 1; margin-top: 3px; }
.c-schedule__ied-head{ grid-column: 2; display: flex; align-items: center; gap: 14px; }
.c-schedule__ied-head .c-schedule__ed-title{ flex: 1 1 auto; }
.c-schedule__ied-field{
  grid-column: 2; display: grid; grid-template-columns: var(--ied-labelw) minmax(0, 1fr);
  align-items: center; gap: 10px;
}
.c-schedule__ied-lab{
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink-3);
}
.c-schedule__ied-ctl{ display: flex; align-items: center; gap: 10px; min-width: 0; }

/* título: campo "sem cara de caixa" (borda só no foco). O responsável saiu do editor e da bancada
   (refinamento pós-validação) — o dado legado segue visível no subtítulo da linha, read-only. */
.c-schedule__ed-title{
  min-width: 0; border: 0; border-bottom: 1px solid transparent; background: transparent;
  outline: 0; font: 600 var(--fs-ui)/1.4 var(--font-ui); color: var(--ink); padding: 2px 0;
}
.c-schedule__ed-title::placeholder{ color: var(--ink-3); font-style: italic; }
.c-schedule__ed-title:focus{ border-bottom-color: var(--brand); }

/* datas + predecessora: mono uppercase + controle compacto de bancada */
.c-schedule__ed-ctl{
  display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--ink-3);
}
.c-schedule__ed-ctl input, .c-schedule__ied-ctl input, .c-schedule__ed-predsel{
  height: var(--control-h-sm); border: 1px solid var(--line-2); background: var(--surface); outline: 0;
  font: 500 var(--fs-meta)/1 var(--font-mono); color: var(--ink); padding: 0 6px;
  font-variant-numeric: tabular-nums;
}
/* o select carrega texto de opção normal (não mono uppercase) p/ caber rótulos longos de item/Parte */
.c-schedule__ed-predsel{ max-width: 220px; text-transform: none; letter-spacing: 0; font-family: var(--font-ui); }
.c-schedule__ed-ctl input:focus, .c-schedule__ied-ctl input:focus,
.c-schedule__ed-predsel:focus{ border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand); }

/* memória da remarcação (data única, doc 60) */
.c-schedule__ed-era{
  font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: .05em; color: var(--ink-3); white-space: nowrap;
}

/* ações do modo edição, quietas e mono: ✕ remover (form de DELETE via form=) no canto do TÍTULO;
   FECHAR (submit = salvar+fechar atômico; Esc clica nele — a tecla vai no title, não no rótulo) na
   última linha. MESMO gabarito: altura --control-h-sm e largura fixa, caixas idênticas. */
.c-schedule__ed-x, .c-schedule__ed-close{
  height: var(--control-h-sm); min-width: 92px; border: 1px solid var(--line-2); background: var(--surface);
  font: 600 var(--fs-label)/1 var(--font-mono); letter-spacing: .08em; text-transform: uppercase;
  text-align: center; color: var(--ink-2); padding: 0 9px; cursor: pointer;
  margin-left: auto; flex: 0 0 auto;
}
.c-schedule__ed-x:hover{ color: var(--danger); border-color: var(--danger); }
.c-schedule__ed-close:hover{ color: var(--ink); border-color: var(--ink); }

/* bancada (SÓ criação): última faixa do widget, largura total. Régua forte --ink no topo (eco da
   régua do eixo): acima dela, dado; abaixo, a bancada. position:relative TAMBÉM a mascara do
   overlay da grade — a grade (absoluta) pinta sobre fundo de bloco não-posicionado, e posicionar a
   bancada a tira do desenho (gridline/HOJE param na régua). */
.c-schedule__editor{
  position: relative;
  display: flex; align-items: center; gap: 10px 16px; flex-wrap: wrap;
  border-top: 1px solid var(--ink); background: var(--paper);
  padding: 10px var(--s4); min-height: 56px;
}
.c-schedule__editor:focus-within{ box-shadow: inset 0 0 0 1px var(--brand); }
.c-schedule__editor .c-schedule__key{ flex: 0 0 auto; }
.c-schedule__editor .c-schedule__ed-title{ flex: 2 1 280px; }
/* revelação progressiva (feedback do PM): sem nada escrito, a bancada é só o convite — os controles
   de data/dependência entram quando o título ganha texto. CSS puro: :placeholder-shown vale
   enquanto o input está vazio, e os controles são irmãos seguintes do título no form. */
.c-schedule__editor .c-schedule__ed-title:placeholder-shown ~ .c-schedule__ed-ctl{ display: none; }

/* Armadilha conhecida (mordeu 2×): CSS de autor com display vence o [hidden] do UA. */
.c-schedule [hidden]{ display: none; }

@media (prefers-reduced-motion: reduce){
  .c-schedule *{ transition: none !important; animation: none !important; }
}
