@openzeppelin/ui-components 3.3.1 → 3.5.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/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
2
2
  import { VariantProps } from "class-variance-authority";
3
3
  import * as React$2 from "react";
4
- import React$1, { ForwardedRef, JSX, ReactElement, ReactNode } from "react";
4
+ import React$1, { Context, ForwardedRef, JSX, ReactElement, ReactNode } from "react";
5
5
  import { AddressCandidateClassification } from "@openzeppelin/ui-utils";
6
6
  import * as react_jsx_runtime0 from "react/jsx-runtime";
7
7
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
@@ -16,9 +16,9 @@ import * as ProgressPrimitive from "@radix-ui/react-progress";
16
16
  import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
17
17
  import * as SelectPrimitive from "@radix-ui/react-select";
18
18
  import * as TabsPrimitive from "@radix-ui/react-tabs";
19
- import { AddressLabelResolver, AddressSuggestion, AddressSuggestionResolver, AddressingCapability, ContractSchema, Ecosystem, EcosystemMetadata, EnumValue, FieldValidation, FormFieldType, FunctionParameter, MapEntry, NetworkConfig, NetworkType, RelayerDetails, RelayerDetailsRich, RuntimeCapability, TypeMappingCapability } from "@openzeppelin/ui-types";
19
+ import { AddressLabelResolver, AddressNameResolver, AddressSuggestion, AddressSuggestionResolver, AddressingCapability, ContractSchema, Ecosystem, EcosystemMetadata, EnumValue, FieldValidation, FormFieldType, FunctionParameter, MapEntry, NameResolutionError, NameResolver, NetworkConfig, NetworkLabelResolver, NetworkType, RelayerDetails, RelayerDetailsRich, ResolutionResult, ResolvedAddress, ResolvedName, RuntimeCapability, TypeMappingCapability } from "@openzeppelin/ui-types";
20
20
  import { ToasterProps } from "sonner";
21
- import * as class_variance_authority_types1 from "class-variance-authority/types";
21
+ import * as class_variance_authority_types0 from "class-variance-authority/types";
22
22
 
23
23
  //#region src/version.d.ts
24
24
  declare const VERSION: string;
@@ -26,13 +26,13 @@ declare const VERSION: string;
26
26
  //#region src/components/ui/accordion.d.ts
27
27
  declare const accordionItemVariants: (props?: ({
28
28
  variant?: "default" | "card" | null | undefined;
29
- } & class_variance_authority_types1.ClassProp) | undefined) => string;
29
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
30
30
  declare const accordionTriggerVariants: (props?: ({
31
31
  variant?: "default" | "card" | null | undefined;
32
- } & class_variance_authority_types1.ClassProp) | undefined) => string;
32
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
33
33
  declare const accordionContentVariants: (props?: ({
34
34
  variant?: "default" | "card" | null | undefined;
35
- } & class_variance_authority_types1.ClassProp) | undefined) => string;
35
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
36
36
  type AccordionVariant = 'default' | 'card';
