@aurea-uds/react 0.51.0 → 0.54.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.
- package/dist/actions.d.ts +11 -4
- package/dist/actions.js +6 -4
- package/dist/agents.js +7 -6
- package/dist/code-client.d.ts +6 -1
- package/dist/code-client.js +21 -3
- package/dist/code-highlight.js +4 -1
- package/dist/data-display-client.d.ts +8 -1
- package/dist/data-display-client.js +1 -1
- package/dist/data-grid.js +23 -2
- package/dist/disclosure.d.ts +7 -1
- package/dist/disclosure.js +12 -2
- package/dist/feedback-client.d.ts +5 -2
- package/dist/feedback-client.js +9 -5
- package/dist/graph.js +2 -1
- package/dist/inputs-client.d.ts +12 -4
- package/dist/inputs-client.js +9 -6
- package/dist/layout-client.d.ts +5 -2
- package/dist/layout-client.js +4 -3
- package/dist/markup.d.ts +26 -8
- package/dist/markup.js +31 -9
- package/dist/navigation-client.d.ts +32 -4
- package/dist/navigation-client.js +68 -22
- package/dist/pure.d.ts +4 -0
- package/dist/pure.js +6 -2
- package/dist/system.js +2 -2
- package/package.json +1 -1
package/dist/actions.d.ts
CHANGED
|
@@ -88,7 +88,8 @@ interface ToggleBase {
|
|
|
88
88
|
* mudou, e a composição fica bonita e morta. Solto, não faz diferença nenhuma. */
|
|
89
89
|
value?: string;
|
|
90
90
|
icon?: IconName;
|
|
91
|
-
|
|
91
|
+
/** `xl` (o site B, 0.54.0 — as marcas do menu do celular, aprovado pela bancada em 01/11/2026): o botão de 50, o `xl` do `Button`. */
|
|
92
|
+
size?: Responsive<Extract<ComponentSize, "sm" | "md" | "lg" | "xl">>;
|
|
92
93
|
disabled?: boolean;
|
|
93
94
|
id?: string;
|
|
94
95
|
className?: string;
|
|
@@ -98,6 +99,10 @@ interface ToggleBase {
|
|
|
98
99
|
/** A cor do LIGADO (ADR-0084, 27/10/2026): `brand` — o amarelo do botão primário, o padrão —, `neutral` (o cinza) ou
|
|
99
100
|
* `contrast` (o grafite, invertido). Dentro de um `ToggleGroup` ou de um `Toolbar` com `pressedStyle`, o do botão vale. */
|
|
100
101
|
pressedStyle?: TogglePressedStyle;
|
|
102
|
+
/** A ÁREA (o site B, 0.54.0 — aprovada pela bancada em 01/11/2026): o toggle em volta de um bloco (uma miniatura, um ícone
|
|
103
|
+
* com o nome). `true` ocupa a largura; `"pill"` fica do tamanho do conteúdo, em cápsula. Com `variant="ghost"`, sem fundo;
|
|
104
|
+
* com o `default`, o fundo cinza e, ligada, o amarelo cheio. */
|
|
105
|
+
area?: boolean | "pill";
|
|
101
106
|
}
|
|
102
107
|
export type ToggleVariant = "default" | "ghost";
|
|
103
108
|
/** As três cores do ligado aprovadas pelo Victor em 26/10/2026 (A cinza, B grafite, C amarelo — o padrão). */
|
|
@@ -110,7 +115,7 @@ export type ToggleProps = ToggleBase & ({
|
|
|
110
115
|
children?: never;
|
|
111
116
|
label: string;
|
|
112
117
|
});
|
|
113
|
-
export declare function Toggle({ pressed, defaultPressed, onPressedChange, value, icon, label, size: sizePedido, disabled, id, className, children, variant, pressedStyle }: ToggleProps): React.JSX.Element;
|
|
118
|
+
export declare function Toggle({ pressed, defaultPressed, onPressedChange, value, icon, label, size: sizePedido, disabled, id, className, children, variant, pressedStyle, area }: ToggleProps): React.JSX.Element;
|
|
114
119
|
export interface IconButtonProps extends Omit<ButtonProps, "children"> {
|
|
115
120
|
label: string;
|
|
116
121
|
icon: AureaIcon;
|
|
@@ -142,10 +147,12 @@ export interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement>, RefAtt
|
|
|
142
147
|
detached?: boolean;
|
|
143
148
|
}
|
|
144
149
|
export declare function ButtonGroup({ label, orientation, variant, size, fullWidth, disabled, detached, className, ...props }: ButtonGroupProps): React.JSX.Element;
|
|
145
|
-
export declare function Toolbar({ orientation, label, className, pressedStyle, ...props }: HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement> & {
|
|
150
|
+
export declare function Toolbar({ orientation, label, className, pressedStyle, tone, ...props }: HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement> & {
|
|
146
151
|
orientation?: Responsive<Orientation>;
|
|
147
152
|
label?: string;
|
|
148
153
|
pressedStyle?: TogglePressedStyle;
|
|
154
|
+
/** `brand`: a barra amarela da seleção em lote ("3 selected", "Clear", "Remove"), com os botões brancos. */
|
|
155
|
+
tone?: "default" | "brand";
|
|
149
156
|
}): React.JSX.Element;
|
|
150
157
|
export declare function ToolbarGroup({ label, className, ...props }: HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement> & {
|
|
151
158
|
label?: string;
|
|
@@ -167,7 +174,7 @@ export interface ToggleGroupProps {
|
|
|
167
174
|
className?: string;
|
|
168
175
|
children: React.ReactNode;
|
|
169
176
|
/** O tamanho de todos os botões de dentro; cada um pode trocar o seu (valor simples, como o dela). */
|
|
170
|
-
size?: Extract<ComponentSize, "sm" | "md" | "lg">;
|
|
177
|
+
size?: Extract<ComponentSize, "sm" | "md" | "lg" | "xl">;
|
|
171
178
|
/** Ocupa a largura do pai, e os botões repartem em partes iguais. */
|
|
172
179
|
fullWidth?: boolean;
|
|
173
180
|
/** Botões soltos (vão de 4), em vez de colados. */
|
package/dist/actions.js
CHANGED
|
@@ -206,7 +206,7 @@ function temConteudoVisivel(children) {
|
|
|
206
206
|
// entre os estados**. Se o texto vira "Mute"/"Unmute" ou "Play"/"Pause", não é toggle — é
|
|
207
207
|
// botão de ação, porque quem lê tela ouve o rótulo NOVO e o estado ao mesmo tempo e não sabe
|
|
208
208
|
// se o botão descreve o que é ou o que fará.
|
|
209
|
-
export function Toggle({ pressed, defaultPressed, onPressedChange, value, icon, label, size: sizePedido, disabled, id, className, children, variant = "default", pressedStyle }) {
|
|
209
|
+
export function Toggle({ pressed, defaultPressed, onPressedChange, value, icon, label, size: sizePedido, disabled, id, className, children, variant = "default", pressedStyle, area }) {
|
|
210
210
|
const grupo = React.useContext(GrupoDeBotoesContext);
|
|
211
211
|
const size = sizePedido ?? grupo?.size;
|
|
212
212
|
// O tipo barra o consumidor TypeScript; este aviso barra o de JavaScript, que não tem tipo nenhum.
|
|
@@ -223,7 +223,7 @@ export function Toggle({ pressed, defaultPressed, onPressedChange, value, icon,
|
|
|
223
223
|
// sem `size` saía a classe `btn-undefined` (medido no catálogo, nos três botões do `ToggleGroup`); com
|
|
224
224
|
// valor responsivo sairia `btn-[object Object]`.
|
|
225
225
|
const tamanho = ehResponsivo(size) ? classesResponsivas("size", size) : ((valorBase(size) ?? "md") !== "md" && `btn-${valorBase(size)}`);
|
|
226
|
-
return _jsxs(BaseToggle, { id: id, value: value, disabled: disabled, pressed: pressed, defaultPressed: defaultPressed, onPressedChange: soOValor(onPressedChange), "aria-label": textoVisivel ? undefined : (rotuloVisivel ? label : undefined), "data-pressed-style": pressedStyle, className: cx("btn", variant === "ghost" ? "btn-ghost" : "btn-tertiary", tamanho, !textoVisivel && "btn-icon", "toggle", className), children: [icon && _jsx(Icon, { name: icon }), children] });
|
|
226
|
+
return _jsxs(BaseToggle, { id: id, value: value, disabled: disabled, pressed: pressed, defaultPressed: defaultPressed, onPressedChange: soOValor(onPressedChange), "aria-label": textoVisivel ? undefined : (rotuloVisivel ? label : undefined), "data-pressed-style": pressedStyle, className: cx("btn", variant === "ghost" ? "btn-ghost" : "btn-tertiary", !area && tamanho, !textoVisivel && !area && "btn-icon", "toggle", area && "toggle-area", area === "pill" && "toggle-area-pill", className), children: [icon && _jsx(Icon, { name: icon }), children] });
|
|
227
227
|
}
|
|
228
228
|
// default ghost (não secondary): um ícone-ação solto — hambúrguer, tema, fechar — é sem
|
|
229
229
|
// caixa por convenção (pedido do Victor: hambúrguer sem borda). Quem quer a caixa passa
|
|
@@ -268,11 +268,13 @@ export function ButtonGroup({ label, orientation, variant, size, fullWidth, disa
|
|
|
268
268
|
// diz outra coisa — seriam duas fontes de verdade e uma janela em que visual e comportamento
|
|
269
269
|
// divergem. Ver `decisions/0047-css-first-para-apresentacao-runtime-para-semantica.md`.
|
|
270
270
|
// `pressedStyle` (ADR-0084): a cor do ligado de todos os botões de dentro; cada um pode trocar a sua.
|
|
271
|
-
|
|
271
|
+
// `tone="brand"` (o site B — a barra de seleção da página inicial, aprovada pela bancada em 01/11/2026, o D-7.7, a forma B):
|
|
272
|
+
// a barra AMARELA, de 52, o texto na tinta, 600, e os botões de dentro BRANCOS com a tinta. Sem `tone`, a barra de sempre.
|
|
273
|
+
export function Toolbar({ orientation, label, className, pressedStyle, tone = "default", ...props }) {
|
|
272
274
|
const s = useAureaStrings();
|
|
273
275
|
const ancora = useRef(null);
|
|
274
276
|
const resolvida = useValorResponsivo(orientation, "horizontal", ancora);
|
|
275
|
-
return _jsx(BaseToolbar.Root, { ref: ancora, orientation: resolvida, "aria-label": label ?? s.toolbarLabel, "data-pressed-style": pressedStyle, className: cx("toolbar", className), ...props });
|
|
277
|
+
return _jsx(BaseToolbar.Root, { ref: ancora, orientation: resolvida, "aria-label": label ?? s.toolbarLabel, "data-pressed-style": pressedStyle, className: cx("toolbar", tone === "brand" && "toolbar-brand", className), ...props });
|
|
276
278
|
}
|
|
277
279
|
export function ToolbarGroup({ label, className, ...props }) { return _jsx(BaseToolbar.Group, { "aria-label": label, className: cx("toolbar-group", className), ...props }); }
|
|
278
280
|
export function ToolbarSeparator({ className, ...props }) { return _jsx(BaseToolbar.Separator, { className: cx("toolbar-sep", className), ...props }); }
|
package/dist/agents.js
CHANGED
|
@@ -19,6 +19,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
19
19
|
// verbal. Aqui as ações entram como nó, e quem monta o botão sabe o que ele faz.
|
|
20
20
|
import React from "react";
|
|
21
21
|
import { cx, useAureaStrings } from "./internal.js";
|
|
22
|
+
import { proprio } from "./pure.js";
|
|
22
23
|
import { Icon } from "./system.js";
|
|
23
24
|
import { Status, Badge, Progress, Alert } from "./feedback.js";
|
|
24
25
|
import { Avatar } from "./identity.js";
|
|
@@ -38,7 +39,7 @@ const ESTADO = {
|
|
|
38
39
|
// exatamente o que a Parte J existe para impedir, um nível acima.
|
|
39
40
|
export function AgentStatus({ state = "idle", label, className, ...props }) {
|
|
40
41
|
const s = useAureaStrings();
|
|
41
|
-
return _jsx(Status, { variant: ESTADO
|
|
42
|
+
return _jsx(Status, { variant: proprio(ESTADO, state), className: className, "data-state": state, ...props, children: label ?? proprio(s.agentState, state) });
|
|
42
43
|
}
|
|
43
44
|
// AgentCard — a identidade do agente: quem é, em que estado está, o que sabe fazer.
|
|
44
45
|
export function AgentCard({ name, description, avatarSrc, model, state, capabilities, actions, className, ...props }) {
|
|
@@ -93,7 +94,7 @@ const TAREFA = {
|
|
|
93
94
|
// aqui faria a fila responder por quatro contratos e nenhum deles direito.
|
|
94
95
|
export function TaskQueue({ tasks, label, onRetry, className, ...props }) {
|
|
95
96
|
const s = useAureaStrings();
|
|
96
|
-
return _jsx("ol", { className: cx("task-queue", className), "aria-label": label ?? s.taskQueueLabel, ...props, children: tasks.map(t => _jsxs("li", { className: "task-item", "data-state": t.state, children: [_jsxs("div", { className: "task-line", children: [_jsx("span", { className: "task-title", children: t.title }), t.priority && _jsx(Badge, { variant: t.priority === "high" ? "warning" : "neutral", children: s.taskPriority[t.priority] }), _jsx(Status, { variant: TAREFA
|
|
97
|
+
return _jsx("ol", { className: cx("task-queue", className), "aria-label": label ?? s.taskQueueLabel, ...props, children: tasks.map(t => _jsxs("li", { className: "task-item", "data-state": t.state, children: [_jsxs("div", { className: "task-line", children: [_jsx("span", { className: "task-title", children: t.title }), t.priority && _jsx(Badge, { variant: t.priority === "high" ? "warning" : "neutral", children: s.taskPriority[t.priority] }), _jsx(Status, { variant: proprio(TAREFA, t.state), children: proprio(s.taskState, t.state) }), t.state === "failed" && onRetry && _jsx(IconButton, { variant: "ghost", size: "sm", icon: "arrow-counter-clockwise", label: `${s.uploadRetry} ${t.title}`, onClick: () => onRetry(t) })] }), t.description && _jsx("p", { className: "task-desc", children: t.description }), t.state === "running" && t.progress != null && _jsx(Progress, { value: Math.round(t.progress * 100), label: t.title })] }, t.id)) });
|
|
97
98
|
}
|
|
98
99
|
// HumanApproval — o portão: o que vai acontecer, e a decisão de uma pessoa.
|
|
99
100
|
export function HumanApproval({ title, description, details, risk, reasoning, deadline, decision, onApprove, onDeny, className, ...props }) {
|
|
@@ -169,7 +170,7 @@ const SAUDE = {
|
|
|
169
170
|
// HealthMatrix — o que está de pé, numa grade.
|
|
170
171
|
export function HealthMatrix({ entries, label, className, ...props }) {
|
|
171
172
|
const s = useAureaStrings();
|
|
172
|
-
return _jsx("ul", { className: cx("health-matrix", className), "aria-label": label ?? s.healthLabel, ...props, children: entries.map(e => _jsxs("li", { className: "health-cell", "data-state": e.state, children: [_jsx("span", { className: "health-name", children: e.name }), _jsx(Status, { variant: SAUDE
|
|
173
|
+
return _jsx("ul", { className: cx("health-matrix", className), "aria-label": label ?? s.healthLabel, ...props, children: entries.map(e => _jsxs("li", { className: "health-cell", "data-state": e.state, children: [_jsx("span", { className: "health-name", children: e.name }), _jsx(Status, { variant: proprio(SAUDE, e.state), children: proprio(s.healthState, e.state) }), e.detail && _jsx("span", { className: "hint", children: e.detail })] }, e.id)) });
|
|
173
174
|
}
|
|
174
175
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
175
176
|
// H.e — custo e memória: quanto se consumiu, contra que teto, e o que ficou guardado.
|
|
@@ -259,7 +260,7 @@ const LANCAMENTO = {
|
|
|
259
260
|
// ordenar e filtrar o razão compõe as duas coisas na aplicação — o exemplo do catálogo mostra.
|
|
260
261
|
export function MemoryLedger({ records, label, className, ...props }) {
|
|
261
262
|
const s = useAureaStrings();
|
|
262
|
-
return _jsx("ol", { className: cx("memory-ledger", className), "aria-label": label ?? s.memoryLabel, ...props, children: records.map(r => _jsxs("li", { className: "memory-entry", "data-operation": r.operation, "data-scope": r.scope, children: [_jsxs("div", { className: "memory-line", children: [_jsx(Badge, { variant: LANCAMENTO
|
|
263
|
+
return _jsx("ol", { className: cx("memory-ledger", className), "aria-label": label ?? s.memoryLabel, ...props, children: records.map(r => _jsxs("li", { className: "memory-entry", "data-operation": r.operation, "data-scope": r.scope, children: [_jsxs("div", { className: "memory-line", children: [_jsx(Badge, { variant: proprio(LANCAMENTO, r.operation), children: proprio(s.memoryOperation, r.operation) }), _jsx(Badge, { children: proprio(s.memoryScope, r.scope) }), _jsx("span", { className: "memory-content", children: r.content }), r.time && _jsx("time", { className: "memory-time", children: r.time })] }), (r.source || r.details?.length) && _jsxs("details", { className: "memory-provenance", children: [_jsx("summary", { children: s.memoryProvenance }), r.source && _jsx("p", { className: "memory-source", children: r.source }), !!r.details?.length && _jsx(DataList, { items: r.details })] })] }, r.id)) });
|
|
263
264
|
}
|
|
264
265
|
const RECADO = {
|
|
265
266
|
request: "info", response: "success", handoff: "primary", broadcast: "neutral", error: "danger",
|
|
@@ -279,7 +280,7 @@ export function InterAgentMessage({ messages, label, className, ...props }) {
|
|
|
279
280
|
const s = useAureaStrings();
|
|
280
281
|
return _jsx("ol", { className: cx("agent-messages", className), "aria-label": label ?? s.agentMessageLabel, ...props, children: messages.map(m => {
|
|
281
282
|
const destino = m.to ?? s.agentMessageBroadcast;
|
|
282
|
-
return _jsxs("li", { className: "agent-message", "data-kind": m.kind ?? "handoff", children: [_jsxs("div", { className: "agent-message-line", children: [_jsxs("span", { className: "agent-message-route", role: "group", "aria-label": `${m.from} ${s.agentMessageTo} ${destino}`, children: [_jsx("strong", { children: m.from }), _jsx(Icon, { name: "arrow-right", size: "sm", className: "agent-message-arrow" }), m.to ? _jsx("strong", { children: m.to }) : _jsx("span", { className: "hint", children: destino })] }), _jsx(Badge, { variant: RECADO
|
|
283
|
+
return _jsxs("li", { className: "agent-message", "data-kind": m.kind ?? "handoff", children: [_jsxs("div", { className: "agent-message-line", children: [_jsxs("span", { className: "agent-message-route", role: "group", "aria-label": `${m.from} ${s.agentMessageTo} ${destino}`, children: [_jsx("strong", { children: m.from }), _jsx(Icon, { name: "arrow-right", size: "sm", className: "agent-message-arrow" }), m.to ? _jsx("strong", { children: m.to }) : _jsx("span", { className: "hint", children: destino })] }), _jsx(Badge, { variant: proprio(RECADO, m.kind ?? "handoff"), children: proprio(s.agentMessageKind, m.kind ?? "handoff") }), m.time && _jsx("time", { className: "agent-message-time", children: m.time })] }), _jsx("p", { className: "agent-message-body", children: m.body }), (m.reason || m.details?.length) && _jsxs("details", { className: "agent-message-why", children: [_jsx("summary", { children: s.agentMessageReason }), m.reason && _jsx("p", { className: "agent-message-reason", children: m.reason }), !!m.details?.length && _jsx(DataList, { items: m.details })] })] }, m.id);
|
|
283
284
|
}) });
|
|
284
285
|
}
|
|
285
286
|
// AutomationCard — a regra que roda sozinha: QUANDO isto, ENTÃO aquilo.
|
|
@@ -300,5 +301,5 @@ export function AutomationCard({ name, description, trigger, action, enabled, on
|
|
|
300
301
|
const s = useAureaStrings();
|
|
301
302
|
// `data-enabled` só quando LIGADA: o `false` saía como `data-enabled="false"` e escapava da regra que faz a regra
|
|
302
303
|
// desligada recuar (`:not([data-enabled])`) — achado do check 49, lote 1, 20/10/2026.
|
|
303
|
-
return _jsxs("article", { className: cx("card", "automation", className), "data-enabled": enabled || undefined, ...props, children: [_jsxs("header", { className: "automation-head", children: [_jsxs("div", { className: "automation-id", children: [_jsx("strong", { children: name }), description && _jsx("span", { className: "hint", children: description })] }), onToggle && _jsx(Switch, { checked: !!enabled, onChange: e => onToggle(e.target.checked), label: s.automationEnabled })] }), _jsx(DataList, { items: [{ term: s.automationWhen, value: trigger }, { term: s.automationThen, value: action }, ...(details ?? [])] }), (lastRun || lastResult) && _jsxs("footer", { className: "automation-foot", children: [lastResult && _jsx(Status, { variant: lastResult === "success" ? "success" : "danger", children: s.automationResult
|
|
304
|
+
return _jsxs("article", { className: cx("card", "automation", className), "data-enabled": enabled || undefined, ...props, children: [_jsxs("header", { className: "automation-head", children: [_jsxs("div", { className: "automation-id", children: [_jsx("strong", { children: name }), description && _jsx("span", { className: "hint", children: description })] }), onToggle && _jsx(Switch, { checked: !!enabled, onChange: e => onToggle(e.target.checked), label: s.automationEnabled })] }), _jsx(DataList, { items: [{ term: s.automationWhen, value: trigger }, { term: s.automationThen, value: action }, ...(details ?? [])] }), (lastRun || lastResult) && _jsxs("footer", { className: "automation-foot", children: [lastResult && _jsx(Status, { variant: lastResult === "success" ? "success" : "danger", children: proprio(s.automationResult, lastResult) }), lastRun && _jsxs("span", { className: "hint", children: [s.automationLastRun, ": ", lastRun] }), actions] }), !lastRun && !lastResult && actions && _jsx("footer", { className: "automation-foot", children: actions })] });
|
|
304
305
|
}
|
package/dist/code-client.d.ts
CHANGED
|
@@ -15,12 +15,17 @@ export type CodeLine = CodeToken[];
|
|
|
15
15
|
/** Quem colore: recebe o código e a língua e devolve as linhas, ou `null` quando não conhece a língua. O da Aurea é o
|
|
16
16
|
* `highlightCode` de `@aurea-uds/react/code-highlight`. */
|
|
17
17
|
export type CodeHighlighter = (code: string, language: string) => CodeLine[] | null;
|
|
18
|
-
export declare function CodeBlock({ children, language, copyable, preview, lineNumbers, highlight, tabs, className }: {
|
|
18
|
+
export declare function CodeBlock({ children, language, copyable, preview, previewLayout, lineNumbers, highlight, tabs, filename, className }: {
|
|
19
19
|
children?: string;
|
|
20
20
|
language?: string;
|
|
21
21
|
copyable?: boolean;
|
|
22
|
+
/** O nome do arquivo na cabeça do bloco; com ele, o "Copy" é escrito e a linha longa desce. */
|
|
23
|
+
filename?: React.ReactNode;
|
|
22
24
|
/** A prévia viva do código: com ela, o bloco vira a caixa de exemplo, com as abas Prévia | Código. */
|
|
23
25
|
preview?: React.ReactNode;
|
|
26
|
+
/** Com `preview`: `tabs` (as abas Prévia | Código, o padrão) ou `stacked` (a peça em cima e o código embaixo; mais de 5
|
|
27
|
+
* linhas, recolhido com o "Expand code" — ADR-0089). */
|
|
28
|
+
previewLayout?: "tabs" | "stacked";
|
|
24
29
|
/** Mostra o número de cada linha à esquerda. O número não entra no texto copiado nem é lido pelo leitor de tela. */
|
|
25
30
|
lineNumbers?: boolean;
|
|
26
31
|
/** Colore o código. Passe o `highlightCode` de `@aurea-uds/react/code-highlight` (os analisadores são peer opcional). */
|
package/dist/code-client.js
CHANGED
|
@@ -14,6 +14,15 @@ import { Icon } from "./system.js";
|
|
|
14
14
|
// moldura. É a caixa do site de hoje (decisão do Victor, 06/10/2026: a da Aurea, não a da referência),
|
|
15
15
|
// agora no pacote, para o site usar só peças da Aurea. O teclado é o das abas do APG: setas, Home e End.
|
|
16
16
|
// Sem o `aurea.js` na página — quem troca a aba é o React.
|
|
17
|
+
// A CAIXA EMPILHADA (`previewLayout="stacked"`, ADR-0089): a peça em cima e o código embaixo, sem as abas; mais de 5
|
|
18
|
+
// linhas, o código vem recolhido com o "Expand code".
|
|
19
|
+
function CaixaEmpilhada({ preview, codigo, linhas, className }) {
|
|
20
|
+
const s = useAureaStrings();
|
|
21
|
+
const id = React.useId();
|
|
22
|
+
const [aberto, setAberto] = React.useState(false);
|
|
23
|
+
const dobra = linhas > 5;
|
|
24
|
+
return _jsxs("div", { className: cx("demo code-preview demo-stacked", className), "data-collapsed": dobra && !aberto ? "" : undefined, "data-expanded": dobra && aberto ? "" : undefined, children: [_jsx("div", { className: "demo-panel", "data-panel": "preview", children: preview }), _jsxs("div", { className: "demo-panel demo-code", "data-panel": "code", id: `${id}-code`, children: [codigo, dobra && _jsx("button", { type: "button", className: "btn btn-tertiary btn-sm demo-stacked-toggle", "aria-expanded": aberto, "aria-controls": `${id}-code`, onClick: () => setAberto(!aberto), children: aberto ? s.codeBlockCollapse : s.codeBlockExpand })] })] });
|
|
25
|
+
}
|
|
17
26
|
function CaixaDeExemplo({ preview, codigo, className }) {
|
|
18
27
|
const s = useAureaStrings();
|
|
19
28
|
const id = React.useId();
|
|
@@ -57,9 +66,14 @@ function linhasDoCodigo(codigo, language, highlight) {
|
|
|
57
66
|
const linhas = highlight?.(codigo, language) ?? codigo.split("\n").map(l => l === "" ? [] : [{ text: l }]);
|
|
58
67
|
return codigo.endsWith("\n") && linhas.length > 1 && linhas[linhas.length - 1].length === 0 ? linhas.slice(0, -1) : linhas;
|
|
59
68
|
}
|
|
60
|
-
|
|
69
|
+
// `filename` (o site B, aprovado pela bancada em 01/11/2026, o item 6 — "Ícone + nome"): a CABEÇA do arquivo — o nome do
|
|
70
|
+
// arquivo à esquerda e, com `copyable`, o "Copy" ESCRITO (o botão secundário, com o ícone antes do nome; vira "Copied").
|
|
71
|
+
// O bloco vira o cartão (canto 22, a cor do cartão) e a linha longa DESCE em vez de rolar. Sem `filename`, o de sempre.
|
|
72
|
+
export function CodeBlock({ children, language = "text", copyable, preview, previewLayout = "tabs", lineNumbers, highlight, tabs, filename, className }) {
|
|
61
73
|
if (tabs && tabs.length > 0)
|
|
62
74
|
return _jsx(CodigoEmAbas, { tabs: tabs, language: language, copyable: copyable, highlight: highlight, className: className });
|
|
75
|
+
if (preview !== undefined && previewLayout === "stacked")
|
|
76
|
+
return _jsx(CaixaEmpilhada, { preview: preview, className: className, linhas: (children ?? "").split("\n").length, codigo: _jsx(CodeBlock, { language: language, copyable: copyable, lineNumbers: lineNumbers, highlight: highlight, children: children }) });
|
|
63
77
|
if (preview !== undefined)
|
|
64
78
|
return _jsx(CaixaDeExemplo, { preview: preview, className: className, codigo: _jsx(CodeBlock, { language: language, copyable: copyable, lineNumbers: lineNumbers, highlight: highlight, children: children }) });
|
|
65
79
|
const s = useAureaStrings();
|
|
@@ -74,11 +88,13 @@ export function CodeBlock({ children, language = "text", copyable, preview, line
|
|
|
74
88
|
const colorido = linhas != null && highlight != null && linhas.some(l => l.some(p => p.className));
|
|
75
89
|
// Os algarismos da última linha: a coluna do número tem a largura deles (99 → 2, 100 → 3).
|
|
76
90
|
const digitos = lineNumbers && linhas ? { "--code-line-digits": String(linhas.length).length } : undefined;
|
|
77
|
-
const pre = _jsx("pre", { className: cx("code-block", lineNumbers && "code-block-numbered", colorido && "code-block-highlighted", !copyable && className), style: digitos, "data-language": language, tabIndex: 0, children: _jsx("code", { children: linhas
|
|
91
|
+
const pre = _jsx("pre", { className: cx("code-block", lineNumbers && "code-block-numbered", colorido && "code-block-highlighted", !copyable && filename == null && className), style: digitos, "data-language": language, tabIndex: 0, children: _jsx("code", { children: linhas
|
|
78
92
|
? _jsxs(_Fragment, { children: [linhas.map((l, i) => _jsxs(React.Fragment, { children: [_jsx("span", { className: "code-line", children: l.map((p, j) => p.className ? _jsx("span", { className: p.className, children: p.text }, j) : p.text) }), i < linhas.length - 1 ? "\n" : null] }, i)), children.endsWith("\n") ? "\n" : null] })
|
|
79
93
|
: children }) });
|
|
80
|
-
if (!copyable)
|
|
94
|
+
if (!copyable && filename == null)
|
|
81
95
|
return pre;
|
|
96
|
+
if (!copyable)
|
|
97
|
+
return _jsxs("div", { className: cx("code-block-wrap", "code-block-file", className), children: [_jsx("div", { className: "code-block-head", children: _jsx("span", { className: "code-block-title", children: filename }) }), pre] });
|
|
82
98
|
// 0.28.0: o "copiado" é dito ao leitor de tela. Com o `aurea.js` na página, é ele quem diz (pelo
|
|
83
99
|
// texto do `data-aurea-copy-done`, na língua do app); sem ele, a região de status daqui.
|
|
84
100
|
const [copiado, setCopiado] = React.useState(false);
|
|
@@ -95,5 +111,7 @@ export function CodeBlock({ children, language = "text", copyable, preview, line
|
|
|
95
111
|
return;
|
|
96
112
|
void copia.then(() => { setCopiado(true); setTimeout(() => setCopiado(false), 1500); }, () => { });
|
|
97
113
|
};
|
|
114
|
+
if (filename != null)
|
|
115
|
+
return _jsxs("div", { className: cx("code-block-wrap", "code-block-file", className), "data-aurea-copy-scope": true, children: [_jsx("span", { className: "sr-only", role: "status", "aria-live": "polite", children: copiado ? s.copied : "" }), _jsxs("div", { className: "code-block-head", children: [_jsx("span", { className: "code-block-title", children: filename }), _jsxs("button", { type: "button", className: cx("btn btn-secondary copy-code-text", copiado && "is-done"), "data-aurea-copy": true, "data-aurea-copy-done": s.copied, onClick: onCopy, children: [_jsx(Icon, { name: "copy", size: "sm", className: "c-copy" }), _jsx(Icon, { name: "check", size: "sm", className: "c-done" }), _jsx("span", { className: "c-copy", children: s.copy }), _jsx("span", { className: "c-done", children: s.copied })] })] }), pre] });
|
|
98
116
|
return _jsxs("div", { className: cx("code-block-wrap", className), "data-aurea-copy-scope": true, children: [_jsx("span", { className: "sr-only", role: "status", "aria-live": "polite", children: copiado ? s.copied : "" }), _jsxs("button", { type: "button", className: cx("btn btn-icon btn-ghost copy-code", copiado && "is-done"), "data-aurea-copy": true, "data-aurea-copy-done": s.copied, "aria-label": s.copyCode, onClick: onCopy, children: [_jsx(Icon, { name: "copy", size: "sm", className: "c-copy" }), _jsx(Icon, { name: "check", size: "sm", className: "c-done" })] }), pre] });
|
|
99
117
|
}
|
package/dist/code-highlight.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
// (o check 19 do `validate.py` cobra que só este arquivo e o do editor importam o `@lezer/`).
|
|
15
15
|
import { highlightCode as colorirArvore, tagHighlighter, tags as t } from "@lezer/highlight";
|
|
16
16
|
import { parser as js } from "@lezer/javascript";
|
|
17
|
+
import { proprio } from "./pure.js";
|
|
17
18
|
import { parser as css } from "@lezer/css";
|
|
18
19
|
import { parser as html } from "@lezer/html";
|
|
19
20
|
import { parser as json } from "@lezer/json";
|
|
@@ -38,12 +39,14 @@ const ANALISADORES = {
|
|
|
38
39
|
css, html, json,
|
|
39
40
|
};
|
|
40
41
|
let bash;
|
|
42
|
+
// A língua vem de fora (a cerca de um texto em markdown): só vale a que é chave DA tabela — "constructor" devolvia a
|
|
43
|
+
// função do `Object.prototype` e derrubava a tela (31/10/2026, a auditoria de segurança).
|
|
41
44
|
// O bash vem do modo antigo do CodeMirror (o Lezer não tem gramática de shell); ele só é montado quando pedido.
|
|
42
45
|
function analisador(lingua) {
|
|
43
46
|
const l = lingua.toLowerCase();
|
|
44
47
|
if (l === "bash" || l === "sh" || l === "shell")
|
|
45
48
|
return bash ??= StreamLanguage.define(shell).parser;
|
|
46
|
-
return ANALISADORES
|
|
49
|
+
return proprio(ANALISADORES, l);
|
|
47
50
|
}
|
|
48
51
|
/** As línguas que `highlightCode` colore. Com outra, ele devolve `null` e o `CodeBlock` mostra o texto puro. */
|
|
49
52
|
export const highlightLanguages = ["bash", "css", "html", "javascript", "js", "json", "jsx", "sh", "shell", "ts", "tsx", "typescript"];
|
|
@@ -8,10 +8,17 @@ export interface TableProps extends HTMLAttributes<HTMLTableElement>, RefAttribu
|
|
|
8
8
|
stickyFirstColumn?: boolean;
|
|
9
9
|
/** GAR-12: a tabela cabe na largura da caixa, sem o mínimo de 720 — a comparação de dois itens no celular. */
|
|
10
10
|
fit?: boolean;
|
|
11
|
+
/** `rows` (o site B, 0.54.0 — a lista de membros da página inicial, aprovada pela bancada em 01/11/2026, o D-7.6): sem a
|
|
12
|
+
* caixa, cada linha é uma CÁPSULA de 54, 4 entre elas; com o mouse, o `--fill-1`; a linha com `data-selected`, o amarelo
|
|
13
|
+
* a 14%. O cabeçalho em mono maiúsculo, apagado. Cabe na largura (sem o mínimo de 720). */
|
|
14
|
+
variant?: "default" | "rows";
|
|
11
15
|
/** GAR-12: esconde as linhas marcadas como iguais (`<tr data-same>`) — o "Só diferenças". */
|
|
12
16
|
differencesOnly?: boolean;
|
|
17
|
+
/** As linhas ímpares do corpo com fundo (o site B, 02/11/2026, a "B" na imagem): a 1ª, a 3ª… — o olho segue a linha
|
|
18
|
+
* numa tabela larga. Nos dois arranjos (`default` e `rows`). */
|
|
19
|
+
striped?: boolean;
|
|
13
20
|
}
|
|
14
|
-
export declare function Table({ caption, stickyHeader, stickyFirstColumn, fit, differencesOnly, children, className, ...props }: TableProps): React.JSX.Element;
|
|
21
|
+
export declare function Table({ caption, stickyHeader, stickyFirstColumn, fit, differencesOnly, striped, variant, children, className, ...props }: TableProps): React.JSX.Element;
|
|
15
22
|
export interface SortableItem {
|
|
16
23
|
id: string;
|
|
17
24
|
label: ReactNode;
|
|
@@ -6,7 +6,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { cx, useAureaStrings, useReorder } from "./internal.js";
|
|
8
8
|
import { Icon } from "./system.js";
|
|
9
|
-
export function Table({ caption, stickyHeader, stickyFirstColumn, fit, differencesOnly, children, className, ...props }) { const s = useAureaStrings(); return _jsx("div", { className: cx("table-region", stickyHeader && "table-sticky-header", stickyFirstColumn && "table-sticky-first"), role: "region", "aria-label": typeof caption === "string" ? caption : s.tableLabel, tabIndex: 0, children: _jsxs("table", { className: cx("table", fit && "table-fit", differencesOnly && "table-differences-only", className), ...props, children: [caption && _jsx("caption", { children: caption }), children] }) }); }
|
|
9
|
+
export function Table({ caption, stickyHeader, stickyFirstColumn, fit, differencesOnly, striped, variant = "default", children, className, ...props }) { const s = useAureaStrings(); return _jsx("div", { className: cx("table-region", stickyHeader && "table-sticky-header", stickyFirstColumn && "table-sticky-first", variant === "rows" && "table-region-rows"), role: "region", "aria-label": typeof caption === "string" ? caption : s.tableLabel, tabIndex: 0, children: _jsxs("table", { className: cx("table", fit && "table-fit", differencesOnly && "table-differences-only", variant === "rows" && "table-rows", striped && "table-striped", className), ...props, children: [caption && _jsx("caption", { children: caption }), children] }) }); }
|
|
10
10
|
// O protocolo de teclado e de ponteiro saiu daqui para o `useReorder` do `internal` no item N1,
|
|
11
11
|
// quando o `BlockEditor` virou o segundo dono dele. A DOM abaixo não mudou uma vírgula na
|
|
12
12
|
// extração — é o que o gate de pixel e o `skin.spec` continuam medindo.
|
package/dist/data-grid.js
CHANGED
|
@@ -8,6 +8,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
import React from "react";
|
|
9
9
|
import { useReactTable, getCoreRowModel, getSortedRowModel, getFilteredRowModel, getPaginationRowModel, getFacetedRowModel, getFacetedUniqueValues, flexRender } from "@tanstack/react-table";
|
|
10
10
|
import { cx, useAureaStrings, stateSeverity } from "./internal.js";
|
|
11
|
+
import { proprio } from "./pure.js";
|
|
11
12
|
import { Icon } from "./system.js";
|
|
12
13
|
import { Button, Toolbar, ToolbarButton, ToolbarSeparator } from "./actions.js";
|
|
13
14
|
import { Input, SearchField, MultiCombobox } from "./inputs.js";
|
|
@@ -152,9 +153,29 @@ export function DataGrid({ data, columns, label, filterable, pageSize, selectabl
|
|
|
152
153
|
// A função acima precisa da tabela, e a tabela é o que esta chamada devolve: a referência fecha o
|
|
153
154
|
// círculo. Ela é lida só quando o motor filtra, que é sempre depois da primeira montagem.
|
|
154
155
|
const tabelaRef = React.useRef(null);
|
|
156
|
+
// Um nome de coluna que vem de fora (o link, `?sort=constructor`) e é nome do `Object.prototype` derrubava o motor, que
|
|
157
|
+
// procura a coluna num objeto comum (31/10/2026, a auditoria de segurança). Do estado que o motor recebe sai só o que
|
|
158
|
+
// é um desses nomes E não é coluna declarada; o nome que não existe continua com o aviso do próprio motor.
|
|
159
|
+
const idsDeclarados = React.useMemo(() => {
|
|
160
|
+
const ids = new Set();
|
|
161
|
+
const ver = (cs) => {
|
|
162
|
+
for (const c of cs) {
|
|
163
|
+
const d = c;
|
|
164
|
+
const id = d.id ?? d.accessorKey ?? (typeof d.header === "string" ? d.header : undefined);
|
|
165
|
+
if (id)
|
|
166
|
+
ids.add(id);
|
|
167
|
+
if (d.columns)
|
|
168
|
+
ver(d.columns);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
ver(colunas);
|
|
172
|
+
return ids;
|
|
173
|
+
}, [colunas]);
|
|
174
|
+
const sortingDoMotor = React.useMemo(() => sorting.filter(o => idsDeclarados.has(o.id) || !(o.id in Object.prototype)), [sorting, idsDeclarados]);
|
|
175
|
+
const filtrosDoMotor = React.useMemo(() => columnFilters.filter(f => idsDeclarados.has(f.id) || !(f.id in Object.prototype)), [columnFilters, idsDeclarados]);
|
|
155
176
|
const table = useReactTable({
|
|
156
177
|
data, columns: colunas, getRowId,
|
|
157
|
-
state: { sorting, globalFilter, rowSelection, columnFilters, columnVisibility, columnSizing, ...(paginated ? { pagination } : {}) },
|
|
178
|
+
state: { sorting: sortingDoMotor, globalFilter, rowSelection, columnFilters: filtrosDoMotor, columnVisibility, columnSizing, ...(paginated ? { pagination } : {}) },
|
|
158
179
|
onSortingChange: setSorting,
|
|
159
180
|
onGlobalFilterChange: setGlobalFilter,
|
|
160
181
|
onColumnFiltersChange: setColumnFilters,
|
|
@@ -375,7 +396,7 @@ export function DataGrid({ data, columns, label, filterable, pageSize, selectabl
|
|
|
375
396
|
// ganha de mais geral; o universal entra para os quatro estados que a grade não tinha.
|
|
376
397
|
const carregando = state === "loading";
|
|
377
398
|
const universal = state && state !== "loading" && state !== "error" ? state : null;
|
|
378
|
-
const recado = state && !carregando ? (stateMessage ?? (state === "stale" ? s.dataGridStale : state === "partial" ? s.dataGridPartial : state === "error" ? s.dataGridError : s.universalState
|
|
399
|
+
const recado = state && !carregando ? (stateMessage ?? (state === "stale" ? s.dataGridStale : state === "partial" ? s.dataGridPartial : state === "error" ? s.dataGridError : proprio(s.universalState, state))) : null;
|
|
379
400
|
// O marcador vai na GRADE, não no recado: quem está obsoleto é a tabela, e o `Alert` é só
|
|
380
401
|
// como ela conta isso. Achado pelo check 30 na primeira execução dele — eu tinha marcado o
|
|
381
402
|
// recado, e com `state="loading"` não há recado nenhum, então o estado não chegava ao DOM.
|
package/dist/disclosure.d.ts
CHANGED
|
@@ -7,9 +7,15 @@ export interface AccordionItem {
|
|
|
7
7
|
/** O item que não abre: anunciado como desligado e fora do Tab. */
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
}
|
|
10
|
-
export declare function Accordion({ items, variant, multiple, defaultValue, className }: {
|
|
10
|
+
export declare function Accordion({ items, variant, multiple, defaultValue, indicator, size, orientation, className }: {
|
|
11
11
|
items: AccordionItem[];
|
|
12
12
|
variant?: AccordionVariant;
|
|
13
|
+
/** `horizontal`: o acordeão de lado — os itens em pé, o aberto toma o resto da linha. */
|
|
14
|
+
orientation?: "vertical" | "horizontal";
|
|
15
|
+
/** O desenho de abrir: `"chevron"` (o padrão, a setinha) ou `"plus"` (o "+" numa bolinha, que vira "×" quando abre). */
|
|
16
|
+
indicator?: "chevron" | "plus";
|
|
17
|
+
/** A altura da linha: `"md"` (o padrão) ou `"lg"` (60, com a letra do texto). */
|
|
18
|
+
size?: "md" | "lg";
|
|
13
19
|
/** Deixa vários itens abertos ao mesmo tempo. Sem isto, abrir um fecha o outro. */
|
|
14
20
|
multiple?: boolean;
|
|
15
21
|
/** Os itens que começam abertos (o `id` de cada um). */
|
package/dist/disclosure.js
CHANGED
|
@@ -8,9 +8,19 @@ import { Collapsible as BaseCollapsible } from "@base-ui/react/collapsible";
|
|
|
8
8
|
import { cx } from "./internal.js";
|
|
9
9
|
import { soOValor } from "./pure.js";
|
|
10
10
|
import { Icon } from "./system.js";
|
|
11
|
-
|
|
11
|
+
// O SITE B (30/10/2026, protótipo): `indicator="plus"` troca a setinha pelo "+" numa bolinha, que gira e vira o "×"
|
|
12
|
+
// amarelo quando abre; `size="lg"` é a linha de 60 com a letra do texto (16), a das perguntas do desenho aprovado.
|
|
13
|
+
// `orientation="horizontal"` (o site B — a página inicial, aprovada pela bancada em 01/11/2026, o D-7.1): o acordeão DE LADO.
|
|
14
|
+
// Cada item é um cartão (canto 22) em pé, fechado com 104 de largura; o aberto toma o resto da linha. Um aberto de cada vez,
|
|
15
|
+
// e o aberto não fecha pelo clique (sempre há um à vista). Num contêiner estreito (até 47.5rem) vira o de pé. A altura é
|
|
16
|
+
// a do pai. Sem `horizontal`, o acordeão de sempre.
|
|
17
|
+
export function Accordion({ items, variant = "default", multiple = false, defaultValue, indicator = "chevron", size = "md", orientation = "vertical", className }) {
|
|
12
18
|
const grupo = React.useId();
|
|
13
|
-
|
|
19
|
+
const deLado = orientation === "horizontal";
|
|
20
|
+
const lista = _jsx("div", { className: cx("accordion", variant === "surface" && "accordion-surface", indicator === "plus" && "accordion-plus", size === "lg" && "accordion-lg", deLado && "accordion-horizontal", !deLado && className), children: items.map(i => _jsxs("details", { className: "accordion-item", name: multiple && !deLado ? undefined : grupo, open: defaultValue?.includes(i.id) || undefined, children: [_jsxs("summary", { "aria-disabled": i.disabled || undefined, tabIndex: i.disabled ? -1 : undefined, onClick: i.disabled ? (e) => e.preventDefault()
|
|
21
|
+
: deLado ? (e) => { if (e.currentTarget.parentElement.open)
|
|
22
|
+
e.preventDefault(); } : undefined, children: [_jsx("span", { className: "accordion-title", children: i.title }), _jsx("span", { className: "accordion-chevron", "aria-hidden": "true" })] }), _jsx("div", { className: "accordion-content", children: i.content })] }, i.id)) });
|
|
23
|
+
return deLado ? _jsx("div", { className: cx("accordion-horizontal-frame", className), children: lista }) : lista;
|
|
14
24
|
}
|
|
15
25
|
// COLLAPSIBLE — uma seção que abre e fecha, com o estado do lado de quem usa.
|
|
16
26
|
//
|
|
@@ -9,12 +9,14 @@ export declare function Status({ variant, state, children, className, ...props }
|
|
|
9
9
|
state?: UniversalState;
|
|
10
10
|
}): React.JSX.Element;
|
|
11
11
|
export type AlertVariant = "info" | "success" | "warning" | "danger" | "accent";
|
|
12
|
-
export declare function Alert({ variant, state, title, icon, onDismiss, action, children, className, ...props }: HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement> & {
|
|
12
|
+
export declare function Alert({ variant, state, title, icon, onDismiss, action, appearance, children, className, ...props }: HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement> & {
|
|
13
13
|
variant?: AlertVariant;
|
|
14
14
|
state?: UniversalState;
|
|
15
15
|
title?: ReactNode;
|
|
16
16
|
icon?: IconName;
|
|
17
17
|
onDismiss?: () => void;
|
|
18
|
+
/** A pele: `card` (o cartão, o padrão) ou `soft` (o fundo da cor do estado, sem sombra, o texto maior). */
|
|
19
|
+
appearance?: "card" | "soft";
|
|
18
20
|
/** O botão do aviso ("Atualizar", "Desfazer"): depois do texto, antes do X. No celular, embaixo do texto. */
|
|
19
21
|
action?: ReactNode;
|
|
20
22
|
}): React.JSX.Element;
|
|
@@ -69,13 +71,14 @@ export type DataStateProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> &
|
|
|
69
71
|
onCatch?: (error: unknown, info: React.ErrorInfo) => void;
|
|
70
72
|
};
|
|
71
73
|
export declare function DataState({ catchErrors, onCatch, ...props }: DataStateProps): React.JSX.Element;
|
|
72
|
-
export declare function EmptyState({ icon, title, titleAs: TitleTag, description, action, state }: {
|
|
74
|
+
export declare function EmptyState({ icon, title, titleAs: TitleTag, description, action, state, framed }: {
|
|
73
75
|
icon?: IconName;
|
|
74
76
|
title: ReactNode;
|
|
75
77
|
titleAs?: "h2" | "h3" | "h4" | "p";
|
|
76
78
|
description?: ReactNode;
|
|
77
79
|
action?: ReactNode;
|
|
78
80
|
state?: UniversalState;
|
|
81
|
+
framed?: boolean;
|
|
79
82
|
}): React.JSX.Element;
|
|
80
83
|
export interface NotificationItem {
|
|
81
84
|
id: string;
|
package/dist/feedback-client.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
// Fase 9 (achado A5): este arquivo saiu do index.tsx de 970 linhas. Um módulo por categoria
|
|
4
4
|
// do registry — a taxonomia já existia e é gateada. A ordem de import entre eles é um DAG:
|
|
5
|
-
import { peleDoEixo } from "./pure.js";
|
|
5
|
+
import { peleDoEixo, proprio } from "./pure.js";
|
|
6
6
|
// internal → system → actions → feedback → inputs → navigation → layout → data-display → resto.
|
|
7
7
|
import React from "react";
|
|
8
8
|
import { Popover as BasePopover } from "@base-ui/react/popover";
|
|
@@ -30,7 +30,7 @@ import { Skeleton, Badge, Switch } from "./markup.js";
|
|
|
30
30
|
// seis caem na gravidade. Quem passa os dois manda, porque só o consumidor sabe se aquele
|
|
31
31
|
// "esperando" dele é grave. E o rótulo é o do consumidor, como sempre foi: a string universal
|
|
32
32
|
// entra só quando não há filho, para o componente não passar a inventar texto.
|
|
33
|
-
export function Status({ variant, state, children, className, ...props }) { const s = useAureaStrings(); const v = variant ?? (state ? (state === "offline" ? "offline" : stateSeverity(state)) : "neutral"); return _jsxs("span", { className: cx("status", v !== "neutral" && `status-${v}`, className), "data-state": state, ...props, children: [_jsx("i", { className: "status-dot", "aria-hidden": "true" }), _jsx("span", { className: "status-label", children: children ?? (state ? s.universalState
|
|
33
|
+
export function Status({ variant, state, children, className, ...props }) { const s = useAureaStrings(); const v = variant ?? (state ? (state === "offline" ? "offline" : stateSeverity(state)) : "neutral"); return _jsxs("span", { className: cx("status", v !== "neutral" && `status-${v}`, className), "data-state": state, ...props, children: [_jsx("i", { className: "status-dot", "aria-hidden": "true" }), _jsx("span", { className: "status-label", children: children ?? (state ? proprio(s.universalState, state) : null) })] }); }
|
|
34
34
|
// O ícone é FUNÇÃO da variante, como o `role` já era. A referência congelada desenha o alerta
|
|
35
35
|
// com ele em toda variante, e um sistema que faz o consumidor lembrar qual glifo significa
|
|
36
36
|
// "perigo" acaba com quatro respostas diferentes para a mesma pergunta. `icon` sobrepõe quando o
|
|
@@ -55,14 +55,16 @@ const ICONE_DA_VARIANTE = { info: "info",
|
|
|
55
55
|
// "esperando" dele é grave.
|
|
56
56
|
// `action` (15/10/2026, o "Upgrade" da referência): o botão do aviso, depois do texto e antes do X; no celular ele desce
|
|
57
57
|
// para baixo do texto, na mesma coluna (a referência repete o botão; aqui ele só muda de lugar).
|
|
58
|
-
|
|
58
|
+
// `appearance="soft"` (o site B, 02/11/2026, a "B" na imagem): o fundo da cor do estado a 14%, sem sombra, e o texto a 16
|
|
59
|
+
// na cor do texto. Sem ele (`"card"`), o cartão de sempre.
|
|
60
|
+
export function Alert({ variant, state, title, icon, onDismiss, action, appearance, children, className, ...props }) { const s = useAureaStrings(); const v = variant ?? (state ? stateSeverity(state) : "info"); return _jsxs("div", { className: cx("alert", `alert-${v}`, appearance === "soft" && "alert-soft", action != null && "alert-has-action", className), role: v === "danger" ? "alert" : "status", "data-state": state, ...props, children: [_jsx(Icon, { name: icon ?? proprio(ICONE_DA_VARIANTE, v) ?? "info", weight: icon ? undefined : "fill" }), _jsxs("div", { children: [title && _jsx("strong", { children: title }), children ?? (state ? proprio(s.universalState, state) : null)] }), action != null && _jsx("div", { className: "alert-action", children: action }), onDismiss ? _jsx(CloseButton, { onClick: onDismiss }) : _jsx("span", {})] }); }
|
|
59
61
|
export function Banner(props) {
|
|
60
62
|
if (props.variant === "consent")
|
|
61
63
|
return _jsx(BannerConsent, { ...props });
|
|
62
64
|
const { variant, state, title, icon, onDismiss, children, className, categories: _c, value: _v, onConsent: _o, ...rest } = props;
|
|
63
65
|
const s = useAureaStrings();
|
|
64
66
|
const v = variant ?? (state ? stateSeverity(state) : "info");
|
|
65
|
-
return _jsxs("div", { className: cx("banner", `banner-${v}`, className), role: v === "danger" ? "alert" : "status", "data-state": state, ...rest, children: [icon ? _jsx(Icon, { name: icon }) : _jsx("span", {}), _jsxs("div", { children: [title && _jsx("strong", { children: title }), children ?? (state ? s.universalState
|
|
67
|
+
return _jsxs("div", { className: cx("banner", `banner-${v}`, className), role: v === "danger" ? "alert" : "status", "data-state": state, ...rest, children: [icon ? _jsx(Icon, { name: icon }) : _jsx("span", {}), _jsxs("div", { children: [title && _jsx("strong", { children: title }), children ?? (state ? proprio(s.universalState, state) : null)] }), onDismiss ? _jsx(IconButton, { variant: "ghost", size: "sm", icon: "x", label: s.close, onClick: onDismiss }) : _jsx("span", {})] });
|
|
66
68
|
}
|
|
67
69
|
// GAR-19 (lote U, 19/10/2026): o aviso de cookies é uma VARIAÇÃO do Banner (decisão do Victor). Nenhuma referência da fila
|
|
68
70
|
// tem a peça aberta; as regras vêm de duas fontes primárias, lidas em 19/10/2026:
|
|
@@ -144,7 +146,9 @@ function CorpoDoDataState({ state, message, skeleton, emptyTitle, emptyIcon, act
|
|
|
144
146
|
return caixa(_jsxs(_Fragment, { children: [_jsx(Alert, { variant: stateSeverity(state), state: state, children: message }), conteudo()] }));
|
|
145
147
|
return caixa(conteudo());
|
|
146
148
|
}
|
|
147
|
-
|
|
149
|
+
// `framed` (o site B, aprovado pela bancada em 01/11/2026): o ícone dentro da moldura redonda, a mesma do nativo (R-15).
|
|
150
|
+
// Variação: sem ele, o ícone continua solto, como sempre.
|
|
151
|
+
export function EmptyState({ icon = "file", title, titleAs: TitleTag = "h3", description, action, state, framed }) { const s = useAureaStrings(); const desc = description ?? (state ? proprio(s.universalState, state) : null); const glifo = _jsx(Icon, { name: icon, size: "xl" }); return _jsxs("div", { className: "empty-state", "data-state": state, children: [framed ? _jsx("span", { className: "empty-state-frame", children: glifo }) : glifo, _jsx(TitleTag, { className: "empty-title", children: title }), desc && _jsx("p", { className: "muted", children: desc }), action] }); }
|
|
148
152
|
function groupNotifications(items) {
|
|
149
153
|
const out = [];
|
|
150
154
|
for (const it of items) {
|
package/dist/graph.js
CHANGED
|
@@ -41,6 +41,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
41
41
|
import React from "react";
|
|
42
42
|
import { ReactFlow, ReactFlowProvider, Background, BaseEdge, EdgeLabelRenderer, EdgeText, Handle, MiniMap, Panel, Position, SelectionMode, ViewportPortal, applyNodeChanges, getBezierPath, getSmoothStepPath, useNodesInitialized, useOnViewportChange, useReactFlow, useStore } from "@xyflow/react";
|
|
43
43
|
import { cx, useAureaStrings } from "./internal.js";
|
|
44
|
+
import { proprio } from "./pure.js";
|
|
44
45
|
import { Icon } from "./system.js";
|
|
45
46
|
import { Badge } from "./markup.js";
|
|
46
47
|
import { Button, IconButton, Toolbar, ToolbarButton, ToolbarSeparator } from "./actions.js";
|
|
@@ -537,7 +538,7 @@ function paraDrawio(nos, linhas, forma, titulo) {
|
|
|
537
538
|
if (!ids.has(e.from) || !ids.has(e.to))
|
|
538
539
|
return;
|
|
539
540
|
const id = `e-${i}`;
|
|
540
|
-
const estilo = `endArrow=none;html=0;${forma === "step" ? "edgeStyle=orthogonalEdgeStyle;rounded=1;" : "curved=1;"}${TRACO_DRAWIO
|
|
541
|
+
const estilo = `endArrow=none;html=0;${forma === "step" ? "edgeStyle=orthogonalEdgeStyle;rounded=1;" : "curved=1;"}${proprio(TRACO_DRAWIO, e.pattern ?? "solid") ?? ""}strokeWidth=${proprio(PESO_DRAWIO, e.weight ?? "regular") ?? 1};`;
|
|
541
542
|
const dobras = rota && rota.length > 2 ? `<Array as="points">${rota.slice(1, -1).map(p => `<mxPoint x="${Math.round(p.x)}" y="${Math.round(p.y)}"/>`).join("")}</Array>` : "";
|
|
542
543
|
celulas.push(`<mxCell id="${id}" value="${XML(e.label ?? "")}" style="${estilo}" edge="1" parent="1" source="${XML(`n-${e.from}`)}" target="${XML(`n-${e.to}`)}"><mxGeometry relative="1" as="geometry">${dobras}</mxGeometry></mxCell>`);
|
|
543
544
|
// O nome da porta na ponta: o rótulo-filho da linha, a 80% do caminho para cada lado (o idioma do draw.io).
|
package/dist/inputs-client.d.ts
CHANGED
|
@@ -94,8 +94,13 @@ export interface RadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, "d
|
|
|
94
94
|
orientation?: "vertical" | "horizontal";
|
|
95
95
|
/** O asterisco no rótulo, como o `Field`. */
|
|
96
96
|
required?: boolean;
|
|
97
|
+
/** `card` faz de cada opção um cartão inteiro — o cartão de escolha, o mesmo nome do nativo (CHK-01). O escolhido sobe com
|
|
98
|
+
* sombra. O site B (aprovado pela bancada em 01/11/2026). */
|
|
99
|
+
variant?: "list" | "card";
|
|
100
|
+
/** Na web a marca fica no início. `none` tira a bolinha — só no `card`, em que o cartão inteiro já mostra a escolha. */
|
|
101
|
+
indicatorPlacement?: "start" | "none";
|
|
97
102
|
}
|
|
98
|
-
export declare function RadioGroup({ label, labelHidden, description, error, value, defaultValue, onValueChange, name, disabled, invalid, orientation, required, children, className, ...props }: RadioGroupProps): React.JSX.Element;
|
|
103
|
+
export declare function RadioGroup({ label, labelHidden, description, error, value, defaultValue, onValueChange, name, disabled, invalid, orientation, required, variant, indicatorPlacement, children, className, ...props }: RadioGroupProps): React.JSX.Element;
|
|
99
104
|
export declare namespace RadioGroup {
|
|
100
105
|
export { Radio as Item };
|
|
101
106
|
}
|
|
@@ -310,19 +315,22 @@ export declare function OTPField({ length, value, defaultValue, onValueChange, m
|
|
|
310
315
|
/** `secondary`: o fundo neutro do `Input` secundário, para o campo dentro de um cartão. */
|
|
311
316
|
variant?: "primary" | "secondary";
|
|
312
317
|
}): React.JSX.Element;
|
|
313
|
-
export type SegmentedControlSelectedStyle = "current" | "neutral" | "contrast" | "brand" | "ring" | "dot";
|
|
314
|
-
export declare function SegmentedControl({ items, value, onChange, label, fullWidth, size, selectedStyle }: {
|
|
318
|
+
export type SegmentedControlSelectedStyle = "current" | "neutral" | "contrast" | "brand" | "ring" | "dot" | "emphasis";
|
|
319
|
+
export declare function SegmentedControl({ items, value, onChange, label, fullWidth, size, selectedStyle, wrap, orientation }: {
|
|
315
320
|
items: Array<{
|
|
316
321
|
value: string;
|
|
317
322
|
label: ReactNode;
|
|
318
323
|
href?: string;
|
|
324
|
+
icon?: IconName;
|
|
319
325
|
}>;
|
|
320
326
|
value: string;
|
|
321
327
|
onChange?: (v: string) => void;
|
|
322
328
|
label?: string;
|
|
323
329
|
fullWidth?: boolean;
|
|
324
|
-
size?: "sm" | "md";
|
|
330
|
+
size?: "sm" | "md" | "lg" | "xl" | "2xl";
|
|
325
331
|
selectedStyle?: SegmentedControlSelectedStyle;
|
|
332
|
+
wrap?: boolean;
|
|
333
|
+
orientation?: "horizontal" | "vertical";
|
|
326
334
|
}): React.JSX.Element;
|
|
327
335
|
export interface ComboboxOption {
|
|
328
336
|
value: string;
|