{"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-ui.ts","../../src/shared/hooks/use-ui-container.ts","../../src/shared/registries/anchor-registry.tsx","../../src/shared/registries/component-registry.tsx","../../src/shared/registries/renderers-registry.tsx","../../src/shared/auto-menu-renderer.tsx","../../src/shared/root.tsx","../../src/shared/provider.tsx","../../src/shared/hooks/use-item-renderer.tsx","../../src/shared/hooks/use-register-anchor.ts","../../src/shared/hooks/use-schema-renderer.tsx","../../src/shared/hooks/use-selection-menu.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { UIPlugin } from '@embedpdf/plugin-ui';\nimport { useState, useEffect } from '@framework';\nimport { UIDocumentState, UISchema } from '@embedpdf/plugin-ui';\n\nexport const useUICapability = () => useCapability<UIPlugin>(UIPlugin.id);\nexport const useUIPlugin = () => usePlugin<UIPlugin>(UIPlugin.id);\n\n/**\n * Get UI state for a document\n */\nexport const useUIState = (documentId: string) => {\n  const { provides } = useUICapability();\n  const [state, setState] = useState<UIDocumentState | null>(null);\n\n  useEffect(() => {\n    if (!provides) return;\n\n    const scope = provides.forDocument(documentId);\n    setState(scope.getState());\n\n    // Subscribe to changes\n    const unsubToolbar = scope.onToolbarChanged(() => setState(scope.getState()));\n    const unsubSidebar = scope.onSidebarChanged(() => setState(scope.getState()));\n    const unsubModal = scope.onModalChanged(() => setState(scope.getState()));\n    const unsubMenu = scope.onMenuChanged(() => setState(scope.getState()));\n    const unsubOverlay = scope.onOverlayChanged(() => setState(scope.getState()));\n\n    return () => {\n      unsubToolbar();\n      unsubSidebar();\n      unsubModal();\n      unsubMenu();\n      unsubOverlay();\n    };\n  }, [provides, documentId]);\n\n  return state;\n};\n\n/**\n * Get UI schema\n */\nexport const useUISchema = (): UISchema | null => {\n  const { provides } = useUICapability();\n  return provides?.getSchema() ?? null;\n};\n","import { createContext, useContext, RefObject } from '@framework';\n\nexport interface UIContainerContextValue {\n  /** Reference to the UIRoot container element */\n  containerRef: RefObject<HTMLDivElement>;\n  /** Get the container element (may be null if not mounted) */\n  getContainer: () => HTMLDivElement | null;\n}\n\nexport const UIContainerContext = createContext<UIContainerContextValue | null>(null);\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 * ```tsx\n * function MyComponent() {\n *   const { containerRef, getContainer } = useUIContainer();\n *\n *   // Use containerRef for ResizeObserver\n *   useEffect(() => {\n *     const container = getContainer();\n *     if (!container) return;\n *\n *     const observer = new ResizeObserver(() => {\n *       console.log('Container width:', container.clientWidth);\n *     });\n *     observer.observe(container);\n *     return () => observer.disconnect();\n *   }, [getContainer]);\n *\n *   // Or portal to the container\n *   return createPortal(<Modal />, getContainer()!);\n * }\n * ```\n */\nexport function useUIContainer(): UIContainerContextValue {\n  const context = useContext(UIContainerContext);\n  if (!context) {\n    throw new Error('useUIContainer must be used within a UIProvider');\n  }\n  return context;\n}\n","import { createContext, useContext, useRef, useCallback } from '@framework';\nimport type { ReactNode } from '@framework';\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 AnchorRegistryContext = createContext<AnchorRegistry | null>(null);\n\nexport function AnchorRegistryProvider({ children }: { children: ReactNode }) {\n  const anchorsRef = useRef<Map<string, HTMLElement>>(new Map());\n\n  const registry: AnchorRegistry = {\n    register: useCallback((documentId: string, itemId: string, element: HTMLElement) => {\n      const key = `${documentId}:${itemId}`;\n      anchorsRef.current.set(key, element);\n    }, []),\n\n    unregister: useCallback((documentId: string, itemId: string) => {\n      const key = `${documentId}:${itemId}`;\n      anchorsRef.current.delete(key);\n    }, []),\n\n    getAnchor: useCallback((documentId: string, itemId: string) => {\n      const key = `${documentId}:${itemId}`;\n      return anchorsRef.current.get(key) || null;\n    }, []),\n  };\n\n  return (\n    <AnchorRegistryContext.Provider value={registry}>{children}</AnchorRegistryContext.Provider>\n  );\n}\n\nexport function useAnchorRegistry(): AnchorRegistry {\n  const context = useContext(AnchorRegistryContext);\n  if (!context) {\n    throw new Error('useAnchorRegistry must be used within UIProvider');\n  }\n  return context;\n}\n","import { createContext, useContext, useRef, useCallback } from '@framework';\nimport type { ComponentType, ReactNode } from '@framework';\nimport { 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: ComponentType<BaseComponentProps>): void;\n  unregister(id: string): void;\n  get(id: string): ComponentType<BaseComponentProps> | undefined;\n  has(id: string): boolean;\n  getRegisteredIds(): string[];\n}\n\nconst ComponentRegistryContext = createContext<ComponentRegistry | null>(null);\n\nexport interface ComponentRegistryProviderProps {\n  children: ReactNode;\n  initialComponents?: Record<string, ComponentType<BaseComponentProps>>;\n}\n\nexport function ComponentRegistryProvider({\n  children,\n  initialComponents = {},\n}: ComponentRegistryProviderProps) {\n  const componentsRef = useRef<Map<string, ComponentType<BaseComponentProps>>>(\n    new Map(Object.entries(initialComponents)),\n  );\n\n  const registry: ComponentRegistry = {\n    register: useCallback((id: string, component: ComponentType<BaseComponentProps>) => {\n      componentsRef.current.set(id, component);\n    }, []),\n\n    unregister: useCallback((id: string) => {\n      componentsRef.current.delete(id);\n    }, []),\n\n    get: useCallback((id: string) => {\n      return componentsRef.current.get(id);\n    }, []),\n\n    has: useCallback((id: string) => {\n      return componentsRef.current.has(id);\n    }, []),\n\n    getRegisteredIds: useCallback(() => {\n      return Array.from(componentsRef.current.keys());\n    }, []),\n  };\n\n  return (\n    <ComponentRegistryContext.Provider value={registry}>\n      {children}\n    </ComponentRegistryContext.Provider>\n  );\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n  const context = useContext(ComponentRegistryContext);\n  if (!context) {\n    throw new Error('useComponentRegistry must be used within UIProvider');\n  }\n  return context;\n}\n","import { createContext, useContext } from '@framework';\nimport type { ReactNode } from '@framework';\nimport { UIRenderers } from '../types';\n\n/**\n * Renderers Registry\n *\n * Provides access to user-supplied renderers (toolbar, panel, menu).\n */\nconst RenderersContext = createContext<UIRenderers | null>(null);\n\nexport interface RenderersProviderProps {\n  children: ReactNode;\n  renderers: UIRenderers;\n}\n\nexport function RenderersProvider({ children, renderers }: RenderersProviderProps) {\n  return <RenderersContext.Provider value={renderers}>{children}</RenderersContext.Provider>;\n}\n\nexport function useRenderers(): UIRenderers {\n  const context = useContext(RenderersContext);\n  if (!context) {\n    throw new Error('useRenderers must be used within UIProvider');\n  }\n  return context;\n}\n","import { useState, useEffect } from '@framework';\nimport { useUIState, useUICapability } from './hooks/use-ui';\nimport { useAnchorRegistry } from './registries/anchor-registry';\nimport { useRenderers } from './registries/renderers-registry';\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 */\nexport interface AutoMenuRendererProps {\n  container?: HTMLElement | null;\n  documentId: string; // Which document's menus to render\n}\n\nexport function AutoMenuRenderer({ container, documentId }: AutoMenuRendererProps) {\n  const uiState = useUIState(documentId);\n  const { provides } = useUICapability();\n  const anchorRegistry = useAnchorRegistry();\n  const renderers = useRenderers();\n\n  const [activeMenu, setActiveMenu] = useState<{\n    menuId: string;\n    anchorEl: HTMLElement | null;\n  } | null>(null);\n\n  const openMenus = uiState?.openMenus || {};\n  const schema = provides?.getSchema();\n\n  // Update active menu when state changes\n  useEffect(() => {\n    const openMenuIds = Object.keys(openMenus);\n\n    if (openMenuIds.length > 0) {\n      // Show the first open menu (in practice, should only be one)\n      const menuId = openMenuIds[0];\n      if (!menuId) {\n        setActiveMenu(null);\n        return;\n      }\n\n      const menuState = openMenus[menuId];\n      if (menuState && menuState.triggeredByItemId) {\n        // Look up anchor with documentId scope\n        const anchor = anchorRegistry.getAnchor(documentId, menuState.triggeredByItemId);\n        setActiveMenu({ menuId, anchorEl: anchor });\n      } else {\n        setActiveMenu(null);\n      }\n    } else {\n      setActiveMenu(null);\n    }\n  }, [openMenus, anchorRegistry, documentId]);\n\n  const handleClose = () => {\n    if (activeMenu) {\n      provides?.forDocument(documentId).closeMenu(activeMenu.menuId);\n    }\n  };\n\n  if (!activeMenu || !schema) {\n    return null;\n  }\n\n  const menuSchema = schema.menus[activeMenu.menuId];\n  if (!menuSchema) {\n    console.warn(`Menu \"${activeMenu.menuId}\" not found in schema`);\n    return null;\n  }\n\n  // Use the user-provided menu renderer\n  const MenuRenderer = renderers.menu;\n\n  return (\n    <MenuRenderer\n      schema={menuSchema}\n      documentId={documentId}\n      anchorEl={activeMenu.anchorEl}\n      onClose={handleClose}\n      container={container}\n    />\n  );\n}\n","import { UI_ATTRIBUTES, UI_SELECTORS } from '@embedpdf/plugin-ui';\nimport { useUICapability, useUIPlugin } from './hooks/use-ui';\nimport { UIContainerContext, UIContainerContextValue } from './hooks/use-ui-container';\nimport {\n  useState,\n  useEffect,\n  useRef,\n  useMemo,\n  useCallback,\n  ReactNode,\n  HTMLAttributes,\n} from '@framework';\n\n/**\n * Find the style injection target for an element.\n * Returns the shadow root if inside one, otherwise document.head.\n */\nfunction 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\ninterface UIRootProps extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode;\n}\n\n/**\n * Internal component that handles:\n * 1. Injecting the generated stylesheet (into shadow root or document.head)\n * 2. Managing the data-disabled-categories attribute\n * 3. Updating styles on locale changes\n */\nexport function UIRoot({ children, style, ...restProps }: UIRootProps) {\n  const { plugin } = useUIPlugin();\n  const { provides } = useUICapability();\n  const [disabledCategories, setDisabledCategories] = useState<string[]>([]);\n  const [hiddenItems, setHiddenItems] = useState<string[]>([]);\n  const styleElRef = useRef<HTMLStyleElement | null>(null);\n  const styleTargetRef = useRef<HTMLElement | ShadowRoot | null>(null);\n  const previousElementRef = useRef<HTMLDivElement | null>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  // Create container context value (memoized to prevent unnecessary re-renders)\n  const containerContextValue = useMemo<UIContainerContextValue>(\n    () => ({\n      containerRef,\n      getContainer: () => containerRef.current,\n    }),\n    [],\n  );\n\n  // Callback ref that handles style injection when element mounts\n  // Handles React Strict Mode by tracking previous element\n  const rootRefCallback = useCallback(\n    (element: HTMLDivElement | null) => {\n      const previousElement = previousElementRef.current;\n\n      // Update refs\n      previousElementRef.current = element;\n      (containerRef as any).current = element;\n\n      // If element is null (unmount), don't do anything yet\n      // React Strict Mode will remount, so we'll handle cleanup in useEffect\n      if (!element) {\n        return;\n      }\n\n      // If element changed (or is new) and plugin is available, inject styles\n      if (element !== previousElement && plugin) {\n        const styleTarget = getStyleTarget(element);\n        styleTargetRef.current = styleTarget;\n\n        // Check if styles already exist in this target\n        const existingStyle = styleTarget.querySelector(\n          UI_SELECTORS.STYLES,\n        ) as HTMLStyleElement | null;\n\n        if (existingStyle) {\n          styleElRef.current = existingStyle;\n          // Update content in case locale changed\n          existingStyle.textContent = plugin.getStylesheet();\n          return;\n        }\n\n        // Create and inject stylesheet\n        const stylesheet = plugin.getStylesheet();\n        const styleEl = document.createElement('style');\n        styleEl.setAttribute(UI_ATTRIBUTES.STYLES, '');\n        styleEl.textContent = stylesheet;\n\n        if (styleTarget instanceof ShadowRoot) {\n          // For shadow root, prepend before other content\n          styleTarget.insertBefore(styleEl, styleTarget.firstChild);\n        } else {\n          styleTarget.appendChild(styleEl);\n        }\n\n        styleElRef.current = styleEl;\n      }\n    },\n    [plugin],\n  );\n\n  // Cleanup on actual unmount (not Strict Mode remount)\n  useEffect(() => {\n    return () => {\n      // Only cleanup if we're actually unmounting (not just Strict Mode)\n      // The style element will be reused if component remounts\n      if (styleElRef.current?.parentNode && !previousElementRef.current) {\n        styleElRef.current.remove();\n      }\n      styleElRef.current = null;\n      styleTargetRef.current = null;\n    };\n  }, []);\n\n  // Subscribe to stylesheet invalidation (locale changes, schema merges)\n  useEffect(() => {\n    if (!plugin) return;\n\n    return plugin.onStylesheetInvalidated(() => {\n      // Update the style element content\n      if (styleElRef.current) {\n        styleElRef.current.textContent = plugin.getStylesheet();\n      }\n    });\n  }, [plugin]);\n\n  // Subscribe to category and hidden items changes\n  useEffect(() => {\n    if (!provides) return;\n\n    setDisabledCategories(provides.getDisabledCategories());\n    setHiddenItems(provides.getHiddenItems());\n\n    return provides.onCategoryChanged(({ disabledCategories, hiddenItems }) => {\n      setDisabledCategories(disabledCategories);\n      setHiddenItems(hiddenItems);\n    });\n  }, [provides]);\n\n  // Build the disabled categories attribute value\n  const disabledCategoriesAttr = useMemo(\n    () => (disabledCategories.length > 0 ? disabledCategories.join(' ') : undefined),\n    [disabledCategories],\n  );\n\n  // Build the hidden items attribute value\n  const hiddenItemsAttr = useMemo(\n    () => (hiddenItems.length > 0 ? hiddenItems.join(' ') : undefined),\n    [hiddenItems],\n  );\n\n  const combinedStyle = useMemo(() => {\n    const base = { containerType: 'inline-size' as const };\n    if (style && typeof style === 'object') {\n      return { ...base, ...style };\n    }\n    return base;\n  }, [style]);\n\n  const rootProps = {\n    [UI_ATTRIBUTES.ROOT]: '',\n    [UI_ATTRIBUTES.DISABLED_CATEGORIES]: disabledCategoriesAttr,\n    [UI_ATTRIBUTES.HIDDEN_ITEMS]: hiddenItemsAttr,\n  };\n\n  return (\n    <UIContainerContext.Provider value={containerContextValue}>\n      <div ref={rootRefCallback} {...rootProps} {...restProps} style={combinedStyle}>\n        {children}\n      </div>\n    </UIContainerContext.Provider>\n  );\n}\n","import type { ReactNode, ComponentType, HTMLAttributes } from '@framework';\nimport { AnchorRegistryProvider } from './registries/anchor-registry';\nimport { ComponentRegistryProvider } from './registries/component-registry';\nimport { RenderersProvider } from './registries/renderers-registry';\nimport { BaseComponentProps, UIRenderers } from './types';\nimport { AutoMenuRenderer } from './auto-menu-renderer';\nimport { UIRoot } from './root';\n\n/**\n * UIProvider Props\n */\nexport interface UIProviderProps extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode;\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?: Record<string, ComponentType<BaseComponentProps>>;\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\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 * ```tsx\n * <EmbedPDF engine={engine} plugins={plugins}>\n *   {({ pluginsReady }) => (\n *     pluginsReady && (\n *       <DocumentContext>\n *         {({ activeDocumentId }) => (\n *           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 *               <ViewerLayout />\n *             </UIProvider>\n *           )\n *         )}\n *       </DocumentContext>\n *     )\n *   )}\n * </EmbedPDF>\n * ```\n */\nexport function UIProvider({\n  children,\n  documentId,\n  components = {},\n  renderers,\n  menuContainer,\n  ...restProps\n}: UIProviderProps) {\n  return (\n    <AnchorRegistryProvider>\n      <ComponentRegistryProvider initialComponents={components}>\n        <RenderersProvider renderers={renderers}>\n          <UIRoot {...restProps}>\n            {children}\n            {/* Automatically render menus for this document */}\n            <AutoMenuRenderer documentId={documentId} container={menuContainer} />\n          </UIRoot>\n        </RenderersProvider>\n      </ComponentRegistryProvider>\n    </AnchorRegistryProvider>\n  );\n}\n","import { useComponentRegistry } from '../registries/component-registry';\n\n/**\n * Helper utilities for building renderers\n */\nexport function useItemRenderer() {\n  const componentRegistry = useComponentRegistry();\n\n  return {\n    /**\n     * Render a custom component by ID\n     *\n     * @param componentId - Component ID from schema\n     * @param documentId - Document ID\n     * @param props - Additional props to pass to component\n     * @returns Rendered component or null if not found\n     */\n    renderCustomComponent: (componentId: string, documentId: string, props?: any) => {\n      const Component = componentRegistry.get(componentId);\n\n      if (!Component) {\n        console.error(`Component \"${componentId}\" not found in registry`);\n        return null;\n      }\n\n      return <Component documentId={documentId} {...(props || {})} />;\n    },\n  };\n}\n","import { useCallback, useRef } from '@framework';\nimport { useAnchorRegistry } from '../registries/anchor-registry';\n\n/**\n * Register a DOM element as an anchor for menus\n *\n * @param documentId - Document ID\n * @param itemId - Item ID (typically matches the toolbar/menu item ID)\n * @returns Ref callback to attach to the element\n *\n * @example\n * ```tsx\n * function ZoomButton({ documentId }: Props) {\n *   const anchorRef = useRegisterAnchor(documentId, 'zoom-button');\n *\n *   return <button ref={anchorRef}>Zoom</button>;\n * }\n * ```\n */\nexport function useRegisterAnchor(\n  documentId: string,\n  itemId: string,\n): (element: HTMLElement | null) => void {\n  const registry = useAnchorRegistry();\n  const elementRef = useRef<HTMLElement | null>(null);\n  const documentIdRef = useRef(documentId);\n  const itemIdRef = useRef(itemId);\n\n  // Keep refs in sync\n  documentIdRef.current = documentId;\n  itemIdRef.current = itemId;\n\n  // Return stable callback that uses refs\n  return useCallback(\n    (element: HTMLElement | null) => {\n      // Store previous element\n      const previousElement = elementRef.current;\n\n      // Update ref\n      elementRef.current = element;\n\n      // Handle registration/unregistration\n      if (element) {\n        // Register new element\n        if (element !== previousElement) {\n          registry.register(documentIdRef.current, itemIdRef.current, element);\n        }\n      } else if (previousElement) {\n        // Element is now null, but we had one before - unregister\n        registry.unregister(documentIdRef.current, itemIdRef.current);\n      }\n    },\n    [registry], // Only depend on registry!\n  );\n}\n","import { Fragment } from '@framework';\nimport { useUICapability, useUIState } from './use-ui';\nimport { useRenderers } from '../registries/renderers-registry';\n\n/**\n * High-level hook for rendering UI from schema\n *\n * Provides simple functions to render toolbars, sidebars, and modals.\n * Always passes isOpen state to renderers so they can control animations.\n *\n * Automatically subscribes to UI state changes for the given document.\n */\nexport function useSchemaRenderer(documentId: string) {\n  const renderers = useRenderers();\n  const { provides } = useUICapability();\n  const schema = provides?.getSchema();\n  const uiState = useUIState(documentId); // Subscribe to state changes\n\n  return {\n    /**\n     * Render a toolbar by placement and slot\n     *\n     * Always renders with isOpen state when toolbar exists in slot.\n     *\n     * @param placement - 'top' | 'bottom' | 'left' | 'right'\n     * @param slot - Slot name (e.g. 'main', 'secondary')\n     *\n     * @example\n     * ```tsx\n     * {renderToolbar('top', 'main')}\n     * {renderToolbar('top', 'secondary')}\n     * ```\n     */\n    renderToolbar: (placement: 'top' | 'bottom' | 'left' | 'right', slot: string) => {\n      const slotKey = `${placement}-${slot}`;\n\n      if (!schema || !provides || !uiState) {\n        return null;\n      }\n\n      const toolbarSlot = uiState.activeToolbars[slotKey];\n      const toolbarSchema = toolbarSlot ? schema.toolbars[toolbarSlot.toolbarId] : null;\n\n      if (toolbarSlot && !toolbarSchema) {\n        console.warn(`Toolbar \"${toolbarSlot.toolbarId}\" not found in schema`);\n      }\n\n      const isClosable = toolbarSchema ? !toolbarSchema.permanent : false;\n      const handleClose = isClosable\n        ? () => provides.forDocument(documentId).closeToolbarSlot(placement, slot)\n        : undefined;\n\n      const ToolbarRenderer = renderers.toolbar;\n\n      // Always return the same element type (div) with stable key\n      return (\n        <Fragment key={`toolbar-slot-${slotKey}`}>\n          {toolbarSlot && toolbarSchema && (\n            <ToolbarRenderer\n              schema={toolbarSchema}\n              documentId={documentId}\n              isOpen={toolbarSlot.isOpen}\n              onClose={handleClose}\n            />\n          )}\n        </Fragment>\n      );\n    },\n\n    /**\n     * Render a sidebar by placement and slot\n     *\n     * ALWAYS renders (when sidebar exists in slot) with isOpen state.\n     * Your renderer controls whether to display or animate.\n     *\n     * @param placement - 'left' | 'right' | 'top' | 'bottom'\n     * @param slot - Slot name (e.g. 'main', 'secondary', 'inspector')\n     *\n     * @example\n     * ```tsx\n     * {renderSidebar('left', 'main')}\n     * {renderSidebar('right', 'main')}\n     * ```\n     */\n    renderSidebar: (placement: 'left' | 'right' | 'top' | 'bottom', slot: string) => {\n      const slotKey = `${placement}-${slot}`;\n\n      if (!schema || !provides || !uiState) {\n        return null;\n      }\n\n      const sidebarSlot = uiState.activeSidebars[slotKey];\n      const sidebarSchema = sidebarSlot ? schema.sidebars?.[sidebarSlot.sidebarId] : null;\n\n      if (sidebarSlot && !sidebarSchema) {\n        console.warn(`Sidebar \"${sidebarSlot.sidebarId}\" not found in schema`);\n      }\n\n      const handleClose = () => {\n        provides.forDocument(documentId).closeSidebarSlot(placement, slot);\n      };\n\n      const SidebarRenderer = renderers.sidebar;\n\n      // Always return the same element type (Fragment) with stable key\n      return (\n        <Fragment key={`sidebar-slot-${slotKey}`}>\n          {sidebarSlot && sidebarSchema && (\n            <SidebarRenderer\n              schema={sidebarSchema}\n              documentId={documentId}\n              isOpen={sidebarSlot.isOpen}\n              onClose={handleClose}\n              sidebarProps={sidebarSlot.props}\n            />\n          )}\n        </Fragment>\n      );\n    },\n\n    /**\n     * Render the active modal (if any)\n     *\n     * Only one modal can be active at a time.\n     * Modals are defined in schema.modals.\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     * @example\n     * ```tsx\n     * {renderModal()}\n     * ```\n     */\n    renderModal: () => {\n      if (!schema || !provides || !uiState) {\n        return null;\n      }\n\n      const ModalRenderer = renderers.modal;\n      if (!ModalRenderer) {\n        return null;\n      }\n\n      const activeModal = uiState.activeModal;\n      const modalSchema = activeModal ? schema.modals?.[activeModal.modalId] : null;\n\n      if (activeModal && !modalSchema) {\n        console.warn(`Modal \"${activeModal.modalId}\" not found in schema`);\n      }\n\n      const handleClose = () => {\n        provides.forDocument(documentId).closeModal();\n      };\n\n      const handleExited = () => {\n        provides.forDocument(documentId).clearModal();\n      };\n\n      // Always return the same element type (Fragment) with stable key\n      return (\n        <Fragment key=\"modal-slot\">\n          {activeModal && modalSchema && (\n            <ModalRenderer\n              schema={modalSchema}\n              documentId={documentId}\n              isOpen={activeModal.isOpen}\n              onClose={handleClose}\n              onExited={handleExited}\n              modalProps={activeModal.props}\n            />\n          )}\n        </Fragment>\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) return [];\n      return Object.entries(uiState.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) return [];\n      return Object.entries(uiState.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     * Render 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     * ```tsx\n     * <div className=\"relative\">\n     *   {children}\n     *   {renderOverlays()}\n     * </div>\n     * ```\n     */\n    renderOverlays: () => {\n      if (!schema || !provides || !uiState) {\n        return null;\n      }\n\n      const OverlayRenderer = renderers.overlay;\n      if (!OverlayRenderer) {\n        return null;\n      }\n\n      const overlays = schema.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.enabledOverlays[overlay.id] !== false,\n      );\n\n      // Always return the same element type (Fragment) with stable key\n      return (\n        <Fragment key=\"overlays-slot\">\n          {enabledOverlays.map((overlaySchema) => (\n            <OverlayRenderer\n              key={overlaySchema.id}\n              schema={overlaySchema}\n              documentId={documentId}\n            />\n          ))}\n        </Fragment>\n      );\n    },\n  };\n}\n","import { useCallback } from '@framework';\nimport { SelectionMenuPropsBase, SelectionMenuRenderFn } from '@embedpdf/utils/@framework';\nimport { useUICapability } from './use-ui';\nimport { useRenderers } from '../registries/renderers-registry';\n\n/**\n * Creates a render function for a selection menu from the schema\n *\n * @param menuId - The selection menu ID from schema\n * @param documentId - Document ID\n * @returns A render function compatible with layer selectionMenu props\n */\nexport function useSelectionMenu<TContext extends { type: string }>(\n  menuId: string,\n  documentId: string,\n): SelectionMenuRenderFn<TContext> | undefined {\n  const { provides } = useUICapability();\n  const renderers = useRenderers();\n\n  const renderFn = useCallback(\n    (props: SelectionMenuPropsBase<TContext>) => {\n      const schema = provides?.getSchema();\n      const menuSchema = schema?.selectionMenus?.[menuId];\n\n      if (!menuSchema) {\n        return null;\n      }\n\n      if (!props.selected) {\n        return null;\n      }\n\n      const SelectionMenuRenderer = renderers.selectionMenu;\n\n      return <SelectionMenuRenderer schema={menuSchema} documentId={documentId} props={props} />;\n    },\n    [provides, renderers, menuId, documentId],\n  );\n\n  // Return undefined if schema doesn't have this menu\n  const schema = provides?.getSchema();\n  if (!schema?.selectionMenus?.[menuId]) {\n    return undefined;\n  }\n\n  return renderFn;\n}\n"],"names":["useUICapability","useCapability","UIPlugin","id","useUIPlugin","usePlugin","useUIState","documentId","provides","state","setState","useState","useEffect","scope","forDocument","getState","unsubToolbar","onToolbarChanged","unsubSidebar","onSidebarChanged","unsubModal","onModalChanged","unsubMenu","onMenuChanged","unsubOverlay","onOverlayChanged","UIContainerContext","createContext","AnchorRegistryContext","AnchorRegistryProvider","children","anchorsRef","useRef","Map","registry","register","useCallback","itemId","element","key","current","set","unregister","delete","getAnchor","get","Provider","value","useAnchorRegistry","context","useContext","Error","ComponentRegistryContext","ComponentRegistryProvider","initialComponents","componentsRef","Object","entries","component","has","getRegisteredIds","Array","from","keys","useComponentRegistry","RenderersContext","RenderersProvider","renderers","useRenderers","AutoMenuRenderer","container","uiState","anchorRegistry","activeMenu","setActiveMenu","openMenus","schema","getSchema","openMenuIds","length","menuId","menuState","triggeredByItemId","anchor","anchorEl","menuSchema","menus","console","warn","MenuRenderer","menu","jsx","onClose","closeMenu","UIRoot","style","restProps","plugin","disabledCategories","setDisabledCategories","hiddenItems","setHiddenItems","styleElRef","styleTargetRef","previousElementRef","containerRef","containerContextValue","useMemo","getContainer","rootRefCallback","previousElement","styleTarget","root","getRootNode","ShadowRoot","document","head","getStyleTarget","existingStyle","querySelector","UI_SELECTORS","STYLES","textContent","getStylesheet","stylesheet","styleEl","createElement","setAttribute","UI_ATTRIBUTES","insertBefore","firstChild","appendChild","_a","parentNode","remove","onStylesheetInvalidated","getDisabledCategories","getHiddenItems","onCategoryChanged","disabledCategoriesAttr","join","hiddenItemsAttr","combinedStyle","base","containerType","rootProps","ROOT","DISABLED_CATEGORIES","HIDDEN_ITEMS","ref","components","menuContainer","jsxs","componentRegistry","renderCustomComponent","componentId","props","Component","error","elementRef","documentIdRef","itemIdRef","renderToolbar","placement","slot","slotKey","toolbarSlot","activeToolbars","toolbarSchema","toolbars","toolbarId","handleClose","permanent","closeToolbarSlot","ToolbarRenderer","toolbar","Fragment","isOpen","renderSidebar","sidebarSlot","activeSidebars","sidebarSchema","sidebars","sidebarId","SidebarRenderer","sidebar","closeSidebarSlot","sidebarProps","renderModal","ModalRenderer","modal","activeModal","modalSchema","modals","modalId","closeModal","onExited","clearModal","modalProps","getActiveToolbars","map","split","getActiveSidebars","renderOverlays","OverlayRenderer","overlay","enabledOverlays","overlays","values","filter","overlaySchema","renderFn","selectionMenus","selected","SelectionMenuRenderer","selectionMenu"],"mappings":"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"}