/**
 * Shared PML (Picnic Markup Language) component types.
 *
 * These types describe the building blocks of the Fusion page renderer:
 * the generic UI primitives that appear inside `pml.component` across all
 * pages and domains (app pages, cart decorators, catalog promotions, etc.).
 *
 * App-specific composite components (TOUCHABLE, STEPPER, SELLING_UNIT_TILE,
 * etc.) are defined further below and use the `Fusion` naming prefix.
 */
export type Padding = {
    top?: number;
    right?: number;
    bottom?: number;
    left?: number;
};
export type TextAttributes = {
    size?: number;
    weight?: string;
    color?: string;
};
export type ImageSource = {
    id: string;
};
export type TrackingAttributes = {
    template_variant_id: string;
    entity_ids: string[];
};
export type ImageComponent = {
    type: "IMAGE";
    source: ImageSource;
    width: string | number;
    height: string | number;
    resizeMode?: string;
    derivativeType?: string;
    extension?: string;
    placeholder?: string | Record<string, any>;
    fallbackSource?: ImageSource;
    maxUpscalePercentage?: number;
    analytics?: Record<string, any>;
    aspectRatio?: number;
};
export type StackComponent = {
    type: "STACK";
    axis?: string;
    alignment?: string;
    distribution?: string;
    spacing?: number;
    padding?: Padding;
    width?: string | number;
    height?: string | number;
    backgroundColor?: string;
    wrap?: string;
    alignContent?: string;
    accessible?: boolean;
    accessibilityLabel?: string;
    accessibilityHint?: string;
    accessibilityActions?: any[];
    isHidden?: boolean;
    children?: Component[];
};
export type ContainerComponent = {
    type: "CONTAINER";
    width?: string | number;
    height?: string | number;
    backgroundColor?: string;
    borderRadius?: number;
    borderWidth?: number;
    borderColor?: string;
    overflow?: string;
    padding?: Padding;
    aspectRatio?: number;
    opacity?: number;
    accessible?: boolean;
    accessibilityLabel?: string;
    hideFromAccessibility?: boolean;
    pointerEvents?: string;
    absolutePosition?: Padding;
    accessibilityActions?: any[];
    /** Drop-shadow configuration (color, offset, opacity, radius). */
    shadow?: Record<string, any>;
    /** Component rendered as a blur underlay (product-details sticky header). */
    blurComponent?: any;
    /** Props passed to the blur underlay renderer. */
    blurProps?: Record<string, any>;
    child?: Component;
    children?: Component[];
};
export type RichTextComponent = {
    type: "RICH_TEXT";
    markdown: string;
    textType?: string;
    textAlignment?: string;
    textAttributes?: TextAttributes;
    numberOfLines?: number;
    flexShrink?: number;
    children?: Component[];
};
export type IconComponent = {
    type: "ICON";
    iconKey: string | Record<string, any>;
    width: number;
    height: number;
    color?: string | Record<string, any>;
    aspectRatio?: number;
    fallback?: Record<string, any>;
    /** Clockwise rotation in degrees applied to the icon (e.g. 270 for a chevron pointing up). */
    rotation?: number;
};
/** Union of the five core PML UI primitives. */
export type Component = StackComponent | ContainerComponent | ImageComponent | RichTextComponent | IconComponent;
export type PML<TComponent> = {
    pml_version: string;
    component: TComponent;
    images?: Record<string, string>;
    tracking_attributes?: TrackingAttributes;
};
/** A PML document whose root component is a single image — used for icons in the cart. */
export type Icon = PML<ImageComponent>;
export type TabType = "PAGE" | "CART" | "LEGACY_SEARCH" | "SEARCH" | "UNSUPPORTED" | string;
export type TabDecoratorType = "GIFT" | "NOTIFICATION" | "PRICE_BALLOON" | "NOTIFY_TAP" | "UNSUPPORTED" | string;
export type TabTargetType = "PICNIC_PAGE_REFERENCE" | "DEEPLINK" | "UNSUPPORTED" | string;
export type TabIconType = "PRESET" | "BASE_64" | "UNSUPPORTED" | string;
export type DynamicIconConfigType = "CART_VALUE" | "UNSUPPORTED" | string;
export type PresetIcon = "BASKET" | "BASKET_2" | "ACTIVE_PROMO" | "CHECKMARK" | "EPV" | "EPV_2" | "HEART" | "POT" | "PROFILE" | "PROMO" | "ROCKET" | "ROCKET_2" | "SEARCH" | "SEARCH_2" | "STOREFRONT" | "STOREFRONT_2" | "TROLLEY" | "TROLLEY_2" | "UNSUPPORTED" | string;
/** Dynamic cart-value-based icon config (e.g. show different icon based on cart value). */
export type CartValueDynamicIconConfig = {
    type: "CART_VALUE";
    lower_bound?: number | null;
    upper_bound?: number | null;
};
export type UnsupportedDynamicIconConfig = {
    type: "UNSUPPORTED" | string;
};
export type DynamicIconConfig = CartValueDynamicIconConfig | UnsupportedDynamicIconConfig;
/** Preset (vector/SVG) icon tab bar item. */
export type PresetTabIcon = {
    type: "PRESET";
    preset?: PresetIcon | null;
    dynamic_config?: DynamicIconConfig | null;
    allow_tint_color?: boolean | null;
};
/** Base64-encoded image tab bar icon. */
export type Base64TabIcon = {
    type: "BASE_64";
    value?: string | null;
    dynamic_config?: DynamicIconConfig | null;
    allow_tint_color?: boolean | null;
};
export type UnsupportedTabIcon = {
    type: "UNSUPPORTED" | string;
    allow_tint_color?: boolean | null;
};
export type TabIcon = PresetTabIcon | Base64TabIcon | UnsupportedTabIcon;
/** Icon configuration for a tab bar item, including default and highlighted states. */
export type IconConfig = {
    icons: TabIcon[];
    highlight_icons?: TabIcon[] | null;
    color: string;
    highlight_color: string;
};
/** Navigates to an internal Picnic page by reference. */
export type PageTabTarget = {
    type: "PICNIC_PAGE_REFERENCE";
    reference: string;
    request_params?: Record<string, string> | null;
};
/** Opens an external deep-link URL. */
export type DeeplinkTabTarget = {
    type: "DEEPLINK";
    deeplink?: string | null;
};
export type UnsupportedTabTarget = {
    type: "UNSUPPORTED" | string;
};
export type TabTarget = PageTabTarget | DeeplinkTabTarget | UnsupportedTabTarget;
/** Controls a visual badge/decorator rendered on top of a tab icon. */
export type TabDecorator = {
    type: TabDecoratorType;
    /** Display positions that trigger this decorator's notification dot. */
    display_positions_to_notify?: string[] | null;
};
export type TabAccessibility = {
    label: string;
    hint: string;
};
/** Defines which display positions this tab renders messages for. */
export type MessageBehaviour = {
    display_positions_to_render: string[];
};
/** Global message polling configuration; defines which positions are polled. */
export type GeneralMessageBehaviour = {
    display_positions_to_poll: string[];
};
export type BootstrapTab = {
    id: string;
    tab_type: TabType;
    analytics_id?: string | null;
    icon_config: IconConfig;
    message_behaviour: MessageBehaviour;
    tab_decorators?: TabDecorator[] | null;
    accessibility: TabAccessibility;
    /** Navigation target; omitted for tabs that handle navigation internally (e.g. CART). */
    target?: TabTarget | null;
    header?: string | null;
    title?: string | null;
    title_config?: TitleConfig | null;
};
export type TitleConfig = {
    title: string;
    color: string;
    highlight_color: string;
};
/** Braze SDK initialisation token. */
export type BrazeConfig = {
    authentication_token: string;
};
/** Datadog RUM / APM configuration. */
export type DatadogConfig = {
    rum_session_sample_rate: number;
    apm_trace_sample_rate: number;
};
/** Timeout for the pre-checkout upsell check before the cart proceeds. */
export type CartPreCheckoutUpsellConfig = {
    timeout_ms: number | null;
};
export type InAppFeatureConfig = {
    cart_pre_checkout_upsell_check?: CartPreCheckoutUpsellConfig | null;
};
/** The root response returned by `GET /bootstrap`. */
export type BootstrapData = {
    landing_tab_id: string;
    tabs: BootstrapTab[];
    general_message_behaviour: GeneralMessageBehaviour;
    datadog_config: DatadogConfig | null;
    braze_config: BrazeConfig | null;
    in_app_feature_config: InAppFeatureConfig | null;
    first_time_user: boolean;
};
export type FusionSpacing = {
    mainAxis?: number;
    crossAxis?: number;
};
export type FusionSize = {
    crossAxis?: string | number;
    mainAxis?: string | number;
};
export type FusionHitSlop = {
    horizontal?: number;
    vertical?: number;
};
export type FusionAnalyticsContext = {
    data: Record<string, any>;
    schema: string;
};
export type FusionItemAnalytics = {
    contexts: FusionAnalyticsContext[];
};
export type FusionOpenAction = {
    actionType: "OPEN";
    target: string;
};
/**
 * Payloads carried inside a `FusionEventAction`. These are not rendered
 * components — they are event descriptions evaluated by the runtime.
 */
