@aurea-uds/core 0.16.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/aurea.css +130 -4
  2. package/package.json +1 -1
package/dist/aurea.css CHANGED
@@ -494,6 +494,14 @@ img,svg { display:block; }
494
494
  .cluster-justify-center { justify-content:center; } .cluster-justify-end { justify-content:flex-end; } .cluster-justify-between { justify-content:space-between; }
495
495
  .cluster-nowrap { flex-wrap:nowrap; }
496
496
  .grid-fixed { grid-template-columns:repeat(var(--grid-cols,1),minmax(0,1fr)); }
497
+ /* AN-08 (03/10/2026): a largura mínima da coluna, por nome — a trava de um consumidor reprova medida
498
+ escrita, e `min="sm"` virava UMA coluna sem aviso (o `--grid-min` inválido derruba a regra inteira).
499
+ O HeroUI não tem `Grid`; nenhum número é novo, cada um já mede uma grade ou uma caixa daqui:
500
+ xs 8rem — a miniatura da `.gallery` (`--gallery-min`)
501
+ sm 12rem — a célula da `.health-matrix`
502
+ md 15rem — o padrão do `.grid`, logo acima (sem classe)
503
+ lg 20rem — o `.dialog-xs`, o `max-w-xs` do HeroUI */
504
+ .grid-min-xs { --grid-min:8rem; } .grid-min-sm { --grid-min:12rem; } .grid-min-lg { --grid-min:20rem; }
497
505
 
498
506
  /* ========================================================================== */
499
507
  /* 03. APP SHELL E DOCUMENTAÇÃO */
@@ -587,7 +595,10 @@ img,svg { display:block; }
587
595
  encostado, não sobre a lateral — a rente já encosta sozinha. */
588
596
  .app-shell-flush .sidebar:not(.sidebar-flush) { --shell-top:calc(var(--topbar-height) + var(--space-05)); margin-block-start:var(--space-05); }
589
597
  .app-shell-flush .content { margin-block-start:var(--space-05); }