37
37
  type AccordionProps = (AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & {
38
38
  variant?: AccordionVariant;
@@ -45,6 +45,18 @@ declare const AccordionTrigger: React$2.ForwardRefExoticComponent<AccordionTrigg
45
45
  interface AccordionContentProps extends React$2.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>, VariantProps<typeof accordionContentVariants> {}
46
46
  declare const AccordionContent: React$2.ForwardRefExoticComponent<AccordionContentProps & React$2.RefAttributes<HTMLDivElement>>;
47
47
  //#endregion
48
+ //#region src/components/ui/address-display/address-avatar.d.ts
49
+ /**
50
+ * Visual treatment for {@link AddressAvatar}.
51
+ *
52
+ * - `'fill'` – a square avatar that stretches to the parent slot's full
53
+ * height and sits flush against its edges (default). Intended for a chip
54
+ * whose container clips it with `overflow-hidden` + a border radius.
55
+ * - `'circle'` – small round avatar sitting inline with the text (the
56
+ * original look, kept as an opt-in).
57
+ */
58
+ type AddressAvatarVariant = 'circle' | 'fill';
59
+ //#endregion
48
60
  //#region src/components/ui/address-display/address-display.d.ts
49
61
  /**
50
62
  * Visual style for the component container.
@@ -123,9 +135,12 @@ interface AddressDisplayProps extends React$2.HTMLAttributes<HTMLDivElement> {
123
135
  */
124
136
  networkId?: string;
125
137
  /**
126
- * When `true`, skip label resolution from `AddressLabelContext`.
127
- * Useful for rendering an address without alias decoration (e.g. in
128
- * a contract selector where the contract name is already shown).
138
+ * When `true`, render the instance fully raw: skip label resolution from
139
+ * `AddressLabelContext` AND suppress any injected resolved name
140
+ * (`resolvedName` prop / `AddressNameContext`). Useful for rendering an
141
+ * address without any decoration (e.g. in a contract selector where the
142
+ * contract name is already shown) — existing `disableLabel` call-sites
143
+ * must not sprout a name once a resolver is wired app-wide.
129
144
  * @default false
130
145
  */
131
146
  disableLabel?: boolean;
@@ -142,6 +157,45 @@ interface AddressDisplayProps extends React$2.HTMLAttributes<HTMLDivElement> {
142
157
  * @default "chip"
143
158
  */
144
159
  variant?: AddressDisplayVariant;
160
+ /**
161
+ * Optional presentational leading element (e.g. an avatar or icon), rendered
162
+ * before the label/address block and vertically centered against it. Purely
163
+ * visual — a `React.ReactNode`, not a capability, so this component stays
164
+ * chain-agnostic. When omitted (the default at every existing call-site), the
165
+ * rendered DOM and layout are byte-for-byte identical to the pre-avatar
166
+ * component: no wrapper element, no reserved slot, in both render branches.
167
+ */
168
+ avatar?: React$2.ReactNode;
169
+ /**
170
+ * Visual treatment for the leading avatar (both the record-constructed ENS
171
+ * avatar and an explicit `avatar` node):
172
+ *
173
+ * - `'fill'` – a square avatar that stretches to the chip's full height and
174
+ * sits flush against its top, bottom, and left edges (default; the chip
175
+ * clips its outer corners). No effect when no avatar is shown.
176
+ * - `'circle'` – small round avatar sitting inline with the text (the
177
+ * original look, kept as an opt-in).
178
+ *
179
+ * @default "fill"
180
+ */
181
+ avatarVariant?: AddressAvatarVariant;
182
+ /**
183
+ * An already-resolved reverse name record for this address (value type).
184
+ * Highest precedence for the name channel — shadows the
185
+ * `AddressNameContext` resolver, exactly as `label` shadows
186
+ * `AddressLabelContext` (INV-120). The record's name renders only when
187
+ * `forwardVerified === true` (INV-52, LOCKED): a mismatched record is
188
+ * suppressed to hex — never name-alone, never name+warning. `undefined`
189
+ * falls back to the context (if any), then to hex.
190
+ */
191
+ resolvedName?: ResolvedName;
192
+ /**
193
+ * When `false`, suppresses the reverse cross-network fallback indicator
194
+ * (amber triangle-alert icon + tooltip) inline after the verified name.
195
+ * Default `true`. Provenance classification is unchanged — only presentation
196
+ * is omitted so the labeled branch stays byte-identical to a row without fallback.
197
+ */
198
+ showCrossNetworkFallbackDisclaimer?: boolean;
145
199
  /**
146
200
  * Additional CSS classes
147
201
  */
@@ -149,15 +203,27 @@ interface AddressDisplayProps extends React$2.HTMLAttributes<HTMLDivElement> {
149
203
  }
150
204
  /**
151
205
  * Displays a blockchain address with optional truncation, copy button,
152
- * explorer link, tooltip, and human-readable label.
206
+ * explorer link, tooltip, human-readable label, and (when an already-resolved
207
+ * record is injected) a forward-verified name + avatar.
153
208
  *
154
- * Labels are resolved in priority order:
209
+ * Labels are resolved in priority order (INV-56):
155
210
  * 1. Explicit `label` prop
156
211
  * 2. `AddressLabelContext` resolver (via `AddressLabelProvider`)
157
- * 3. No label (renders address only, identical to previous behavior)
158
- *
159
- * Pass `disableLabel` to suppress context-based resolution (e.g. when the
160
- * surrounding UI already shows a name, such as a contract selector).
212
+ * 3. Forward-verified resolved name (`resolvedName` prop, else
213
+ * `AddressNameContext` via `AddressNameProvider`) — a record with
214
+ * `forwardVerified: false` is suppressed to hex (INV-52, LOCKED)
215
+ * 4. No label (renders address only, identical to previous behavior)
216
+ *
217
+ * The component is synchronous and capability-free (INV-121): it never
218
+ * resolves anything itself — it reads injected values. Hex renders on first
219
+ * commit; the name+avatar swap in when the react layer feeds an updated
220
+ * record (progressive enhancement, INV-61). With no `resolvedName` and no
221
+ * `AddressNameProvider`, output is byte-identical to the pre-enhancement
222
+ * component (INV-54, LOCKED).
223
+ *
224
+ * Pass `disableLabel` to render fully raw — it suppresses both the context
225
+ * alias and any injected resolved name (e.g. when the surrounding UI already
226
+ * shows a name, such as a contract selector).
161
227
  *
162
228
  * @example
163
229
  * ```tsx
@@ -184,6 +250,14 @@ interface AddressDisplayProps extends React$2.HTMLAttributes<HTMLDivElement> {
184
250
  * // Inline variant (no chip background) — useful inside wallet bars
185
251
  * <AddressDisplay address="0x742d35Cc..." variant="inline" showTooltip showCopyButton />
186
252
  *
253
+ * // Reverse-resolved name + avatar via an injected value (react layer owns the async)
254
+ * <AddressDisplay address="0x742d35Cc..." resolvedName={record} showCopyButton />
255
+ *
256
+ * // Or subtree-wide via context (rows stay plain <AddressDisplay/>)
257
+ * <AddressNameProvider resolveAddressName={readFromResolutionCache}>
258
+ * <AddressDisplay address="0x742d35Cc..." />
259
+ * </AddressNameProvider>
260
+ *
187
261
  * // Truncate only when an alias/label is present (full address when unlabeled)
188
262
  * <AddressDisplay address="G..." truncateWhenLabeled />
189
263
  * ```
@@ -204,6 +278,10 @@ declare function AddressDisplay({
204
278
  disableLabel,
205
279
  showTooltip,
206
280
  variant,
281
+ avatar,
282
+ avatarVariant,
283
+ resolvedName,
284
+ showCrossNetworkFallbackDisclaimer,
207
285
  className,
208
286
  onPointerEnter,
209
287
  onPointerLeave,
@@ -275,10 +353,63 @@ interface UseAddressLabelResult {
275
353
  */
276
354
  declare function useAddressLabel(address: string, networkId?: string): UseAddressLabelResult;
277
355
  //#endregion
356
+ //#region src/components/ui/address-display/address-name-context.d.ts
357
+ /**
358
+ * Props for `AddressNameProvider`.
359
+ *
360
+ * Accepts the same shape as `AddressNameResolver` so the provider can be
361
+ * spread directly from a resolver source: `<AddressNameProvider {...resolver}>`.
362
+ */
363
+ interface AddressNameProviderProps extends AddressNameResolver {
364
+ children: React$2.ReactNode;
365
+ }
366
+ /**
367
+ * Provides reverse-name resolution to all `AddressDisplay` instances in the
368
+ * subtree. `resolveAddressName` MUST be synchronous — it is called during
369
+ * render (INV-122). A resolver that returns `undefined` for an address is
370
+ * behaviorally identical to mounting no provider (INV-54).
371
+ *
372
+ * @param props - Resolver function and children
373
+ */
374
+ declare function AddressNameProvider({
375
+ children,
376
+ resolveAddressName,
377
+ resolveNetworkLabel
378
+ }: AddressNameProviderProps): React$2.ReactElement;
379
+ //#endregion
380
+ //#region src/components/ui/address-display/use-address-name.d.ts
381
+ /**
382
+ * Return type for the `useAddressName` convenience hook.
383
+ */
384
+ interface UseAddressNameResult {
385
+ /** Resolved record, or `undefined` if no provider/record exists */
386
+ record: ResolvedName | undefined;
387
+ }
388
+ /**
389
+ * Reads the `AddressNameContext` for one address, synchronously (INV-122).
390
+ * Returns `{ record: undefined }` when no provider is mounted — never throws,
391
+ * never suspends. Note the record is returned verbatim: callers rendering a
392
+ * name from it must apply the same `forwardVerified === true` gate that
393
+ * `AddressDisplay` applies (INV-52).
394
+ *
395
+ * @param address - The blockchain address to reverse-resolve
396
+ * @param networkId - Optional network identifier scoping the lookup
397
+ * @returns The current best-known record for the address
398
+ *
399
+ * @example
400
+ * ```tsx
401
+ * function EnsBadge({ address }: { address: string }) {
402
+ * const { record } = useAddressName(address);
403
+ * return record?.forwardVerified ? <Badge>{record.name}</Badge> : null;
404
+ * }
405
+ * ```
406
+ */
407
+ declare function useAddressName(address: string, networkId?: string): UseAddressNameResult;
408
+ //#endregion
278
409
  //#region src/components/ui/alert.d.ts
279
410
  declare const Alert: React$2.ForwardRefExoticComponent<React$2.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
280
411
  variant?: "default" | "destructive" | "success" | null | undefined;
281
- } & class_variance_authority_types1.ClassProp) | undefined) => string> & React$2.RefAttributes<HTMLDivElement>>;
412
+ } & class_variance_authority_types0.ClassProp) | undefined) => string> & React$2.RefAttributes<HTMLDivElement>>;
282
413
  declare const AlertTitle: React$2.ForwardRefExoticComponent<React$2.HTMLAttributes<HTMLHeadingElement> & React$2.RefAttributes<HTMLParagraphElement>>;