export type FusionToastEventPayload = {
    type: "TOAST";
    /** Message text displayed in the native toast. */
    message?: string;
};
export type FusionSnackbarEventPayload = {
    type: "SNACKBAR";
    isVisible?: boolean;
    message?: string;
};
export type FusionRefreshEventPayload = {
    type: "REFRESH";
    /** Which layer to refresh, e.g. `"BACKGROUND_PAGES"`. */
    source?: string;
    onNext?: FusionPressAction;
};
/** Union of all typed event payloads that can appear as `FusionEventAction.action`. */
export type FusionEventPayload = FusionToastEventPayload | FusionSnackbarEventPayload | FusionRefreshEventPayload | {
    type: string;
    [key: string]: any;
};
export type FusionEventAction = {
    actionType: "EVENT";
    /** Event payload; typed via {@link FusionEventPayload} (not a rendered component). */
    action?: FusionEventPayload;
};
export type FusionEndpointAction = {
    actionType: "ENDPOINT";
    method: string;
    url: string;
    body?: Record<string, any>;
    onSuccess?: FusionPressAction;
};
export type FusionCallbackAction = {
    actionType: "CALLBACK";
    callback?: () => void;
};
/**
 * Instructs the runtime to reload a specific SUSPENSE boundary by its `suspenseId`.
 * Commonly used in error-state retry buttons.
 */
