@aurea-uds/react 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +34 -2
  2. package/dist/actions.d.ts +20 -0
  3. package/dist/actions.js +59 -5
  4. package/dist/agents.d.ts +209 -0
  5. package/dist/agents.js +302 -0
  6. package/dist/calendar.d.ts +6 -0
  7. package/dist/calendar.js +27 -0
  8. package/dist/chart.d.ts +10 -0
  9. package/dist/chart.js +53 -0
  10. package/dist/code-client.d.ts +6 -0
  11. package/dist/code-client.js +24 -0
  12. package/dist/code-editor.js +1 -0
  13. package/dist/code.d.ts +2 -13
  14. package/dist/code.js +5 -18
  15. package/dist/communication.js +1 -0
  16. package/dist/data-display-client.d.ts +14 -0
  17. package/dist/data-display-client.js +22 -0
  18. package/dist/data-display.d.ts +2 -23
  19. package/dist/data-display.js +5 -13
  20. package/dist/data-grid.d.ts +52 -3
  21. package/dist/data-grid.js +205 -25
  22. package/dist/feedback-client.d.ts +64 -0
  23. package/dist/feedback-client.js +110 -0
  24. package/dist/feedback.d.ts +2 -53
  25. package/dist/feedback.js +5 -71
  26. package/dist/file-input.d.ts +21 -2
  27. package/dist/file-input.js +202 -21
  28. package/dist/graph.d.ts +33 -0
  29. package/dist/graph.js +178 -0
  30. package/dist/identity-client.d.ts +9 -0
  31. package/dist/identity-client.js +12 -0
  32. package/dist/identity.d.ts +2 -8
  33. package/dist/identity.js +5 -3
  34. package/dist/index.d.ts +4 -1
  35. package/dist/index.js +33 -3
  36. package/dist/inputs-client.d.ts +105 -0
  37. package/dist/inputs-client.js +264 -0
  38. package/dist/inputs.d.ts +2 -65
  39. package/dist/inputs.js +9 -61
  40. package/dist/internal.d.ts +23 -70
  41. package/dist/internal.js +115 -23
  42. package/dist/layout-client.d.ts +9 -0
  43. package/dist/layout-client.js +72 -0
  44. package/dist/layout.d.ts +2 -14
  45. package/dist/layout.js +5 -22
  46. package/dist/markup.d.ts +72 -0
  47. package/dist/markup.js +87 -0
  48. package/dist/media-client.d.ts +36 -0
  49. package/dist/media-client.js +239 -0
  50. package/dist/media.d.ts +2 -9
  51. package/dist/media.js +5 -98
  52. package/dist/navigation-client.d.ts +94 -0
  53. package/dist/navigation-client.js +154 -0
  54. package/dist/navigation.d.ts +2 -59
  55. package/dist/navigation.js +5 -113
  56. package/dist/overlays.d.ts +28 -0
  57. package/dist/overlays.js +66 -10
  58. package/dist/pure.d.ts +196 -0
  59. package/dist/pure.js +111 -0
  60. package/dist/qrcode.d.ts +2 -1
  61. package/dist/qrcode.js +3 -2
  62. package/dist/system.d.ts +11 -1
  63. package/dist/system.js +59 -4
  64. package/package.json +40 -4
