import type { Theme } from '../../theming/types.js';
import type { IconCallback, IconMeta, IconReferencePair, SvgIcon } from './registry/types.js';
/**
 * Global singleton registry for managing SVG icons and their references.
 *
 * @remarks
 * The IconsRegistry class handles:
 * - Registration and storage of SVG icons in collections
 * - Icon reference/alias management with theme-based resolution
 * - Notification of icon changes to subscribed components
 * - Cross-context synchronization via BroadcastChannel
 * - Batched notifications for performance optimization
 *
 * This is a singleton managed via Symbol.for to ensure a single instance
 * across the entire application, even with multiple bundle instances.
 *
 * @internal This class is not directly exposed. Use the exported functions instead.
 */
declare class IconsRegistry {
    /** Set of callbacks subscribed to icon change notifications */
    private readonly _listeners;
    /** Set of pending icon:collection keys awaiting notification */
    private readonly _pendingNotifications;
    /** Map of icon references/aliases by collection and name */
    private readonly _references;
    /** Map of registered SVG icons by collection and name */
    private readonly _collections;
    /** Parser for converting SVG text to icon metadata */
    private readonly _svgIconParser;
    /** Broadcast channel manager for cross-context synchronization */
    private readonly _broadcast;
    /** Flag indicating if a notification microtask is scheduled */
    private _notificationScheduled;
    /**
     * Registers an SVG icon in the registry.
     *
     * @param name - The unique name for the icon within its collection
     * @param iconText - The SVG markup as a string
     * @param collection - The collection to register the icon in (default: 'default')
     *
     * @remarks
     * This method:
     * 1. Parses the SVG text into icon metadata
     * 2. Stores the icon in the specified collection
     * 3. Broadcasts the registration to other contexts
     * 4. Notifies subscribed components (batched)
     *
     * @throws Will throw if the SVG text is malformed
     */
    register(name: string, iconText: string, collection?: string): void;
    /**
     * Subscribes a callback to icon change notifications.
     *
     * @param callback - Function to call when icons are registered or updated
     *
     * @remarks
     * The callback receives the icon name and collection when changes occur.
     * Notifications are batched using microtasks for performance.
     */
    subscribe(callback: IconCallback): void;
    /**
     * Unsubscribes a callback from icon change notifications.
     *
     * @param callback - The previously subscribed callback to remove
     */
    unsubscribe(callback: IconCallback): void;
    /**
     * Sets an icon reference/alias.
     *
     * @param options - Configuration for the icon reference
     *
     * @remarks
     * Icon references allow icons to be aliased with different names.
     * They can be:
     * - User-set (external: true) - higher priority, synced across contexts
     * - System-set (external: false) - used internally, not synced
     *
     * When overwrite is true, the reference is stored and subscribers are notified.
     * When external is true, the reference is broadcast to other contexts.
     */
    setIconRef(options: IconReferencePair): void;
    /**
     * Gets the icon reference, resolving aliases based on the provided theme.
     *
     * @param name - The icon name or alias
     * @param collection - The collection name
     * @param theme - The theme to use for resolving aliases
     * @returns The resolved icon metadata (without the internal 'external' flag)
     */
    getIconRef(name: string, collection: string, theme?: Theme): IconMeta;
    /**
     * Retrieves an icon from the registry.
     *
     * @param name - The icon name
     * @param collection - The collection name (default: 'default')
     * @returns The SVG icon metadata, or undefined if not found
     *
     * @remarks
     * Use `getIconRef` first to resolve aliases before calling this method.
     */
    get(name: string, collection?: string): SvgIcon | undefined;
    /**
     * Schedules a batched notification for icon changes.
     *
     * @param name - The icon name that changed
     * @param collection - The collection name
     *
     * @remarks
     * Notifications are batched in a microtask queue to avoid excessive
     * listener calls when multiple icons are registered synchronously.
     * Duplicate icon:collection pairs are automatically deduplicated.
     *
     * @internal
     */
    private _notifyAll;
    /**
     * Flushes pending notifications to all subscribed listeners.
     *
     * @remarks
     * This method is called as a microtask after icons are registered.
     * It processes all pending icon:collection pairs and notifies listeners.
     *
     * @internal
     */
    private _flushNotifications;
}
/**
 * Gets the global icon registry singleton instance.
 *
 * @returns The IconsRegistry singleton
 *
 * @remarks
 * This function ensures only one instance of the registry exists globally,
 * even across multiple bundle instances. The registry is stored on globalThis
 * using a well-known Symbol.
 *
 * @example
 * ```typescript
 * const registry = getIconRegistry();
 * registry.subscribe((name, collection) => {
 *   console.log(`Icon ${name} changed in ${collection}`);
 * });
 * ```
 */
export declare function getIconRegistry(): IconsRegistry;
/**
 * Registers an icon by fetching it from a URL.
 *
 * @param name - The unique name for the icon
 * @param url - The URL to fetch the SVG icon from
 * @param collection - The collection to register the icon in (default: 'default')
 *
 * @returns A promise that resolves when the icon is registered
 *
 * @throws If the HTTP request fails or returns a non-OK status
 *
 * @remarks
 * This function fetches SVG content from the provided URL and registers it
 * in the icon registry. The icon becomes immediately available to all icon
 * components in the application.
 *
 * @example
 * ```typescript
 * // Register an icon from a URL
 * await registerIcon('custom-icon', '/assets/icons/custom.svg');
 *
 * // Use in HTML
 * // <igc-icon name="custom-icon"></igc-icon>
 * ```
 */
export declare function registerIcon(name: string, url: string, collection?: string): Promise<void>;
/**
 * Registers an icon from SVG text content.
 *
 * @param name - The unique name for the icon
 * @param iconText - The SVG markup as a string
 * @param collection - The collection to register the icon in (default: 'default')
 *
 * @throws If the SVG text is malformed or doesn't contain an SVG element
 *
 * @remarks
 * This is the preferred method for registering icons when you have the SVG
 * content directly (e.g., from a bundled asset or inline string). The icon
 * becomes immediately available to all icon components.
 *
 * The SVG text is parsed to extract viewBox, title, and other metadata.
 *
 * @example
 * ```typescript
 * const iconSvg = '<svg viewBox="0 0 24 24"><path d="..."/></svg>';
 * registerIconFromText('my-icon', iconSvg, 'custom');
 *
 * // Use in HTML
 * // <igc-icon name="my-icon" collection="custom"></igc-icon>
 * ```
 */
export declare function registerIconFromText(name: string, iconText: string, collection?: string): void;
/**
 * Sets an icon reference/alias that points to another icon.
 *
 * @param name - The alias name
 * @param collection - The collection for the alias
 * @param icon - The target icon metadata (name and collection)
 *
 * @remarks
 * Icon references allow you to create aliases that point to other icons.
 * This is useful for:
 * - Creating semantic names (e.g., 'close' → 'x')
 * - Overriding default icon mappings
 * - Providing fallbacks for missing icons
 *
 * User-set references are marked as external and have higher priority than
 * theme-based aliases. They are also synchronized across browsing contexts.
 *
 * @example
 * ```typescript
 * // Register target icon
 * registerIconFromText('x-mark', '<svg>...</svg>');
 *
 * // Create an alias
 * setIconRef('close', 'default', {
 *   name: 'x-mark',
 *   collection: 'default'
 * });
 *
 * // Both work the same way:
 * // <igc-icon name="close"></igc-icon>
 * // <igc-icon name="x-mark"></igc-icon>
 * ```
 */
export declare function setIconRef(name: string, collection: string, icon: IconMeta): void;
export {};