590
- .content { min-width:0; margin:var(--space-4) var(--space-4) var(--space-4) 0; padding:var(--space-6); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
598
+ /* A margem é LÓGICA desde 03/10/2026 (AN-01): era `margin:space-4 space-4 space-4 0`, física, e na
599
+ escrita da direita para a esquerda o conteúdo encostava na borda da página e deixava 32 de vão na
600
+ junção com a lateral. Medido no banco da moldura; na esquerda para a direita nada muda. */
601
+ .content { min-width:0; margin-block:var(--space-4); margin-inline:0 var(--space-4); padding:var(--space-6); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
591
602
  /* contentVariant="plain" (B-10): a área de conteúdo sem caixa. Os `Card` da tela passam a ser as
592
603
  únicas superfícies. A margem continua: é ela que afasta o conteúdo da lateral e da barra. */
593
604
  .content-plain { padding:0; border:0; border-radius:0; background:none; color:inherit; }
@@ -717,6 +728,33 @@ img,svg { display:block; }
717
728
  nada. Gate nenhum via, porque `sidebar.html` não tem baseline de pixel. */
718
729
  .app-shell:has(> .sidebar-collapsed) { --sidebar-track:calc(var(--sidebar-rail) + var(--space-4)*2); }
719
730
  .app-shell:has(> .sidebar-collapsed.sidebar-flush) { --sidebar-track:var(--sidebar-rail); }
731
+ /* AN-01 (03/10/2026): O BOTÃO DE RECOLHER, no alto da junção do menu com o conteúdo — o lugar que o
732
+ Victor marcou. Só com `sidebarCollapsible`, e por isso mora sob `.app-shell-collapsible`: o
733
+ `.app-shell` cru (o catálogo escrito à mão o usa como raiz) não muda.
734
+ O botão é um item da grade na MESMA célula da lateral, e por isso a lateral e o conteúdo ganham
735
+ lugar escrito: sem ele, o posicionamento automático da grade empurraria a lateral para a coluna
736
+ do conteúdo. A caixa do botão é de tamanho zero na borda da coluna e copia da lateral a margem de
737
+ cima e o `--shell-top`, então gruda junto quando a página rola; o botão se centra nela.
738
+ No alto: o centro do botão na altura do centro do primeiro item da lateral (borda + `space-1` +
739
+ metade do `control-h-md`). Na junção: no meio do vão de `space-4` entre as duas caixas, ou em cima
740
+ do fio, na lateral rente. */
741
+ .app-shell-collapsible > .sidebar { grid-column:1; grid-row:2; }
742
+ .app-shell-collapsible > .content { grid-column:2; grid-row:2; }
743
+ .sidebar-toggle-slot { --toggle-top:calc(var(--topbar-height) + var(--space-4)*2); --toggle-x:calc(var(--space-4) / -2); --toggle-edge:var(--border-width);
744
+ grid-column:1; grid-row:2; justify-self:end; align-self:start; position:sticky; top:var(--toggle-top); z-index:var(--z-sticky); width:0; height:0; margin-block-start:var(--space-4); }
745
+ .app-shell-flush > .sidebar-toggle-slot { --toggle-top:calc(var(--topbar-height) + var(--space-05)); margin-block-start:var(--space-05); }
746
+ .app-shell-collapsible:has(> .sidebar-flush) > .sidebar-toggle-slot { --toggle-top:var(--topbar-height); --toggle-x:0px; --toggle-edge:0px; margin-block-start:0; }
747
+ /* O botão se centra por conta, com o lado dele escrito, e não por `translate` — que é físico e pede
748
+ `:dir(rtl)` para virar, e o empacotador do app reescreve `:dir()` (medido no Vite, 03/10/2026).
749
+ Com as margens lógicas ele vira sozinho. O lado é o `control-h-xs` do `IconButton size="xs"`, e o
750
+ alvo de toque com o dedo (`target-min`, a mesma troca do `.btn-icon` lá embaixo). A seta, quem
751
+ vira é o React, pela direção do provedor. */
752
+ .sidebar-toggle-slot > .btn.sidebar-toggle { --toggle-size:var(--control-h-xs); --btn-bg:var(--card); --btn-border:var(--border-strong); position:absolute; inline-size:var(--toggle-size); block-size:var(--toggle-size); min-inline-size:0; min-block-size:0;
753
+ inset-block-start:calc(var(--toggle-edge) + var(--space-1) + var(--control-h-md) / 2 - var(--toggle-size) / 2); inset-inline-start:calc(var(--toggle-x) - var(--toggle-size) / 2); }
754
+ @media (pointer:coarse) { .sidebar-toggle-slot > .btn.sidebar-toggle { --toggle-size:var(--target-min); } }
755
+ @media (max-width:1023px) {
756
+ .sidebar-toggle-slot { display:none; }
757
+ .app-shell-collapsible > .sidebar, .app-shell-collapsible > .content { grid-column:auto; grid-row:auto; } }
720
758
 
721
759
  /* ── Navegação inferior — o vocabulário de APLICATIVO ───────────────────────────────
722
760
  Lacuna estrutural medida no `CONSUMIDOR-1.md` §4.1: `.topbar` e `.sidebar` são
@@ -782,7 +820,7 @@ img,svg { display:block; }
782
820
  nativo (`navigation.tsx`). ~~A folga de 4dp do M3 entre o indicador e o rótulo~~ vale só para
783
821
  os redondos agora. */
784
822
  .bottom-nav-mark { height:var(--icon-lg); }
785
- .bottom-nav-ind-circle .bottom-nav-mark, .bottom-nav-ind-circle-raised .bottom-nav-mark, .bottom-nav-ind-circle-outline .bottom-nav-mark, .bottom-nav-ind-circle-bold .bottom-nav-mark { height:var(--bottomnav-ring); }
823
+ .bottom-nav-ind-circle .bottom-nav-mark, .bottom-nav-ind-circle-raised .bottom-nav-mark, .bottom-nav-ind-circle-outline .bottom-nav-mark { height:var(--bottomnav-ring); }
786
824
  /* `inline-flex` no envoltório: como `<span>` solto ele é caixa de LINHA, e mede a entrelinha do
787
825
  item (18px) em vez do contador que carrega (16px). A diferença não aparece na tela — aparece
788
826
  na medição, e medição errada é o que faz a razão parecer 0,75 quando é 0,67. */
@@ -807,7 +845,30 @@ img,svg { display:block; }
807
845
  O FOCO CONTINUA, e a diferença não é de gosto: `:focus-visible` é o que o teclado enxerga, vem
808
846
  do contrato de foco global e o `geometry.spec` cobra. Tirar hover é tirar enfeite; tirar foco
809
847
  seria tirar acesso. */
810
- .bottom-nav-item[aria-current] { color:var(--foreground); font-weight:var(--weight-medium); }
848
+ /* O PESO DO RÓTULO NÃO MUDA COM A ESCOLHA — 03/10/2026, pedido do Victor: *"quero ele estático,
849
+ apenas os botões dinâmicos"*. Era `--weight-medium` só no escolhido, e texto mais grosso é texto
850
+ mais LARGO: no `width="content"` a barra mudava de largura a cada toque, nos sete indicadores
851
+ (medido: 247,7 contra 249,0). Agora todos os rótulos são `--weight-medium` — o "Label medium" do
852
+ Material 3, que no Expressive também deixou de engrossar o escolhido. O que marca a escolha é a
853
+ cor, o ícone cheio e a forma. Quem cobra: `geometry.spec`, "a barra não se mexe". */
854
+ .bottom-nav-item { font-weight:var(--weight-medium); }
855
+ /* A ALTURA DO TELEGRAM — 03/10/2026, pedido do Victor (*"ainda acho ele muito largo comparado a
856
+ bottomnav como do telegram"*; "largo" é a grossura). Medido no fonte do Telegram para Android
857
+ 12.10.6: pílula de 56, botão de 48, ícone de 24, nome de 12 numa linha de 16. O recheio de cima
858
+ e de baixo cai de `--space-1` para `--space-05`, e a linha do nome é a do Telegram: o tamanho
859
+ mais `--space-1` (12 + 4). Com a do corpo (1,5) ela media 18; com a `--leading-tight` (14,4) a
860
+ perna do "j" passava 1 da caixa, e a caixa corta (`overflow:hidden`, para as reticências).
861
+ Fica 56 nos indicadores sem moldura e 64 nos que têm a de 32 — a altura do Material 3
862
+ Expressive. O mesmo no `navigation.tsx`. */
863
+ .bottom-nav-item { padding-block:var(--space-05); }
864
+ /* O NOME COLADO NO ÍCONE — 03/10/2026, pedido do Victor (*"o texto pode ficar mais próximo do
865
+ ícone"*): vão ZERO, como no Telegram, em que o nome começa onde a caixa do ícone acaba. O
866
+ `--space-05` de 30/09/2026 somava 2 aos 2 de folga da linha do nome: medido de tinta a tinta,
867
+ eram 9 no `pill` e 13 no `circle-bold`. No `circle-bold` a moldura de 32 também sai (logo
868
+ abaixo): lá o círculo é o disco, não ela. */
869
+ .bottom-nav-item, .bottom-nav-disc { gap:0; }
870
+ .bottom-nav-label { line-height:calc(1em + var(--space-1)); }
871
+ .bottom-nav-item[aria-current] { color:var(--foreground); }
811
872
  .bottom-nav-item[aria-current] .icon { opacity:1; }
812
873
  /* ── A GRAMÁTICA: DOIS EIXOS, E ELES NÃO SE MISTURAM ────────────────────────────────
813
874
  Reescrito em 20/08/2026 pela auditoria de UI/UX do BottomNav que o Victor encomendou.
@@ -876,7 +937,15 @@ img,svg { display:block; }
876
937
  /* `padding-inline: space-1` — o recheio de sempre do item (`.bottom-nav-item`). No `width="content"`
877
938
  o item ganha `space-3` dos lados, e dentro dos 56 sobravam 32 para o rótulo: "Avisos" (35)
878
939
  saía "Avis…". Medido em 02/10/2026, no navegador e no nativo; igual no `navigation.tsx`. */
879
- .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] { flex:none; width:var(--bottomnav-bold,3.5rem); padding-inline:var(--space-1); border-radius:var(--radius-full); background:var(--primary); color:var(--primary-foreground); }
940
+ /* ~~O disco ERA o item escolhido~~ (até a `0.16.1`): ele media 56 e os outros mediam o conteúdo,
941
+ então trocar de aba mudava a largura da barra (249 a 257 no app, medido em 03/10/2026) e, no
942
+ `full`, os outros itens andavam. Agora o disco é uma caixa DENTRO do item (`.bottom-nav-disc`),
943
+ em todos os itens, e o recheio passa do item para ele: o item mede o mesmo escolhido ou não, e a
944
+ altura da barra não muda. O mesmo no `navigation.tsx`. */
945
+ .bottom-nav.bottom-nav-ind-circle-bold .bottom-nav-item { padding:0; }
946
+ .bottom-nav-disc { display:flex; flex-direction:column; align-items:center; justify-content:center; inline-size:var(--bottomnav-bold,3.5rem); max-inline-size:100%; min-height:var(--control-h-lg); padding:var(--space-1); border-radius:var(--radius-full); }
947
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] { color:var(--primary-foreground); }
948
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-disc { background:var(--primary); }
880
949
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .icon { opacity:1; }
881
950
  /* O contador do `circle-bold` INVERTE, como o do `.btn-primary`, e a volta atrás está medida.
882
951
  Tentei em 20/08/2026 deixá-lo dourado com um anel da cor da barra em volta — é o que as telas
@@ -885,6 +954,36 @@ img,svg { display:block; }
885
954
  se esconde. Fio fino não substitui contraste quando as duas cores são claras. */