283
414
  declare const AlertDescription: React$2.ForwardRefExoticComponent<React$2.HTMLAttributes<HTMLParagraphElement> & React$2.RefAttributes<HTMLParagraphElement>>;
284
415
  //#endregion
@@ -332,7 +463,7 @@ declare const Banner: React$2.ForwardRefExoticComponent<BannerProps & React$2.Re
332
463
  declare const buttonVariants: (props?: ({
333
464
  variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
334
465
  size?: "default" | "sm" | "lg" | "icon" | null | undefined;
335
- } & class_variance_authority_types1.ClassProp) | undefined) => string;
466
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
336
467
  //#endregion
337
468
  //#region src/components/ui/button.d.ts
338
469
  interface ButtonProps extends React$2.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
@@ -1330,6 +1461,24 @@ interface AddressFieldProps<TFieldValues extends FieldValues = FieldValues> exte
1330
1461
  * so callers can perform additional side-effects beyond filling the field value.
1331
1462
  */
1332
1463
  onSuggestionSelect?: (suggestion: AddressSuggestion) => void;
1464
+ /**
1465
+ * Fired when the resolved-and-name-matched name changes. Emits the resolved
1466
+ * NAME (not the hex) on `resolved` + name-match, and `undefined` in every
1467
+ * other state (idle / debouncing / loading / error / hex / cleared).
1468
+ *
1469
+ * Pure notification for consumers that want the human-readable name (e.g.
1470
+ * the address book's alias suggestion, SF-5 INV-109..111). It reads existing
1471
+ * resolution state and does NOT participate in the resolved-hex write path
1472
+ * (INV-75/79/80/81/85 unaffected). With no injected resolver it only ever
1473
+ * emits `undefined`, so the field stays behavior-identical (INV-82).
1474
+ */
1475
+ onResolvedNameChange?: (name: string | undefined) => void;
1476
+ /**
1477
+ * When `false`, suppresses the forward cross-network fallback disclaimer under
1478
+ * the frozen "Resolved to …" template. Default `true`. Use when a sibling
1479
+ * `AddressDisplay` already surfaces the same message (e.g. demo resolved card).
1480
+ */
1481
+ showCrossNetworkFallbackDisclaimer?: boolean;
1333
1482
  }