export type FusionReloadAction = {
    actionType: "RELOAD";
    suspenseId?: string;
};
/**
 * Fires a Snowplow analytics event, optionally chaining a follow-up action.
 * Seen on the delivery-receipt page (e.g. "add all to cart" button).
 */
export type FusionAnalyticsAction = {
    actionType: "ANALYTICS";
    context?: FusionAnalyticsContext | null;
    additionalContexts?: FusionAnalyticsContext[];
    onNext?: FusionPressAction;
};
export type FusionPressAction = FusionOpenAction | FusionEventAction | FusionEndpointAction | FusionCallbackAction | FusionReloadAction | FusionAnalyticsAction | {
    actionType: string;
    [key: string]: any;
};
export type FusionTouchableComponent = {
    type: "TOUCHABLE";
    onPress?: FusionPressAction;
    child?: FusionComponent;
    /** Can be a plain string or an EXPRESSION component whose result is the label. */
    accessibilityLabel?: string | FusionExpressionComponent | null;
    /** Can be a plain string or an EXPRESSION component whose result is the hint. */
    accessibilityHint?: string | FusionExpressionComponent | null;
    accessible?: boolean;
    hideFromAccessibility?: boolean;
    isHidden?: boolean;
    hitSlop?: FusionHitSlop;
    activeOpacity?: number;
    activeScale?: number;
    activeColor?: string;
    backgroundColor?: string;
    borderRadius?: number;
    disabled?: boolean;
    testID?: string;
};
export type FusionTimingAnimation = {
    type: "TIMING";
    duration: number;
    toValue: number;
};
export type FusionAnimationPresets = Record<string, Record<string, FusionTimingAnimation>>;
export type FusionAnimationContainerComponent = {
    type: "ANIMATION_CONTAINER";
    id: string;
    child: FusionComponent;
    presets: FusionAnimationPresets;
    /** Name of the preset to activate immediately on render. */
    selectedPreset?: string | null;
};
export type FusionReferenceContainerComponent = {
    type: "REFERENCE_CONTAINER";
    id: string;
    child: FusionComponent;
};
export type FusionExpressionComponent = {
    type: "EXPRESSION";
    name: string;
    expression: string;
};
/** A single tier in a progressive (bundle) discount schedule. */
export type PriceRange = {
    /** Per-unit price in cents that applies at this tier. */
    price: number;
    /** Minimum quantity in the cart for this price to kick in. */
    from_quantity: number;
};
export type SellingUnit = {
    id: string;
    name: string;
    image_id: string;
    display_price: number;
    unit_quantity: string;
    max_count: number;
    decorators: any[];
    /** Bundle discount price tiers. Each entry defines a per-unit price that applies when the cart quantity reaches `from_quantity`. */
    price_ranges: PriceRange[] | null;
};
export type SellingUnitImageConfiguration = {
    derivativeType: string;
    extension: string;
    id: string;
};
export type FusionSellingUnitTileComponent = {
    type: "SELLING_UNIT_TILE";
    sellingUnit?: SellingUnit;
    sellingUnitImageConfiguration?: SellingUnitImageConfiguration;
    /** When true the tile does not contribute an analytics context to its parent. */
    excludeFromAnalyticsContext?: boolean;
};
export type FusionSellingUnitMutationComponent = {
    type: "SELLING_UNIT_MUTATION";
    mutation: "ADD" | "REMOVE" | string;
    quantity: number;
    sellingUnitId: string;
};
export type FusionStepperComponent = {
    type: "STEPPER";
    sellingUnitId: string;
    color: string;
    onIncrementPress?: FusionPressAction | null;
    onDecrementPress?: FusionPressAction | null;
    /** Fired when the collapsed stepper is tapped to expand. */
    onExpand?: FusionPressAction | null;
    /** Fired when the expanded stepper collapses back. */
    onCollapse?: FusionPressAction | null;
    presentation?: string;
    showCollapsed: boolean;
    showCollapsedRemoveButton: boolean;
    borderRadius?: number | null;
    textType?: string | null;
    /** Fixed height override for the stepper widget. */
    height?: number | null;
};
export type FusionAccessibilityAction = {
    name: string;
    onAction: FusionPressAction;
};
export type FusionAccessibilityInfo = {
    accessible?: boolean;
    accessibilityLabel?: string;
    accessibilityHint?: string;
    accessibilityRole?: string;
    accessibilityActions?: FusionAccessibilityAction[];
};
export type FusionAccessibilityContainerComponent = {
    type: "ACCESSIBILITY_CONTAINER";
    sellingUnitId: string;
    contentType: string;
    availableAccessibility: FusionAccessibilityInfo;
    unavailableAccessibility: FusionAccessibilityInfo;
};
export type FusionUnavailabilityContainerComponent = {
    type: "UNAVAILABILITY_CONTAINER";
    sellingUnitId: string;
    /** Additional selling-unit IDs that share the same unavailability state (e.g. product-detail variants). */
    sellingUnitIds?: string[] | null;
    color: string;
    secondaryColor?: string;
    presentationStyle: string;
    /** When true, unavailability events are not tracked in analytics. */
    disableTrackingAnalytics?: boolean;
};
/** Native activity indicator / spinner; children are typically empty. */
export type FusionActivityIndicatorComponent = {
    type: "ACTIVITY_INDICATOR";
    children?: FusionComponent[];
};
/**
 * A modal overlay component. `isVisible` and `onDismiss` are usually
 * EXPRESSION components whose evaluated result drives visibility/dismiss.
 */
