/**
 * @file FieldLabel.tsx
 * @input Uses React, Icon, IconType, useTranslator
 * @output Exports FieldLabel component, FieldLabelProps
 * @position Core label implementation; used by Field, CheckboxInput, Switch
 *
 * SYNC: When modified, update these files to stay in sync:
 * - /packages/core/src/Field/Field.doc.mjs (props table, features, implementation notes)
 * - /packages/core/src/Field/index.ts (exports if types change)
 * - /packages/cli/assets/templates/blocks/components/Field/ (showcase blocks)
 * - /packages/core/locales/en.json (@astryx.field.required / @astryx.field.optional)
 */
import { type ReactNode } from 'react';
import type { BaseProps } from '../BaseProps';
import { type IconType } from '../Icon';
export interface FieldLabelProps extends BaseProps<HTMLLabelElement> {
    /** Ref forwarded to the root element */
    ref?: React.Ref<HTMLLabelElement>;
    /**
     * Label text (always rendered for accessibility).
     */
    label: string;
    /**
     * ID of the input element this label points AT (rendered as `htmlFor` on the
     * label). This is *not* the id of the label element itself — see
     * `labelID` for that.
     */
    inputID: string;
    /**
     * The `id` applied TO the label element itself (not the element it points
     * at — that's `inputID`). A grouping control (e.g. `role="radiogroup"`) can
     * reference this via `aria-labelledby` to take the label as its accessible
     * name.
     */
    labelID?: string;
    /**
     * When true, the field wraps a *group* of controls (e.g. a radiogroup)
     * rather than a single input. In that case the label is rendered as a
     * `<span>` instead of a `<label>` — a `<label>` semantically names one form
     * control and can't be associated with a group, so it must not be a literal
     * label element. The group takes the label as its name via
     * `labelID` + `aria-labelledby`.
     * @default false
     */
    isGroupLabel?: boolean;
    /**
     * Whether to visually hide the label and description (still accessible
     * to screen readers). When hidden, the entire label group is rendered
     * with sr-only styles and takes up no layout space.
     * @default false
     */
    isLabelHidden?: boolean;
    /**
     * Whether the associated input is disabled.
     * @default false
     */
    isDisabled?: boolean;
    /**
     * Whether the field is optional. Mutually exclusive with isRequired.
     * @default false
     */
    isOptional?: boolean;
    /**
     * Whether the field is required. Mutually exclusive with isOptional.
     * @default false
     */
    isRequired?: boolean;
    /**
     * Icon to display before the label text.
     */
    labelIcon?: ReactNode | IconType;
    /**
     * Tooltip text to display in an info icon at the end of the label.
     */
    labelTooltip?: string;
    /**
     * Description displayed below the label. Hidden along with the label
     * when isLabelHidden is true.
     */
    description?: ReactNode;
    /**
     * ID for the description element (for aria-describedby on the input).
     */
    descriptionID?: string;
}
/**
 * Label + description group for form fields. Handles sr-only hiding,
 * disabled styling, optional/required indicators, icons, and tooltips.
 *
 * When `isLabelHidden` is true the entire group uses sr-only positioning
 * so it takes up zero layout space — no wrapper div left in flow.
 *
 * @example
 * ```
 * <FieldLabel label="Email" inputID={inputId} description="We won't share it" />
 * <FieldLabel label="Search" inputID={inputId} isLabelHidden />
 * ```
 */
export declare function FieldLabel({ label, inputID, labelID, isGroupLabel, isLabelHidden, isDisabled, isOptional, isRequired, labelIcon, labelTooltip, description, descriptionID, className, style, xstyle, ref, ...rest }: FieldLabelProps): import("react").JSX.Element;
export declare namespace FieldLabel {
    var displayName: string;
}
//# sourceMappingURL=FieldLabel.d.ts.map