1334
1483
  /**
1335
1484
  * Address input field component specifically designed for blockchain addresses via React Hook Form integration.
@@ -1358,7 +1507,22 @@ interface AddressFieldProps<TFieldValues extends FieldValues = FieldValues> exte
1358
1507
  * Pass `suggestions={false}` to opt out when a provider is mounted.
1359
1508
  *
1360
1509
  * The suggestion dropdown includes built-in debouncing, keyboard navigation (Arrow keys,
1361
- * Enter, Escape), click-outside dismissal, and ARIA listbox semantics.
1510
+ * Enter, Escape), click-outside dismissal, and ARIA listbox semantics — all provided by
1511
+ * the shared headless `useAddressSuggestionField` hook + `AddressSuggestionList`.
1512
+ *
1513
+ * **Inline name resolution (SF-3, opt-in via context).** When a
1514
+ * `NameResolverProvider` is mounted, the field also accepts a name (e.g.
1515
+ * `alice.eth`): the name is resolved inline through the injected `resolveName`
1516
+ * and the RHF form value becomes the resolved hex — never the name, never a
1517
+ * silently-coerced value. The correctness spine is a shadow-state model:
1518
+ * the `<input>` always shows the typed string (`inputValue`, INV-69); the RHF
1519
+ * value is `''` for every unresolved name state so submit stays gated with no
1520
+ * async validator (INV-75); the single name→hex write fires only on
1521
+ * `resolved` + normalized name-match (INV-79/80). With **no** provider mounted
1522
+ * every resolution branch below is dead code and the field is byte-identical
1523
+ * to its pre-ENS behavior (INV-82 — the LOCKED backward-compat guarantee).
1524
+ * The component stays capability-free: it never reads a runtime or wallet
1525
+ * state; everything arrives through the injected context (INV-118).
1362
1526
  */