export type FusionModalComponent = {
    type: "MODAL";
    child: FusionComponent;
    isVisible: FusionExpressionComponent | boolean;
    onDismiss?: FusionExpressionComponent | null;
};
/** A simple themed button with a text label. */
export type FusionTextButtonComponent = {
    type: "TEXT_BUTTON";
    title: string;
    /** Preset style variant, e.g. `"PRIMARY"`. */
    style?: string;
    onPress?: FusionPressAction;
};
/** A single collapsible item inside an ACCORDION component. */
export type FusionAccordionItem = {
    header: FusionComponent;
    body: FusionComponent;
};
/**
 * A vertically stacked list of collapsible sections with header/body pairs.
 * Seen on the product-details page (e.g. ingredients & nutritional values)
 * and on the delivery-receipt page.
 */
export type FusionAccordionComponent = {
    type: "ACCORDION";
    items: FusionAccordionItem[];
    /** Non-item children rendered outside the accordion items. */
    children?: FusionComponent[];
    /** Separator component rendered between items. */
    separator?: FusionComponent | null;
    /** Icon shown when an item is collapsed. */
    iconCollapsed?: FusionComponent | null;
    /** Icon shown when an item is expanded. */
    iconExpanded?: FusionComponent | null;
    /** When true, no separator is rendered after the last item. */
    isLastSeparatorOmitted?: boolean;
    /** Action/expression fired when an item is expanded; `null` means no side-effect. */
    onAccordionItemExpanded?: FusionPressAction | FusionExpressionComponent | null;
    /** Action/expression fired when an item collapses. */
    onAccordionItemCollapsed?: FusionPressAction | FusionExpressionComponent | null;
};
/**
 * A formatted price display component (product-details and delivery-receipt pages).
 * `price` is an integer in the minor currency unit (e.g. cents).
 */
