@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.
- package/dist/aurea.css +125 -7
- 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
|
-
|
|
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
|
|
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-
|
|
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
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
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
|
|
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; }
|