@aurea-uds/native 0.31.0 → 0.32.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/feedback.js CHANGED
@@ -11,7 +11,8 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
11
11
  // .spinner aurea.css:668 borda 2 currentColor, direita transparente, redondo, .7s linear
12
12
  // .skeleton aurea.css:1111 raio 7, fundo surface-3, pulso de opacidade .55 em 1.35s
13
13
  // .progress aurea.css:1105 altura 8, raio 999, trilho surface-3, preenchimento primary
14
- // .alert aurea.css:1088 grade auto/1fr/auto, gap 12, padding 14 16, raio lg, borda 1
14
+ // .alert aurea.css:1088 grade auto/1fr/auto, ~~gap 12, padding 14 16, raio lg, borda 1~~
15
+ // → 0.32.0: medidas do nativo da referência, pintura da web (`Alert`)
15
16
  // .empty-state aurea.css:1823 coluna centrada, gap space-3, padding space-10 space-6
16
17
  // .data-state aurea.css:1110 grade com gap space-3 e NADA de superfície própria
17
18
  //
@@ -21,7 +22,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
21
22
  // de uma REGIÃO não emite título de documento.
22
23
  import * as React from "react";
23
24
  import { Animated, Easing, View } from "react-native";
24
- import { IconButton } from "./actions.js";
25
+ import { Button, CloseButton } from "./actions.js";
25
26
  import { canto, criarFolha, estadoAcessivel, letraDoToken } from "./estilos.js";
26
27
  import { Icon } from "./icon.js";
27
28
  import { IconeEmMoldura } from "./moldura.js";