package/dist/graph.js ADDED
@@ -0,0 +1,178 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // DependencyGraph — PLANO-1.0, Parte H, item H14 (09/08/2026).
4
+ //
5
+ // SUBPATH PRÓPRIO (`@aurea-uds/react/graph`), como ./chart, ./data-grid, ./calendar e ./qrcode:
6
+ // é o único componente que precisa do `@xyflow/react`, que entra como peer OPCIONAL. Quem
7
+ // instala a biblioteca pelo Button não paga por ele — e o check 19 reprova se este import
8
+ // aparecer em qualquer outro módulo.
9
+ //
10
+ // A diretiva NÃO vem de um hook nosso: vem do motor, que usa `zustand` e não publica
11
+ // `"use client"` no dist — o mesmo caso do `recharts`, do `@tanstack/react-table` e do
12
+ // `react-day-picker`, medido em 06/08/2026 e cobrado pelo check 26.
13
+ //
14
+ // ── O MOTOR, e por que este ──────────────────────────────────────────────────────────────
15
+ // Autorizado pelo Victor em 09/08/2026, e a autorização foi RECONFIRMADA por medição depois de
16
+ // eu mesmo levantar dúvida. A dúvida era boa e a resposta desfez: o `trace-graph-view/` do
17
+ // langfuse — a referência mais próxima do domínio — desenha `<div>` posicionados por ELK e NÃO
18
+ // usa React Flow, e o React Flow não faz layout nenhum, então adotá-lo não entrega um grafo
19
+ // pronto. O que decidiu foi o ALVO, que o Victor nomeou: uma aplicação tipo n8n. Aí a conta
20
+ // vira outra, e ela é medida:
21
+ // • a `activepieces-main`, que já está em `Referencia/` e é concorrente direta do n8n, usa
22
+ // `@xyflow/react` 12.3.5 — está no `package.json` dela;
23
+ // • o próprio n8n usa **Vue Flow**, o irmão Vue do React Flow, da mesma equipe xyflow.
24
+ // Grafo de LEITURA não precisa de motor. EDITOR precisa, e o padrão de mercado para este
25
+ // editor é o xyflow. Registro completo no `REFERENCES.md`.
26
+ //
27
+ // Segurança e saúde, conferidas em 09/08/2026 antes de instalar: `@xyflow/react` 12.11.2,
28
+ // **MIT**, publicado há ~1 mês, mantido em tempo integral; **zero** avisos no GitHub Advisory
29
+ // Database para `xyflow`. Traz `@xyflow/system`, `classcat` e `zustand@4` — e só para quem
30
+ // instalar o peer.
31
+ //
32
+ // ── A PELE, e a linha que não se cruza ───────────────────────────────────────────────────
33
+ // O motor publica DUAS folhas, e só uma pode entrar:
34
+ // • `dist/style.css` é a IDENTIDADE deles — `--xy-node-border-radius-default: 3px`, `#1a192b`,
35
+ // sombras, nó branco. É exatamente o que o `BUILDING.md` proíbe extrair. **Não entra.**
36
+ // • `dist/base.css` é ESTRUTURA — posição, `z-index`, `transform-origin`, `pointer-events` —
37
+ // e todo valor visível está atrás de `var(--xy-algo, --xy-algo-default)`. Sobrescritível
38
+ // por token, no idioma que o `--qr-size` e o `--datagrid-max-h` já usam.
39
+ // Quem importa a folha é o CONSUMIDOR, uma vez, como já importa o `@aurea-uds/core/css`: um
40
+ // `import "…css"` dentro deste módulo quebraria em Node puro e o build daqui é `tsc` só.
41
+ import React from "react";
42
+ import { ReactFlow, ReactFlowProvider, Background, Handle, Position, applyNodeChanges } from "@xyflow/react";
43
+ import { cx, useAureaStrings } from "./internal.js";
44
+ // ── O layout ─────────────────────────────────────────────────────────────────────────────
45
+ // O motor recebe `x`/`y` PRONTOS: ele não posiciona nada. Sem isto, um grafo sem coordenadas
46
+ // empilha tudo em (0,0) — que foi a medição que quase derrubou a escolha do motor.
47
+ //
48
+ // Camadas por caminho mais longo: a profundidade de um nó é a maior profundidade entre os que
49
+ // apontam para ele, mais um. É o esqueleto do Sugiyama sem a parte cara.
50
+ //
51
+ // ponytail: sem minimização de cruzamento de arestas — grafo denso vai desenhar linhas se
52
+ // cruzando, e isso é aceitável para dependência (dezenas de nós), não para mil. O caminho de
53
+ // subida é o `elkjs`, que é o que o langfuse usa, e ele é DEPENDÊNCIA NOVA: entra com
54
+ // autorização, não de contrabando.
55
+ const LARGURA = 180, ALTURA = 52, VAO_X = 90, VAO_Y = 24;
56
+ function dispor(nodes, edges) {
57
+ const entram = new Map();
58
+ for (const n of nodes)
59
+ entram.set(n.id, []);
60
+ for (const e of edges)
61
+ if (entram.has(e.to) && entram.has(e.from))
62
+ entram.get(e.to).push(e.from);
63
+ const profundidade = new Map();
64
+ // `visitando` corta CICLO. Um grafo de dependências com ciclo é um defeito do dado, não
65
+ // deste componente — mas travar o navegador por causa dele seria defeito nosso.
66
+ const visitando = new Set();
67
+ const calcular = (id) => {
68
+ const pronto = profundidade.get(id);
69
+ if (pronto != null)
70
+ return pronto;
71
+ if (visitando.has(id))
72
+ return 0;
73
+ visitando.add(id);
74
+ const pais = entram.get(id) ?? [];
75
+ const d = pais.length ? Math.max(...pais.map(calcular)) + 1 : 0;
76
+ visitando.delete(id);
77
+ profundidade.set(id, d);
78
+ return d;
79
+ };
80
+ for (const n of nodes)
81
+ calcular(n.id);
82
+ const ocupacao = new Map();
83
+ const posicoes = new Map();
84
+ for (const n of nodes) {
85
+ const d = profundidade.get(n.id) ?? 0;
86
+ const linha = ocupacao.get(d) ?? 0;
87
+ ocupacao.set(d, linha + 1);
88
+ posicoes.set(n.id, { x: d * (LARGURA + VAO_X), y: linha * (ALTURA + VAO_Y) });
89
+ }
90
+ // A EXTENSÃO existe para o SERVIDOR: sem ela o `fitView` não tem viewport para caber, e o
91
+ // grafo renderizado fora do navegador sai ancorado no canto, com metade dos nós do lado de
92
+ // fora da caixa. É a diferença entre a prévia do catálogo existir e não existir.
93
+ //
94
+ // Os campos se chamam `larg`/`alt` e não `width`/`height` por dois motivos: é o vocabulário
95
+ // interno deste arquivo (`posicoes`, `ocupacao`, `profundidade`), e o check 23 lê o fonte
96
+ // INTEIRO — ele existe para impedir prop de dimensão em número, e um par de pixels de layout
97
+ // interno o acionava sem ser prop de ninguém.
98
+ const colunas = Math.max(...[...ocupacao.keys()], 0) + 1;
99
+ const linhas = Math.max(...[...ocupacao.values()], 1);
100
+ return { posicoes, extensao: { larg: colunas * LARGURA + (colunas - 1) * VAO_X, alt: linhas * ALTURA + (linhas - 1) * VAO_Y } };
101
+ }
102
+ // O nó é NOSSO, e é o ponto em que este componente deixa de ser "React Flow com outra cor".
103
+ // O `GraphNode.tsx` do langfuse declara o motivo em uma linha — *"Real-HTML accessibility (the
104
+ // win over the old canvas renderer)"* —: nó desenhado em canvas não existe para o teclado nem
105
+ // para o leitor de tela. Aqui ele é `<button>` de verdade quando dá para selecionar.
106
+ //
107
+ // O que NÃO entrou: as DEZ cores por tipo de nó da referência (`AGENT` roxo, `TOOL` laranja,
108
+ // `GENERATION` magenta…). É a quarta vez que esta parte recusa a mesma coisa. `kind` sai como
109
+ // TEXTO, que é legível também por quem não separa as cores.
110
+ function NoAurea({ data }) {
111
+ const d = data;
112
+ const corpo = _jsxs(_Fragment, { children: [_jsx("span", { className: "graph-node-label", children: d.label }), d.kind && _jsx("span", { className: "graph-node-kind", children: d.kind }), d.detail && _jsx("span", { className: "hint", children: d.detail })] });
113
+ return _jsxs("div", { className: "graph-node", "data-selected": d.selecionado || undefined, children: [_jsx(Handle, { type: "target", position: Position.Left, isConnectable: !!d.conectavel, className: "graph-handle" }), d.aoSelecionar
114
+ ? _jsx("button", { type: "button", className: "graph-node-body", "aria-pressed": !!d.selecionado, onClick: d.aoSelecionar, children: corpo })
115
+ : _jsx("span", { className: "graph-node-body", children: corpo }), _jsx(Handle, { type: "source", position: Position.Right, isConnectable: !!d.conectavel, className: "graph-handle" })] });
116
+ }
117
+ const TIPOS = { aurea: NoAurea };
118
+ // DependencyGraph — quem depende de quem.
119
+ //
120
+ // O vocabulário da API é NOSSO — `{from,to}`, não `{source,target}`. Não é preciosismo: é o que
121
+ // permite trocar o motor sem quebrar quem usa, e é a mesma razão pela qual o `Chart` não expõe
122
+ // os tipos do Recharts. O escopo também é menor que o do motor: nada de minimapa, de painéis,
123
+ // de nó redimensionável nem de seleção por retângulo — isso é superfície de EDITOR, e o editor
124
+ // é a Parte I (`VisualBuilder`, item I8), que compõe este componente em vez de reescrevê-lo.
125
+ export function DependencyGraph({ nodes, edges, label, selectedId, onSelect, connectable, onConnect, onNodeMove, height, className, ...props }) {
126
+ const s = useAureaStrings();
127
+ // O layout só roda para quem não trouxe coordenada. Quem traz manda — é o que deixa a Parte I
128
+ // guardar a posição que a pessoa arrastou sem brigar com a disposição automática.
129
+ const automatico = React.useMemo(() => dispor(nodes, edges), [nodes, edges]);
130
+ const nosDoMotor = React.useMemo(() => nodes.map(n => ({
131
+ id: n.id, type: "aurea",
132
+ position: { x: n.x ?? automatico.posicoes.get(n.id)?.x ?? 0, y: n.y ?? automatico.posicoes.get(n.id)?.y ?? 0 },
133
+ draggable: !!onNodeMove,
134
+ // ── O QUE FAZ ESTE GRAFO EXISTIR FORA DO NAVEGADOR ─────────────────────────────────
135
+ // O motor só desenha nó que tem tamanho, e no servidor não há o que medir. `initialWidth`
136
+ // e `initialHeight` valem SÓ até a primeira medição — no navegador o tamanho real assume
137
+ // e um nó de três linhas deixa de ser aproximado. E sem `handles` declarados a aresta não
138
+ // sabe de onde sai nem onde chega, então ela some.
139
+ //
140
+ // Eu tinha concluído que grafo não cabia em HTML estático e escrevi isso como limite do
141
+ // componente. Era conclusão minha, não medição: o motor tem caminho de SSR documentado, e
142
+ // são estas três coisas. A prévia do catálogo existe por causa deste bloco.
143
+ initialWidth: LARGURA, initialHeight: ALTURA,
144
+ handles: [{ type: "target", position: Position.Left, x: 0, y: ALTURA / 2 },
145
+ { type: "source", position: Position.Right, x: LARGURA, y: ALTURA / 2 }],
146
+ data: { label: n.label, kind: n.kind, detail: n.detail, selecionado: selectedId === n.id,
147
+ conectavel: !!connectable, aoSelecionar: onSelect ? () => onSelect(n.id) : undefined },
148
+ })), [nodes, automatico, selectedId, onSelect, connectable, onNodeMove]);
149
+ const arestasDoMotor = React.useMemo(() => edges.map(e => ({
150
+ id: `${e.from}->${e.to}`, source: e.from, target: e.to, label: e.label, animated: e.animated,
151
+ })), [edges]);
152
+ // ── A MEDIDA TEM DE PODER VOLTAR, e isto foi achado NO NAVEGADOR ───────────────────────
153
+ // A primeira versão passava `nodes` e nenhum `onNodesChange`. O motor aceita calado e o
154
+ // resultado é um grafo INVISÍVEL: ele só tira o `visibility:hidden` do nó depois de gravar
155
+ // a medida dele de volta na lista, e sem o retorno não tem onde gravar. Medido em
156
+ // 09/08/2026 num navegador de verdade — os cinco nós saíam `visibility: hidden`, com ZERO
157
+ // aresta e o `fitView` parado em `scale(1)`. Nenhum teste de jsdom pega isso, porque lá
158
+ // não há layout para medir.
159
+ //
160
+ // A lista interna preserva `measured` quando os dados de fora mudam: sem isso, trocar a
161
+ // seleção jogaria a medida fora e o grafo piscaria a cada clique.
162
+ const [nosVivos, setNosVivos] = React.useState(nosDoMotor);
163
+ React.useEffect(() => {
164
+ setNosVivos(anteriores => {
165
+ const medidos = new Map(anteriores.map(n => [n.id, n.measured]));
166
+ return nosDoMotor.map(n => ({ ...n, measured: medidos.get(n.id) }));
167
+ });
168
+ }, [nosDoMotor]);
169
+ const aoMudarNos = React.useCallback((mudancas) => {
170
+ setNosVivos(anteriores => applyNodeChanges(mudancas, anteriores));
171
+ }, []);
172
+ // `initialWidth`/`initialHeight` no provider é o par do de cima, um nível acima: é o viewport
173
+ // que o `fitView` usa ENQUANTO ninguém mediu. Com o prefixo `initial`, o navegador sobrescreve
174
+ // na primeira medição — passar `width`/`height` direto no ReactFlow fixaria o tamanho e mataria
175
+ // a fluidez. O valor é a extensão do próprio layout, então no servidor o grafo cabe exato.
176
+ return _jsx("div", { className: cx("dependency-graph", className), style: height ? { blockSize: height } : undefined, role: "group", "aria-label": label ?? s.graphLabel, ...props, children: _jsx(ReactFlowProvider, { initialNodes: nosDoMotor, initialEdges: arestasDoMotor, fitView: true, initialWidth: automatico.extensao.larg, initialHeight: automatico.extensao.alt, children: _jsx(ReactFlow, { nodes: nosVivos, onNodesChange: aoMudarNos, edges: arestasDoMotor, nodeTypes: TIPOS, fitView: true, proOptions: { hideAttribution: false }, nodesDraggable: !!onNodeMove, nodesConnectable: !!connectable, elementsSelectable: !!onSelect, onNodeDragStop: onNodeMove ? (_, no) => onNodeMove(no.id, no.position) : undefined, onConnect: onConnect ? c => { if (c.source && c.target)
177
+ onConnect({ from: c.source, to: c.target }); } : undefined, children: _jsx(Background, {}) }) }) });
178
+ }
@@ -0,0 +1,9 @@
1
+ import React, { type ReactNode } from "react";
2
+ import type { AvatarSize } from "./markup.js";
3
+ export declare function Avatar({ src, alt, fallback, size, className }: {
4
+ src?: string;
5
+ alt?: string;
6
+ fallback?: ReactNode;
7
+ size?: AvatarSize;
8
+ className?: string;
9
+ }): React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ // Fase 9 (achado A5): este arquivo saiu do index.tsx de 970 linhas. Um módulo por categoria
4
+ // do registry — a taxonomia já existia e é gateada. A ordem de import entre eles é um DAG:
5
+ // internal → system → actions → feedback → inputs → navigation → layout → data-display → resto.
6
+ import React from "react";
7
+ import { cx } from "./internal.js";
8
+ export function Avatar({ src, alt = "", fallback, size = "md", className }) {
9
+ const [falhou, setFalhou] = React.useState(false);
10
+ React.useEffect(() => { setFalhou(false); }, [src]);
11
+ return _jsx("span", { className: cx("avatar", size !== "md" && `avatar-${size}`, className), children: src && !falhou ? _jsx("img", { src: src, alt: alt, onError: () => setFalhou(true) }) : fallback });
12
+ }
@@ -1,8 +1,2 @@
1
- import { type ReactNode } from "react";
2
- export declare function Avatar({ src, alt, fallback, size, className }: {
3
- src?: string;
4
- alt?: string;
5
- fallback?: ReactNode;
6
- size?: number;
7
- className?: string;
8
- }): import("react").JSX.Element;
1
+ export * from "./identity-client.js";
2
+ export { AvatarGroup, type AvatarSize } from "./markup.js";
package/dist/identity.js CHANGED
@@ -1,3 +1,5 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cx } from "./internal.js";
3
- export function Avatar({ src, alt = "", fallback, size = 40, className }) { return _jsx("span", { className: cx("avatar", className), style: { width: size, height: size }, children: src ? _jsx("img", { src: src, alt: alt }) : fallback }); }
1
+ // VITRINE da categoria é este arquivo que `@aurea-uds/react/identity` resolve. Sem
2
+ // `"use client"` de propósito: a diretiva contamina o módulo inteiro e faria a marcação pura
3
+ // chegar como cliente por vizinhança (ADR-0026; o check 26b reprova quem a puser de volta aqui).
4
+ export * from "./identity-client.js";
5
+ export { AvatarGroup } from "./markup.js";
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- export { cx, defaultStrings, ptBR, useAureaStrings, defaultSpriteUrl, useSpriteUrl, type AureaStrings } from "./internal.js";
1
+ export { cx, defaultStrings, ptBR, defaultSpriteUrl, gridStateToParams, gridStateFromParams, screenStateToParams, screenStateFromParams, universalStates, stateSeverity, type AureaStrings, type GridState, type ScreenState, type UniversalState } from "./pure.js";
2
+ export { useAureaStrings, useSpriteUrl } from "./internal.js";
3
+ export { Card, Stack, Cluster, Grid, KPI, DataList, Timeline, Prose, Badge, Progress, Skeleton, AvatarGroup, LogStream, MediaPlayerShell, Topbar, Kbd, Select, Textarea, Checkbox, Radio, Switch, Range, type BadgeVariant, type AvatarSize, type TopbarVariant } from "./markup.js";
2
4
  export * from "./system.js";