886
955
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
887
956
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-badge { color:var(--primary-foreground); }
957
+ /* ── CÁPSULA (`capsule`) — a "A" da bancada do Victor, 03/10/2026: o Material 3 Expressive ────
958
+ A moldura do ícone vira a cápsula de 56 × 32 do indicador ativo do M3 Expressive
959
+ (`--bottomnav-bold` × `--bottomnav-ring`), em TODOS os itens; só a do escolhido é pintada, de
960
+ amarelo sólido. O rótulo fica embaixo, fora dela — é isso que a separa do antigo bloco amarelo
961
+ que a auditoria de 20/08/2026 recusou (achado 5): a forma não estica com o nome.
962
+ O contador fica no canto do ÍCONE, e não da cápsula: sem a cápsula pintada ele ficaria solto,
963
+ longe do sino. São os (56 − 32) / 2 a mais para dentro. E ele INVERTE sobre o amarelo, pela
964
+ mesma razão medida do `circle-bold`, logo acima. */
965
+ .bottom-nav-ind-capsule .bottom-nav-mark { width:var(--bottomnav-bold,3.5rem); height:var(--bottomnav-ring); border-radius:var(--radius-full); }
966
+ .bottom-nav-ind-capsule .bottom-nav-badge { inset-inline-end:calc((var(--bottomnav-bold,3.5rem) - var(--bottomnav-ring)) / 2 - var(--space-05)); }
967
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .bottom-nav-mark { background:var(--primary); color:var(--primary-foreground); }
968
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .icon { opacity:1; }
969
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
970
+ /* No `content`, o recheio de sempre (`--space-1`) e não o `--space-3`: com ele cada item teria 80. */
971
+ .bottom-nav-content:not(.bottom-nav-edge).bottom-nav-ind-capsule .bottom-nav-item { padding-inline:var(--space-1); }
972
+ /* ── EXPANDE (`expand`) — a "C" da bancada do Victor, 03/10/2026 ───────────────────────────────
973
+ Os outros itens mostram só o ícone; o escolhido vira cápsula amarela com o nome ao lado.
974
+ ⚠ É a exceção à regra "o rótulo nunca some" (auditoria de 20/08/2026, achado 6/7), por ordem do
975
+ Victor: o nome dos não escolhidos sai da TELA e fica para o leitor de tela (o componente põe a
976
+ `.sr-only` nele), então o link continua com nome.
977
+ É o ÚNICO em que o botão escolhido cresce — os botões andam, a BARRA não: a vaga do escolhido é
978
+ FIXA, e não do tamanho do nome. Ícone + vão (`--space-2`) + lugar do nome (`--space-20`) +
979
+ recheio (`--space-3` dos dois lados) = 136. Nome maior que 80 termina em "…". */
980
+ .bottom-nav-ind-expand .bottom-nav-item { flex-direction:row; gap:var(--space-2); min-width:var(--target-min); min-height:var(--target-min); padding:0; }
981
+ .bottom-nav-ind-expand .bottom-nav-mark { width:var(--icon-lg); }
982
+ .bottom-nav-ind-expand .bottom-nav-label { font-size:var(--text-sm); }
983
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] { flex:none; inline-size:calc(var(--icon-lg) + var(--space-2) + var(--space-20) + 2 * var(--space-3)); padding-inline:var(--space-3); background:var(--primary); color:var(--primary-foreground); }
984
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] .icon { opacity:1; }
985
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
986
+ .bottom-nav-content:not(.bottom-nav-edge).bottom-nav-ind-expand .bottom-nav-item:not([aria-current]) { flex:none; inline-size:var(--target-min); padding-inline:0; }
888
987
 
