{"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-ui.svelte.ts","../../src/svelte/hooks/use-ui-container.svelte.ts","../../src/svelte/registries/anchor-registry.svelte.ts","../../src/svelte/registries/component-registry.svelte.ts","../../src/svelte/registries/renderers-registry.svelte.ts","../../src/svelte/auto-menu-renderer.svelte","../../src/svelte/root.svelte","../../src/svelte/provider.svelte","../../src/svelte/hooks/use-item-renderer.svelte.ts","../../src/svelte/hooks/use-register-anchor.svelte.ts","../../src/svelte/hooks/use-schema-renderer.svelte.ts","../../src/svelte/hooks/use-selection-menu.svelte.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { UIPlugin, UIDocumentState, UIScope } from '@embedpdf/plugin-ui';\n\n/**\n * Hook to get the raw UI plugin instance.\n */\nexport const useUIPlugin = () => usePlugin<UIPlugin>(UIPlugin.id);\n\n/**\n * Hook to get the UI plugin's capability API.\n */\nexport const useUICapability = () => useCapability<UIPlugin>(UIPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseUIStateReturn {\n  provides: UIScope | null;\n  state: UIDocumentState | null;\n}\n\n/**\n * Hook for UI state for a specific document\n * @param getDocumentId Function that returns the document ID\n */\nexport const useUIState = (getDocumentId: () => string | null): UseUIStateReturn => {\n  const capability = useUICapability();\n\n  let state = $state<UIDocumentState | null>(null);\n\n  // Reactive documentId\n  const documentId = $derived(getDocumentId());\n\n  // Scoped capability for current docId\n  const scopedProvides = $derived(\n    capability.provides && documentId ? capability.provides.forDocument(documentId) : null,\n  );\n\n  $effect(() => {\n    const provides = capability.provides;\n    const docId = documentId;\n\n    if (!provides || !docId) {\n      state = null;\n      return;\n    }\n\n    const scope = provides.forDocument(docId);\n\n    // Set initial state\n    state = scope.getState();\n\n    // Subscribe to all changes and update state\n    const unsubToolbar = scope.onToolbarChanged(() => {\n      state = scope.getState();\n    });\n    const unsubSidebar = scope.onSidebarChanged(() => {\n      state = scope.getState();\n    });\n    const unsubModal = scope.onModalChanged(() => {\n      state = scope.getState();\n    });\n    const unsubMenu = scope.onMenuChanged(() => {\n      state = scope.getState();\n    });\n    const unsubOverlay = scope.onOverlayChanged(() => {\n      state = scope.getState();\n    });\n\n    return () => {\n      unsubToolbar();\n      unsubSidebar();\n      unsubModal();\n      unsubMenu();\n      unsubOverlay();\n    };\n  });\n\n  return {\n    get provides() {\n      return scopedProvides;\n    },\n    get state() {\n      return state;\n    },\n  };\n};\n\n/**\n * Hook to get UI schema\n * Returns an object with a reactive getter for the schema\n */\nexport const useUISchema = () => {\n  const capability = useUICapability();\n\n  return {\n    get schema() {\n      return capability.provides?.getSchema() ?? null;\n    },\n  };\n};\n","import { getContext, setContext } from 'svelte';\n\nexport interface UIContainerContextValue {\n  /** Get the container element (may be null if not mounted) */\n  getContainer: () => HTMLDivElement | null;\n}\n\nconst UI_CONTAINER_KEY = Symbol('ui-container');\n\n/**\n * Set up the container context (called by UIRoot)\n */\nexport function setUIContainerContext(value: UIContainerContextValue): void {\n  setContext(UI_CONTAINER_KEY, value);\n}\n\n/**\n * Hook to access the UI container element.\n *\n * This provides access to the UIRoot container for:\n * - Container query based responsiveness\n * - Portaling elements to the root\n * - Measuring container dimensions\n *\n * @example\n * ```svelte\n * <script>\n *   import { useUIContainer } from '@embedpdf/plugin-ui/svelte';\n *   import { onMount, onDestroy } from 'svelte';\n *\n *   const { getContainer } = useUIContainer();\n *\n *   let observer;\n *\n *   onMount(() => {\n *     const container = getContainer();\n *     if (!container) return;\n *\n *     observer = new ResizeObserver(() => {\n *       console.log('Container width:', container.clientWidth);\n *     });\n *     observer.observe(container);\n *   });\n *\n *   onDestroy(() => observer?.disconnect());\n * </script>\n * ```\n */\nexport function useUIContainer(): UIContainerContextValue {\n  const context = getContext<UIContainerContextValue>(UI_CONTAINER_KEY);\n  if (!context) {\n    throw new Error('useUIContainer must be used within a UIProvider');\n  }\n  return context;\n}\n","import { getContext, setContext } from 'svelte';\n\n/**\n * Anchor Registry\n *\n * Tracks DOM elements for menu positioning.\n * Each anchor is scoped by documentId and itemId.\n */\nexport interface AnchorRegistry {\n  register(documentId: string, itemId: string, element: HTMLElement): void;\n  unregister(documentId: string, itemId: string): void;\n  getAnchor(documentId: string, itemId: string): HTMLElement | null;\n}\n\nconst ANCHOR_REGISTRY_KEY = Symbol('AnchorRegistry');\n\nexport function createAnchorRegistry(): AnchorRegistry {\n  const anchors = new Map<string, HTMLElement>();\n\n  return {\n    register(documentId: string, itemId: string, element: HTMLElement) {\n      const key = `${documentId}:${itemId}`;\n      anchors.set(key, element);\n    },\n\n    unregister(documentId: string, itemId: string) {\n      const key = `${documentId}:${itemId}`;\n      anchors.delete(key);\n    },\n\n    getAnchor(documentId: string, itemId: string) {\n      const key = `${documentId}:${itemId}`;\n      return anchors.get(key) || null;\n    },\n  };\n}\n\nexport function provideAnchorRegistry() {\n  const registry = createAnchorRegistry();\n  setContext(ANCHOR_REGISTRY_KEY, registry);\n  return registry;\n}\n\nexport function useAnchorRegistry(): AnchorRegistry {\n  const registry = getContext<AnchorRegistry>(ANCHOR_REGISTRY_KEY);\n  if (!registry) {\n    throw new Error('useAnchorRegistry must be used within UIProvider');\n  }\n  return registry;\n}\n","import { getContext, setContext, type Component } from 'svelte';\nimport type { BaseComponentProps } from '../types';\n\n/**\n * Component Registry\n *\n * Stores custom components that can be referenced in the UI schema.\n */\nexport interface ComponentRegistry {\n  register(id: string, component: Component<BaseComponentProps>): void;\n  unregister(id: string): void;\n  get(id: string): Component<BaseComponentProps> | undefined;\n  has(id: string): boolean;\n  getRegisteredIds(): string[];\n}\n\nconst COMPONENT_REGISTRY_KEY = Symbol('ComponentRegistry');\n\nexport function createComponentRegistry(\n  initialComponents: Record<string, Component<BaseComponentProps>> = {},\n): ComponentRegistry {\n  const components = new Map<string, Component<BaseComponentProps>>(\n    Object.entries(initialComponents),\n  );\n\n  return {\n    register(id: string, component: Component<BaseComponentProps>) {\n      components.set(id, component);\n    },\n\n    unregister(id: string) {\n      components.delete(id);\n    },\n\n    get(id: string) {\n      return components.get(id);\n    },\n\n    has(id: string) {\n      return components.has(id);\n    },\n\n    getRegisteredIds() {\n      return Array.from(components.keys());\n    },\n  };\n}\n\nexport function provideComponentRegistry(\n  initialComponents: Record<string, Component<BaseComponentProps>> = {},\n) {\n  const registry = createComponentRegistry(initialComponents);\n  setContext(COMPONENT_REGISTRY_KEY, registry);\n  return registry;\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n  const registry = getContext<ComponentRegistry>(COMPONENT_REGISTRY_KEY);\n  if (!registry) {\n    throw new Error('useComponentRegistry must be used within UIProvider');\n  }\n  return registry;\n}\n","import { getContext, setContext } from 'svelte';\nimport type { UIRenderers } from '../types';\n\n/**\n * Renderers Registry\n *\n * Provides access to user-supplied renderers (toolbar, panel, menu).\n */\nconst RENDERERS_KEY = Symbol('Renderers');\n\nexport function provideRenderers(renderers: UIRenderers) {\n  setContext(RENDERERS_KEY, renderers);\n}\n\nexport function useRenderers(): UIRenderers {\n  const renderers = getContext<UIRenderers>(RENDERERS_KEY);\n  if (!renderers) {\n    throw new Error('useRenderers must be used within UIProvider');\n  }\n  return renderers;\n}\n","<script lang=\"ts\">\n  import { useUIState, useUICapability } from './hooks/use-ui.svelte';\n  import { useAnchorRegistry } from './registries/anchor-registry.svelte';\n  import { useRenderers } from './registries/renderers-registry.svelte';\n\n  /**\n   * Automatically renders menus when opened\n   *\n   * This component:\n   * 1. Listens to UI plugin state for open menus\n   * 2. Looks up anchor elements from the anchor registry\n   * 3. Renders menus using the user-provided menu renderer\n   */\n\n  interface Props {\n    documentId: string; // Which document's menus to render\n    container?: HTMLElement | null;\n  }\n\n  let { documentId, container = null }: Props = $props();\n\n  const uiState = useUIState(() => documentId);\n  const capability = useUICapability();\n  const anchorRegistry = useAnchorRegistry();\n  const renderers = useRenderers();\n\n  // Derived state for active menu\n  const activeMenu = $derived.by(() => {\n    const openMenus = uiState.state?.openMenus || {};\n    const openMenuIds = Object.keys(openMenus);\n\n    if (openMenuIds.length === 0) return null;\n\n    // Show the first open menu (in practice, should only be one)\n    const menuId = openMenuIds[0];\n    if (!menuId) return null;\n\n    const menuState = openMenus[menuId];\n    if (!menuState || !menuState.triggeredByItemId) return null;\n\n    // Look up anchor with documentId scope\n    const anchor = anchorRegistry.getAnchor(documentId, menuState.triggeredByItemId);\n    return { menuId, anchorEl: anchor };\n  });\n\n  const schema = $derived(capability.provides?.getSchema());\n\n  const menuSchema = $derived.by(() => {\n    if (!activeMenu || !schema) return null;\n\n    const menuSchemaValue = schema.menus[activeMenu.menuId];\n    if (!menuSchemaValue) {\n      console.warn(`Menu \"${activeMenu.menuId}\" not found in schema`);\n      return null;\n    }\n\n    return menuSchemaValue;\n  });\n\n  const handleClose = () => {\n    if (activeMenu) {\n      uiState.provides?.closeMenu(activeMenu.menuId);\n    }\n  };\n\n  // Use the user-provided menu renderer\n  const MenuRenderer = renderers.menu;\n</script>\n\n{#if activeMenu && menuSchema && MenuRenderer}\n  <MenuRenderer\n    schema={menuSchema}\n    {documentId}\n    anchorEl={activeMenu.anchorEl}\n    onClose={handleClose}\n    {container}\n  />\n{/if}\n","<script lang=\"ts\">\n  import { UI_ATTRIBUTES, UI_SELECTORS } from '@embedpdf/plugin-ui';\n  import { useUIPlugin, useUICapability } from './hooks/use-ui.svelte';\n  import { setUIContainerContext } from './hooks/use-ui-container.svelte';\n  import type { Snippet } from 'svelte';\n  import type { HTMLAttributes } from 'svelte/elements';\n\n  type Props = HTMLAttributes<HTMLDivElement> & {\n    children?: Snippet;\n  };\n\n  let { children, class: className, ...restProps }: Props = $props();\n\n  const { plugin } = useUIPlugin();\n  const { provides } = useUICapability();\n\n  let disabledCategories = $state<string[]>([]);\n  let hiddenItems = $state<string[]>([]);\n  let rootElement: HTMLDivElement | null = $state(null);\n  let styleEl: HTMLStyleElement | null = null;\n  let styleTarget: HTMLElement | ShadowRoot | null = null;\n\n  // Provide container context for child components\n  setUIContainerContext({\n    getContainer: () => rootElement,\n  });\n\n  function getStyleTarget(element: HTMLElement): HTMLElement | ShadowRoot {\n    const root = element.getRootNode();\n    if (root instanceof ShadowRoot) {\n      return root;\n    }\n    return document.head;\n  }\n\n  $effect(() => {\n    if (!rootElement || !plugin) {\n      styleTarget = null;\n      return;\n    }\n\n    styleTarget = getStyleTarget(rootElement);\n\n    const existingStyle = styleTarget.querySelector(UI_SELECTORS.STYLES) as HTMLStyleElement | null;\n\n    if (existingStyle) {\n      styleEl = existingStyle;\n      existingStyle.textContent = plugin.getStylesheet();\n      return;\n    }\n\n    const stylesheet = plugin.getStylesheet();\n    const newStyleEl = document.createElement('style');\n    newStyleEl.setAttribute(UI_ATTRIBUTES.STYLES, '');\n    newStyleEl.textContent = stylesheet;\n\n    if (styleTarget instanceof ShadowRoot) {\n      styleTarget.insertBefore(newStyleEl, styleTarget.firstChild);\n    } else {\n      styleTarget.appendChild(newStyleEl);\n    }\n\n    styleEl = newStyleEl;\n\n    return () => {\n      if (styleEl?.parentNode) {\n        styleEl.remove();\n      }\n      styleEl = null;\n      styleTarget = null;\n    };\n  });\n\n  $effect(() => {\n    if (!plugin) return;\n\n    return plugin.onStylesheetInvalidated(() => {\n      if (styleEl) {\n        styleEl.textContent = plugin.getStylesheet();\n      }\n    });\n  });\n\n  $effect(() => {\n    if (!provides) return;\n\n    disabledCategories = provides.getDisabledCategories();\n    hiddenItems = provides.getHiddenItems();\n\n    return provides.onCategoryChanged((event) => {\n      disabledCategories = event.disabledCategories;\n      hiddenItems = event.hiddenItems;\n    });\n  });\n\n  const disabledCategoriesAttr = $derived(\n    disabledCategories.length > 0 ? disabledCategories.join(' ') : undefined,\n  );\n\n  const hiddenItemsAttr = $derived(hiddenItems.length > 0 ? hiddenItems.join(' ') : undefined);\n</script>\n\n<div\n  bind:this={rootElement}\n  {...restProps}\n  {...{ [UI_ATTRIBUTES.ROOT]: '' }}\n  {...disabledCategoriesAttr ? { [UI_ATTRIBUTES.DISABLED_CATEGORIES]: disabledCategoriesAttr } : {}}\n  {...hiddenItemsAttr ? { [UI_ATTRIBUTES.HIDDEN_ITEMS]: hiddenItemsAttr } : {}}\n  class={className}\n  style:container-type=\"inline-size\"\n>\n  {#if children}\n    {@render children()}\n  {/if}\n</div>\n","<script lang=\"ts\">\n  import type { Component, Snippet } from 'svelte';\n  import { provideAnchorRegistry } from './registries/anchor-registry.svelte';\n  import { provideComponentRegistry } from './registries/component-registry.svelte';\n  import { provideRenderers } from './registries/renderers-registry.svelte';\n  import type { UIComponents, UIRenderers } from './types';\n  import AutoMenuRenderer from './auto-menu-renderer.svelte';\n  import UIRoot from './root.svelte';\n  import type { HTMLAttributes } from 'svelte/elements';\n\n  /**\n   * UIProvider Props\n   */\n  type ProviderProps = HTMLAttributes<HTMLDivElement> & {\n    children: Snippet;\n\n    /**\n     * Document ID for this UI context\n     * Required for menu rendering\n     */\n    documentId: string;\n\n    /**\n     * Custom component registry\n     * Maps component IDs to components\n     */\n    components?: UIComponents;\n\n    /**\n     * REQUIRED: User-provided renderers\n     * These define how toolbars, panels, and menus are displayed\n     */\n    renderers: UIRenderers;\n\n    /**\n     * Optional: Container for menu portal\n     * Defaults to document.body\n     */\n    menuContainer?: HTMLElement | null;\n\n    class?: string;\n  };\n\n  let {\n    children,\n    documentId,\n    components = {},\n    renderers,\n    menuContainer = null,\n    class: className,\n    ...restProps\n  }: ProviderProps = $props();\n\n  /**\n   * UIProvider - Single provider for all UI plugin functionality\n   *\n   * Manages:\n   * - Anchor registry for menu positioning\n   * - Component registry for custom components\n   * - Renderers for toolbars, panels, and menus\n   * - Automatic menu rendering\n   *\n   * @example\n   * ```svelte\n   * <EmbedPDF {engine} {plugins}>\n   *   {#snippet children({ pluginsReady, activeDocumentId })}\n   *     {#if pluginsReady && activeDocumentId}\n   *       <UIProvider\n   *         documentId={activeDocumentId}\n   *         components={{\n   *           'thumbnail-panel': ThumbnailPanel,\n   *           'bookmark-panel': BookmarkPanel,\n   *         }}\n   *         renderers={{\n   *           toolbar: ToolbarRenderer,\n   *           panel: PanelRenderer,\n   *           menu: MenuRenderer,\n   *         }}\n   *       >\n   *         {#snippet children()}\n   *           <ViewerLayout />\n   *         {/snippet}\n   *       </UIProvider>\n   *     {/if}\n   *   {/snippet}\n   * </EmbedPDF>\n   * ```\n   */\n\n  // Provide all registries\n  provideAnchorRegistry();\n  provideComponentRegistry(components);\n  provideRenderers(renderers);\n</script>\n\n<UIRoot class={className} {...restProps}>\n  {@render children()}\n  <AutoMenuRenderer {documentId} container={menuContainer} />\n</UIRoot>\n","import { useComponentRegistry } from '../registries/component-registry.svelte';\n\n/**\n * Helper utilities for building renderers\n */\nexport function useItemRenderer() {\n  const componentRegistry = useComponentRegistry();\n\n  return {\n    /**\n     * Get a custom component by ID\n     *\n     * @param componentId - Component ID from schema\n     * @returns Component constructor or undefined if not found\n     *\n     * @example\n     * ```svelte\n     * <script lang=\"ts\">\n     *   const { getCustomComponent } = useItemRenderer();\n     *   const MyComponent = getCustomComponent('my-component-id');\n     * </script>\n     *\n     * {#if MyComponent}\n     *   <MyComponent {documentId} {...props} />\n     * {/if}\n     * ```\n     */\n    getCustomComponent: (componentId: string) => {\n      const Component = componentRegistry.get(componentId);\n\n      if (!Component) {\n        console.error(`Component \"${componentId}\" not found in registry`);\n        return undefined;\n      }\n\n      return Component;\n    },\n  };\n}\n","import { onDestroy } from 'svelte';\nimport { useAnchorRegistry } from '../registries/anchor-registry.svelte';\n\n/**\n * Register a DOM element as an anchor for menus\n *\n * @param getDocumentId - Function returning document ID\n * @param getItemId - Function returning item ID (typically matches the toolbar/menu item ID)\n * @returns Function to attach to the element via use:action\n *\n * @example\n *\n * <script lang=\"ts\">\n *   const registerAnchor = useRegisterAnchor(() => documentId, () => 'zoom-button');\n * </script>\n *\n * <button use:registerAnchor>Zoom</button>\n *  */\nexport function useRegisterAnchor(getDocumentId: () => string | null, getItemId: () => string) {\n  const registry = useAnchorRegistry();\n  let currentElement = $state<HTMLElement | null>(null);\n\n  // Reactive values - these update when the functions return different values\n  const documentId = $derived(getDocumentId());\n  const itemId = $derived(getItemId());\n\n  // Re-register anchor when documentId, itemId, or element changes\n  $effect(() => {\n    const docId = documentId;\n    const item = itemId;\n    const element = currentElement;\n\n    // Only register if we have all required values\n    if (element && docId && item) {\n      registry.register(docId, item, element);\n\n      // Cleanup: unregister when effect re-runs or component unmounts\n      return () => {\n        registry.unregister(docId, item);\n      };\n    }\n  });\n\n  // Svelte action function\n  const action = (element: HTMLElement) => {\n    currentElement = element;\n\n    return {\n      destroy() {\n        // Clear the element reference when the action is destroyed\n        currentElement = null;\n      },\n    };\n  };\n\n  return action;\n}\n","import { useUICapability } from './use-ui.svelte';\nimport { useRenderers } from '../registries/renderers-registry.svelte';\n\n/**\n * High-level hook for rendering UI from schema\n *\n * Provides information about active toolbars, sidebars, and modals.\n * Always includes isOpen state so renderers can control animations.\n *\n * Use with Svelte's component binding to render toolbars and sidebars.\n *\n * @example\n * ```svelte\n * <script lang=\"ts\">\n *   const { getToolbarInfo, getSidebarInfo, getModalInfo } = useSchemaRenderer(() => documentId);\n *\n *   const topMainToolbar = $derived(getToolbarInfo('top', 'main'));\n *   const leftMainSidebar = $derived(getSidebarInfo('left', 'main'));\n *   const modal = $derived(getModalInfo());\n * </script>\n *\n * {#if topMainToolbar}\n *   {@const ToolbarRenderer = topMainToolbar.renderer}\n *   <ToolbarRenderer\n *     schema={topMainToolbar.schema}\n *     documentId={topMainToolbar.documentId}\n *     isOpen={topMainToolbar.isOpen}\n *     onClose={topMainToolbar.onClose}\n *   />\n * {/if}\n * ```\n */\nexport function useSchemaRenderer(getDocumentId: () => string | null) {\n  const renderers = useRenderers();\n  const capability = useUICapability();\n  const uiState = useUIState(getDocumentId);\n\n  return {\n    /**\n     * Get toolbar information by placement and slot\n     *\n     * @param placement - 'top' | 'bottom' | 'left' | 'right'\n     * @param slot - Slot name (e.g. 'main', 'secondary')\n     * @returns Toolbar info or null if no toolbar in slot\n     */\n    getToolbarInfo: (placement: 'top' | 'bottom' | 'left' | 'right', slot: string) => {\n      const schema = capability.provides?.getSchema();\n      const documentId = getDocumentId();\n\n      if (!schema || !uiState.provides || !uiState.state || !documentId) return null;\n\n      const slotKey = `${placement}-${slot}`;\n      const toolbarSlot = uiState.state.activeToolbars[slotKey];\n\n      // If no toolbar in this slot, nothing to render\n      if (!toolbarSlot) return null;\n\n      const toolbarSchema = schema.toolbars[toolbarSlot.toolbarId];\n      if (!toolbarSchema) {\n        console.warn(`Toolbar \"${toolbarSlot.toolbarId}\" not found in schema`);\n        return null;\n      }\n\n      // Check if toolbar is closable\n      const isClosable = !toolbarSchema.permanent;\n\n      const handleClose = isClosable\n        ? () => {\n            uiState.provides?.closeToolbarSlot(placement, slot);\n          }\n        : undefined;\n\n      return {\n        renderer: renderers.toolbar,\n        schema: toolbarSchema,\n        documentId,\n        isOpen: toolbarSlot.isOpen,\n        onClose: handleClose,\n      };\n    },\n\n    /**\n     * Get sidebar information by placement and slot\n     *\n     * @param placement - 'left' | 'right' | 'top' | 'bottom'\n     * @param slot - Slot name (e.g. 'main', 'secondary', 'inspector')\n     * @returns Sidebar info or null if no sidebar in slot\n     */\n    getSidebarInfo: (placement: 'left' | 'right' | 'top' | 'bottom', slot: string) => {\n      const schema = capability.provides?.getSchema();\n      const documentId = getDocumentId();\n\n      if (!schema || !uiState.provides || !uiState.state || !documentId) return null;\n\n      const slotKey = `${placement}-${slot}`;\n      const sidebarSlot = uiState.state.activeSidebars[slotKey];\n\n      // If no sidebar in this slot, nothing to render\n      if (!sidebarSlot) return null;\n\n      const sidebarSchema = schema.sidebars?.[sidebarSlot.sidebarId];\n      if (!sidebarSchema) {\n        console.warn(`Sidebar \"${sidebarSlot.sidebarId}\" not found in schema`);\n        return null;\n      }\n\n      const handleClose = () => {\n        uiState.provides?.closeSidebarSlot(placement, slot);\n      };\n\n      return {\n        renderer: renderers.sidebar,\n        schema: sidebarSchema,\n        documentId,\n        isOpen: sidebarSlot.isOpen,\n        onClose: handleClose,\n        sidebarProps: sidebarSlot.props,\n      };\n    },\n\n    /**\n     * Get modal information (if active)\n     *\n     * Supports animation lifecycle:\n     * - isOpen: true = visible\n     * - isOpen: false = animate out (modal still rendered)\n     * - onExited called after animation → modal removed\n     *\n     * @returns Modal info or null if no modal active\n     */\n    getModalInfo: () => {\n      const schema = capability.provides?.getSchema();\n      const documentId = getDocumentId();\n\n      if (!schema || !uiState.provides || !uiState.state?.activeModal || !documentId) return null;\n\n      const { modalId, isOpen } = uiState.state.activeModal;\n\n      const modalSchema = schema.modals?.[modalId];\n      if (!modalSchema) {\n        console.warn(`Modal \"${modalId}\" not found in schema`);\n        return null;\n      }\n\n      const handleClose = () => {\n        uiState.provides?.closeModal();\n      };\n\n      const handleExited = () => {\n        uiState.provides?.clearModal();\n      };\n\n      const ModalRenderer = renderers.modal;\n      if (!ModalRenderer) {\n        console.warn('No modal renderer registered');\n        return null;\n      }\n\n      return {\n        renderer: ModalRenderer,\n        schema: modalSchema,\n        documentId,\n        isOpen,\n        onClose: handleClose,\n        onExited: handleExited,\n        modalProps: uiState.state.activeModal.props,\n      };\n    },\n\n    /**\n     * Helper: Get all active toolbars for this document\n     * Useful for batch rendering or debugging\n     */\n    getActiveToolbars: () => {\n      if (!uiState.state) return [];\n      return Object.entries(uiState.state.activeToolbars).map(([slotKey, toolbarSlot]) => {\n        const [placement, slot] = slotKey.split('-');\n        return {\n          placement,\n          slot,\n          toolbarId: toolbarSlot.toolbarId,\n          isOpen: toolbarSlot.isOpen,\n        };\n      });\n    },\n\n    /**\n     * Helper: Get all active sidebars for this document\n     * Useful for batch rendering or debugging\n     */\n    getActiveSidebars: () => {\n      if (!uiState.state) return [];\n      return Object.entries(uiState.state.activeSidebars).map(([slotKey, sidebarSlot]) => {\n        const [placement, slot] = slotKey.split('-');\n        return {\n          placement,\n          slot,\n          sidebarId: sidebarSlot.sidebarId,\n          isOpen: sidebarSlot.isOpen,\n        };\n      });\n    },\n\n    /**\n     * Get overlay information for all enabled overlays\n     *\n     * Overlays are floating components positioned over the document content.\n     * Unlike modals, multiple overlays can be visible and they don't block interaction.\n     * Overlay visibility is controlled by the enabledOverlays state.\n     *\n     * @example\n     * ```svelte\n     * <script lang=\"ts\">\n     *   const { getOverlaysInfo } = useSchemaRenderer(() => documentId);\n     *   const overlays = $derived(getOverlaysInfo());\n     * </script>\n     *\n     * {#each overlays as overlay (overlay.schema.id)}\n     *   {@const OverlayRenderer = overlay.renderer}\n     *   <OverlayRenderer schema={overlay.schema} documentId={overlay.documentId} />\n     * {/each}\n     * ```\n     */\n    getOverlaysInfo: () => {\n      const schema = capability.provides?.getSchema();\n      const documentId = getDocumentId();\n\n      if (!schema?.overlays || !documentId || !uiState.state) return [];\n\n      const OverlayRenderer = renderers.overlay;\n      if (!OverlayRenderer) {\n        return [];\n      }\n\n      const overlays = Object.values(schema.overlays);\n\n      // Filter overlays by enabled state (default to true if not explicitly set)\n      const enabledOverlays = overlays.filter(\n        (overlay) => uiState.state!.enabledOverlays[overlay.id] !== false,\n      );\n\n      return enabledOverlays.map((overlaySchema) => ({\n        renderer: OverlayRenderer,\n        schema: overlaySchema,\n        documentId,\n      }));\n    },\n  };\n}\n\n// Import after definition to avoid circular dependency\nimport { useUIState } from './use-ui.svelte';\n","import type {\n  SelectionMenuPropsBase,\n  SelectionMenuRenderFn,\n  SelectionMenuRenderResult,\n} from '@embedpdf/utils/svelte';\nimport { useUICapability } from './use-ui.svelte';\nimport { useRenderers } from '../registries/renderers-registry.svelte';\n\n/**\n * Hook for schema-driven selection menus\n */\nexport function useSelectionMenu<TContext extends { type: string }>(\n  menuId: string | (() => string),\n  getDocumentId: () => string,\n) {\n  const uiCapability = useUICapability();\n  const renderers = useRenderers();\n\n  // Normalize menuId to always be a function, then make it reactive\n  const getMenuIdFn = typeof menuId === 'function' ? menuId : () => menuId;\n  const menuIdValue = $derived(getMenuIdFn());\n  const documentId = $derived(getDocumentId());\n  const schema = $derived(uiCapability.provides?.getSchema());\n  const menuSchema = $derived(schema?.selectionMenus?.[menuIdValue]);\n\n  const renderFn = $derived.by<SelectionMenuRenderFn<TContext> | undefined>(() => {\n    if (!menuSchema) return undefined;\n\n    const currentMenuSchema = menuSchema;\n    const currentDocumentId = documentId;\n    const SelectionMenuRenderer = renderers.selectionMenu;\n\n    return (props: SelectionMenuPropsBase<TContext>): SelectionMenuRenderResult | null => {\n      if (!props.selected) return null;\n\n      return {\n        component: SelectionMenuRenderer,\n        props: {\n          schema: currentMenuSchema,\n          documentId: currentDocumentId,\n          props,\n        },\n      };\n    };\n  });\n\n  return {\n    get renderFn() {\n      return renderFn;\n    },\n  };\n}\n"],"names":["useUIPlugin","usePlugin","UIPlugin","id","useUICapability","useCapability","useUIState","getDocumentId","capability","state","$","documentId","scopedProvides","derived","provides","forDocument","user_effect","docId","set","scope","getState","unsubToolbar","onToolbarChanged","unsubSidebar","onSidebarChanged","unsubModal","onModalChanged","unsubMenu","onMenuChanged","unsubOverlay","onOverlayChanged","UI_CONTAINER_KEY","Symbol","setUIContainerContext","value","setContext","ANCHOR_REGISTRY_KEY","createAnchorRegistry","anchors","Map","register","itemId","element","key","unregister","delete","getAnchor","get","provideAnchorRegistry","registry","useAnchorRegistry","getContext","Error","COMPONENT_REGISTRY_KEY","createComponentRegistry","initialComponents","components","Object","entries","component","has","getRegisteredIds","Array","from","keys","provideComponentRegistry","useComponentRegistry","RENDERERS_KEY","provideRenderers","renderers","useRenderers","container","uiState","$$props","anchorRegistry","activeMenu","openMenus","_a","openMenuIds","length","menuId","menuState","triggeredByItemId","anchorEl","schema","getSchema","menuSchema","menuSchemaValue","menus","console","warn","handleClose","closeMenu","MenuRenderer","menu","$$anchor","$$render","consequent","restProps","rest_props","plugin","disabledCategories","proxy","hiddenItems","rootElement","styleEl","styleTarget","getContainer","root","getRootNode","ShadowRoot","document","head","getStyleTarget","existingStyle","querySelector","UI_SELECTORS","STYLES","textContent","getStylesheet","stylesheet","newStyleEl","createElement","setAttribute","UI_ATTRIBUTES","insertBefore","firstChild","appendChild","parentNode","remove","onStylesheetInvalidated","getDisabledCategories","getHiddenItems","onCategoryChanged","event","disabledCategoriesAttr","join","hiddenItemsAttr","div","root_1","ROOT","DISABLED_CATEGORIES","HIDDEN_ITEMS","$$value","prop","menuContainer","UIRoot","spread_props","AutoMenuRenderer","componentRegistry","getCustomComponent","componentId","Component","error","getItemId","currentElement","item","destroy","getToolbarInfo","placement","slot","slotKey","toolbarSlot","activeToolbars","toolbarSchema","toolbars","toolbarId","permanent","closeToolbarSlot","renderer","toolbar","isOpen","onClose","getSidebarInfo","sidebarSlot","activeSidebars","sidebarSchema","_b","sidebars","sidebarId","sidebar","closeSidebarSlot","sidebarProps","props","getModalInfo","activeModal","modalId","modalSchema","_c","modals","ModalRenderer","modal","closeModal","onExited","clearModal","modalProps","getActiveToolbars","map","split","getActiveSidebars","getOverlaysInfo","overlays","OverlayRenderer","overlay","values","filter","enabledOverlays","overlaySchema","uiCapability","getMenuIdFn","menuIdValue","selectionMenus","renderFn","currentMenuSchema","currentDocumentId","SelectionMenuRenderer","selectionMenu","selected","context"],"mappings":"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"}