/* Material Symbols Outlined — self-hosted (fonte variável opsz/wght/FILL/GRAD).
 * Iconografia única do portal_spa (ADR-0019). Baixada do Google Fonts e servida
 * localmente — ZERO rede externa (CSP/offline). Licença Apache 2.0.
 * O woff2 é a instância variável (weight 100..700); os eixos são controlados
 * via font-variation-settings na classe .ms (ver assets/css/input.css).
 *
 * É um SUBSET: 403 ligaduras, não os 4301 ícones da família. Ícone fora do
 * subset não renderiza — o browser mostra o NOME por extenso ("storefront"),
 * sem erro no console.
 *
 * ⚑ Regenerado em 2026-10-14 (SPEC-PLAN-038) — 401 → 403, ZERO perdidas; 214.472 → 215.940 bytes.
 * Entraram `leaderboard` (seção «Ranking de postos na rota») e `search_off` (busca sem
 * resultado no ranking). Eixos de variação conferidos iguais.
 *
 * Antes: 2026-10-14 (SPEC-PLAN-037 RF-13) — 392 → 401 ligaduras medidas no arquivo
 * (fontTools); 205.820 → 214.472 bytes. Entrou `person_add` (cadastro rápido de motorista na
 * revisão do plano); vieram da varredura `account_box`, `backspace`, `box`, `draw`,
 * `location_off`, `person_add_alt`, `polyline`, `portrait`, `rectangle`, `sort`, `tabs`,
 * `train`. Saíram 4, com ZERO uso medido por `grep -w` em assets/templates/src/ui_kit:
 * `splitscreen`, `stacked_line_chart`, `unfold_less` (já saídos por zero uso em 24/09) e
 * `arrow_shape_up_stack` (só citado num comentário; o código usa `arrow_shape_up_stack_2`).
 * Eixos de variação conferidos iguais. Gerado em temporário e comparado antes da troca.
 *
 * ⚑ Regenerado em 2026-10-08 (SPEC-CV-001 RF-33) — 389 → 391 ligaduras medidas no arquivo
 * (fontTools), ZERO perdidas; 205.256 → 205.460 bytes. Entrou `upload` (botão «Enviar» do
 * rotulador de painéis); `file_upload` veio junto. UNIÃO das ligaduras servidas com a nova,
 * gerada da fonte completa em temporário e comparada antes da troca; eixos de variação
 * conferidos iguais.
 *
 * Antes: 2026-10-07 (SPEC-CV-001) — 381 → 389 ligaduras medidas no arquivo
 * (fontTools), ZERO perdidas; 200.672 → 205.256 bytes. Entraram os 8 glifos do rotulador
 * de painéis, escolhidos RENDERIZANDO os candidatos: `arrow_selector_tool` (Selecionar),
 * `zoom_in`, `zoom_out`, `view_real_size` (100%), `redo`, `light_mode`, `dark_mode` (tema
 * do editor) e `activity_zone` (item de menu — retângulo com alças). UNIÃO das ligaduras
 * servidas com os novos, gerada da fonte completa em temporário e comparada antes da
 * troca; os eixos de variação (FILL, GRAD, opsz, wght) conferidos iguais.
 *
 * Antes: 2026-10-02 (SPEC-PLAN-031 RF-2/RF-12) — 379 → 381 ligaduras medidas
 * no arquivo (fontTools), ZERO perdidas. Entrou `print` («Imprimir plano» da auditoria e
 * da grid de Acompanhamento de planos, e o «Imprimir» do documento do plano de viagem);
 * `local_printshop` veio de brinde, por prefixo. UNIÃO das ligaduras servidas com o ícone
 * novo, gerada da fonte completa em temporário e comparada antes da troca.
 *
 * Antes: 2026-10-01 (SPEC-ADM-010 RF-20) — 373 → 374, ZERO perdidas. Entrou
 * `pentagon` (cerca personalizada, no lugar de `crop_free`), pela UNIÃO das ligaduras
 * servidas com o ícone novo, comparada com fontTools antes da troca.
 * No mesmo dia, 374 → 376, ZERO perdidas: `arrow_shape_up` e `arrow_shape_up_stack`
 * (subida moderada e acentuada; a descida é a mesma seta virada por CSS).
 * E `remove_road` (trecho não pavimentado, no lugar de `route`).
 * E `visibility_off` (olho do campo de senha no login): nunca esteve no subset — o
 * template o escreve por `textContent`, que a varredura do script não enxerga.
 *
 * Antes: 2026-09-30 (merge da master na 2663-mapa-precos) — 372 ligaduras, ZERO
 * perdidas: UNIÃO do subset desta branch (371, com `approval` e `price_change`) com o da
 * master (370, com `speed`), gerada da fonte completa e comparada com fontTools.
 *
 * Antes (branch): 2026-09-29 (SPEC-PLAN-027 RF-6, D-23) — 370 → 371. Entrou `approval`
 * (carimbo) — «Aceitar planejamento» da grid de Viagens.
 * Antes (master): 2026-09-29 — 369 → 370. Entrou `speed` (velocímetro): o chip de odômetro
 * do card do abastecimento usava `speed_1_5`, que desenha «1.5» dentro.
 *
 * Antes: 2026-09-24 (SPEC-PLAN-022) — 351 → 360 ligaduras, ZERO perdidas
 * (união do subset atual com os novos, comparada com fontTools antes da troca —
 * o script sozinho descartaria 34 ligaduras). Entraram `picture_in_picture_alt` (botão da
 * foto processada) e `image_search` (item e cabeçalho do Monitor de erros IA
 * painel); `autoplay`, `camera`, `capture`, `landscape`, `photo`,
 * `photo_size_select_actual` e `terrain` vieram da varredura/prefixo.
 *
 * Antes: 2026-09-24 (SPEC-PLAN-024) — 347 → 351 ligaduras, ZERO perdidas
 * (união do subset atual com os novos, comparada com fontTools antes da troca).
 * Entraram `photo_camera` e `screen_rotation` (página da foto do painel pelo
 * motorista); `camera_alt` e `mobile_rotate` vieram de brinde, por prefixo.
 *
 * Antes: 2026-09-18 — 285 → 287 ligaduras, ZERO perdidas. Entrou
 * `smart_toy` (coluna Origem da grid do Fechamento: AUTOMATICO × manual), que o
 * usuário viu desenhando o nome por extenso na tela; `uppercase` veio de brinde,
 * por prefixo de ligadura.
 *
 * Antes: 2026-09-08 — 268 → 280 ligaduras, 1 perdida (`playlist_add_check`)
 * e ZERO em uso entre as perdidas. Entraram os 6 que estavam AUSENTES e em uso:
 * `arrow_back` e `left_panel_close` (botões do topo da auditoria da média, achados
 * pelo usuário na tela), e mais QUATRO que já estavam quebrados havia tempo, cada um
 * desenhando o nome por extenso sem ninguém reportar: `cloud_off` (core/notificacoes),
 * `restart_alt` e `select_all` (fechamento) e `zoom_out_map` (gráfico de linha). Vieram
 * de brinde, por prefixo de ligadura: `arrow_forward`, `published_with_changes`,
 * `radio_button_unchecked`, `stop`, `store`, `store_mall_directory`, `window`.
 * Segunda rodada no mesmo dia: +`left_panel_open` (o botão que devolve a lista de
 * planos da auditoria) e +`fullscreen` de brinde — 280 → 282, ZERO perdidas.
 *
 * ⛔ **O script estava QUEBRADO desde que saiu de `scripts/` para `scripts/portal/`**
 * (commit 771e4ef92): o `BASE` subia 2 diretórios e passou a apontar para
 * `portal_spa/scripts`, onde não há ícone nenhum. Ele não falhava — devolvia
 * "ícones usados: 0" e geraria um woff2 de **784 bytes** por cima da fonte servida,
 * apagando a iconografia do portal inteiro. Corrigido (3 dirnames) e com guarda:
 * abaixo de `MINIMO_ESPERADO` ícones o script ABORTA sem gravar. Foi o `--out`
 * temporário do procedimento abaixo que impediu a destruição — não pule esse passo.
 *
 * Antes: 2026-07-30 (SPEC-PLAN-014, +2 pedidos:
 * `report` e `inventory_2`; o `report_gmailerrorred` veio de brinde, porque
 * compartilha o prefixo de ligadura) — antes em 2026-07-30 (SPEC-PLAN-006, +9:
 * `rv_hookup`, `speed_1_5`, `sports_score`, `mark_chat_read`,
 * `assignment_turned_in`, `subdirectory_arrow_right`, `water_drop`, `toll`,
 * `hotel`) e em 2026-07-28 (+ `show_chart`, SPEC-PLAN-012).
 *
 * ⚠️ `inventory_2` (menu → Produtos) estava AUSENTE desde o commit que criou o
 * app: o item desenhava o NOME em 176px. Achado na validação em navegador da
 * SPEC-PLAN-013 e corrigido nesta regeneração.
 *
 * **A política é REGENERAR, não substituir** (decisão do usuário, 2026-07-30):
 * ícone novo que o desenho pede entra no subset; não se troca o ícone certo por
 * um "que já existe". O custo é ~0,7 KB por ícone.
 *
 * ⚠️ **O arquivo NÃO tem hash no nome** — depois de regenerar, o browser continua
 * servindo o woff2 em cache e os ícones novos aparecem como TEXTO. Isso já
 * confundiu a validação aqui: o arquivo estava correto (224 ligaduras conferidas
 * com fontTools) e a tela mostrava "rv_hookup" por extenso. Hard refresh
 * (Ctrl+Shift+R) resolve em dev; em produção, conferir a política de cache do
 * nginx para `/static/vendor/fonts/`. Para testar sem depender do cache, carregue
 * a fonte com cache-buster via FontFace API e meça a largura (ver a rule do DS).
 *
 * ⚠️ Ao INVENTARIAR as ligaduras do woff2 atual (passo 1), NORMALIZE o nome do
 * glifo: o fontTools grafa `_` como "underscore" e dígito por extenso
 * (`local_gas_station` sai `localunderscoregasunderscorestation`;
 * `inventory_2` sai `inventory_two`). Sem normalizar, a conferência acusa
 * FALSO NEGATIVO — parece que 8 ícones em uso sumiram do subset quando só 1
 * faltava de verdade.
 *
 * ── COMO REGENERAR (ao usar um ícone novo) ───────────────────────────────
 *  1. Inventariar os nomes já presentes + os novos (as ligaduras do woff2
 *     atual são a fonte da verdade do que existe hoje — extrair com fontTools
 *     e UNIR aos novos, senão a regeneração APAGA ícone em uso);
 *  2. baixar a fonte completa (URL no CSS de fonts.googleapis.com) e o mapa
 *     oficial nome→codepoint (`*.codepoints` do repo google/material-design-icons);
 *  3. pyftsubset completa.woff2 \
 *       --unicodes-file=<codepoints dos ícones + letras a-z e _> \
 *       --layout-features+=liga,dlig,rlig,calt \
 *       --no-layout-closure \
 *       --flavor=woff2 --output-file=material-symbols-outlined.woff2
 *
 *  `--no-layout-closure` é OBRIGATÓRIO: sem ele a closure de ligaduras vê as
 *  letras a-z no conjunto, conclui que QUALQUER ligadura pode se formar e
 *  devolve a família inteira (3,6 MB em vez de ~100 KB). */
@font-face {
    font-family: 'Material Symbols Outlined';
    font-style: normal;
    font-weight: 100 700;
    font-display: block;
    src: url("material-symbols-outlined.09fe6ab1ff14.woff2") format('woff2');
}