3
5
  export * from "./actions.js";
4
6
  export * from "./feedback.js";
@@ -12,3 +14,4 @@ export * from "./overlays.js";
12
14
  export * from "./media.js";
13
15
  export * from "./communication.js";
14
16
  export * from "./code.js";
17
+ export * from "./agents.js";
package/dist/index.js CHANGED
@@ -8,13 +8,41 @@
8
8
  // porta de sempre: `import {Button} from "@aurea-uds/react"` continua funcionando e traz tudo
9
9
  // que não custa dependência.
10
10
  //
11
- // TRÊS COMPONENTES NÃO ENTRAM AQUI, e é o ponto da fase:
11
+ // SEIS MÓDULOS DE MOTOR OPCIONAL NÃO ENTRAM AQUI:
12
12
  // CodeEditor → "@aurea-uds/react/code-editor" (CodeMirror, 6 peers opcionais)
13
13
  // DataGrid → "@aurea-uds/react/data-grid" (@tanstack/react-table)
14
14
  // QRCode → "@aurea-uds/react/qrcode" (qr)
15
- // Se estivessem neste barril, importar um Button carregaria os três — e a dependência opcional
15
+ // Calendar → "@aurea-uds/react/calendar" (react-day-picker)
16
+ // Chart → "@aurea-uds/react/chart" (recharts)
17
+ // DependencyGraph → "@aurea-uds/react/graph" (@xyflow/react)
18
+ // Se estivessem neste barril, importar um Button carregaria um peer opcional — e a dependência
16
19
  // que não estivesse instalada quebraria a importação. O peso é real, então a fronteira é real.