889
988
  /* ── A LINHA DE LISTA TOCÁVEL (§4.3 do CONSUMIDOR-1) ──────────────────────────
890
989
  A LISTA NÃO PINTA SUPERFÍCIE. Quem dá o card é o `Card`, e repintar aqui seria um segundo
@@ -918,6 +1017,11 @@ img,svg { display:block; }
918
1017
  /* O VALOR E A SETA NÃO ENCOLHEM: valor cortado MENTE (um "R$ 1.2" no lugar de "R$ 1.234"), e seta
919
1018
  cortada deixa de dizer que a linha abre. Quem cede espaço é o texto, que reticencia dizendo. */
920
1019
  .nav-list-value { flex:none; color:var(--muted-foreground); font-size:var(--text-sm); }
1020
+ /* AN-04 (03/10/2026): os sinais ao lado do valor — fixada, silenciada. Pequenos (`sm`), apagados como o
1021
+ valor, e o vão é o mesmo de dentro do texto (`space-1`). A foto é o `.avatar` de sempre. */
1022
+ .nav-list-indicators { flex:none; display:inline-flex; align-items:center; gap:var(--space-1); color:var(--muted-foreground); }
1023
+ .nav-list-indicators>span { display:inline-flex; }
1024
+ .nav-list-row>.avatar { flex:none; }
921
1025
  .nav-list-row .nav-list-chevron { flex:none; opacity:.6; }