@@ -56,13 +57,17 @@ const folha = criarFolha((t) => ({
56
57
  // `flex:1` — mesmo resultado, e `display:grid` não existe no RN (a mesma nota do `Grid`).
57
58
  // `alignItems:"flex-start"` porque o ícone acompanha a PRIMEIRA linha do texto, não o centro
58
59
  // de um parágrafo de três linhas.
60
+ // 0.32.0: as medidas do nativo da referência — 12 de recheio em volta e 12 entre as partes (era
61
+ // 14 em cima e embaixo e 16 dos lados). A pintura é a da web desta versão (`.alert`): fundo de
62
+ // CARTÃO, sem borda, com a sombra de superfície (`shadowSm` inteira); a cor do estado fica só no
63
+ // ícone e no título. Até a 0.31.0 o estado tingia o fundo e a borda.
59
64
  alerta: {
60
65
  flexDirection: "row", alignItems: "flex-start", gap: t.size.space3,
61
- paddingVertical: 14, paddingHorizontal: t.size.space4,
66
+ padding: t.size.space3,
62
67
  // HER-02 (06/10/2026): era `radiusLg` (16). Painel é 22 na identidade da Aurea (`CLAUDE.md`
63
68
  // §5), como o `Popover`, o `Dialog` e o `Banner`; a referência usa 24 na web e no nativo.
64
- borderWidth: t.size.borderWidth, ...canto(t.size.radiusCard),
65
- backgroundColor: t.color.secondary, borderColor: t.color.border,
69
+ ...canto(t.size.radiusCard),
70
+ backgroundColor: t.color.card, boxShadow: [...t.shadowLayers.shadowSm],
66
71
  },
67
72
  // O GRUPO de leitura: ícone + texto, lidos como uma coisa só. Ele existe porque a moldura
68
73
  // deixou de ser `accessible` (ver o comentário no componente) — e sem um grupo o título e o
@@ -72,10 +77,6 @@ const folha = criarFolha((t) => ({
72
77
  flex: 1, minWidth: 0,
73
78
  flexDirection: "row", alignItems: "flex-start", gap: t.size.space3,
74
79
  },
75
- alerta_info: { backgroundColor: t.color.infoBg, borderColor: t.color.info400 ?? t.color.info },
76
- alerta_success: { backgroundColor: t.color.successBg, borderColor: t.color.success400 ?? t.color.success },
77
- alerta_warning: { backgroundColor: t.color.warningBg, borderColor: t.color.warning400 ?? t.color.warning },
78
- alerta_danger: { backgroundColor: t.color.dangerBg, borderColor: t.color.danger400 ?? t.color.destructive },
79
80
  corpoDoAlerta: { flex: 1, gap: 2 },
80
81
  // ── EmptyState ─────────────────────────────────────────────────────────────────────────────
81
82
  vazio: {
@@ -95,7 +96,7 @@ const folha = criarFolha((t) => ({
95
96
  * cascata para fazê-lo por ele. Parado, o anel continua desenhado — quem precisa da informação
96
97
  * "algo está acontecendo" continua vendo o rótulo.
97
98
  */
98
- export function Spinner({ size = "sm", label, decorative, style, testID }) {
99
+ export function Spinner({ size = "md", label, decorative, style, testID }) {
99
100
  const t = useAureaTokens();
100
101
  const s = folha(t);
101
102
  const strings = useAureaStrings();
@@ -114,7 +115,7 @@ export function Spinner({ size = "sm", label, decorative, style, testID }) {
114
115
  // clássico de `Animated.loop`.
115
116
  return () => laco.stop();
116
117
  }, [giro, reduzir]);
117
- const lado = size === "lg" ? t.size.iconLg : size === "md" ? t.size.iconMd : t.size.iconSm;
118
+ const lado = size === "lg" ? t.size.iconXl : size === "md" ? t.size.iconLg : t.size.iconSm;
118
119
  const acessibilidade = decorative
119
120
  ? { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" }
120
121
  : { accessible: true, accessibilityRole: "progressbar",
@@ -126,6 +127,31 @@ export function Spinner({ size = "sm", label, decorative, style, testID }) {
126
127
  style,
127
128
  ] }));
128
129
  }
130
+ export const GrupoDeEsqueleto = React.createContext(null);
131
+ /**
132
+ * O pulso do esqueleto: liga só quando `ativo`, e só depois de o sistema dizer que pode mexer.
133
+ * Desligado, a opacidade volta a 1 — um laço parado no meio deixaria a caixa meio apagada.
134
+ * O `SkeletonGroup` usa o mesmo, uma vez para o grupo inteiro.
135
+ */
136
+ export function usePulsoDoEsqueleto(ativo) {
137
+ const reduzir = useReduceMotion();
138
+ const opacidade = React.useRef(new Animated.Value(1)).current;
139
+ React.useEffect(() => {
140
+ if (!ativo || reduzir !== false) {
141
+ opacidade.setValue(1);
142
+ return;
143
+ }
144
+ // 1,35 s no total, com o vale em .55 na METADE — é o `@keyframes skeleton-pulse` do
145
+ // `aurea.css:1112` lido literalmente: 675 ms para descer e 675 para voltar.
146
+ const laco = Animated.loop(Animated.sequence([
147
+ Animated.timing(opacidade, { toValue: 0.55, duration: 675, easing: Easing.inOut(Easing.ease), useNativeDriver: driverNativo() }),
148
+ Animated.timing(opacidade, { toValue: 1, duration: 675, easing: Easing.inOut(Easing.ease), useNativeDriver: driverNativo() }),
149
+ ]));
150
+ laco.start();
151
+ return () => laco.stop();
152
+ }, [ativo, opacidade, reduzir]);
153
+ return opacidade;
154
+ }
129
155
  /**
130
156
  * A caixa cinza que pulsa enquanto o dado não chega.
131
157
  *
@@ -136,29 +162,48 @@ export function Spinner({ size = "sm", label, decorative, style, testID }) {
136
162
  *
137
163
  * Ele é **invisível para o leitor de tela** (`aria-hidden` na web, `accessibilityElementsHidden`
138
164
  * aqui): anunciar "caixa" três vezes enquanto a tela carrega não ajuda ninguém.
165
+ *
166
+ * 0.32.0: o `isLoading` e os `children` da referência. Com `isLoading={false}` a caixa sai e o
167
+ * conteúdo entra, num esmaecer da duração lenta da Aurea (a referência usa o esmaecer padrão do
168
+ * motor dela); com "menos movimento", ou no primeiro desenho, ele entra sem esmaecer. Sem as props
169
+ * novas, nada muda: é a caixa de sempre.
139
170
  */
140
- export function Skeleton({ width, height, radius, style, testID }) {
171
+ export function Skeleton({ width, height, radius, style, testID, isLoading, children, animation }) {
141
172
  const t = useAureaTokens();
142
173
  const s = folha(t);
143
174
  const reduzir = useReduceMotion();
144
- const opacidade = React.useRef(new Animated.Value(1)).current;
175
+ const grupo = React.useContext(GrupoDeEsqueleto);
176
+ const carregando = isLoading ?? grupo?.isLoading ?? true;
177
+ const pulsa = (animation ?? grupo?.animation ?? "pulse") === "pulse";
178
+ // No grupo que pulsa, o pulso é o dele. O próprio só liga fora de um grupo — ou quando este pede o
179
+ // pulso e o grupo não.
180
+ const doGrupo = pulsa && grupo?.animation === "pulse" ? grupo.pulso : null;
181
+ const proprio = usePulsoDoEsqueleto(carregando && pulsa && !doGrupo);
182
+ // O esmaecer do conteúdo que chega. Um valor NOVO a cada troca, que já nasce em 0 quando vai
183
+ // esmaecer: zerar depois, num efeito, deixaria passar um quadro com o conteúdo cheio antes do
184
+ // esmaecer começar. No primeiro desenho ele nasce em 1 — nada está chegando, já estava lá.
185
+ // As dependências são só a TROCA de estado (e, abaixo, o valor novo), de propósito: a resposta do
186
+ // "menos movimento" chegando depois não pode fazer o conteúdo esmaecer de novo.
187
+ const montado = React.useRef(false);
188
+ const entrada = React.useMemo(() => new Animated.Value(montado.current && reduzir === false ? 0 : 1), [carregando]);
189
+ React.useEffect(() => { montado.current = true; }, []);
145
190
  React.useEffect(() => {
146
- if (reduzir !== false)
191
+ if (carregando || reduzir !== false) {
192
+ entrada.setValue(1);
147
193
  return;
148
- // 1,35 s no total, com o vale em .55 na METADE — é o `@keyframes skeleton-pulse` do
149
- // `aurea.css:1112` lido literalmente: 675 ms para descer e 675 para voltar.
150
- const laco = Animated.loop(Animated.sequence([
151
- Animated.timing(opacidade, { toValue: 0.55, duration: 675, easing: Easing.inOut(Easing.ease), useNativeDriver: driverNativo() }),
152
- Animated.timing(opacidade, { toValue: 1, duration: 675, easing: Easing.inOut(Easing.ease), useNativeDriver: driverNativo() }),
153
- ]));
154
- laco.start();
155
- return () => laco.stop();
156
- }, [opacidade, reduzir]);
194
+ }
195
+ const a = Animated.timing(entrada, { toValue: 1, duration: t.size.durationSlow, useNativeDriver: driverNativo() });
196
+ a.start();
197
+ return () => a.stop();
198
+ }, [entrada]);
199
+ if (!carregando) {
200
+ return _jsx(Animated.View, { style: { opacity: entrada }, children: children });
201
+ }
157
202
  return (_jsx(Animated.View, { testID: testID, accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: [
158
203
  s.esqueleto,
159
204
  { width: width ?? "100%", height: height ?? t.size.space4 },
160
205
  radius != null && { ...canto(radius) },
161
- { opacity: opacidade },
206
+ { opacity: doGrupo ?? proprio },
162
207
  style,
163
208
  ] }));
164
209
  }
@@ -267,9 +312,9 @@ accessibilityLabel, accessibilityHint, ...rest }) {
267
312
  , {
268
313
  // Android: a região viva é o que faz o leitor falar sem foco, e ela cobre a moldura
269
314
  // inteira de propósito — o que muda é o conteúdo, e o "X" some junto quando o aviso fecha.
270
- accessibilityLiveRegion: v === "danger" ? "assertive" : "polite", style: [s.alerta, s[`alerta_${v}`], style], ...rest, children: [_jsxs(View, { accessible: true, accessibilityLabel: accessibilityLabel, accessibilityHint: accessibilityHint, ...(v === "danger" ? { accessibilityRole: "alert" } : null), style: s.grupoDoAlerta, children: [_jsx(Icon, { name: icon ?? ICONE_DA_VARIANTE[v], size: "md", color: corDoIcone, weight: icon ? undefined : "fill" }), _jsxs(View, { style: s.corpoDoAlerta, children: [title != null && _jsx(Text, { size: "sm", weight: 600, children: title }), children != null
271
- ? (typeof children === "string" ? _jsx(Text, { size: "sm", tone: "muted", children: children }) : children)
272
- : state ? _jsx(Text, { size: "sm", tone: "muted", children: strings.universalState[state] }) : null] })] }), onDismiss ? _jsx(IconButton, { appearance: "ghost", size: "sm", name: "x", label: strings.close, onPress: onDismiss }) : null] }));
315
+ accessibilityLiveRegion: v === "danger" ? "assertive" : "polite", style: [s.alerta, style], ...rest, children: [_jsxs(View, { accessible: true, accessibilityLabel: accessibilityLabel, accessibilityHint: accessibilityHint, ...(v === "danger" ? { accessibilityRole: "alert" } : null), style: s.grupoDoAlerta, children: [_jsx(Icon, { name: icon ?? ICONE_DA_VARIANTE[v], size: "md", color: corDoIcone, weight: icon ? undefined : "fill" }), _jsxs(View, { style: s.corpoDoAlerta, children: [title != null && _jsx(Text, { size: "base", weight: 500, tone: v, children: title }), children != null
316
+ ? (typeof children === "string" ? _jsx(Text, { size: "xs", tone: "muted", children: children }) : children)
317
+ : state ? _jsx(Text, { size: "xs", tone: "muted", children: strings.universalState[state] }) : null] })] }), onDismiss ? _jsx(CloseButton, { label: strings.close, onPress: onDismiss }) : null] }));
273
318
  }
