import type { CSSProperties, FocusEvent, KeyboardEvent, ReactNode } from "react";
import type { IconNames } from "../../Icon";
/**
 * `className`/`style` shared by every `InputNumberExperimental` building block.
 * Both compose with the block's internal styling rather than replacing it.
 */
export interface InputNumberExperimentalStyleProps {
    readonly className?: string;
    readonly style?: CSSProperties;
}
/**
 * Affix descriptor for the top-level `prefix`/`suffix` props. At least one of
 * `label` or `icon` should be provided. Icons render outside the input area (in
 * the field's outer padding zone); labels render inside the input area next to
 * the typed value. `onClick`/`ariaLabel` are not allowed here; use
 * `InputNumberExperimentalSuffix` for a clickable action.
 */
export interface InputNumberExperimentalAffix {
    readonly label?: string;
    readonly icon?: IconNames;
    readonly ariaLabel?: never;
    readonly onClick?: never;
}
/**
 * Suffix variant that turns the suffix icon into a clickable action button.
 * The `?: never` fields make this a discriminated union with the plain affix.
 */
export interface InputNumberExperimentalSuffix {
    readonly label?: string;
    readonly icon: IconNames;
    readonly ariaLabel: string;
    onClick(): void;
}
export type InputNumberExperimentalSuffixProp = InputNumberExperimentalAffix | InputNumberExperimentalSuffix;
export type InputNumberExperimentalAutoComplete = boolean | "on" | "off" | "one-time-code" | "address-line1" | "address-line2";
export type InputNumberExperimentalSize = "small" | "default" | "large";
/**
 * Field configuration shared by `<InputNumberExperimental.Wrapper>` (the
 * composition entry point) and the top-level `<InputNumberExperimental>` sugar.
 * The Wrapper owns the field state and exposes it to the parts via context.
 */
export interface InputNumberExperimentalWrapperProps extends InputNumberExperimentalStyleProps {
    readonly align?: "center" | "right";
    readonly autoComplete?: InputNumberExperimentalAutoComplete;
    /** Composed parts (`.Group`, `.Footer`, and the parts within them). */
    readonly children?: ReactNode;
    readonly disabled?: boolean;
    /**
     * Number formatting for the displayed value, forwarded to Base UI
     * `NumberField`'s native `format`. When omitted, typed decimals are preserved.
     */
    readonly format?: Intl.NumberFormatOptions;
    readonly id?: string;
    /** Shrink-wrap the field to its content (auto width). */
    readonly inline?: boolean;
    readonly inputMode?: "numeric" | "decimal";
    /** Style the error border without showing an error message. */
    readonly invalid?: boolean;
    /**
     * Shows a non-blocking loading indicator in the stepper's slot. The field
     * stays editable (use `readOnly`/`disabled` to lock it); the stepper hides so
     * the two never overlap.
     */
    readonly loading?: boolean;
    readonly max?: number;
    readonly min?: number;
    readonly name?: string;
    readonly onBlur?: (event?: FocusEvent<HTMLInputElement>) => void;
    /**
     * Fires when the user commits a value (blur, Enter, stepper, arrow step).
     * Emits `null` when committed empty. For per-keystroke updates use
     * `onValueChange`.
     */
    readonly onValueCommitted?: (newValue: number | null) => void;
    /**
     * Fires on every parsed value change (typing, paste, stepper, arrow step).
     * Emits `null` when the field is empty.
     */
    readonly onValueChange?: (newValue: number | null) => void;
    /** Fires when Enter is pressed without modifier keys (Shift/Ctrl/Meta). */
    readonly onEnter?: (event: KeyboardEvent<HTMLInputElement>) => void;
    readonly onFocus?: (event?: FocusEvent<HTMLInputElement>) => void;
    readonly onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void;
    readonly onKeyUp?: (event: KeyboardEvent<HTMLInputElement>) => void;
    readonly readOnly?: boolean;
    /** Default `true`. When `false`, the floating label is hidden. */
    readonly showMiniLabel?: boolean;
    readonly size?: InputNumberExperimentalSize;
    /**
     * Amount the stepper buttons and ArrowUp/ArrowDown keys change the value by.
     * Default `1`.
     */
    readonly step?: number;
    /**
     * Controlled value. `number` sets the value; `null` (or `undefined`) is an
     * empty field.
     */
    readonly value?: number | null;
}
/**
 * Props for the top-level `<InputNumberExperimental>` sugar: the field
 * configuration plus the convenience content props (`label`, `description`,
 * `error`, `prefix`, `suffix`). It composes the parts internally — to compose
 * the field yourself, use `<InputNumberExperimental.Wrapper>` and the parts.
 */
export interface InputNumberExperimentalProps extends Omit<InputNumberExperimentalWrapperProps, "children"> {
    /** Floating field label. */
    readonly label?: string;
    readonly description?: ReactNode;
    /** Renders a styled error message below the field. */
    readonly error?: string;
    readonly prefix?: InputNumberExperimentalAffix;
    readonly suffix?: InputNumberExperimentalSuffixProp;
}
export interface InputNumberExperimentalRef {
    blur(): void;
    focus(): void;
}
export interface InputNumberExperimentalGroupProps extends InputNumberExperimentalStyleProps {
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalFooterProps extends InputNumberExperimentalStyleProps {
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalInputProps extends InputNumberExperimentalStyleProps {
    /** Content rendered inside the input area (e.g. `.Label`, `.Stepper`). */
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalLabelProps extends InputNumberExperimentalStyleProps {
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalDescriptionProps extends InputNumberExperimentalStyleProps {
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalErrorProps extends InputNumberExperimentalStyleProps {
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalLoadingProps extends InputNumberExperimentalStyleProps {
    /** Indicator content. Falls back to the default `ActivityIndicator`. */
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalStepperProps extends InputNumberExperimentalStyleProps {
    /** Stepper buttons. Falls back to the default increment/decrement pair. */
    readonly children?: ReactNode;
    /** Accessible label for the increment button. Defaults to `Increase value`. */
    readonly incrementLabel?: string;
    /** Accessible label for the decrement button. Defaults to `Decrease value`. */
    readonly decrementLabel?: string;
}
export interface InputNumberExperimentalStepButtonProps extends InputNumberExperimentalStyleProps {
    /** Icon content. Falls back to the default Atlantis stepper icon. */
    readonly children?: ReactNode;
    /** Accessible label for the button. */
    readonly ariaLabel?: string;
}
export interface InputNumberExperimentalAffixCompound extends InputNumberExperimentalStyleProps {
    readonly variation: "prefix" | "suffix";
    readonly label?: string;
    readonly icon?: IconNames;
    readonly ariaLabel?: never;
    readonly onClick?: never;
    /** Arbitrary affix content, beyond the built-in `label`/`icon`. */
    readonly children?: ReactNode;
}
export interface InputNumberExperimentalAffixCompoundClickable extends InputNumberExperimentalStyleProps {
    readonly variation: "prefix" | "suffix";
    readonly label?: string;
    readonly icon: IconNames;
    readonly ariaLabel: string;
    onClick(): void;
    /** Arbitrary affix content, beyond the built-in `label`/`icon`. */
    readonly children?: ReactNode;
}
/**
 * `.Affix` props. Discriminated by whether `onClick` is set:
 * - omit `onClick` -> behaves like a plain affix
 * - set `onClick`  -> requires `icon` and `ariaLabel` (clickable icon-button)
 */
export type InputNumberExperimentalAffixCompoundProps = InputNumberExperimentalAffixCompound | InputNumberExperimentalAffixCompoundClickable;
