@aurea-uds/core 0.17.0 → 0.19.1

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 +125 -7
  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
@@ -979,6 +1017,11 @@ img,svg { display:block; }
979
1017
  /* O VALOR E A SETA NÃO ENCOLHEM: valor cortado MENTE (um "R$ 1.2" no lugar de "R$ 1.234"), e seta
980
1018
  cortada deixa de dizer que a linha abre. Quem cede espaço é o texto, que reticencia dizendo. */
981
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; }
982
1025
  .nav-list-row .nav-list-chevron { flex:none; opacity:.6; }
983
1026
  @media (hover:hover) and (pointer:fine) { .nav-list-row:hover { background:var(--secondary); } }
984
1027
  /* `aria-disabled` e NÃO `:disabled` — a razão está escrita ao lado de `.btn:disabled`, medida em
@@ -1691,6 +1734,28 @@ img,svg { display:block; }
1691
1734
  @media (max-width:640px) { .banner { grid-template-columns:auto minmax(0,1fr); } .banner>:last-child { grid-column:2; justify-self:start; } }
1692
1735
  .progress { height:8px; overflow:hidden; border-radius:999px; background:var(--surface-3); }
1693
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); } }
1694
1759
  /* DataState (M3): a região que troca de cara. Ela NÃO desenha nada próprio — só empilha o que
1695
1760
  já existe (esqueleto, alerta, estado vazio, conteúdo) com respiro entre eles. Se ganhar borda
1696
1761
  ou fundo, viram duas superfícies para a mesma coisa — o defeito que a `.table-region` cobrou. */
@@ -1962,6 +2027,40 @@ img,svg { display:block; }
1962
2027
  /* Chat React (Fase 5.4): estrutura fixa em classe, não inline (auditoria 18/07, M14). */
1963
2028
  .message-status { display:flex; align-items:center; flex-wrap:wrap; gap:var(--space-3); margin-block-start:var(--space-2); }
1964
2029
  .message-composer { display:flex; align-items:center; gap:var(--space-3); flex-wrap:nowrap; } .message-composer .input-group { flex:1; min-width:0; }