274
319
  /**
275
320
  * O nada, dito com jeito.
@@ -290,6 +335,17 @@ export function EmptyState({ icon = "file", title, description, action, state, s
290
335
  ? _jsx(Text, { size: "sm", tone: "muted", align: "center", children: desc })
291
336
  : desc), action] }));
292
337
  }
338
+ /**
339
+ * MNT-25 (0.32.0): a barreira de erro, a mesma da web — o que quebra DENTRO do `DataState` vira a cara de
340
+ * erro dele, e o resto da tela fica. Só um componente de CLASSE pega erro de desenho no React.
341
+ */
342
+ class BarreiraDeErro extends React.Component {
343
+ state = { quebrou: false };
344
+ static getDerivedStateFromError() { return { quebrou: true }; }
345
+ componentDidCatch(erro, info) { this.props.onCatch?.(erro, info); }
346
+ tentar = () => this.setState({ quebrou: false });
347
+ render() { return this.state.quebrou ? this.props.falha(this.tentar) : this.props.children; }
348
+ }
293
349
  /**
294
350
  * A região que troca de cara. **Ela não desenha nada próprio** — empilha o que já existe.
295
351
  *
@@ -298,7 +354,15 @@ export function EmptyState({ icon = "file", title, description, action, state, s
298
354
  * dado está aí e tem ressalva — esconder o dado seria trocar informação parcial por informação
299
355
  * nenhuma. Só `loading`, `error` e `empty` tomam o lugar.
300
356
  */