17
- export { cx, defaultStrings, ptBR, useAureaStrings, defaultSpriteUrl, useSpriteUrl } from "./internal.js";
20
+ // SEM `"use client"`, e é o ponto da Parte A: este barril é um módulo de SERVIDOR. Reexportar
21
+ // componente de um módulo com a diretiva é o caminho suportado — quem importa daqui de um
22
+ // componente de servidor recebe uma referência de cliente e a renderiza normalmente.
23
+ //
24
+ // `cx` e os dicionários vêm do `pure.js`, não do `internal.js`: os dois exportam os mesmos
25
+ // nomes, mas o `internal` tem a diretiva, e dali `cx` viraria referência de cliente — chamável
26
+ // só no navegador. Um helper de classe tem de funcionar nos dois lados.
27
+ // `gridStateToParams`/`gridStateFromParams` saem por AQUI, e não pelo subpath do
28
+ // DataGrid, de propósito: quem lê a URL num framework de RSC é o SERVIDOR, e o
29
+ // subpath tem a diretiva. Vindo daqui — via `pure.js`, que não tem — a função é
30
+ // chamável dos dois lados. É a mesma razão do `cx`, uma camada acima.
31
+ export { cx, defaultStrings, ptBR, defaultSpriteUrl, gridStateToParams, gridStateFromParams, screenStateToParams, screenStateFromParams, universalStates, stateSeverity } from "./pure.js";
32
+ export { useAureaStrings, useSpriteUrl } from "./internal.js";
33
+ // ── A LINHA DO ITEM O1, e ela é o item inteiro ───────────────────────────────────────────────
34
+ // Estes 22 vêm do `markup.js`, que NÃO tem a diretiva, e por isso chegam como componentes de
35
+ // SERVIDOR. Vinham dos módulos de categoria abaixo, e de lá chegavam como cliente: `Card` é uma
36
+ // <div>, e importá-lo embarcava 9 módulos e 118,5 KB — `node scripts/measure-boundary.mjs`.
37
+ //
38
+ // ESTA LINHA PRECISA SER EXPLÍCITA, e o que acontece sem ela foi MEDIDO, não deduzido — a
39
+ // primeira versão deste comentário dizia outra coisa e a prova contra o defeito a derrubou.
40
+ // Tirando um nome daqui: o `tsc` fica VERDE, o componente continua existindo e os testes
41
+ // continuam passando, porque o módulo de categoria abaixo o reexporta (é o que mantém o subpath
42
+ // inteiro). O que muda é de ONDE ele vem — do módulo com a diretiva —, e aí ele volta a chegar
43
+ // como referência de CLIENTE e os 118,5 KB voltam com ele. Não é um erro: é o ganho do item O1
44
+ // se desfazendo em silêncio. É isso, exatamente isso, que o check 35 pega.
45
+ export { Card, Stack, Cluster, Grid, KPI, DataList, Timeline, Prose, Badge, Progress, Skeleton, AvatarGroup, LogStream, MediaPlayerShell, Topbar, Kbd, Select, Textarea, Checkbox, Radio, Switch, Range } from "./markup.js";
18
46
  export * from "./system.js";