922
1026
  @media (hover:hover) and (pointer:fine) { .nav-list-row:hover { background:var(--secondary); } }
923
1027
  /* `aria-disabled` e NÃO `:disabled` — a razão está escrita ao lado de `.btn:disabled`, medida em
@@ -1630,6 +1734,28 @@ img,svg { display:block; }
1630
1734
  @media (max-width:640px) { .banner { grid-template-columns:auto minmax(0,1fr); } .banner>:last-child { grid-column:2; justify-self:start; } }
1631
1735
  .progress { height:8px; overflow:hidden; border-radius:999px; background:var(--surface-3); }
1632
1736
  .progress>span { display:block; height:100%; border-radius:inherit; background:var(--primary); }
1737
+ /* AN-07 (03/10/2026): a caixa de fora, o texto de apoio e o tom. A anatomia é a do `ProgressBar` do
1738
+ HeroUI 3.2.6 (`@heroui/styles`, progress-bar.css): a saída no alto à direita, `text-sm` médio com
1739
+ algarismos de largura igual, e `gap-1` até o trilho. O tom é a lista fechada do `ButtonTone`:
1740
+ pausado é `neutral`, falha é `danger`. */
1741
+ .progress-field { display:grid; gap:var(--space-1); }
1742
+ .progress-detail { justify-self:end; color:var(--muted-foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); font-variant-numeric:tabular-nums; }
1743
+ .progress-tone-neutral>span { background:var(--muted-foreground); }
1744
+ .progress-tone-success>span { background:var(--success); }
1745
+ .progress-tone-warning>span { background:var(--warning); }
1746
+ .progress-tone-danger>span { background:var(--destructive); }
1747
+ .progress-tone-info>span { background:var(--info); }
1748
+ /* Sem total, um pedaço de 2/5 corre pelo trilho: os números do HeroUI (`w-2/5`, de -100% a 350% da
1749
+ própria largura, 1,5 s, a curva dele). O HeroUI anda com `translateX`; aqui anda a MARGEM LÓGICA
1750
+ (de -40% a 140% do trilho, o mesmo percurso), para correr ao contrário na escrita da direita para
1751
+ a esquerda sem `:dir(rtl)` — o empacotador do app reescreve `:dir()` como lista de idiomas e a
1752
+ regra deixa de pegar (medido no Vite, 03/10/2026). O pedaço tem 8 de altura: a conta por quadro é
1753
+ desprezível.
1754
+ Com menos movimento ele não corre: a barra inteira, apagada — nunca um pedaço parado, que leria
1755
+ como 40% feito. */
1756
+ .progress-indeterminate>span { width:40%; animation:progress-indeterminate 1.5s cubic-bezier(0.65,0,0.35,1) infinite; }
1757
+ @keyframes progress-indeterminate { from { margin-inline-start:-40%; } to { margin-inline-start:140%; } }
1758
+ @media (prefers-reduced-motion:reduce) { .progress-indeterminate>span { width:100%; animation:none; opacity:var(--opacity-disabled); } }
1633
1759
  /* DataState (M3): a região que troca de cara. Ela NÃO desenha nada próprio — só empilha o que
1634
1760
  já existe (esqueleto, alerta, estado vazio, conteúdo) com respiro entre eles. Se ganhar borda
1635
1761
  ou fundo, viram duas superfícies para a mesma coisa — o defeito que a `.table-region` cobrou. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.16.1",
3
+ "version": "0.18.0",
4
4
  "description": "O CSS da Aurea UDS e o comportamento em JavaScript puro. Importe @aurea-uds/fonts/css antes deste.",
5
5
  "keywords": [
6
6
  "aurea",