1363
1527
  declare function AddressField<TFieldValues extends FieldValues = FieldValues>({
1364
1528
  id,
@@ -1372,7 +1536,9 @@ declare function AddressField<TFieldValues extends FieldValues = FieldValues>({
1372
1536
  addressing,
1373
1537
  readOnly,
1374
1538
  suggestions: suggestionsProp,
1375
- onSuggestionSelect
1539
+ onSuggestionSelect,
1540
+ onResolvedNameChange,
1541
+ showCrossNetworkFallbackDisclaimer
1376
1542
  }: AddressFieldProps<TFieldValues>): React$1.ReactElement;
1377
1543
  declare namespace AddressField {
1378
1544
  var displayName: string;
@@ -1524,6 +1690,253 @@ interface UseAddressSuggestionsResult {
1524
1690
  /** Resolves address suggestions from the nearest `AddressSuggestionProvider`. */
1525
1691
  declare function useAddressSuggestions(query: string, networkId?: string): UseAddressSuggestionsResult;
1526
1692
  //#endregion
1693
+ //#region src/components/fields/address-suggestion/useAddressSuggestionField.d.ts
1694
+ /** Arguments for {@link useAddressSuggestionField}. */
1695
+ interface UseAddressSuggestionFieldArgs {
1696
+ /** The current input text — drives the debounce and dropdown visibility. */
1697
+ readonly inputValue: string;
1698
+ /**
1699
+ * Explicit suggestion list. When an array, it overrides context resolution and
1700
+ * is rendered as-is (no cap). `false` disables suggestions entirely (even with
1701
+ * a provider mounted). `undefined` falls back to context resolution.
1702
+ */
1703
+ readonly suggestions?: AddressSuggestion[] | false;
1704
+ /** Optional network id forwarded to the context resolver for scoping. */
1705
+ readonly networkId?: string;
1706
+ }
1707
+ /** State and handlers returned by {@link useAddressSuggestionField}. */
1708
+ interface UseAddressSuggestionFieldResult {
1709
+ /** Ref for the field container — used for click-outside detection. */
1710
+ readonly containerRef: React.RefObject<HTMLDivElement | null>;
1711
+ /** The suggestions to render (context-resolved + capped, or the explicit array). */
1712
+ readonly resolvedSuggestions: AddressSuggestion[];
1713
+ /** `true` when the dropdown is open AND there is at least one suggestion. */
1714
+ readonly hasSuggestions: boolean;
1715
+ /** Index of the keyboard-highlighted option, or `-1` when none. */
1716
+ readonly highlightedIndex: number;
1717
+ /** `true` when suggestions are explicitly disabled (`suggestions === false`). */
1718
+ readonly suggestionsDisabled: boolean;
1719
+ /** Set the highlighted option index (e.g. on hover). */
1720
+ readonly setHighlightedIndex: (index: number) => void;
1721
+ /** Close the dropdown and clear the highlight. */
1722
+ readonly closeSuggestions: () => void;
1723
+ /** Notify the hook of an input change — opens/closes the dropdown and resets highlight. */
1724
+ readonly onInputChange: (value: string) => void;
1725
+ /** Container-level keydown handler: wrapping ArrowUp / ArrowDown navigation. */
1726
+ readonly onContainerKeyDown: (e: React.KeyboardEvent) => void;
1727
+ }
1728
+ /**
1729
+ * Headless address-suggestion dropdown behavior. See the module docstring for
1730
+ * the full behavior contract.
1731
+ *
1732
+ * @param args - {@link UseAddressSuggestionFieldArgs}.
1733
+ * @returns {@link UseAddressSuggestionFieldResult}.
1734
+ */
1735
+ declare function useAddressSuggestionField({
1736
+ inputValue,
1737
+ suggestions: suggestionsProp,
1738
+ networkId
1739
+ }: UseAddressSuggestionFieldArgs): UseAddressSuggestionFieldResult;
1740
+ //#endregion
1741
+ //#region src/components/fields/address-suggestion/AddressSuggestionList.d.ts
1742
+ /** Props for {@link AddressSuggestionList}. */
1743
+ interface AddressSuggestionListProps {
1744
+ /** Field id — anchors the listbox id (`${id}-suggestions`) and option ids. */
1745
+ readonly id: string;
1746
+ /** The suggestions to render. */
1747
+ readonly suggestions: AddressSuggestion[];
1748
+ /** Index of the currently highlighted option, or `-1`. */
1749
+ readonly highlightedIndex: number;
1750
+ /** Called when an option is selected (click / mouse-down). */
1751
+ readonly onSelect: (suggestion: AddressSuggestion) => void;
1752
+ /** Called when an option is hovered, to sync the highlight. */
1753
+ readonly onHighlight: (index: number) => void;
1754
+ }
1755
+ /**
1756
+ * Render the suggestion dropdown. Returns `null` when there are no suggestions
1757
+ * (the consuming field also gates on `hasSuggestions`, so this is a safety net).
1758
+ *
1759
+ * @param props - {@link AddressSuggestionListProps}.
1760
+ */
1761
+ declare function AddressSuggestionList({
1762
+ id,
1763
+ suggestions,
1764
+ highlightedIndex,
1765
+ onSelect,
1766
+ onHighlight
1767
+ }: AddressSuggestionListProps): React$2.ReactElement | null;
1768
+ declare namespace AddressSuggestionList {
1769
+ var displayName: string;
1770
+ }
1771
+ //#endregion
1772
+ //#region src/components/fields/name-resolution/context.d.ts
1773
+ /**
1774
+ * Value held by NameResolverContext. Extends the SF-3 injection seam with
1775
+ * optional network context for SF-6 chain-scope gating only.
1776
+ */
1777
+ interface NameResolverContextValue extends NameResolver {
1778
+ /**
1779
+ * Active network id for chain-scope submit gating (opaque string).
1780
+ * When absent, `isChainScopeMismatch` is never true and coinType wrong-chain
1781
+ * protection is the integrator's responsibility.
1782
+ */
1783
+ readonly activeNetworkId?: string | null;
1784
+ /**
1785
+ * Optional human-readable active network name — interpolated into the
1786
+ * chain-scope mismatch message only (same seam as INV-78 networkName).
1787
+ */
1788
+ readonly activeNetworkName?: string;
1789
+ /**
1790
+ * Optional slug → display name for provenance disclaimer copy (003 SF-3).
1791
+ */
1792
+ readonly resolveNetworkLabel?: NetworkLabelResolver;
1793
+ }
1794
+ /**
1795
+ * @internal Shared context instance consumed by both AddressField and
1796
+ * NameResolverProvider (INV-118). Kept in its own file so component files
1797
+ * export only components (required by React Fast Refresh).
1798
+ *
1799
+ * `null` means no provider is mounted — every ENS branch in `AddressField` is
1800
+ * then dead code and the field is byte-identical to its pre-ENS behavior
1801
+ * (INV-82).
1802
+ */
1803
+ declare const NameResolverContext: Context<NameResolverContextValue | null>;
1804
+ //#endregion
1805
+ //#region src/components/fields/name-resolution/name-resolver-context.d.ts
1806
+ /**
1807
+ * Props for `NameResolverProvider`.
1808
+ *
1809
+ * Accepts the same shape as `NameResolver` so the provider can be spread
1810
+ * directly from a resolver hook: `<NameResolverProvider {...resolver}>` —
1811
+ * the same idiom as `AddressSuggestionProvider` / `AddressLabelProvider`.
1812
+ */
1813
+ interface NameResolverProviderProps extends NameResolverContextValue {
1814
+ children: React$2.ReactNode;
1815
+ }
1816
+ /**
1817
+ * Provides forward name resolution to all `AddressField` instances in the
1818
+ * subtree (zero call-site wiring, SC-001). Both functions are optional: an
1819
+ * absent `resolveName` means forward resolution is unsupported and a typed
1820
+ * name surfaces `UNSUPPORTED_NETWORK` (INV-119 / SC-006).
1821
+ *
1822
+ * ## Stable resolver identity (integrator contract)
1823
+ *
1824
+ * The injected resolver **must be referentially stable across renders** —
1825
+ * memoize it (e.g. `useMemo`) or use `useRuntimeNameResolver` from
1826
+ * `@openzeppelin/ui-react`, which is stable by construction. A resolver whose
1827
+ * function identity changes on every render (e.g. a fresh inline function) is a
1828
+ * misconfiguration: the field keys inline resolution on that identity, so a
1829
+ * churning identity would otherwise re-dispatch on every render — an unbounded
1830
+ * RPC loop on a funds path.
1831
+ *
1832
+ * The base component **detects and withstands** this (it is not merely a caveat):
1833
+ * dispatch is bounded per resolution intent so a churning resolver can never drive
1834
+ * an unbounded loop (INV-123), a one-shot development-only warning names the
1835
+ * misconfiguration (INV-124), and the field degrades to a **safe gated state**
1836
+ * (empty value, submit blocked — never a wrong address, never a throw; INV-125)
1837
+ * until the resolver is memoized. A **genuine** resolver/network swap — a single
1838
+ * identity change for a given input — is still honored and re-resolves within
1839
+ * budget (INV-119). The bound is a backstop; the contract is a stable identity.
1840
+ *
1841
+ * @param props - Injected resolver functions and children
1842
+ */
1843
+ declare function NameResolverProvider({
1844
+ children,
1845
+ isValidName,
1846
+ resolveName,
1847
+ activeNetworkId,
1848
+ activeNetworkName,
1849
+ resolveNetworkLabel
1850
+ }: NameResolverProviderProps): React$2.ReactElement;
1851
+ //#endregion
1852
+ //#region src/components/fields/name-resolution/useNameResolver.d.ts
1853
+ /**
1854
+ * Read the injected resolver context. Returns `null` when no
1855
+ * `NameResolverProvider` is mounted — the consuming field must then treat
1856
+ * every ENS branch as dead code (INV-82).
1857
+ *
1858
+ * @returns The extended context value, or `null` when no provider is mounted.
1859
+ */
1860
+ declare function useNameResolver(): NameResolverContextValue | null;
1861
+ //#endregion
1862
+ //#region src/components/fields/name-resolution/useInjectedNameResolution.d.ts
1863
+ /**
1864
+ * Default debounce window (ms) for typed names — mirrors SF-2's
1865
+ * `forwardDebounceMs` default so the field and the bare hook feel identical.
1866
+ */
1867
+ declare const NAME_RESOLUTION_DEBOUNCE_MS = 300;
1868
+ /** Forward resolver function injected through `NameResolverContext`. */
1869
+ type InjectedResolveName = (name: string) => Promise<ResolutionResult<ResolvedAddress>>;
1870
+ /**
1871
+ * Machine result — a discriminated union keyed on `status`, shaped like SF-2's
1872
+ * `UseResolveNameResult` so downstream rendering logic carries over verbatim.
1873
+ * `name` is always the normalized (trim + lowercase) input the arm refers to.
1874
+ */
1875
+ type InjectedNameResolutionResult = {
1876
+ readonly status: 'idle';
1877
+ } | {
1878
+ readonly status: 'debouncing';
1879
+ readonly name: string;
1880
+ } | {
1881
+ readonly status: 'loading';
1882
+ readonly name: string;
1883
+ } | {
1884
+ readonly status: 'resolved';
1885
+ readonly name: string;
1886
+ readonly data: ResolvedAddress;
1887
+ } | {
1888
+ readonly status: 'error';
1889
+ readonly name: string;
1890
+ readonly error: NameResolutionError;
1891
+ readonly retry: () => void;
1892
+ };
1893
+ /** Parameters for {@link useInjectedNameResolution}. */
1894
+ interface UseInjectedNameResolutionParams {
1895
+ /** The raw typed input (the field's display string). Normalized internally. */
1896
+ readonly input: string;
1897
+ /**
1898
+ * INV-83: `true` only when `classification === 'name-candidate'` AND an
1899
+ * injected `resolveName` exists. `false` forces `idle` with zero calls.
1900
+ */
1901
+ readonly enabled: boolean;
1902
+ /** The injected forward resolver. Absent → the machine stays `idle`. */
1903
+ readonly resolveName?: InjectedResolveName;
1904
+ /** Debounce override (ms); `<= 0` disables debouncing. */
1905
+ readonly debounceMs?: number;
1906
+ }
1907
+ /**
1908
+ * Debounce + dispatch + status derivation over an injected `resolveName`.
1909
+ *
1910
+ * Guarantees:
1911
+ * - INV-83: no call unless `enabled` (name-candidate + injected method), and
1912
+ * never for a debounced copy that lags the current normalized input.
1913
+ * - INV-117: a settled result whose requested name ≠ the current debounced
1914
+ * input is discarded (last-write-wins at the component boundary).
1915
+ * - INV-87: a rejecting resolver (contract violation) is mapped to a typed
1916
+ * `ADAPTER_ERROR` — nothing throws into the render tree.
1917
+ * - INV-123: resolver dispatches are bounded per resolution intent (normalized
1918
+ * debounced input × retry attempt) at {@link MAX_DISPATCHES_PER_INTENT},
1919
+ * regardless of render count or resolver-identity oscillation; the budget
1920
+ * resets on intent change or when leaving the name-resolution path — never on
1921
+ * `settled.source` mismatch; `retry()` never consumes an existing budget.
1922
+ * - INV-124: an identity-churning resolver that exhausts the budget triggers a
1923
+ * one-shot, development-only `logger.warn` (silent in production).
1924
+ * - INV-125: under sustained churn the field stays in the safe gated state — the
1925
+ * perpetually-changing identity keeps failing the `settled.source` check, so
1926
+ * the machine derives `loading`, never `resolved`; combined with INV-87 it
1927
+ * never throws and never writes a hex.
1928
+ * - No `setState` after unmount: every dispatch is cancelled on cleanup.
1929
+ *
1930
+ * @param params - {@link UseInjectedNameResolutionParams}
1931
+ * @returns The current {@link InjectedNameResolutionResult}.
1932
+ */
1933
+ declare function useInjectedNameResolution({
1934
+ input,
1935
+ enabled,
1936
+ resolveName,
1937
+ debounceMs
1938
+ }: UseInjectedNameResolutionParams): InjectedNameResolutionResult;
1939
+ //#endregion
1527
1940
  //#region src/components/fields/AmountField.d.ts
1528
1941
  /**
1529
1942
  * AmountField component properties
@@ -2665,6 +3078,15 @@ interface TextFieldProps<TFieldValues extends FieldValues = FieldValues> extends
2665
3078
  * Placeholder text displayed when the field is empty
2666
3079
  */
2667
3080
  placeholder?: string;
3081
+ /**
3082
+ * Fired with the new value on USER-originated edits only — keystrokes and the
3083
+ * Escape-clear — never on programmatic writes (`setValue`/`reset`). This is
3084
+ * the discriminator consumers need to tell "the user claimed this field" from
3085
+ * "code seeded this field" (e.g. the address book's ENS alias suggestion,
3086
+ * SF-5 INV-103/INV-105); RHF's `dirtyFields` cannot express it because any
3087
+ * form-wide dirty recompute retroactively marks a seeded value dirty.
3088
+ */
3089
+ onUserEdit?: (value: string) => void;
2668
3090
  }
2669
3091
  /**
2670
3092
  * Text input field component specifically designed for React Hook Form integration.
@@ -2693,7 +3115,8 @@ declare function TextField<TFieldValues extends FieldValues = FieldValues>({
2693
3115
  name,
2694
3116
  width,
2695
3117
  validation,
2696
- readOnly
3118
+ readOnly,
3119
+ onUserEdit
2697
3120
  }: TextFieldProps<TFieldValues>): React$1.ReactElement;
2698
3121
  declare namespace TextField {
2699
3122
  var displayName: string;
@@ -3093,5 +3516,5 @@ declare const Toaster: ({
3093
3516
  ...props
3094
3517
  }: ToasterProps) => JSX.Element;
3095
3518
  //#endregion
3096
- export { AccessibilityProps, Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, AddressDisplay, type AddressDisplayVariant, AddressField, AddressLabelProvider, type AddressLabelProviderProps, AddressListEntryMode, AddressListField, AddressListFieldLabels, AddressListFieldProps, AddressSuggestionProvider, type AddressSuggestionProviderProps, Alert, AlertDescription, AlertTitle, AmountField, AmountFieldProps, ArrayField, ArrayFieldProps, ArrayObjectField, ArrayObjectFieldProps, Banner, BannerProps, BannerSize, BannerVariant, BaseField, BaseFieldProps, BigIntField, BigIntFieldProps, BooleanField, BooleanFieldProps, Button, ButtonProps, BytesField, BytesFieldProps, Calendar, CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DEFAULT_ADDRESS_LIST_FIELD_LABELS, type DateRange, DateRangePicker, DateRangePickerProps, DateTimeField, DateTimeFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EcosystemDropdown, EcosystemDropdownOption, EcosystemDropdownProps, EcosystemIcon, EcosystemIconProps, EmptyState, EmptyStateProps, EnumField, EnumFieldProps, EnumFieldValue, EnumMetadata, EnumVariant, ErrorMessage, ExternalLink, FileUploadField, FileUploadFieldProps, Footer, FooterProps, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GroupedSelectOption, Header, HeaderProps, INTEGER_HTML_PATTERN, INTEGER_INPUT_PATTERN, INTEGER_PATTERN, Input, InputProps, Label, LoadingButton, LoadingButtonProps, MapEntryRow, MapField, MapFieldProps, MidnightIcon, NetworkAvailabilityNotice, type NetworkAvailabilityNoticeProps, type NetworkError, NetworkErrorNotificationProvider, type NetworkErrorType, NetworkIcon, NetworkIconProps, NetworkSelector, NetworkSelectorProps, NetworkServiceErrorBanner, type NetworkServiceErrorBannerProps, NetworkStatusBadge, NumberField, NumberFieldProps, ObjectField, ObjectFieldProps, OptionGroup, OverflowMenu, OverflowMenuItem, OverflowMenuProps, PasswordField, PasswordFieldProps, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioField, RadioFieldProps, RadioGroup, RadioGroupItem, RadioOption, RelayerDetailsCard, type RelayerDetailsCardProps, Select, SelectContent, SelectField, SelectFieldProps, SelectGroup, SelectGroupedField, SelectGroupedFieldProps, SelectItem, SelectLabel, SelectOption, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarButton, type SidebarButtonProps, SidebarGroup, type SidebarGroupProps, SidebarLayout, type SidebarLayoutProps, SidebarSection, type SidebarSectionProps, type StepStatus, type StepVisualState, Tabs, TabsContent, TabsList, TabsTrigger, TextAreaField, TextAreaFieldProps, TextField, TextFieldProps, Textarea, TextareaProps, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UrlField, type UseAddressLabelResult, type UseAddressSuggestionsResult, VERSION, ViewContractStateButton, WizardLayout, type WizardLayoutProps, WizardNavigation, type WizardNavigationProps, type WizardStepConfig, type WizardStepDef, WizardStepper, type WizardStepperProps, buildAddressListPreviewSummary, buttonVariants, computeChildTouched, createFocusManager, createValidationResult, formatAddressBulkSummary, formatValidationError, getAccessibilityProps, getDescribedById, getErrorMessage, getValidationStateClasses, getWidthClasses, handleEscapeKey, handleKeyboardEvent, handleNumericKeys, handleToggleKeys, handleValidationError, hasFieldError, isDuplicateMapKey, resolveAddressListFieldLabels, useAddressLabel, useAddressSuggestions, useDuplicateKeyIndexes, useMapFieldSync, useNetworkErrorAwareAdapter, useNetworkErrorReporter, useNetworkErrors, validateField, validateMapEntries, validateMapStructure };
3519
+ export { AccessibilityProps, Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, type AddressAvatarVariant, AddressDisplay, type AddressDisplayProps, type AddressDisplayVariant, AddressField, AddressFieldProps, AddressLabelProvider, type AddressLabelProviderProps, AddressListEntryMode, AddressListField, AddressListFieldLabels, AddressListFieldProps, AddressNameProvider, type AddressNameProviderProps, AddressSuggestionList, type AddressSuggestionListProps, AddressSuggestionProvider, type AddressSuggestionProviderProps, Alert, AlertDescription, AlertTitle, AmountField, AmountFieldProps, ArrayField, ArrayFieldProps, ArrayObjectField, ArrayObjectFieldProps, Banner, BannerProps, BannerSize, BannerVariant, BaseField, BaseFieldProps, BigIntField, BigIntFieldProps, BooleanField, BooleanFieldProps, Button, ButtonProps, BytesField, BytesFieldProps, Calendar, CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DEFAULT_ADDRESS_LIST_FIELD_LABELS, type DateRange, DateRangePicker, DateRangePickerProps, DateTimeField, DateTimeFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EcosystemDropdown, EcosystemDropdownOption, EcosystemDropdownProps, EcosystemIcon, EcosystemIconProps, EmptyState, EmptyStateProps, EnumField, EnumFieldProps, EnumFieldValue, EnumMetadata, EnumVariant, ErrorMessage, ExternalLink, FileUploadField, FileUploadFieldProps, Footer, FooterProps, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GroupedSelectOption, Header, HeaderProps, INTEGER_HTML_PATTERN, INTEGER_INPUT_PATTERN, INTEGER_PATTERN, type InjectedNameResolutionResult, type InjectedResolveName, Input, InputProps, Label, LoadingButton, LoadingButtonProps, MapEntryRow, MapField, MapFieldProps, MidnightIcon, NAME_RESOLUTION_DEBOUNCE_MS, NameResolverContext, NameResolverProvider, type NameResolverProviderProps, NetworkAvailabilityNotice, type NetworkAvailabilityNoticeProps, type NetworkError, NetworkErrorNotificationProvider, type NetworkErrorType, NetworkIcon, NetworkIconProps, NetworkSelector, NetworkSelectorProps, NetworkServiceErrorBanner, type NetworkServiceErrorBannerProps, NetworkStatusBadge, NumberField, NumberFieldProps, ObjectField, ObjectFieldProps, OptionGroup, OverflowMenu, OverflowMenuItem, OverflowMenuProps, PasswordField, PasswordFieldProps, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioField, RadioFieldProps, RadioGroup, RadioGroupItem, RadioOption, RelayerDetailsCard, type RelayerDetailsCardProps, Select, SelectContent, SelectField, SelectFieldProps, SelectGroup, SelectGroupedField, SelectGroupedFieldProps, SelectItem, SelectLabel, SelectOption, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarButton, type SidebarButtonProps, SidebarGroup, type SidebarGroupProps, SidebarLayout, type SidebarLayoutProps, SidebarSection, type SidebarSectionProps, type StepStatus, type StepVisualState, Tabs, TabsContent, TabsList, TabsTrigger, TextAreaField, TextAreaFieldProps, TextField, TextFieldProps, Textarea, TextareaProps, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UrlField, type UseAddressLabelResult, type UseAddressNameResult, type UseAddressSuggestionFieldArgs, type UseAddressSuggestionFieldResult, type UseAddressSuggestionsResult, type UseInjectedNameResolutionParams, VERSION, ViewContractStateButton, WizardLayout, type WizardLayoutProps, WizardNavigation, type WizardNavigationProps, type WizardStepConfig, type WizardStepDef, WizardStepper, type WizardStepperProps, buildAddressListPreviewSummary, buttonVariants, computeChildTouched, createFocusManager, createValidationResult, formatAddressBulkSummary, formatValidationError, getAccessibilityProps, getDescribedById, getErrorMessage, getValidationStateClasses, getWidthClasses, handleEscapeKey, handleKeyboardEvent, handleNumericKeys, handleToggleKeys, handleValidationError, hasFieldError, isDuplicateMapKey, resolveAddressListFieldLabels, useAddressLabel, useAddressName, useAddressSuggestionField, useAddressSuggestions, useDuplicateKeyIndexes, useInjectedNameResolution, useMapFieldSync, useNameResolver, useNetworkErrorAwareAdapter, useNetworkErrorReporter, useNetworkErrors, validateField, validateMapEntries, validateMapStructure };
3097
3520
  //# sourceMappingURL=index.d.mts.map