301
- export function DataState({ state, message, skeleton, emptyTitle, emptyIcon, action, children, style, ...rest }) {
357
+ export function DataState({ catchErrors, onCatch, ...props }) {
358
+ const t = useAureaTokens();
359
+ const s = folha(t);
360
+ const strings = useAureaStrings();
361
+ if (!catchErrors)
362
+ return _jsx(CorpoDoDataState, { ...props });
363
+ return (_jsx(BarreiraDeErro, { onCatch: onCatch, falha: (tentar) => (_jsxs(View, { style: [s.regiao, props.style], children: [_jsx(Alert, { variant: "danger", children: props.message ?? strings.dataCrashed }), _jsx(View, { style: { alignSelf: "flex-start" }, children: _jsx(Button, { size: "sm", onPress: tentar, children: strings.dataRetry }) })] })), children: _jsx(CorpoDoDataState, { ...props }) }));
364
+ }
365
+ function CorpoDoDataState({ state, message, skeleton, emptyTitle, emptyIcon, action, children, style, ...rest }) {
302
366
  const t = useAureaTokens();
303
367
  const s = folha(t);
304
368
  const strings = useAureaStrings();
@@ -15,7 +15,13 @@ export type IconName = PhosphorIconName | Extract<keyof AureaIconNames, string>;
15
15
  /**
16
16
  * O peso do ícone. `regular` é o de sempre; `fill` é o cheio, o do item escolhido (aba ativa,
17
17
  * item atual do menu) — ADR-0053. Nome próprio do app não tem forma cheia e fica no `regular`.
18
+ * `bold` (0.32.0) é o traço grosso, e só existe para os nomes de `NOMES_BOLD` (hoje, o `x` do
19
+ * `CloseButton`); para os outros, ele desenha o `regular`.
18
20
  */
19
- export type IconWeight = "regular" | "fill";
21
+ export type IconWeight = "regular" | "fill" | "bold";
20
22
  /** Os nomes do Phosphor em tempo de execução: só eles têm a forma cheia (`<nome>-fill`). */
21
23
  export declare const NOMES_PHOSPHOR: ReadonlySet<string>;
24
+ /** Os nomes que também têm o peso Bold (`<nome>-bold`), um a um, por decisão. */
25
+ export type BoldIconName = "x";
26
+ /** Os mesmos, em tempo de execução. */
27
+ export declare const NOMES_BOLD: ReadonlySet<string>;
@@ -2,3 +2,5 @@
2
2
  // Achado A-04: o nome do ícone é checado pelo TypeScript. ADR-0053: os nomes são os do Phosphor.
3
3
  /** Os nomes do Phosphor em tempo de execução: só eles têm a forma cheia (`<nome>-fill`). */
4
4
  export const NOMES_PHOSPHOR = new Set(["acorn", "address-book", "address-book-tabs", "air-traffic-control", "airplane", "airplane-in-flight", "airplane-landing", "airplane-takeoff", "airplane-taxiing", "airplane-tilt", "airplay", "alarm", "alien", "align-bottom", "align-bottom-simple", "align-center-horizontal", "align-center-horizontal-simple", "align-center-vertical", "align-center-vertical-simple", "align-left", "align-left-simple", "align-right", "align-right-simple", "align-top", "align-top-simple", "ambulance", "anchor", "anchor-simple", "angle", "aperture", "app-window", "approximate-equals", "archive", "armchair", "arrow-arc-left", "arrow-arc-right", "arrow-bend-double-up-left", "arrow-bend-double-up-right", "arrow-bend-down-left", "arrow-bend-down-right", "arrow-bend-left-down", "arrow-bend-left-up", "arrow-bend-right-down", "arrow-bend-right-up", "arrow-bend-up-left", "arrow-bend-up-right", "arrow-circle-down", "arrow-circle-down-left", "arrow-circle-down-right", "arrow-circle-left", "arrow-circle-right", "arrow-circle-up", "arrow-circle-up-left", "arrow-circle-up-right", "arrow-clockwise", "arrow-counter-clockwise", "arrow-down", "arrow-down-left", "arrow-down-right", "arrow-elbow-down-left", "arrow-elbow-down-right", "arrow-elbow-left", "arrow-elbow-left-down", "arrow-elbow-left-up", "arrow-elbow-right", "arrow-elbow-right-down", "arrow-elbow-right-up", "arrow-elbow-up-left", "arrow-elbow-up-right", "arrow-fat-down", "arrow-fat-left", "arrow-fat-line-down", "arrow-fat-line-left", "arrow-fat-line-right", "arrow-fat-line-up", "arrow-fat-lines-down", "arrow-fat-lines-left", "arrow-fat-lines-right", "arrow-fat-lines-up", "arrow-fat-right", "arrow-fat-up", "arrow-left", "arrow-line-down", "arrow-line-down-left", "arrow-line-down-right", "arrow-line-left", "arrow-line-right", "arrow-line-up", "arrow-line-up-left", "arrow-line-up-right", "arrow-right", "arrow-square-down", "arrow-square-down-left", "arrow-square-down-right", "arrow-square-in", "arrow-square-left", "arrow-square-out", "arrow-square-right", "arrow-square-up", "arrow-square-up-left", "arrow-square-up-right", "arrow-u-down-left", "arrow-u-down-right", "arrow-u-left-down", "arrow-u-left-up", "arrow-u-right-down", "arrow-u-right-up", "arrow-u-up-left", "arrow-u-up-right", "arrow-up", "arrow-up-left", "arrow-up-right", "arrows-clockwise", "arrows-counter-clockwise", "arrows-down-up", "arrows-horizontal", "arrows-in", "arrows-in-cardinal", "arrows-in-line-horizontal", "arrows-in-line-vertical", "arrows-in-simple", "arrows-left-right", "arrows-merge", "arrows-out", "arrows-out-cardinal", "arrows-out-line-horizontal", "arrows-out-line-vertical", "arrows-out-simple", "arrows-split", "arrows-vertical", "article", "article-medium", "article-ny-times", "asclepius", "asterisk", "asterisk-simple", "at", "atom", "avocado", "axe", "baby", "baby-carriage", "backpack", "backspace", "bag", "bag-simple", "balloon", "bandaids", "bank", "barbell", "barcode", "barn", "barricade", "baseball", "baseball-cap", "baseball-helmet", "basket", "basketball", "bathtub", "battery-charging", "battery-charging-vertical", "battery-empty", "battery-full", "battery-high", "battery-low", "battery-medium", "battery-plus", "battery-plus-vertical", "battery-vertical-empty", "battery-vertical-full", "battery-vertical-high", "battery-vertical-low", "battery-vertical-medium", "battery-warning", "battery-warning-vertical", "beach-ball", "beanie", "bed", "beer-bottle", "beer-stein", "bell", "bell-ringing", "bell-simple", "bell-simple-ringing", "bell-simple-slash", "bell-simple-z", "bell-slash", "bell-z", "belt", "bezier-curve", "bicycle", "binary", "binoculars", "biohazard", "bird", "blueprint", "bluetooth", "bluetooth-connected", "bluetooth-slash", "bluetooth-x", "boat", "bomb", "bone", "book", "book-bookmark", "book-open", "book-open-text", "book-open-user", "bookmark", "bookmark-simple", "bookmarks", "bookmarks-simple", "books", "boot", "boules", "bounding-box", "bowl-food", "bowl-steam", "bowling-ball", "box-arrow-down", "box-arrow-up", "boxing-glove", "brackets-angle", "brackets-curly", "brackets-round", "brackets-square", "brain", "brandy", "bread", "bridge", "briefcase", "briefcase-metal", "broadcast", "broom", "browser", "browsers", "bug", "bug-beetle", "bug-droid", "building", "building-apartment", "building-office", "buildings", "bulldozer", "bus", "butterfly", "cable-car", "cactus", "cake", "calculator", "calendar", "calendar-blank", "calendar-check", "calendar-dot", "calendar-dots", "calendar-heart", "calendar-minus", "calendar-plus", "calendar-slash", "calendar-star", "calendar-x", "call-bell", "camera", "camera-plus", "camera-rotate", "camera-slash", "campfire", "car", "car-battery", "car-profile", "car-simple", "cardholder", "cards", "cards-three", "caret-circle-double-down", "caret-circle-double-left", "caret-circle-double-right", "caret-circle-double-up", "caret-circle-down", "caret-circle-left", "caret-circle-right", "caret-circle-up", "caret-circle-up-down", "caret-double-down", "caret-double-left", "caret-double-right", "caret-double-up", "caret-down", "caret-left", "caret-line-down", "caret-line-left", "caret-line-right", "caret-line-up", "caret-right", "caret-up", "caret-up-down", "carrot", "cash-register", "cassette-tape", "castle-turret", "cat", "cell-signal-full", "cell-signal-high", "cell-signal-low", "cell-signal-medium", "cell-signal-none", "cell-signal-slash", "cell-signal-x", "cell-tower", "certificate", "chair", "chalkboard", "chalkboard-simple", "chalkboard-teacher", "champagne", "charging-station", "chart-bar", "chart-bar-horizontal", "chart-donut", "chart-line", "chart-line-down", "chart-line-up", "chart-pie", "chart-pie-slice", "chart-polar", "chart-scatter", "chat", "chat-centered", "chat-centered-dots", "chat-centered-slash", "chat-centered-text", "chat-circle", "chat-circle-dots", "chat-circle-slash", "chat-circle-text", "chat-dots", "chat-slash", "chat-teardrop", "chat-teardrop-dots", "chat-teardrop-slash", "chat-teardrop-text", "chat-text", "chats", "chats-circle", "chats-teardrop", "check", "check-circle", "check-fat", "check-square", "check-square-offset", "checkerboard", "checks", "cheers", "cheese", "chef-hat", "cherries", "church", "cigarette", "cigarette-slash", "circle", "circle-dashed", "circle-half", "circle-half-tilt", "circle-notch", "circles-four", "circles-three", "circles-three-plus", "circuitry", "city", "clipboard", "clipboard-text", "clock", "clock-afternoon", "clock-clockwise", "clock-countdown", "clock-counter-clockwise", "clock-user", "closed-captioning", "cloud", "cloud-arrow-down", "cloud-arrow-up", "cloud-check", "cloud-fog", "cloud-lightning", "cloud-moon", "cloud-rain", "cloud-slash", "cloud-snow", "cloud-sun", "cloud-warning", "cloud-x", "clover", "club", "coat-hanger", "code", "code-block", "code-simple", "coffee", "coffee-bean", "coin", "coin-vertical", "coins", "columns", "columns-plus-left", "columns-plus-right", "command", "compass", "compass-rose", "compass-tool", "computer-tower", "confetti", "contactless-payment", "control", "cookie", "cooking-pot", "copy", "copy-simple", "copyleft", "copyright", "corners-in", "corners-out", "couch", "court-basketball", "cow", "cowboy-hat", "cpu", "crane", "crane-tower", "credit-card", "cricket", "crop", "cross", "crosshair", "crosshair-simple", "crown", "crown-cross", "crown-simple", "cube", "cube-focus", "cube-transparent", "currency-btc", "currency-circle-dollar", "currency-cny", "currency-dollar", "currency-dollar-simple", "currency-eth", "currency-eur", "currency-gbp", "currency-inr", "currency-jpy", "currency-krw", "currency-kzt", "currency-ngn", "currency-rub", "cursor", "cursor-click", "cursor-text", "cylinder", "database", "desk", "desktop", "desktop-tower", "detective", "device-mobile", "device-mobile-camera", "device-mobile-slash", "device-mobile-speaker", "device-rotate", "device-tablet", "device-tablet-camera", "device-tablet-speaker", "devices", "diamond", "diamonds-four", "dice-five", "dice-four", "dice-one", "dice-six", "dice-three", "dice-two", "disc", "disco-ball", "divide", "dna", "dog", "door", "door-open", "dot", "dot-outline", "dots-nine", "dots-six", "dots-six-vertical", "dots-three", "dots-three-circle", "dots-three-circle-vertical", "dots-three-outline", "dots-three-outline-vertical", "dots-three-vertical", "download", "download-simple", "dress", "dresser", "drone", "drop", "drop-half", "drop-half-bottom", "drop-simple", "drop-slash", "ear", "ear-slash", "egg", "egg-crack", "eject", "eject-simple", "elevator", "empty", "engine", "envelope", "envelope-open", "envelope-simple", "envelope-simple-open", "equalizer", "equals", "eraser", "escalator-down", "escalator-up", "exam", "exclamation-mark", "exclude", "exclude-square", "export", "eye", "eye-closed", "eye-slash", "eyedropper", "eyedropper-sample", "eyeglasses", "eyes", "face-mask", "factory", "faders", "faders-horizontal", "fallout-shelter", "fan", "farm", "fast-forward", "fast-forward-circle", "feather", "file", "file-archive", "file-arrow-down", "file-arrow-up", "file-audio", "file-c", "file-c-sharp", "file-cloud", "file-code", "file-cpp", "file-css", "file-csv", "file-dashed", "file-doc", "file-html", "file-image", "file-ini", "file-jpg", "file-js", "file-jsx", "file-lock", "file-magnifying-glass", "file-md", "file-minus", "file-pdf", "file-plus", "file-png", "file-ppt", "file-py", "file-rs", "file-sql", "file-svg", "file-text", "file-ts", "file-tsx", "file-txt", "file-video", "file-vue", "file-x", "file-xls", "file-zip", "files", "film-reel", "film-script", "film-slate", "film-strip", "fingerprint", "fingerprint-simple", "finn-the-human", "fire", "fire-extinguisher", "fire-simple", "fire-truck", "first-aid", "first-aid-kit", "fish", "fish-simple", "flag", "flag-banner", "flag-banner-fold", "flag-checkered", "flag-pennant", "flame", "flashlight", "flask", "flip-horizontal", "flip-vertical", "floppy-disk", "floppy-disk-back", "flow-arrow", "flower", "flower-lotus", "flower-tulip", "flying-saucer", "folder", "folder-dashed", "folder-lock", "folder-minus", "folder-open", "folder-plus", "folder-simple", "folder-simple-dashed", "folder-simple-lock", "folder-simple-minus", "folder-simple-plus", "folder-simple-star", "folder-simple-user", "folder-star", "folder-user", "folders", "football", "football-helmet", "footprints", "fork-knife", "four-k", "frame-corners", "function", "funnel", "funnel-simple", "funnel-simple-x", "funnel-x", "game-controller", "garage", "gas-can", "gas-pump", "gauge", "gavel", "gear", "gear-fine", "gear-six", "gender-female", "gender-intersex", "gender-male", "gender-neuter", "gender-nonbinary", "gender-transgender", "ghost", "gif", "gift", "git-branch", "git-commit", "git-diff", "git-fork", "git-merge", "git-pull-request", "globe", "globe-hemisphere-east", "globe-hemisphere-west", "globe-simple", "globe-simple-x", "globe-stand", "globe-x", "goggles", "golf", "gps", "gps-fix", "gps-slash", "gradient", "graduation-cap", "grains", "grains-slash", "graph", "graphics-card", "greater-than", "greater-than-or-equal", "grid-four", "grid-nine", "guitar", "hair-dryer", "hamburger", "hammer", "hand", "hand-arrow-down", "hand-arrow-up", "hand-coins", "hand-deposit", "hand-eye", "hand-fist", "hand-grabbing", "hand-heart", "hand-palm", "hand-peace", "hand-pointing", "hand-soap", "hand-swipe-left", "hand-swipe-right", "hand-tap", "hand-waving", "hand-withdraw", "handbag", "handbag-simple", "hands-clapping", "hands-praying", "handshake", "hard-drive", "hard-drives", "hard-hat", "hash", "hash-straight", "head-circuit", "headlights", "headphones", "headset", "heart", "heart-break", "heart-half", "heart-straight", "heart-straight-break", "heartbeat", "hexagon", "high-definition", "high-heel", "highlighter", "highlighter-circle", "hockey", "hoodie", "horse", "hospital", "hourglass", "hourglass-high", "hourglass-low", "hourglass-medium", "hourglass-simple", "hourglass-simple-high", "hourglass-simple-low", "hourglass-simple-medium", "house", "house-line", "house-simple", "hurricane", "ice-cream", "identification-badge", "identification-card", "image", "image-broken", "image-square", "images", "images-square", "infinity", "info", "intersect", "intersect-square", "intersect-three", "intersection", "invoice", "island", "jar", "jar-label", "jeep", "joystick", "kanban", "key", "key-return", "keyboard", "keyhole", "knife", "ladder", "ladder-simple", "lamp", "lamp-pendant", "laptop", "lasso", "layout", "leaf", "lectern", "lego", "lego-smiley", "less-than", "less-than-or-equal", "letter-circle-h", "letter-circle-p", "letter-circle-v", "lifebuoy", "lightbulb", "lightbulb-filament", "lighthouse", "lightning", "lightning-a", "lightning-slash", "line-segment", "line-segments", "line-vertical", "link", "link-break", "link-simple", "link-simple-break", "link-simple-horizontal", "link-simple-horizontal-break", "list", "list-bullets", "list-checks", "list-dashes", "list-heart", "list-magnifying-glass", "list-numbers", "list-plus", "list-star", "lock", "lock-key", "lock-key-open", "lock-laminated", "lock-laminated-open", "lock-open", "lock-simple", "lock-simple-open", "lockers", "log", "magic-wand", "magnet", "magnet-straight", "magnifying-glass", "magnifying-glass-minus", "magnifying-glass-plus", "mailbox", "map-pin", "map-pin-area", "map-pin-line", "map-pin-plus", "map-pin-simple", "map-pin-simple-area", "map-pin-simple-line", "map-trifold", "marker-circle", "martini", "mask-happy", "mask-sad", "math-operations", "medal", "medal-military", "megaphone", "megaphone-simple", "member-of", "memory", "meteor", "metronome", "microphone", "microphone-slash", "microphone-stage", "microscope", "minus", "minus-circle", "minus-square", "money", "money-wavy", "monitor", "monitor-arrow-up", "monitor-play", "moon", "moon-stars", "moped", "moped-front", "mosque", "motorcycle", "mountains", "mouse", "mouse-left-click", "mouse-middle-click", "mouse-right-click", "mouse-scroll", "mouse-simple", "music-note", "music-note-simple", "music-notes", "music-notes-minus", "music-notes-plus", "music-notes-simple", "navigation-arrow", "needle", "network", "network-slash", "network-x", "newspaper", "newspaper-clipping", "not-equals", "not-member-of", "not-subset-of", "not-superset-of", "notches", "note", "note-blank", "note-pencil", "notebook", "notepad", "notification", "nuclear-plant", "number-circle-eight", "number-circle-five", "number-circle-four", "number-circle-nine", "number-circle-one", "number-circle-seven", "number-circle-six", "number-circle-three", "number-circle-two", "number-circle-zero", "number-eight", "number-five", "number-four", "number-nine", "number-one", "number-seven", "number-six", "number-square-eight", "number-square-five", "number-square-four", "number-square-nine", "number-square-one", "number-square-seven", "number-square-six", "number-square-three", "number-square-two", "number-square-zero", "number-three", "number-two", "number-zero", "numpad", "nut", "octagon", "office-chair", "onigiri", "option", "orange", "orange-slice", "oven", "package", "paint-brush", "paint-brush-broad", "paint-brush-household", "paint-bucket", "paint-roller", "palette", "panorama", "pants", "paper-plane", "paper-plane-right", "paper-plane-tilt", "paperclip", "paperclip-horizontal", "parachute", "paragraph", "parallelogram", "park", "password", "path", "pause", "pause-circle", "paw-print", "peace", "pen", "pen-nib", "pen-nib-straight", "pencil", "pencil-circle", "pencil-line", "pencil-ruler", "pencil-simple", "pencil-simple-line", "pencil-simple-slash", "pencil-slash", "pentagon", "pentagram", "pepper", "percent", "person", "person-arms-spread", "person-simple", "person-simple-bike", "person-simple-circle", "person-simple-hike", "person-simple-run", "person-simple-ski", "person-simple-snowboard", "person-simple-swim", "person-simple-tai-chi", "person-simple-throw", "person-simple-walk", "perspective", "phone", "phone-call", "phone-disconnect", "phone-incoming", "phone-list", "phone-outgoing", "phone-pause", "phone-plus", "phone-slash", "phone-transfer", "phone-x", "pi", "piano-keys", "picnic-table", "picture-in-picture", "piggy-bank", "pill", "ping-pong", "pint-glass", "pinwheel", "pipe", "pipe-wrench", "pizza", "placeholder", "planet", "plant", "play", "play-circle", "play-pause", "playlist", "plug", "plug-charging", "plugs", "plugs-connected", "plus", "plus-circle", "plus-minus", "plus-square", "poker-chip", "police-car", "polygon", "popcorn", "popsicle", "potted-plant", "power", "prescription", "presentation", "presentation-chart", "printer", "prohibit", "prohibit-inset", "projector-screen", "projector-screen-chart", "pulse", "push-pin", "push-pin-simple", "push-pin-simple-slash", "push-pin-slash", "puzzle-piece", "qr-code", "question", "question-mark", "queue", "quotes", "rabbit", "racquet", "radical", "radio", "radio-button", "radioactive", "rainbow", "rainbow-cloud", "ranking", "receipt", "receipt-x", "record", "rectangle", "rectangle-dashed", "recycle", "repeat", "repeat-once", "resize", "rewind", "rewind-circle", "road-horizon", "robot", "rocket", "rocket-launch", "rows", "rows-plus-bottom", "rows-plus-top", "rss", "rss-simple", "rug", "ruler", "sailboat", "scales", "scan", "scan-smiley", "scissors", "scooter", "screencast", "screwdriver", "scribble", "scribble-loop", "scroll", "seal", "seal-check", "seal-percent", "seal-question", "seal-warning", "seat", "seatbelt", "security-camera", "selection", "selection-all", "selection-background", "selection-foreground", "selection-inverse", "selection-plus", "selection-slash", "shapes", "share", "share-fat", "share-network", "shield", "shield-check", "shield-checkered", "shield-chevron", "shield-plus", "shield-slash", "shield-star", "shield-warning", "shipping-container", "shirt-folded", "shooting-star", "shopping-bag", "shopping-bag-open", "shopping-cart", "shopping-cart-simple", "shovel", "shower", "shrimp", "shuffle", "shuffle-angular", "shuffle-simple", "sidebar", "sidebar-simple", "sigma", "sign-in", "sign-out", "signature", "signpost", "sim-card", "siren", "skip-back", "skip-back-circle", "skip-forward", "skip-forward-circle", "skull", "sliders", "sliders-horizontal", "slideshow", "smiley", "smiley-angry", "smiley-blank", "smiley-meh", "smiley-melting", "smiley-nervous", "smiley-sad", "smiley-sticker", "smiley-wink", "smiley-x-eyes", "sneaker", "sneaker-move", "snowflake", "soccer-ball", "sock", "solar-panel", "solar-roof", "sort-ascending", "sort-descending", "spade", "sparkle", "speaker-hifi", "speaker-high", "speaker-low", "speaker-none", "speaker-simple-high", "speaker-simple-low", "speaker-simple-none", "speaker-simple-slash", "speaker-simple-x", "speaker-slash", "speaker-x", "speedometer", "sphere", "spinner", "spinner-ball", "spinner-gap", "spiral", "split-horizontal", "split-vertical", "spray-bottle", "square", "square-half", "square-half-bottom", "square-split-horizontal", "square-split-vertical", "squares-four", "stack", "stack-minus", "stack-plus", "stack-simple", "stairs", "stamp", "standard-definition", "star", "star-and-crescent", "star-four", "star-half", "star-of-david", "steering-wheel", "steps", "stethoscope", "sticker", "stool", "stop", "stop-circle", "storefront", "strategy", "student", "subset-of", "subset-proper-of", "subtitles", "subtitles-slash", "subtract", "subtract-square", "subway", "suitcase", "suitcase-rolling", "suitcase-simple", "sun", "sun-dim", "sun-horizon", "sunglasses", "superset-of", "superset-proper-of", "swap", "swatches", "swimming-pool", "sword", "synagogue", "syringe", "t-shirt", "table", "tabs", "tag", "tag-chevron", "tag-simple", "target", "taxi", "tea-bag", "television", "television-simple", "tennis-ball", "tent", "terminal", "terminal-window", "test-tube", "text-a-underline", "text-aa", "text-align-center", "text-align-justify", "text-align-left", "text-align-right", "text-b", "text-columns", "text-h", "text-h-five", "text-h-four", "text-h-one", "text-h-six", "text-h-three", "text-h-two", "text-indent", "text-italic", "text-outdent", "text-strikethrough", "text-subscript", "text-superscript", "text-t", "text-t-slash", "text-underline", "textbox", "thermometer", "thermometer-cold", "thermometer-hot", "thermometer-simple", "three-d", "thumbs-down", "thumbs-up", "ticket", "tilde", "timer", "tip-jar", "tipi", "tire", "toggle-left", "toggle-right", "toilet", "toilet-paper", "toolbox", "tooth", "tornado", "tote", "tote-simple", "towel", "tractor", "trademark", "trademark-registered", "traffic-cone", "traffic-sign", "traffic-signal", "train", "train-regional", "train-simple", "tram", "translate", "trash", "trash-simple", "tray", "tray-arrow-down", "tray-arrow-up", "treasure-chest", "tree", "tree-evergreen", "tree-palm", "tree-structure", "tree-view", "trend-down", "trend-up", "triangle", "triangle-dashed", "trolley", "trolley-suitcase", "trophy", "truck", "truck-trailer", "umbrella", "umbrella-simple", "union", "unite", "unite-square", "upload", "upload-simple", "usb", "user", "user-check", "user-circle", "user-circle-check", "user-circle-dashed", "user-circle-gear", "user-circle-minus", "user-circle-plus", "user-focus", "user-gear", "user-list", "user-minus", "user-plus", "user-rectangle", "user-sound", "user-square", "user-switch", "users", "users-four", "users-three", "van", "vault", "vector-three", "vector-two", "vibrate", "video", "video-camera", "video-camera-slash", "video-conference", "vignette", "vinyl-record", "virtual-reality", "virus", "visor", "voicemail", "volleyball", "wall", "wallet", "warehouse", "warning", "warning-circle", "warning-diamond", "warning-octagon", "washing-machine", "watch", "wave-sawtooth", "wave-sine", "wave-square", "wave-triangle", "waveform", "waveform-slash", "waves", "webcam", "webcam-slash", "wheelchair", "wheelchair-motion", "wifi-high", "wifi-low", "wifi-medium", "wifi-none", "wifi-slash", "wifi-x", "wind", "windmill", "wine", "wrench", "x", "x-circle", "x-square", "yarn", "yin-yang"]);
5
+ /** Os mesmos, em tempo de execução. */
6
+ export const NOMES_BOLD = new Set(["x"]);
package/dist/icon.d.ts CHANGED
@@ -16,13 +16,14 @@ export type AureaIconComponent = (props: {
16
16
  */
17
17
  export type AureaIcon = IconName | AureaIconComponent;
18
18
  export type { IconName, PhosphorIconName, AureaIconNames, IconWeight } from "./icon-names.js";
19
- import type { IconName, IconWeight, PhosphorIconName } from "./icon-names.js";
19
+ import type { BoldIconName, IconName, IconWeight, PhosphorIconName } from "./icon-names.js";
20
20
  /**
21
21
  * Parcial: o app registra só os que usa, e uma chave com erro de digitação reprova. A forma cheia
22
22
  * (o item escolhido, ADR-0053) entra com o sufixo `-fill`, como o arquivo:
23
- * `{"house": House, "house-fill": HouseFill}`.
23
+ * `{"house": House, "house-fill": HouseFill}`. O traço grosso (0.32.0), com `-bold`, só para os
24
+ * nomes que o têm — hoje o `x` do `CloseButton`: `{"x-bold": XBold}`.
24
25
  */
25
- export type AureaIconRegistry = Readonly<Partial<Record<IconName | `${PhosphorIconName}-fill`, AureaIconComponent>>>;
26
+ export type AureaIconRegistry = Readonly<Partial<Record<IconName | `${PhosphorIconName}-fill` | `${BoldIconName}-bold`, AureaIconComponent>>>;
26
27
  /**
27
28
  * Declara o registro. É uma função de identidade tipada, e ela existe por um motivo prático:
28
29
  * escrita como constante no módulo do app, a referência é estável — e um registro recriado a cada
@@ -123,7 +124,8 @@ export interface IconProps {
123
124
  icons?: AureaIconRegistry;
124
125
  /**
125
126
  * `fill` desenha a forma cheia — a do item escolhido (ADR-0053). Ela é a chave `<nome>-fill`
126
- * do registro; se o app não a registrou, sai o glifo regular, em vez de nada.
127
+ * do registro; se o app não a registrou, sai o glifo regular, em vez de nada. `bold` (0.32.0) é
128
+ * a chave `<nome>-bold`, pela mesma regra.
127
129
  */
128
130
  weight?: IconWeight;
129
131
  /**
package/dist/icon.js CHANGED
@@ -106,7 +106,7 @@ export function Icon({ name, size = "md", color, icons, label, weight }) {
106
106
  // O desenho passado direto (R-11) não consulta o registro.
107
107
  const Glifo = typeof name === "function"
108
108
  ? name
109
- : (weight === "fill" ? registro?.[`${name}-fill`] : undefined) ?? registro?.[name];
109
+ : (weight === "fill" || weight === "bold" ? registro?.[`${name}-${weight}`] : undefined) ?? registro?.[name];
110
110
  if (!Glifo) {
111
111
  if (__DEV__) {
112
112
  console.warn(`Aurea Icon: "${name}" não está no registro. Importe-o pelo caminho profundo e ` +
package/dist/index.d.ts CHANGED
@@ -12,8 +12,8 @@ export { Screen } from "./screen.js";
12
12
  export type { ScreenProps, AureaScreenBackground, AureaScreenEdge } from "./screen.js";
13
13
  export { Stack, Cluster, Grid, Card, Separator } from "./layout.js";
14
14
  export type { StackProps, ClusterProps, AureaStackAlign, AureaClusterAlign, AureaClusterJustify, GridProps, CardProps, SeparatorProps, AureaCardVariant, AureaCardAccent, AureaGridMin, } from "./layout.js";
15
- export { Button, IconButton, LinkButton, ThemeToggle } from "./actions.js";
16
- export type { ButtonProps, IconButtonProps, LinkButtonProps, ThemeToggleProps, AureaButtonAppearance, AureaButtonSize, AureaButtonTone, AureaShareData, } from "./actions.js";
15
+ export { Button, IconButton, LinkButton, ThemeToggle, CloseButton } from "./actions.js";
16
+ export type { ButtonProps, IconButtonProps, LinkButtonProps, ThemeToggleProps, CloseButtonProps, AureaButtonAppearance, AureaButtonSize, AureaButtonTone, AureaShareData, } from "./actions.js";
17
17
  export { Spinner, Skeleton, Progress, Alert, EmptyState, DataState, ICONE_DA_VARIANTE } from "./feedback.js";
18
18
  export type { SpinnerProps, SkeletonProps, ProgressProps, AlertProps, EmptyStateProps, DataStateProps, AureaSpinnerSize, AureaAlertVariant, AureaDataStateValue, AureaProgressTone, } from "./feedback.js";
19
19
  export { Badge, Status, Avatar, KPI, formatarContagem } from "./display.js";
@@ -43,3 +43,10 @@ export type { NumberFieldProps, AureaSeparadores, AureaNumberFieldSize } from ".
43
43
  export { Image, Gallery } from "./midia.js";
44
44
  export type { ImageProps, GalleryProps, AureaGalleryItem, AureaImageSource, } from "./midia.js";
45
45
  export type { AureaFilaJustify } from "./rolagem.js";
46
+ export { Accordion, ScrollShadow, SkeletonGroup, PressableFeedback } from "./exibicao.js";
47
+ export type { AccordionProps, AureaAccordionItem, AureaAccordionVariant, ScrollShadowProps, AureaScrollShadowOrientation, AureaScrollShadowVisibility, AureaScrollShadowVariant, SkeletonGroupProps, PressableFeedbackProps, PressableFeedbackScaleProps, PressableFeedbackHighlightProps, PressableFeedbackRippleProps, } from "./exibicao.js";
48
+ export type { AureaSkeletonAnimation } from "./feedback.js";
49
+ export { Slider, OTPField, TagGroup } from "./escolha.js";
50
+ export type { SliderProps, AureaSliderOrientation, OTPFieldProps, TagGroupProps, AureaTagItem, AureaTagSize, AureaTagVariant, AureaTagGroupSelectionMode, } from "./escolha.js";
51
+ export { Popover, DropdownMenu } from "./menu.js";
52
+ export type { PopoverProps, DropdownMenuProps, AureaOverlaySide, MenuEntry, MenuActionDef, MenuLinkDef, MenuCheckboxDef, MenuRadioGroupDef, MenuSubmenuDef, MenuGroupDef, } from "./menu.js";
package/dist/index.js CHANGED
@@ -37,7 +37,7 @@ export { Icon, IconRegistryProvider, criarRegistroDeIcones, criarGlifo } from ".
37
37
  // autorizada pelo Victor em 03/09/2026 depois de o lote parar por ela (`BUILDING.md` §3).
38
38
  export { Screen } from "./screen.js";
39
39
  export { Stack, Cluster, Grid, Card, Separator } from "./layout.js";
40
- export { Button, IconButton, LinkButton, ThemeToggle } from "./actions.js";
40
+ export { Button, IconButton, LinkButton, ThemeToggle, CloseButton } from "./actions.js";
41
41
  // ── Lote 2 — o painel, que é só leitura ────────────────────────────────────────────────────
42
42
  export { Spinner, Skeleton, Progress, Alert, EmptyState, DataState, ICONE_DA_VARIANTE } from "./feedback.js";
43
43
  export { Badge, Status, Avatar, KPI, formatarContagem } from "./display.js";
@@ -118,3 +118,12 @@ export { NumberField, formatarNumero, lerNumero, separadoresDoLocale } from "./n
118
118
  // promete e que o primitivo cru não faz. Foi por não fazê-las que o `Avatar` precisou de
119
119
  // conserto em 31/07/2026.
120
120
  export { Image, Gallery } from "./midia.js";
121
+ // ── 0.32.0, passo 9b — as peças que faltavam no nativo, com a API da web ────────────────────
122
+ // As nove são as do pacote nativo da referência (anatomia, medidas, comportamento), com o que é da
123
+ // Aurea por cima. O que ficou de fora de cada uma está no cabeçalho do arquivo dela.
124
+ // ⚠ O `ScrollShadow` é um FIO na ponta com mais conteúdo, e não o degradê dela (decisão do Victor:
125
+ // a Aurea não tem degradê). O `DropdownMenu` usa o MESMO `MenuEntry` da web; o `destructive` do
126
+ // item de ação é só do nativo, por enquanto.
127
+ export { Accordion, ScrollShadow, SkeletonGroup, PressableFeedback } from "./exibicao.js";
128
+ export { Slider, OTPField, TagGroup } from "./escolha.js";
129
+ export { Popover, DropdownMenu } from "./menu.js";
package/dist/inputs.d.ts CHANGED
@@ -6,6 +6,7 @@ import type { AureaTokens } from "./tokens.js";
6
6
  export type AureaFieldSize = "sm" | "md" | "lg";
7
7
  export declare const alturaDoTamanho: (t: AureaTokens, s: AureaFieldSize) => number;
8
8
  export declare const respiroDoTamanho: (t: AureaTokens, s: AureaFieldSize) => number;
9
+ export declare const respiroDoGatilho: (t: AureaTokens, s: AureaFieldSize) => number;
9
10
  type ContextoDeCampo = {
10
11
  label?: string;
11
12
  hint?: string;
@@ -143,7 +144,7 @@ export interface TextareaProps extends InputProps {
143
144
  /** Linhas visíveis. Vira altura mínima, porque no RN não há `rows`. */
144
145
  rows?: number;
145
146
  }
146
- /** A caixa alta. Mesmo campo, `multiline`, raio LG e altura mínima de 104 (medida no CSS). */
147
+ /** A caixa alta. Mesmo campo, `multiline`, raio LG e altura mínima de 128 (a da referência, 0.32.0). */
147
148
  export declare function Textarea({ rows, size, style, ...rest }: TextareaProps): React.JSX.Element;
148
149
  interface ControleProps {
149
150
  label?: React.ReactNode;
@@ -348,8 +349,8 @@ export interface SwitchProps extends ControleProps {
348
349
  *
349
350
  * ⚠ **NÃO é o `Switch` do React Native**, pela mesma razão que o `Spinner` não é o
350
351
  * `ActivityIndicator`: aquele desenha o interruptor do sistema no Android e o do iOS no iOS —
351
- * duas aparências que o `CLAUDE.md` proíbe em voz alta. As medidas aqui são as do CSS: trilho de
352
- * `altura × 7/6` por `altura × 2/3`, polegar com 3 de folga.
352
+ * duas aparências que o `CLAUDE.md` proíbe em voz alta. As medidas são as do interruptor da
353
+ * referência (0.32.0): trilho de 48 × 24 e bolinha em cápsula de 28 × 20, a 2 da borda.
353
354
  *
354
355
  * ⚠ **E ele respeita "menos movimento"**: com a preferência ligada, o polegar salta em vez de
355
356
  * deslizar. O estado continua o mesmo — o que some é a animação, não a informação.
@@ -383,6 +384,14 @@ export interface SegmentedControlProps extends ViewProps {
383
384
  * `radio` por segmento, e o estado `selected` em quem está escolhido.
384
385
  */
385
386
  export declare function SegmentedControl({ items, value, onChange, label, disabled, justify, fullWidth, style, ...rest }: SegmentedControlProps): React.JSX.Element;
387
+ /**
388
+ * O indicador da opção escolhida, nas listas do `Select` e do `Combobox` (0.32.0): o da referência
389
+ * — a caixa de 20 com o `check` de 16 — e o mesmo glifo da coluna `.combobox-check` da web. A cor
390
+ * é a do destaque que se lê como ícone nos dois temas (`primaryEmphasis`, ADR-0054). Sai do
391
+ * arquivo, não do pacote — e é função, não componente, para não contar como peça nova. ⚠ Pede o
392
+ * `check` no registro de ícones do app; sem ele, o aviso de desenvolvimento do `Icon` diz o import.
393
+ */
394
+ export declare const indicadorDaEscolhida: (t: AureaTokens) => React.JSX.Element;
386
395
  export interface SelectProps {
387
396
  items: Array<{
388
397
  value: string;