2030
+ /* AN-03 (Lote H, 04/10/2026). A FAIXA ACIMA DO CAMPO é o adorno em bloco da casa, empilhado: a
2031
+ citação (responder ou editar) em cima, os anexos embaixo. Com ela o grupo vira superfície (raio
2032
+ de cartão, a regra do adorno em bloco) e o botão de enviar desce para a linha do campo, onde
2033
+ está o texto — sem faixa, nada muda.
2034
+ A CITAÇÃO é a da prosa: o fio no começo da linha, apagado, com o recuo de dentro. O fio tem a
2035
+ espessura do `blockquote` da `.prose` (2), escrita a partir do `--border-width`. O título leva o
2036
+ peso médio, e o corpo fica numa linha só, com reticências. Ela serve também ao cabeçalho de
2037
+ resposta do `MessageList` (AN-02). */
2038
+ .message-composer:has(.message-composer-context) { align-items:flex-end; }
2039
+ .message-composer-context { flex-direction:column; align-items:stretch; gap:var(--space-2); color:var(--foreground); }
2040
+ .message-composer-context > .file-list { margin:0; }
2041
+ .message-quote { display:flex; align-items:center; gap:var(--space-2); padding-inline-start:var(--space-3); border-inline-start:calc(var(--border-width) * 2) solid var(--border-strong); color:var(--muted-foreground); font-size:var(--text-sm); }
2042
+ .message-quote > .icon { flex:none; }
2043
+ .message-quote-text { display:grid; flex:1; min-inline-size:0; }
2044
+ .message-quote-title { color:var(--foreground); font-weight:var(--weight-medium); }
2045
+ .message-quote-body { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
2046
+ /* AN-02 (Lote H, 04/10/2026). O LADO DA MENSAGEM. Quem declara `direction` ganha a bolha do
2047
+ tamanho do texto e uma folga do lado oposto igual ao avatar mais o vão (`--control-h-md` +
2048
+ `--space-3`): a conversa fica em duas margens, como em todo app de mensagem. Quem não declara
2049
+ continua como antes, com a bolha na largura toda.
2050
+ A MINHA vai para o fim, sem avatar, com o canto pequeno (`--radius-xs`, os mesmos 6 da bolha de
2051
+ sempre) do lado dela, e o fundo tingido da marca — o mesmo tom do nó escolhido do `TreeView`, que
2052
+ já é a forma desta folha de dizer "é seu" sem o amarelo cheio. Os cantos são lógicos: viram
2053
+ sozinhos na escrita da direita para a esquerda.
2054
+ O ÁLBUM é a `Gallery`, e a medida dela: no máximo duas miniaturas por linha (`--gallery-min` ×2
2055
+ mais o vão), e `auto-fit` para uma foto só ocupar a largura. */
2056
+ .message-in { padding-inline-end:calc(var(--control-h-md) + var(--space-3)); }
2057
+ .message-out { grid-template-columns:minmax(0,1fr); padding-inline-start:calc(var(--control-h-md) + var(--space-3)); }
2058
+ .message-in > .message-bubble { justify-self:start; border-radius:var(--radius-lg); border-start-start-radius:var(--radius-xs); }
2059
+ .message-out > .message-bubble { justify-self:end; border-radius:var(--radius-lg); border-start-end-radius:var(--radius-xs); background:color-mix(in srgb,var(--primary) 14%,transparent); }
2060
+ .message-day { display:flex; justify-content:center; }
2061
+ .message-forwarded { display:flex; align-items:center; gap:var(--space-1); color:var(--muted-foreground); font-size:var(--text-sm); }
2062
+ .message-bubble > .message-forwarded, .message-bubble > .message-quote, .message-bubble > .message-album, .message-bubble > .file-list { margin-block:0 var(--space-2); }
2063
+ .message-album { inline-size:min(100%, calc(var(--gallery-min,8rem) * 2 + var(--space-3))); grid-template-columns:repeat(auto-fit,minmax(var(--gallery-min,8rem),1fr)); }
1965
2064
 
1966
2065
  /* ========================================================================== */
1967
2066
  /* 07. MÍDIA */
@@ -2068,6 +2167,17 @@ img,svg { display:block; }
2068
2167
  qualquer forma — ele é `buttonface`, não transparente. */
2069
2168
  .gallery-tile:not(.is-selected) { background:transparent; color:var(--muted-foreground); }
2070
2169
  .gallery-caption { font-size:var(--text-sm); }
2170
+ /* AN-05 (Lote H, 04/10/2026). O VÍDEO não inventa peça: é o `Badge` da casa, pousado no canto do
2171
+ fim da foto, com as cores do reprodutor: o véu (`--media-scrim`, preto a 82%) e a letra dele
2172
+ (`--media-foreground`). O `--media-track` que o `.media-player` dá ao `Badge` é branco a 18% e só
2173
+ funciona sobre o véu: sobre foto clara, o tempo sumia (visto no banco em 04/10/2026). O canto é lógico (`inset-inline-end`), então vira sozinho na escrita da
2174
+ direita para a esquerda; o recuo do canto é `--space-2`.
2175
+ A LINHA DE "CARREGANDO MAIS" tem a medida do `Table.LoadMore` do HeroUI (`py-3`, centrada): é
2176
+ ela que o observador vigia, então existe também parada, sem a rodinha. A do `MessageList` (AN-02),
2177
+ nas duas pontas da conversa, é a mesma linha. */
2178
+ .gallery-media { position:relative; display:block; }
2179
+ .gallery-media > .gallery-duration { position:absolute; inset-block-end:var(--space-2); inset-inline-end:var(--space-2); border-color:var(--media-scrim); background:var(--media-scrim); color:var(--media-foreground); }
2180
+ .gallery-more,.message-more { display:flex; align-items:center; justify-content:center; min-block-size:var(--icon-sm); padding-block:var(--space-3); color:var(--muted-foreground); }
2071
2181
 
2072
2182
  /* TIPOGRAFIA (B-02, 25/09/2026) — `Text`, `Heading`, `Paragraph` e `Code`, no molde do HeroUI
2073
2183
  3.2.6 (`typography.css`), por ordem do Victor: HeroUI sempre primeiro. O que vem dele é a FORMA:
@@ -2455,22 +2565,30 @@ img,svg { display:block; }
2455
2565
  /* TreeView (Fase 4) — árvore headless própria (Base UI 1.6 não tem tree).
2456
2566
  role=tree/treeitem/group + roving tabindex vêm do React; aqui só a pele.
2457
2567
  A indentação por nível é padding-inline-start inline (style). Espaço novo
2458
- tokenizado; a linha não é pill (radius-sm, como o .menu-item). */
2568
+ tokenizado. A linha é CÁPSULA (`--radius-control`): o escolhido e o realce de passar o mouse
2569
+ são cápsula, como os campos, as abas e os botões de texto — regra do Victor, dita olhando a
2570
+ bancada do Lote H em 04/10/2026. Antes era `--radius-sm` (8). O texto do nó é uma linha só
2571
+ (`.tree-label` não quebra), então a cápsula não deforma. */
2459
2572
  .tree, .tree-group { margin:0; padding:0; list-style:none; }
2460
2573
  .tree-item { outline:none; }
2461
- .tree-node { display:flex; align-items:center; gap:var(--space-2); min-height:var(--control-h-md); padding-block:var(--space-1); padding-inline-end:var(--space-3); border-radius:var(--radius-sm); color:var(--foreground); cursor:pointer; user-select:none; }
2574
+ .tree-node { display:flex; align-items:center; gap:var(--space-2); min-height:var(--control-h-md); padding-block:var(--space-1); padding-inline-end:var(--space-3); border-radius:var(--radius-control); color:var(--foreground); cursor:pointer; user-select:none; }
2462
2575
  .tree-node:hover { background:var(--surface-3); }
2463
2576
  .tree-item:focus-visible > .tree-node { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
2464
2577
  .tree-node[data-selected] { background:color-mix(in srgb,var(--primary) 14%,transparent); }
2465
- .tree-twist { flex:none; color:var(--muted-foreground); transition:transform var(--duration-fast); }
2466
- .tree-item[aria-expanded="true"] > .tree-node > .tree-twist { transform:rotate(90deg); }
2467
- .tree-item[aria-expanded="false"]:dir(rtl) > .tree-node > .tree-twist { transform:rotate(180deg); }
2578
+ /* A seta gira pela propriedade `rotate`, e não por `transform`: assim a rodinha que ocupa o lugar
2579
+ dela enquanto o nó carrega (AN-06) continua girando pela animação dela, que é `transform`.
2580
+ Na escrita da direita para a esquerda a seta fechada aponta para a esquerda. Quem diz a direção é
2581
+ o React, pela direção do provedor (`.tree-twist-rtl`), e não `:dir(rtl)` — o empacotador do app
2582
+ reescreve `:dir()` como lista de idiomas e a regra deixa de pegar (medido no Vite, 03/10/2026). */
2583
+ .tree-twist { flex:none; color:var(--muted-foreground); transition:rotate var(--duration-fast); }
2584
+ .tree-twist-rtl { rotate:180deg; }
2585
+ .tree-item[aria-expanded="true"] > .tree-node > .tree-twist { rotate:90deg; }
2468
2586
  .tree-indent { flex:none; width:1rem; }
2469
2587
  .tree-label { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
2470
2588
 
2471
2589
  /* NotificationCenter (Fase 4) — compõe o .popover; aqui só o gatilho com count,
2472
2590
  o cabeçalho e as linhas do feed. Espaço novo tokenizado; a linha usa radius-sm
2473
- (não é pill, como o .menu-item/.tree-node). O painel NÃO é live region — a
2591
+ (não é pill, como o .menu-item; o .tree-node virou cápsula em 04/10/2026). O painel NÃO é live region — a
2474
2592
  chegada é anunciada por um role=status à parte no React. */
2475
2593
  .notification-trigger { position:relative; display:inline-flex; }
2476
2594
  .notification-count { position:absolute; inset-block-start:-4px; inset-inline-end:-4px; display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 var(--space-1); border-radius:var(--radius-control); background:var(--primary); color:var(--primary-foreground); font-size:var(--text-xs); font-weight:var(--weight-semibold); line-height:var(--leading-none); pointer-events:none; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.17.0",
3
+ "version": "0.19.1",
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",