19
47
  export * from "./actions.js";
20
48
  export * from "./feedback.js";
@@ -28,3 +56,5 @@ export * from "./overlays.js";
28
56
  export * from "./media.js";
29
57
  export * from "./communication.js";
30
58
  export * from "./code.js";
59
+ // A camada operacional (Parte H). Sem dependência nova, então entra no barril.
60
+ export * from "./agents.js";
@@ -0,0 +1,105 @@
1
+ import React, { type HTMLAttributes, type InputHTMLAttributes, type RefAttributes, type ReactNode } from "react";
2
+ import { type IconName } from "./system.js";
3
+ export { FileInput, matchesAccept, type FileRejection, type UploadContext, type UploadFn } from "./file-input.js";
4
+ export interface FieldProps extends HTMLAttributes<HTMLDivElement>, RefAttributes<HTMLDivElement> {
5
+ label: string;
6
+ hint?: ReactNode;
7
+ error?: ReactNode;
8
+ name?: string;
9
+ }
10
+ export declare function Field({ label, hint, error, children, className, id, name, ...props }: FieldProps): React.JSX.Element;
11
+ export declare function Form({ errors, onSubmit, children, className, ...props }: Omit<React.FormHTMLAttributes<HTMLFormElement>, "onSubmit"> & RefAttributes<HTMLFormElement> & {
12
+ errors?: Record<string, string | string[]>;
13
+ onSubmit?: (values: Record<string, unknown>) => void;
14
+ }): React.JSX.Element;
15
+ export interface InputProps extends InputHTMLAttributes<HTMLInputElement>, RefAttributes<HTMLInputElement> {
16
+ formatOnBlur?: (value: string) => string;
17
+ }
18
+ export declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "ref"> & RefAttributes<HTMLInputElement>>;
19
+ export declare function SearchField({ icon, className, ...props }: InputHTMLAttributes<HTMLInputElement> & RefAttributes<HTMLInputElement> & {
20
+ icon?: IconName;
21
+ }): React.JSX.Element;
22
+ export declare function NumberField({ value, defaultValue, onValueChange, min, max, step, disabled, readOnly, required, label, id, name, format, locale, className }: {
23
+ value?: number | null;
24
+ defaultValue?: number;
25
+ onValueChange?: (v: number | null) => void;
26
+ min?: number;
27
+ max?: number;
28
+ step?: number;
29
+ disabled?: boolean;
30
+ readOnly?: boolean;
31
+ required?: boolean;
32
+ label?: string;
33
+ id?: string;
34
+ name?: string;
35
+ format?: Intl.NumberFormatOptions;
36
+ locale?: string;
37
+ className?: string;
38
+ }): React.JSX.Element;
39
+ export declare function OTPField({ length, value, defaultValue, onValueChange, mask, disabled, required, label, id, className }: {
40
+ length: number;
41
+ value?: string;
42
+ defaultValue?: string;
43
+ onValueChange?: (v: string) => void;
44
+ mask?: boolean;
45
+ disabled?: boolean;
46
+ required?: boolean;
47
+ label?: string;
48
+ id?: string;
49
+ className?: string;
50
+ }): React.JSX.Element;
51
+ export declare function SegmentedControl({ items, value, onChange, label }: {
52
+ items: Array<{
53
+ value: string;
54
+ label: ReactNode;
55
+ }>;
56
+ value: string;
57
+ onChange: (v: string) => void;
58
+ label?: string;
59
+ }): React.JSX.Element;
60
+ export interface ComboboxOption {
61
+ value: string;
62
+ label: string;
63
+ }
64
+ export declare function Combobox({ items, value, onValueChange, placeholder, label, disabled, id, className, "aria-describedby": descrito, "aria-invalid": invalido }: {
65
+ items: ComboboxOption[];
66
+ value?: ComboboxOption | null;
67
+ onValueChange?: (v: ComboboxOption | null) => void;
68
+ placeholder?: string;
69
+ label?: ReactNode;
70
+ disabled?: boolean;
71
+ id?: string;
72
+ className?: string;
73
+ "aria-describedby"?: string;
74
+ "aria-invalid"?: boolean | "true" | "false";
75
+ }): React.JSX.Element;
76
+ export interface ComboboxOptGroup {
77
+ label: string;
78
+ items: ComboboxOption[];
79
+ }
80
+ export declare function MultiCombobox({ items, value, onValueChange, onInputChange, loading, placeholder, label, disabled, id, className, "aria-describedby": descrito, "aria-invalid": invalido }: {
81
+ items: ComboboxOption[] | ComboboxOptGroup[];
82
+ value?: ComboboxOption[];
83
+ onValueChange?: (v: ComboboxOption[]) => void;
84
+ onInputChange?: (query: string) => void;
85
+ loading?: boolean;
86
+ placeholder?: string;
87
+ label?: ReactNode;
88
+ disabled?: boolean;
89
+ id?: string;
90
+ className?: string;
91
+ "aria-describedby"?: string;
92
+ "aria-invalid"?: boolean | "true" | "false";
93
+ }): React.JSX.Element;
94
+ export interface EditorBlock {
95
+ id: string;
96
+ kind?: ReactNode;
97
+ children: ReactNode;
98
+ }
99
+ export interface BlockEditorProps extends Omit<HTMLAttributes<HTMLOListElement>, "onReorder">, RefAttributes<HTMLOListElement> {
100
+ blocks: EditorBlock[];
101
+ onReorder: (from: number, to: number) => void;
102
+ onRemove?: (index: number) => void;
103
+ label?: string;
104
+ }
105
+ export declare function BlockEditor({ blocks, onReorder, onRemove, label, className, ...props }: BlockEditorProps): React.JSX.Element;