export type FusionPriceComponent = {
    type: "PRICE";
    price: number;
    color?: string;
    fontSize?: number;
    /** When true, the price is rendered with a strikethrough (crossed-out). */
    isCrossed?: boolean;
    opacity?: number;
    /** Optional prefix/suffix sign string, e.g. `"+"` or `null`. */
    priceSign?: string | null;
    testID?: string;
};
/** Triggers the native share sheet with a pre-composed message. */
export type FusionSocialShareComponent = {
    type: "SOCIAL_SHARE";
    message?: string;
};
/**
 * Metadata attached to a search result entity. Carries ranking and
 * retrieval-method information for analytics purposes.
 */
export type FusionSearchResultEntityComponent = {
    type: "SEARCH_RESULT_ENTITY";
    initial_dvs_rank?: number | null;
    retrieval_methods?: string[];
};
/**
 * Union of all PML inner component types found across all page responses.
 * The `type` discriminant field identifies each variant.
 */
export type FusionComponent = StackComponent | ContainerComponent | RichTextComponent | ImageComponent | IconComponent | FusionTouchableComponent | FusionAnimationContainerComponent | FusionReferenceContainerComponent | FusionExpressionComponent | FusionSellingUnitTileComponent | FusionSellingUnitMutationComponent | FusionStepperComponent | FusionAccessibilityContainerComponent | FusionUnavailabilityContainerComponent | FusionActivityIndicatorComponent | FusionModalComponent | FusionTextButtonComponent | FusionAccordionComponent | FusionPriceComponent | FusionSocialShareComponent | FusionSearchResultEntityComponent;
/** PML root object embedded inside a PML wrapper block. */
export type FusionPMLRoot = {
    pml_version: string;
    component: FusionComponent;
    images: Record<string, string>;
};
export type FlowLayout = {
    type: "FLOW";
    axis: string;
    spacing?: FusionSpacing;
    padding?: Padding;
    showsScrollIndicator?: boolean;
    backgroundColor?: string;
    cornerRadius?: Record<string, number>;
    overflow?: string;
    overScrollMode?: string;
    hideFromAccessibility?: boolean;
    accessibilityElementsHidden?: boolean;
    /** Pagination configuration. */
    pagination?: Record<string, any> | null;
    /**
     * ID of the item to scroll into focus on render. Can be a plain string or an
     * EXPRESSION component that resolves to the ID at runtime.
     */
    focusedItemId?: string | FusionExpressionComponent | null;
    focusedItemOffset?: number | null;
    itemVisibilityPercentage?: number | null;
    smoothScrollToFocusedItem?: boolean;
    viewabilityListeners?: any[] | null;
    /**
     * Override for the underlying list renderer.
     * Known values: `"FlashList"` (high-performance list on category pages).
     */
    listComponent?: string | null;
};
/** A PML item rendered inside the page block layout. */
export type PMLItem = {
    type: "PML";
    id: string;
    analytics: FusionItemAnalytics;
    size: FusionSize;
    pml: FusionPMLRoot;
    content?: Record<string, any>;
    viewComponentType?: string;
    /** When true the item is invisible but still present in the tree. */
    isHidden?: boolean;
};
/** A layout block that can contain nested blocks or PML items. */
export type BlockComponent = {
    type: "BLOCK";
    id: string;
    layout: FlowLayout;
    size: FusionSize;
    children: Array<BlockComponent | PMLItem | SuspenseComponent>;
    /** Block-level analytics payload, present on some blocks (e.g. recipe tiles). */
    analytics?: FusionItemAnalytics | null;
    /**
     * Expressions evaluated when the block mounts. Can be an array of named
     * expressions or a single EXPRESSION object (search pages use the latter).
     */
    initializeExpressions?: any[] | Record<string, any> | null;
    /** Action fired when the block mounts. */
    onMount?: FusionPressAction | null;
    /** Action fired when the block unmounts (navigation away). */
    onUnmount?: FusionPressAction | null;
    /** Action fired when the page containing this block regains focus. */
    onPageFocus?: FusionPressAction | null;
    /** Hides the block without removing it from the tree. */
    isHidden?: boolean | null;
};
/** Config for the loading or error state rendered by a suspense boundary. */
export type SuspenseFallbackConfig = {
    /** The PML item to render while loading / on error. */
    component: PMLItem;
    /** Presentation style, e.g. `"DEFAULT"`. */
    presentation?: string;
};
/** Async boundary used by some pages; wraps lazily-loaded content. */
export type SuspenseComponent = {
    type: "SUSPENSE";
    id?: string;
    /** Stable ID used by RELOAD actions to target this specific boundary. */
    suspenseId?: string;
    child?: BlockComponent | StateBoundaryComponent;
    /** References the page-content endpoint to fetch lazily. */
    pageConfig?: {
        id: string;
        parameters?: Record<string, any>;
    } | null;
    /** Shown while the lazy content is loading; `null` means no loading UI. */
    loadingConfig?: SuspenseFallbackConfig | null;
    /** Shown when the lazy content fetch fails; `null` means no error UI. */
    errorConfig?: SuspenseFallbackConfig | null;
};
export type StateBoundaryComponent = {
    type: "STATE_BOUNDARY";
    id: string;
    state: Record<string, any>;
    child: BlockComponent | SuspenseComponent;
};
export type FullScreenPresentation = {
    type: "FULL_SCREEN";
    style: {
        backgroundColor: string;
        /** Controls safe-area edge insets; value is `"off"` to disable a side (e.g. `{ bottom: "off" }`). */
        safeAreaEdges?: Record<string, string>;
    };
};
export type PageAnalytics = {
    /** Present on home pages; absent on some pages (e.g. meals, slot-selector) that only carry `contexts`. */
    type?: "Page" | string;
    additionalProperties?: Record<string, any>;
    contexts?: FusionAnalyticsContext[];
    domain?: string;
    name?: string;
    version?: string;
};
export type PageHeader = {
    type: string;
    title?: string | null;
    padding?: Padding;
    buttons?: any[] | null;
};
/** Minimal static header — just a title, no buttons or padding (e.g. category pages). */
export type StaticPageHeader = {
    type: "STATIC";
    title: string;
};
/** Standard header with an optional title, buttons and padding (e.g. slot-selector, delivery-receipt). */
export type DefaultPageHeader = {
    type: "DEFAULT";
    title?: string | null;
    padding?: Padding;
    buttons?: any[] | null;
};
/**
 * The layout portion of a page response. Contains the page ID, presentation
 * config, header and body tree.
 */
export type FusionPageLayout = {
    id: string;
    /** Present on most pages, but may be absent on some routes. */
    analytics?: PageAnalytics | null;
    presentation: FullScreenPresentation;
    /** `null` for pages with no header bar; otherwise a typed header config. */
    header: StaticPageHeader | DefaultPageHeader | PageHeader | null;
    body: StateBoundaryComponent;
};
/**
 * Generic page response returned by `GET /pages/:page-id`.
 * The API wraps the layout in an envelope that also carries PML script expressions.
 */
export type FusionPage = {
    /** PML script expressions (client-side JS functions) keyed by name. */
    script: Record<string, string>;
    /** The page layout tree. */
    layout: FusionPageLayout;
};
/** @deprecated Renamed to {@link FusionPageLayout}. */
export type HomePage = FusionPageLayout;
//# sourceMappingURL=fusion.d.ts.map