{"version":3,"file":"index.cjs","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/utils/schema-merger.ts","../src/lib/utils/responsive-utils.ts","../src/lib/utils/consts.ts","../src/lib/utils/stylesheet-generator.ts","../src/lib/ui-plugin.ts","../src/lib/reducer.ts","../src/lib/selectors.ts","../src/lib/index.ts","../src/lib/utils/ui-props.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { UIPluginConfig } from './types';\n\nexport const UI_PLUGIN_ID = 'ui';\n\nexport const manifest: PluginManifest<UIPluginConfig> = {\n  id: UI_PLUGIN_ID,\n  name: 'UI Plugin',\n  version: '1.0.0',\n  provides: ['ui'],\n  requires: [],\n  optional: ['i18n'],\n  defaultConfig: {\n    schema: {\n      id: 'empty',\n      version: '1.0.0',\n      toolbars: {},\n      menus: {},\n      sidebars: {},\n      modals: {},\n      selectionMenus: {},\n    },\n  },\n};\n","import { Action } from '@embedpdf/core';\nimport { OpenMenuState, UISchema } from './types';\n\nexport const INIT_UI_STATE = 'UI/INIT_STATE';\nexport const CLEANUP_UI_STATE = 'UI/CLEANUP_STATE';\nexport const SET_ACTIVE_TOOLBAR = 'UI/SET_ACTIVE_TOOLBAR';\nexport const CLOSE_TOOLBAR_SLOT = 'UI/CLOSE_TOOLBAR_SLOT';\n\n// Sidebar actions\nexport const SET_ACTIVE_SIDEBAR = 'UI/SET_ACTIVE_SIDEBAR';\nexport const CLOSE_SIDEBAR_SLOT = 'UI/CLOSE_SIDEBAR_SLOT';\nexport const SET_SIDEBAR_TAB = 'UI/SET_SIDEBAR_TAB';\n\n// Modal actions (with animation lifecycle)\nexport const OPEN_MODAL = 'UI/OPEN_MODAL';\nexport const CLOSE_MODAL = 'UI/CLOSE_MODAL';\nexport const CLEAR_MODAL = 'UI/CLEAR_MODAL';\n\n// Menu actions\nexport const OPEN_MENU = 'UI/OPEN_MENU';\nexport const CLOSE_MENU = 'UI/CLOSE_MENU';\nexport const CLOSE_ALL_MENUS = 'UI/CLOSE_ALL_MENUS';\n\n// Overlay actions\nexport const SET_OVERLAY_ENABLED = 'UI/SET_OVERLAY_ENABLED';\n\n// Category actions\nexport const SET_DISABLED_CATEGORIES = 'UI/SET_DISABLED_CATEGORIES';\nexport const SET_HIDDEN_ITEMS = 'UI/SET_HIDDEN_ITEMS';\n\nexport interface InitUIStateAction extends Action {\n  type: typeof INIT_UI_STATE;\n  payload: { documentId: string; schema: UISchema };\n}\n\nexport interface CleanupUIStateAction extends Action {\n  type: typeof CLEANUP_UI_STATE;\n  payload: { documentId: string };\n}\n\nexport interface SetActiveToolbarAction extends Action {\n  type: typeof SET_ACTIVE_TOOLBAR;\n  payload: { documentId: string; placement: string; slot: string; toolbarId: string };\n}\n\nexport interface CloseToolbarSlotAction extends Action {\n  type: typeof CLOSE_TOOLBAR_SLOT;\n  payload: { documentId: string; placement: string; slot: string };\n}\n\n// Sidebar action types\nexport interface SetActiveSidebarAction extends Action {\n  type: typeof SET_ACTIVE_SIDEBAR;\n  payload: {\n    documentId: string;\n    placement: string;\n    slot: string;\n    sidebarId: string;\n    activeTab?: string;\n    props?: Record<string, unknown>;\n  };\n}\n\nexport interface CloseSidebarSlotAction extends Action {\n  type: typeof CLOSE_SIDEBAR_SLOT;\n  payload: { documentId: string; placement: string; slot: string };\n}\n\nexport interface SetSidebarTabAction extends Action {\n  type: typeof SET_SIDEBAR_TAB;\n  payload: { documentId: string; sidebarId: string; tabId: string };\n}\n\n// Modal action types (with animation lifecycle)\nexport interface OpenModalAction extends Action {\n  type: typeof OPEN_MODAL;\n  payload: { documentId: string; modalId: string; props?: Record<string, unknown> };\n}\n\nexport interface CloseModalAction extends Action {\n  type: typeof CLOSE_MODAL;\n  payload: { documentId: string };\n}\n\nexport interface ClearModalAction extends Action {\n  type: typeof CLEAR_MODAL;\n  payload: { documentId: string };\n}\n\nexport interface OpenMenuAction extends Action {\n  type: typeof OPEN_MENU;\n  payload: { documentId: string; menuState: OpenMenuState };\n}\n\nexport interface CloseMenuAction extends Action {\n  type: typeof CLOSE_MENU;\n  payload: { documentId: string; menuId: string };\n}\n\nexport interface CloseAllMenusAction extends Action {\n  type: typeof CLOSE_ALL_MENUS;\n  payload: { documentId: string };\n}\n\n// Overlay action types\nexport interface SetOverlayEnabledAction extends Action {\n  type: typeof SET_OVERLAY_ENABLED;\n  payload: { documentId: string; overlayId: string; enabled: boolean };\n}\n\nexport interface SetDisabledCategoriesAction extends Action {\n  type: typeof SET_DISABLED_CATEGORIES;\n  payload: { categories: string[] };\n}\n\nexport interface SetHiddenItemsAction extends Action {\n  type: typeof SET_HIDDEN_ITEMS;\n  payload: { hiddenItems: string[] };\n}\n\nexport type UIAction =\n  | InitUIStateAction\n  | CleanupUIStateAction\n  | SetActiveToolbarAction\n  | CloseToolbarSlotAction\n  | SetActiveSidebarAction\n  | CloseSidebarSlotAction\n  | SetSidebarTabAction\n  | OpenModalAction\n  | CloseModalAction\n  | ClearModalAction\n  | OpenMenuAction\n  | CloseMenuAction\n  | CloseAllMenusAction\n  | SetOverlayEnabledAction\n  | SetDisabledCategoriesAction\n  | SetHiddenItemsAction;\n\n// Action creators\nexport const initUIState = (documentId: string, schema: UISchema): InitUIStateAction => ({\n  type: INIT_UI_STATE,\n  payload: { documentId, schema },\n});\n\nexport const cleanupUIState = (documentId: string): CleanupUIStateAction => ({\n  type: CLEANUP_UI_STATE,\n  payload: { documentId },\n});\n\nexport const setActiveToolbar = (\n  documentId: string,\n  placement: string,\n  slot: string,\n  toolbarId: string,\n): SetActiveToolbarAction => ({\n  type: SET_ACTIVE_TOOLBAR,\n  payload: { documentId, placement, slot, toolbarId },\n});\n\nexport const closeToolbarSlot = (\n  documentId: string,\n  placement: string,\n  slot: string,\n): CloseToolbarSlotAction => ({\n  type: CLOSE_TOOLBAR_SLOT,\n  payload: { documentId, placement, slot },\n});\n\n// Sidebar action creators\nexport const setActiveSidebar = (\n  documentId: string,\n  placement: string,\n  slot: string,\n  sidebarId: string,\n  activeTab?: string,\n  props?: Record<string, unknown>,\n): SetActiveSidebarAction => ({\n  type: SET_ACTIVE_SIDEBAR,\n  payload: { documentId, placement, slot, sidebarId, activeTab, props },\n});\n\nexport const closeSidebarSlot = (\n  documentId: string,\n  placement: string,\n  slot: string,\n): CloseSidebarSlotAction => ({\n  type: CLOSE_SIDEBAR_SLOT,\n  payload: { documentId, placement, slot },\n});\n\nexport const setSidebarTab = (\n  documentId: string,\n  sidebarId: string,\n  tabId: string,\n): SetSidebarTabAction => ({\n  type: SET_SIDEBAR_TAB,\n  payload: { documentId, sidebarId, tabId },\n});\n\n// Modal action creators (with animation lifecycle)\nexport const openModal = (\n  documentId: string,\n  modalId: string,\n  props?: Record<string, unknown>,\n): OpenModalAction => ({\n  type: OPEN_MODAL,\n  payload: { documentId, modalId, props },\n});\n\nexport const closeModal = (documentId: string): CloseModalAction => ({\n  type: CLOSE_MODAL,\n  payload: { documentId },\n});\n\nexport const clearModal = (documentId: string): ClearModalAction => ({\n  type: CLEAR_MODAL,\n  payload: { documentId },\n});\n\nexport const openMenu = (documentId: string, menuState: OpenMenuState): OpenMenuAction => ({\n  type: OPEN_MENU,\n  payload: { documentId, menuState },\n});\n\nexport const closeMenu = (documentId: string, menuId: string): CloseMenuAction => ({\n  type: CLOSE_MENU,\n  payload: { documentId, menuId },\n});\n\nexport const closeAllMenus = (documentId: string): CloseAllMenusAction => ({\n  type: CLOSE_ALL_MENUS,\n  payload: { documentId },\n});\n\n// Overlay action creators\nexport const setOverlayEnabled = (\n  documentId: string,\n  overlayId: string,\n  enabled: boolean,\n): SetOverlayEnabledAction => ({\n  type: SET_OVERLAY_ENABLED,\n  payload: { documentId, overlayId, enabled },\n});\n\nexport const setDisabledCategories = (categories: string[]): SetDisabledCategoriesAction => ({\n  type: SET_DISABLED_CATEGORIES,\n  payload: { categories },\n});\n\nexport const setHiddenItems = (hiddenItems: string[]): SetHiddenItemsAction => ({\n  type: SET_HIDDEN_ITEMS,\n  payload: { hiddenItems },\n});\n","import { UISchema, ToolbarSchema, MenuSchema, SidebarSchema } from '../types';\n\n/**\n * Deep merge UI schemas\n * Allows users to override/extend default schema\n */\nexport function mergeUISchema(base: UISchema, override: Partial<UISchema>): UISchema {\n  return {\n    ...base,\n    ...override,\n    toolbars: mergeToolbars(base.toolbars, override.toolbars),\n    menus: mergeMenus(base.menus, override.menus),\n    sidebars: mergeSidebars(base.sidebars, override.sidebars),\n  };\n}\n\nfunction mergeToolbars(\n  base: Record<string, ToolbarSchema>,\n  override?: Record<string, ToolbarSchema>,\n): Record<string, ToolbarSchema> {\n  if (!override) return base;\n\n  const result = { ...base };\n\n  for (const [id, toolbar] of Object.entries(override)) {\n    if (result[id]) {\n      // Merge existing toolbar\n      result[id] = {\n        ...result[id],\n        ...toolbar,\n        items: toolbar.items ?? result[id].items,\n        responsive: toolbar.responsive ?? result[id].responsive,\n      };\n    } else {\n      // Add new toolbar\n      result[id] = toolbar;\n    }\n  }\n\n  return result;\n}\n\nfunction mergeMenus(\n  base: Record<string, MenuSchema>,\n  override?: Record<string, MenuSchema>,\n): Record<string, MenuSchema> {\n  if (!override) return base;\n\n  const result = { ...base };\n\n  for (const [id, menu] of Object.entries(override)) {\n    if (result[id]) {\n      // Merge existing menu\n      result[id] = {\n        ...result[id],\n        ...menu,\n        items: menu.items ?? result[id].items,\n      };\n    } else {\n      // Add new menu\n      result[id] = menu;\n    }\n  }\n\n  return result;\n}\n\nfunction mergeSidebars(\n  base: Record<string, SidebarSchema>,\n  override?: Record<string, SidebarSchema>,\n): Record<string, SidebarSchema> {\n  if (!override) return base;\n\n  const result = { ...base };\n\n  for (const [id, panel] of Object.entries(override)) {\n    if (result[id]) {\n      // Merge existing panel\n      result[id] = {\n        ...result[id],\n        ...panel,\n        content: panel.content ?? result[id].content,\n      };\n    } else {\n      // Add new panel\n      result[id] = panel;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Helper to remove items from schema\n */\nexport function removeFromSchema(\n  schema: UISchema,\n  options: {\n    toolbars?: string[];\n    menus?: string[];\n    sidebars?: string[];\n    commands?: string[]; // Remove commands from all menus/toolbars\n  },\n): UISchema {\n  const result = { ...schema };\n\n  // Remove toolbars\n  if (options.toolbars) {\n    result.toolbars = { ...result.toolbars };\n    options.toolbars.forEach((id) => delete result.toolbars[id]);\n  }\n\n  // Remove menus\n  if (options.menus) {\n    result.menus = { ...result.menus };\n    options.menus.forEach((id) => delete result.menus[id]);\n  }\n\n  // Remove panels\n  if (options.sidebars) {\n    result.sidebars = { ...result.sidebars };\n    options.sidebars.forEach((id) => delete result.sidebars[id]);\n  }\n\n  // Remove commands from all toolbars/menus\n  if (options.commands) {\n    result.toolbars = removeCommandsFromToolbars(result.toolbars, options.commands);\n    result.menus = removeCommandsFromMenus(result.menus, options.commands);\n  }\n\n  return result;\n}\n\nfunction removeCommandsFromToolbars(\n  toolbars: Record<string, ToolbarSchema>,\n  commandIds: string[],\n): Record<string, ToolbarSchema> {\n  const result: Record<string, ToolbarSchema> = {};\n\n  for (const [id, toolbar] of Object.entries(toolbars)) {\n    result[id] = {\n      ...toolbar,\n      items: toolbar.items.filter((item) => {\n        if (item.type === 'command-button') {\n          return !commandIds.includes(item.commandId);\n        }\n        if (item.type === 'group') {\n          return item.items.some((child) =>\n            child.type === 'command-button' ? !commandIds.includes(child.commandId) : true,\n          );\n        }\n        if (item.type === 'tab-group') {\n          return item.tabs.some((tab) => !commandIds.includes(tab.commandId));\n        }\n        return true;\n      }),\n    };\n  }\n\n  return result;\n}\n\nfunction removeCommandsFromMenus(\n  menus: Record<string, MenuSchema>,\n  commandIds: string[],\n): Record<string, MenuSchema> {\n  const result: Record<string, MenuSchema> = {};\n\n  for (const [id, menu] of Object.entries(menus)) {\n    result[id] = {\n      ...menu,\n      items: menu.items.filter((item) => {\n        if (item.type === 'command') {\n          return !commandIds.includes(item.commandId);\n        }\n        if (item.type === 'section') {\n          return item.items.some((child) =>\n            child.type === 'command' ? !commandIds.includes(child.commandId) : true,\n          );\n        }\n        return true;\n      }),\n    };\n  }\n\n  return result;\n}\n","import {\n  ToolbarSchema,\n  MenuSchema,\n  ResponsiveMetadata,\n  ResponsiveItemMetadata,\n  ResponsiveVisibilityRule,\n  BreakpointRule,\n  LocaleOverrides,\n  SelectionMenuSchema,\n} from '../types';\n\n/**\n * Processes responsive configuration and returns metadata for all items\n * This is framework-agnostic and lives in plugin-ui\n */\nexport function resolveResponsiveMetadata(\n  schema: ToolbarSchema | MenuSchema | SelectionMenuSchema,\n  currentLocale?: string,\n): ResponsiveMetadata | null {\n  if (!schema.responsive?.breakpoints) {\n    return null;\n  }\n\n  // Apply locale overrides to get effective breakpoints\n  const effectiveBreakpoints = applyLocaleOverrides(\n    schema.responsive.breakpoints,\n    schema.responsive.localeOverrides,\n    currentLocale,\n  );\n\n  const items = new Map<string, ResponsiveItemMetadata>();\n  const breakpoints = new Map<string, { minWidth?: number; maxWidth?: number }>();\n\n  // Extract breakpoint definitions (widths never change!)\n  for (const [breakpointId, config] of Object.entries(effectiveBreakpoints)) {\n    breakpoints.set(breakpointId, {\n      minWidth: config.minWidth,\n      maxWidth: config.maxWidth,\n    });\n  }\n\n  // Collect all item IDs from schema\n  const allItemIds = new Set<string>();\n  const collectItemIds = (items: any[]) => {\n    items.forEach((item) => {\n      allItemIds.add(item.id);\n      if (item.type === 'group' && item.items) {\n        collectItemIds(item.items);\n      }\n      if (item.type === 'tab-group' && item.tabs) {\n        collectItemIds(item.tabs);\n      }\n      if (item.type === 'section' && item.items) {\n        collectItemIds(item.items);\n      }\n    });\n  };\n  collectItemIds(schema.items);\n\n  // Process each item\n  for (const itemId of allItemIds) {\n    const rules: ResponsiveVisibilityRule[] = [];\n    let defaultVisible = true; // Assume visible by default\n\n    // Sort breakpoints by width for proper cascade\n    const sortedBreakpoints = Array.from(Object.entries(effectiveBreakpoints)).sort((a, b) => {\n      const aMin = a[1].minWidth ?? 0;\n      const bMin = b[1].minWidth ?? 0;\n      return aMin - bMin;\n    });\n\n    sortedBreakpoints.forEach(([breakpointId, config], index) => {\n      const isHidden = config.hide?.includes(itemId);\n      const isShown = config.show?.includes(itemId);\n\n      // If neither hide nor show mentions this item, skip\n      if (!isHidden && !isShown) {\n        return;\n      }\n\n      rules.push({\n        breakpointId,\n        minWidth: config.minWidth,\n        maxWidth: config.maxWidth,\n        visible: isShown || !isHidden,\n        priority: index,\n      });\n\n      // The first (smallest) breakpoint determines default visibility\n      if (index === 0) {\n        defaultVisible = isShown || !isHidden;\n      }\n    });\n\n    // Only add items that have responsive rules\n    if (rules.length > 0) {\n      items.set(itemId, {\n        itemId,\n        shouldRender: true, // Always render for SSR\n        visibilityRules: rules,\n        defaultVisible,\n      });\n    }\n  }\n\n  return { items, breakpoints };\n}\n\n/**\n * Apply locale-specific overrides to breakpoints\n * Merges locale-specific show/hide rules with base breakpoints\n */\nfunction applyLocaleOverrides(\n  baseBreakpoints: Record<string, BreakpointRule>,\n  localeOverrides: LocaleOverrides | undefined,\n  currentLocale: string | undefined,\n): Record<string, BreakpointRule> {\n  // No locale or no overrides - return base breakpoints\n  if (!currentLocale || !localeOverrides?.groups) {\n    return baseBreakpoints;\n  }\n\n  // Find matching locale group\n  const matchingGroup = localeOverrides.groups.find((group) =>\n    group.locales.includes(currentLocale),\n  );\n\n  // No matching group - return base breakpoints\n  if (!matchingGroup) {\n    return baseBreakpoints;\n  }\n\n  // Clone and merge show/hide rules\n  const effective: Record<string, BreakpointRule> = {};\n\n  for (const [breakpointId, baseRule] of Object.entries(baseBreakpoints)) {\n    const override = matchingGroup.breakpoints[breakpointId];\n\n    if (!override) {\n      // No override for this breakpoint - use base as-is\n      effective[breakpointId] = baseRule;\n      continue;\n    }\n\n    // Merge the rules\n    effective[breakpointId] = {\n      // Width constraints never change!\n      minWidth: baseRule.minWidth,\n      maxWidth: baseRule.maxWidth,\n\n      // Merge hide lists (base + additional) or use replacement\n      hide: override.replaceHide\n        ? override.replaceHide\n        : [...(baseRule.hide || []), ...(override.hide || [])],\n\n      // Merge show lists (base + additional) or use replacement\n      show: override.replaceShow\n        ? override.replaceShow\n        : [...(baseRule.show || []), ...(override.show || [])],\n    };\n  }\n\n  return effective;\n}\n\n/**\n * Get responsive metadata for a specific item\n */\nexport function getItemResponsiveMetadata(\n  itemId: string,\n  schema: ToolbarSchema | MenuSchema,\n  currentLocale?: string,\n): ResponsiveItemMetadata | null {\n  const metadata = resolveResponsiveMetadata(schema, currentLocale);\n  return metadata?.items.get(itemId) ?? null;\n}\n","/**\n * Using 'embedpdf' prefix to avoid conflicts with other libraries.\n */\nexport const UI_ATTRIBUTES = {\n  /** Root element marker */\n  ROOT: 'data-epdf',\n  /** Style element marker for deduplication */\n  STYLES: 'data-epdf-s',\n  /** Item ID for responsive and dependency rules */\n  ITEM: 'data-epdf-i',\n  /** Item categories for category-based hiding */\n  CATEGORIES: 'data-epdf-cat',\n  /** Disabled categories list on root element */\n  DISABLED_CATEGORIES: 'data-epdf-dis',\n  /** Hidden item IDs (computed from disabled categories) */\n  HIDDEN_ITEMS: 'data-epdf-hid',\n} as const;\n\n/**\n * CSS selectors derived from attributes\n */\nexport const UI_SELECTORS = {\n  ROOT: `[${UI_ATTRIBUTES.ROOT}]`,\n  STYLES: `[${UI_ATTRIBUTES.STYLES}]`,\n  ITEM: (id: string) => `[${UI_ATTRIBUTES.ITEM}=\"${id}\"]`,\n  CATEGORIES: (category: string) => `[${UI_ATTRIBUTES.CATEGORIES}~=\"${category}\"]`,\n  DISABLED_CATEGORY: (category: string) => `[${UI_ATTRIBUTES.DISABLED_CATEGORIES}~=\"${category}\"]`,\n  HIDDEN_ITEM: (itemId: string) => `[${UI_ATTRIBUTES.HIDDEN_ITEMS}~=\"${itemId}\"]`,\n} as const;\n","import {\n  UISchema,\n  ToolbarSchema,\n  ToolbarItem,\n  TabItem,\n  MenuSchema,\n  MenuItem,\n  SidebarSchema,\n  SelectionMenuSchema,\n  SelectionMenuItem,\n  BreakpointRule,\n  VisibilityDependency,\n  ResponsiveItemMetadata,\n} from '../types';\nimport { resolveResponsiveMetadata } from './responsive-utils';\nimport { UI_ATTRIBUTES, UI_SELECTORS } from './consts';\n\n// ─────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────\n\nexport interface StylesheetConfig {\n  /** Use container queries (@container) instead of media queries (@media). Default: true */\n  useContainerQueries?: boolean;\n}\n\nexport interface StylesheetGenerationOptions {\n  config?: StylesheetConfig;\n  /** Current locale for locale-aware responsive rules */\n  locale?: string;\n}\n\nconst DEFAULT_CONFIG: Required<StylesheetConfig> = {\n  useContainerQueries: true,\n};\n\n// ─────────────────────────────────────────────────────────\n// Analysis Types\n// ─────────────────────────────────────────────────────────\n\ninterface SchemaAnalysis {\n  /** All unique categories found in schema */\n  categories: Set<string>;\n  /** Map of item ID -> categories array */\n  itemCategories: Map<string, string[]>;\n  /** All dependency rules collected from schema */\n  dependencies: DependencyRule[];\n  /** Breakpoint visibility info per menu (for dependency calculations) */\n  menuBreakpoints: Map<string, BreakpointVisibility[]>;\n  /** All responsive item metadata */\n  responsiveItems: Map<string, ResponsiveItemMetadata>;\n}\n\ninterface DependencyRule {\n  itemId: string;\n  dependsOnMenuId?: string;\n  dependsOnItemIds?: string[];\n}\n\ninterface BreakpointVisibility {\n  minWidth?: number;\n  maxWidth?: number;\n  /** Item IDs that are responsive-visible at this breakpoint */\n  visibleItemIds: string[];\n  /** Categories that are responsive-visible at this breakpoint (kept for backwards compat) */\n  visibleCategories: Set<string>;\n}\n\n// ─────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────\n\n/**\n * Generates complete CSS stylesheet for UI visibility.\n *\n * Includes:\n * 1. Responsive visibility rules (container queries or media queries)\n * 2. Category visibility rules\n * 3. Breakpoint-aware dependency rules\n *\n * This is pure logic - no DOM manipulation.\n *\n * @param schema - The UI schema to generate CSS for\n * @param options - Generation options including config and locale\n * @returns Generated CSS string\n */\nexport function generateUIStylesheet(\n  schema: UISchema,\n  options: StylesheetGenerationOptions = {},\n): string {\n  const cfg = { ...DEFAULT_CONFIG, ...options.config };\n  const locale = options.locale;\n  const analysis = analyzeSchema(schema, locale);\n  const sections: string[] = [];\n\n  // Header\n  sections.push(generateHeader(locale));\n\n  // 1. Responsive visibility rules\n  const responsiveCSS = generateResponsiveRules(analysis, cfg);\n  if (responsiveCSS) sections.push(responsiveCSS);\n\n  // 2. Category visibility rules\n  const categoryCSS = generateCategoryRules(analysis, cfg);\n  if (categoryCSS) sections.push(categoryCSS);\n\n  // 3. Dependency rules (breakpoint-aware)\n  const dependencyCSS = generateDependencyRules(analysis, cfg);\n  if (dependencyCSS) sections.push(dependencyCSS);\n\n  return sections.filter((s) => s.trim()).join('\\n\\n');\n}\n\n/**\n * Extract all unique categories from the schema.\n * Useful for building UI to toggle categories.\n *\n * @param schema - The UI schema to extract categories from\n * @returns Sorted array of unique category names\n */\nexport function extractCategories(schema: UISchema): string[] {\n  const analysis = analyzeSchema(schema);\n  return Array.from(analysis.categories).sort();\n}\n\n/**\n * Extract a map of item ID -> categories from the schema.\n * Used to compute which items are hidden based on disabled categories.\n *\n * @param schema - The UI schema to extract item categories from\n * @returns Map of item ID to array of categories\n */\nexport function extractItemCategories(schema: UISchema): Map<string, string[]> {\n  const analysis = analyzeSchema(schema);\n  return analysis.itemCategories;\n}\n\n/**\n * Compute which items are hidden based on disabled categories.\n * An item is hidden if ANY of its categories is disabled.\n *\n * @param itemCategories - Map of item ID to categories (from extractItemCategories)\n * @param disabledCategories - Array of currently disabled categories\n * @returns Array of hidden item IDs\n */\nexport function computeHiddenItems(\n  itemCategories: Map<string, string[]>,\n  disabledCategories: string[],\n): string[] {\n  const disabledSet = new Set(disabledCategories);\n  const hiddenItems: string[] = [];\n\n  itemCategories.forEach((categories, itemId) => {\n    // Item is hidden if ANY of its categories is disabled\n    if (categories.some((cat) => disabledSet.has(cat))) {\n      hiddenItems.push(itemId);\n    }\n  });\n\n  return hiddenItems;\n}\n\n/**\n * Get the stylesheet configuration with defaults applied.\n *\n * @param config - Optional partial configuration\n * @returns Complete configuration with defaults\n */\nexport function getStylesheetConfig(config: StylesheetConfig = {}): Required<StylesheetConfig> {\n  return { ...DEFAULT_CONFIG, ...config };\n}\n\n// ─────────────────────────────────────────────────────────\n// Schema Analysis\n// ─────────────────────────────────────────────────────────\n\nfunction analyzeSchema(schema: UISchema, locale?: string): SchemaAnalysis {\n  const categories = new Set<string>();\n  const itemCategories = new Map<string, string[]>();\n  const dependencies: DependencyRule[] = [];\n  const menuBreakpoints = new Map<string, BreakpointVisibility[]>();\n  const responsiveItems = new Map<string, ResponsiveItemMetadata>();\n\n  // Analyze menus first (needed for dependency calculations)\n  for (const [menuId, menu] of Object.entries(schema.menus)) {\n    analyzeMenu(\n      menuId,\n      menu,\n      categories,\n      itemCategories,\n      dependencies,\n      menuBreakpoints,\n      responsiveItems,\n      locale,\n    );\n  }\n\n  // Analyze toolbars\n  for (const [toolbarId, toolbar] of Object.entries(schema.toolbars)) {\n    analyzeToolbar(\n      toolbarId,\n      toolbar,\n      categories,\n      itemCategories,\n      dependencies,\n      responsiveItems,\n      locale,\n    );\n  }\n\n  // Analyze panels\n  for (const [panelId, panel] of Object.entries(schema.sidebars)) {\n    analyzePanel(panelId, panel, categories, itemCategories, dependencies);\n  }\n\n  // Analyze selection menus\n  for (const [selMenuId, selMenu] of Object.entries(schema.selectionMenus || {})) {\n    analyzeSelectionMenu(\n      selMenuId,\n      selMenu,\n      categories,\n      itemCategories,\n      dependencies,\n      responsiveItems,\n      locale,\n    );\n  }\n\n  // Analyze overlays\n  for (const [overlayId, overlay] of Object.entries(schema.overlays || {})) {\n    collectCategoriesAndDependency(\n      overlayId,\n      overlay.categories,\n      overlay.visibilityDependsOn,\n      categories,\n      itemCategories,\n      dependencies,\n    );\n  }\n\n  return { categories, itemCategories, dependencies, menuBreakpoints, responsiveItems };\n}\n\n// ─────────────────────────────────────────────────────────\n// Menu Analysis\n// ─────────────────────────────────────────────────────────\n\nfunction analyzeMenu(\n  menuId: string,\n  menu: MenuSchema,\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n  menuBreakpoints: Map<string, BreakpointVisibility[]>,\n  responsiveItems: Map<string, ResponsiveItemMetadata>,\n  locale?: string,\n): void {\n  // Menu-level categories and dependencies\n  collectCategoriesAndDependency(\n    menuId,\n    menu.categories,\n    menu.visibilityDependsOn,\n    categories,\n    itemCategories,\n    dependencies,\n  );\n\n  // Collect from menu items\n  analyzeMenuItems(menu.items, categories, itemCategories, dependencies);\n\n  // Get responsive metadata with locale\n  const metadata = resolveResponsiveMetadata(menu, locale);\n  if (metadata) {\n    metadata.items.forEach((itemMeta, itemId) => {\n      responsiveItems.set(itemId, itemMeta);\n    });\n  }\n\n  // Compute visibility per breakpoint for dependency calculations\n  const breakpointVisibilities = computeMenuBreakpointVisibilities(menu, itemCategories, locale);\n  menuBreakpoints.set(menuId, breakpointVisibilities);\n}\n\nfunction analyzeMenuItems(\n  items: MenuItem[],\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  for (const item of items) {\n    collectCategoriesAndDependency(\n      item.id,\n      item.categories,\n      item.visibilityDependsOn,\n      categories,\n      itemCategories,\n      dependencies,\n    );\n\n    // Recurse into sections\n    if (item.type === 'section') {\n      analyzeMenuItems(item.items, categories, itemCategories, dependencies);\n    }\n  }\n}\n\nfunction computeMenuBreakpointVisibilities(\n  menu: MenuSchema,\n  itemCategories: Map<string, string[]>,\n  locale?: string,\n): BreakpointVisibility[] {\n  const breakpointVisibilities: BreakpointVisibility[] = [];\n\n  // Get effective breakpoints (with locale overrides applied)\n  const metadata = resolveResponsiveMetadata(menu, locale);\n\n  if (menu.responsive?.breakpoints && metadata) {\n    const sortedBreakpoints = Array.from(metadata.breakpoints.entries()).sort(\n      (a, b) => (a[1].minWidth ?? 0) - (b[1].minWidth ?? 0),\n    );\n\n    for (const [_bpId, bp] of sortedBreakpoints) {\n      const visibleItems = computeVisibleItemsAtBreakpoint(metadata, bp);\n      const visibleCats = new Set<string>();\n\n      for (const itemId of visibleItems) {\n        const cats = itemCategories.get(itemId);\n        if (cats) cats.forEach((c) => visibleCats.add(c));\n      }\n\n      breakpointVisibilities.push({\n        minWidth: bp.minWidth,\n        maxWidth: bp.maxWidth,\n        visibleItemIds: visibleItems,\n        visibleCategories: visibleCats,\n      });\n    }\n  } else {\n    // No responsive rules - collect all item IDs and categories\n    const allItemIds: string[] = [];\n    const allCats = new Set<string>();\n    collectAllMenuItemInfo(menu.items, itemCategories, allItemIds, allCats);\n    breakpointVisibilities.push({ visibleItemIds: allItemIds, visibleCategories: allCats });\n  }\n\n  return breakpointVisibilities;\n}\n\nfunction collectAllMenuItemInfo(\n  items: MenuItem[],\n  itemCategories: Map<string, string[]>,\n  resultIds: string[],\n  resultCats: Set<string>,\n): void {\n  for (const item of items) {\n    resultIds.push(item.id);\n    const cats = itemCategories.get(item.id);\n    if (cats) cats.forEach((c) => resultCats.add(c));\n\n    if (item.type === 'section') {\n      collectAllMenuItemInfo(item.items, itemCategories, resultIds, resultCats);\n    }\n  }\n}\n\nfunction computeVisibleItemsAtBreakpoint(\n  metadata: {\n    items: Map<string, ResponsiveItemMetadata>;\n    breakpoints: Map<string, { minWidth?: number; maxWidth?: number }>;\n  },\n  targetBp: { minWidth?: number; maxWidth?: number },\n): string[] {\n  const visible: string[] = [];\n\n  metadata.items.forEach((itemMeta, itemId) => {\n    // Check if item is visible at this breakpoint\n    let isVisible = itemMeta.defaultVisible;\n\n    for (const rule of itemMeta.visibilityRules) {\n      // Check if this rule applies to our target breakpoint\n      const ruleApplies =\n        (rule.minWidth === undefined ||\n          (targetBp.minWidth !== undefined && targetBp.minWidth >= rule.minWidth)) &&\n        (rule.maxWidth === undefined ||\n          (targetBp.maxWidth !== undefined && targetBp.maxWidth <= rule.maxWidth));\n\n      if (ruleApplies) {\n        isVisible = rule.visible;\n      }\n    }\n\n    if (isVisible) {\n      visible.push(itemId);\n    }\n  });\n\n  return visible;\n}\n\n// ─────────────────────────────────────────────────────────\n// Toolbar Analysis\n// ─────────────────────────────────────────────────────────\n\nfunction analyzeToolbar(\n  toolbarId: string,\n  toolbar: ToolbarSchema,\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n  responsiveItems: Map<string, ResponsiveItemMetadata>,\n  locale?: string,\n): void {\n  // Toolbar-level categories and dependencies\n  collectCategoriesAndDependency(\n    toolbarId,\n    toolbar.categories,\n    toolbar.visibilityDependsOn,\n    categories,\n    itemCategories,\n    dependencies,\n  );\n\n  // Get responsive metadata with locale\n  const metadata = resolveResponsiveMetadata(toolbar, locale);\n  if (metadata) {\n    metadata.items.forEach((itemMeta, itemId) => {\n      responsiveItems.set(itemId, itemMeta);\n    });\n  }\n\n  // Analyze items\n  analyzeToolbarItems(toolbar.items, categories, itemCategories, dependencies);\n}\n\nfunction analyzeToolbarItems(\n  items: ToolbarItem[],\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  for (const item of items) {\n    collectCategoriesAndDependency(\n      item.id,\n      item.categories,\n      item.visibilityDependsOn,\n      categories,\n      itemCategories,\n      dependencies,\n    );\n\n    // Recurse into groups\n    if (item.type === 'group' && item.items) {\n      analyzeToolbarItems(item.items, categories, itemCategories, dependencies);\n    }\n\n    // Recurse into tab groups\n    if (item.type === 'tab-group' && item.tabs) {\n      analyzeTabItems(item.tabs, categories, itemCategories, dependencies);\n    }\n  }\n}\n\nfunction analyzeTabItems(\n  tabs: TabItem[],\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  for (const tab of tabs) {\n    collectCategoriesAndDependency(\n      tab.id,\n      tab.categories,\n      tab.visibilityDependsOn,\n      categories,\n      itemCategories,\n      dependencies,\n    );\n  }\n}\n\n// ─────────────────────────────────────────────────────────\n// Panel Analysis\n// ─────────────────────────────────────────────────────────\n\nfunction analyzePanel(\n  panelId: string,\n  panel: SidebarSchema,\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  // Panel-level categories and dependencies\n  collectCategoriesAndDependency(\n    panelId,\n    panel.categories,\n    panel.visibilityDependsOn,\n    categories,\n    itemCategories,\n    dependencies,\n  );\n\n  // Analyze panel tabs if present\n  if (panel.content.type === 'tabs') {\n    for (const tab of panel.content.tabs) {\n      collectCategoriesAndDependency(\n        tab.id,\n        tab.categories,\n        tab.visibilityDependsOn,\n        categories,\n        itemCategories,\n        dependencies,\n      );\n    }\n  }\n}\n\n// ─────────────────────────────────────────────────────────\n// Selection Menu Analysis\n// ─────────────────────────────────────────────────────────\n\nfunction analyzeSelectionMenu(\n  selMenuId: string,\n  selMenu: SelectionMenuSchema,\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n  responsiveItems: Map<string, ResponsiveItemMetadata>,\n  locale?: string,\n): void {\n  // Selection menu level\n  collectCategoriesAndDependency(\n    selMenuId,\n    selMenu.categories,\n    selMenu.visibilityDependsOn,\n    categories,\n    itemCategories,\n    dependencies,\n  );\n\n  // Get responsive metadata if present\n  if (selMenu.responsive) {\n    const metadata = resolveResponsiveMetadata(selMenu, locale);\n    if (metadata) {\n      metadata.items.forEach((itemMeta, itemId) => {\n        responsiveItems.set(itemId, itemMeta);\n      });\n    }\n  }\n\n  // Analyze items\n  analyzeSelectionMenuItems(selMenu.items, categories, itemCategories, dependencies);\n}\n\nfunction analyzeSelectionMenuItems(\n  items: SelectionMenuItem[],\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  for (const item of items) {\n    collectCategoriesAndDependency(\n      item.id,\n      item.categories,\n      item.visibilityDependsOn,\n      categories,\n      itemCategories,\n      dependencies,\n    );\n\n    // Recurse into groups\n    if (item.type === 'group' && item.items) {\n      analyzeSelectionMenuItems(item.items, categories, itemCategories, dependencies);\n    }\n  }\n}\n\n// ─────────────────────────────────────────────────────────\n// Shared Analysis Helpers\n// ─────────────────────────────────────────────────────────\n\nfunction collectCategoriesAndDependency(\n  itemId: string,\n  itemCats: string[] | undefined,\n  visibilityDep: VisibilityDependency | undefined,\n  categories: Set<string>,\n  itemCategories: Map<string, string[]>,\n  dependencies: DependencyRule[],\n): void {\n  // Collect categories\n  if (itemCats?.length) {\n    itemCats.forEach((c) => categories.add(c));\n    itemCategories.set(itemId, itemCats);\n  }\n\n  // Collect dependencies\n  if (visibilityDep && (visibilityDep.menuId || visibilityDep.itemIds?.length)) {\n    dependencies.push({\n      itemId,\n      dependsOnMenuId: visibilityDep.menuId,\n      dependsOnItemIds: visibilityDep.itemIds,\n    });\n  }\n}\n\n// ─────────────────────────────────────────────────────────\n// CSS Generation - Header\n// ─────────────────────────────────────────────────────────\n\nfunction generateHeader(locale?: string): string {\n  const localeInfo = locale ? ` (locale: ${locale})` : '';\n  return `/* ═══════════════════════════════════════════════════════════════════════════ */\n/* EmbedPDF UI Stylesheet - Auto-generated${localeInfo}                         */\n/* DO NOT EDIT MANUALLY - This file is generated from your UI schema            */\n/* ═══════════════════════════════════════════════════════════════════════════ */`;\n}\n\n// ─────────────────────────────────────────────────────────\n// CSS Generation - Responsive Rules\n// ─────────────────────────────────────────────────────────\n\nfunction generateResponsiveRules(\n  analysis: SchemaAnalysis,\n  cfg: Required<StylesheetConfig>,\n): string {\n  const rules: string[] = [];\n  const queryType = cfg.useContainerQueries ? '@container' : '@media';\n  const processedItems = new Set<string>();\n\n  // Process all responsive items\n  analysis.responsiveItems.forEach((itemMeta, itemId) => {\n    if (processedItems.has(itemId)) return;\n    processedItems.add(itemId);\n\n    const itemRules = generateItemResponsiveRules(itemId, itemMeta, queryType, cfg);\n    if (itemRules) rules.push(itemRules);\n  });\n\n  if (rules.length === 0) return '';\n\n  return `/* ─── Responsive Visibility Rules ─── */\n/* Items show/hide based on container width */\n\n${rules.join('\\n\\n')}`;\n}\n\nfunction generateItemResponsiveRules(\n  itemId: string,\n  metadata: ResponsiveItemMetadata,\n  queryType: string,\n  cfg: Required<StylesheetConfig>,\n): string | null {\n  if (metadata.visibilityRules.length === 0) return null;\n\n  const rules: string[] = [];\n  const selector = UI_SELECTORS.ITEM(itemId);\n\n  // Base visibility (for mobile-first approach)\n  if (!metadata.defaultVisible) {\n    rules.push(`${selector} { display: none; }`);\n  }\n\n  // Breakpoint-specific rules\n  for (const rule of metadata.visibilityRules) {\n    const conditions: string[] = [];\n\n    if (rule.minWidth !== undefined) {\n      conditions.push(`(min-width: ${rule.minWidth}px)`);\n    }\n    if (rule.maxWidth !== undefined) {\n      conditions.push(`(max-width: ${rule.maxWidth}px)`);\n    }\n\n    if (conditions.length > 0) {\n      const display = rule.visible ? 'flex' : 'none';\n      rules.push(`${queryType} ${conditions.join(' and ')} {\n  ${selector} { display: ${display}; }\n}`);\n    }\n  }\n\n  return rules.length > 0 ? rules.join('\\n') : null;\n}\n\n// ─────────────────────────────────────────────────────────\n// CSS Generation - Category Rules\n// ─────────────────────────────────────────────────────────\n\nfunction generateCategoryRules(analysis: SchemaAnalysis, cfg: Required<StylesheetConfig>): string {\n  if (analysis.categories.size === 0) return '';\n\n  const rules: string[] = [];\n\n  // Sort categories for consistent output\n  const sortedCategories = Array.from(analysis.categories).sort();\n\n  for (const category of sortedCategories) {\n    // Using ~= selector matches when category is in space-separated list\n    // This works correctly for items with multiple categories\n    rules.push(\n      `${UI_SELECTORS.ROOT}[${UI_ATTRIBUTES.DISABLED_CATEGORIES}~=\"${category}\"] [${UI_ATTRIBUTES.CATEGORIES}~=\"${category}\"] {\n  display: none !important;\n}`,\n    );\n  }\n\n  return `/* ─── Category Visibility Rules ─── */\n/* Items hide when ANY of their categories is disabled */\n/* Use: data-disabled-categories=\"category1 category2\" on root element */\n\n${rules.join('\\n\\n')}`;\n}\n\n// ─────────────────────────────────────────────────────────\n// CSS Generation - Dependency Rules\n// ─────────────────────────────────────────────────────────\n\nfunction generateDependencyRules(\n  analysis: SchemaAnalysis,\n  cfg: Required<StylesheetConfig>,\n): string {\n  if (analysis.dependencies.length === 0) return '';\n\n  const rules: string[] = [];\n  const queryType = cfg.useContainerQueries ? '@container' : '@media';\n\n  for (const dep of analysis.dependencies) {\n    const depRules = generateSingleDependencyRules(dep, analysis, queryType, cfg);\n    if (depRules.length > 0) {\n      rules.push(...depRules);\n    }\n  }\n\n  if (rules.length === 0) return '';\n\n  return `/* ─── Dependency Visibility Rules ─── */\n/* Container elements hide when all their dependencies are hidden */\n\n${rules.join('\\n\\n')}`;\n}\n\nfunction generateSingleDependencyRules(\n  dep: DependencyRule,\n  analysis: SchemaAnalysis,\n  queryType: string,\n  cfg: Required<StylesheetConfig>,\n): string[] {\n  const rules: string[] = [];\n\n  // Handle menu-based dependencies\n  // Uses data-hidden-items to check if all visible items at each breakpoint are hidden\n  if (dep.dependsOnMenuId) {\n    const breakpoints = analysis.menuBreakpoints.get(dep.dependsOnMenuId);\n    if (breakpoints && breakpoints.length > 0) {\n      rules.push(`/* \"${dep.itemId}\" depends on menu \"${dep.dependsOnMenuId}\" */`);\n\n      for (const bp of breakpoints) {\n        if (bp.visibleItemIds.length === 0) continue;\n\n        // Generate selector: hide when ALL visible items at this breakpoint are hidden\n        // Uses data-hidden-items which is computed by JavaScript\n        const hiddenItemSelectors = bp.visibleItemIds\n          .sort()\n          .map((id) => UI_SELECTORS.HIDDEN_ITEM(id))\n          .join('');\n\n        const cssRule = `${UI_SELECTORS.ROOT}${hiddenItemSelectors} ${UI_SELECTORS.ITEM(dep.itemId)} {\n  display: none !important;\n}`;\n\n        // Wrap in media/container query if breakpoint has width constraints\n        const conditions: string[] = [];\n        if (bp.minWidth !== undefined) conditions.push(`(min-width: ${bp.minWidth}px)`);\n        if (bp.maxWidth !== undefined) conditions.push(`(max-width: ${bp.maxWidth}px)`);\n\n        if (conditions.length > 0) {\n          rules.push(`${queryType} ${conditions.join(' and ')} {\n  ${cssRule}\n}`);\n        } else {\n          rules.push(cssRule);\n        }\n      }\n    }\n  }\n\n  // Handle direct item dependencies\n  // Uses data-hidden-items to check if all specified items are hidden\n  if (dep.dependsOnItemIds?.length) {\n    rules.push(`/* \"${dep.itemId}\" depends on items: ${dep.dependsOnItemIds.join(', ')} */`);\n\n    // Generate selector: hide when ALL dependent items are hidden\n    const hiddenItemSelectors = dep.dependsOnItemIds\n      .sort()\n      .map((id) => UI_SELECTORS.HIDDEN_ITEM(id))\n      .join('');\n\n    rules.push(`${UI_SELECTORS.ROOT}${hiddenItemSelectors} ${UI_SELECTORS.ITEM(dep.itemId)} {\n  display: none !important;\n}`);\n  }\n\n  return rules;\n}\n","import {\n  BasePlugin,\n  Listener,\n  PluginRegistry,\n  Unsubscribe,\n  createBehaviorEmitter,\n  createEmitter,\n  createScopedEmitter,\n} from '@embedpdf/core';\nimport { I18nCapability, I18nPlugin } from '@embedpdf/plugin-i18n';\nimport {\n  UICapability,\n  UIPluginConfig,\n  UIState,\n  UIScope,\n  UISchema,\n  UIDocumentState,\n  ToolbarChangedData,\n  ToolbarChangedEvent,\n  SidebarChangedData,\n  SidebarChangedEvent,\n  ModalChangedData,\n  ModalChangedEvent,\n  MenuChangedData,\n  MenuChangedEvent,\n  OverlayChangedData,\n  OverlayChangedEvent,\n  ModalSlotState,\n} from './types';\nimport {\n  UIAction,\n  initUIState,\n  cleanupUIState,\n  setActiveToolbar,\n  closeToolbarSlot,\n  setActiveSidebar,\n  closeSidebarSlot,\n  setSidebarTab,\n  openModal,\n  closeModal,\n  clearModal,\n  openMenu,\n  closeMenu,\n  closeAllMenus,\n  setOverlayEnabled,\n  setDisabledCategories,\n  setHiddenItems,\n} from './actions';\nimport { mergeUISchema } from './utils/schema-merger';\nimport {\n  generateUIStylesheet,\n  extractItemCategories,\n  computeHiddenItems,\n  StylesheetConfig,\n} from './utils';\n\nexport class UIPlugin extends BasePlugin<UIPluginConfig, UICapability, UIState, UIAction> {\n  static readonly id = 'ui' as const;\n\n  private schema: UISchema;\n  private stylesheetConfig: StylesheetConfig;\n\n  // Item categories mapping for computing hidden items\n  private itemCategories: Map<string, string[]>;\n\n  // Stylesheet caching with locale awareness\n  private cachedStylesheet: string | null = null;\n  private cachedLocale: string | null = null;\n\n  // Optional i18n integration\n  private i18n: I18nCapability | null = null;\n  private i18nCleanup: (() => void) | null = null;\n\n  // Events\n  private readonly categoryChanged$ = createBehaviorEmitter<{\n    disabledCategories: string[];\n    hiddenItems: string[];\n  }>();\n  private readonly stylesheetInvalidated$ = createEmitter<void>();\n\n  private readonly toolbarChanged$ = createScopedEmitter<\n    ToolbarChangedData,\n    ToolbarChangedEvent,\n    string\n  >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n  private readonly sidebarChanged$ = createScopedEmitter<\n    SidebarChangedData,\n    SidebarChangedEvent,\n    string\n  >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n  private readonly modalChanged$ = createScopedEmitter<ModalChangedData, ModalChangedEvent, string>(\n    (documentId, data) => ({ documentId, ...data }),\n    { cache: false },\n  );\n\n  private readonly menuChanged$ = createScopedEmitter<MenuChangedData, MenuChangedEvent, string>(\n    (documentId, data) => ({ documentId, ...data }),\n    { cache: false },\n  );\n\n  private readonly overlayChanged$ = createScopedEmitter<\n    OverlayChangedData,\n    OverlayChangedEvent,\n    string\n  >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n  constructor(id: string, registry: PluginRegistry, config: UIPluginConfig) {\n    super(id, registry);\n    this.schema = config.schema;\n    this.stylesheetConfig = config.stylesheetConfig || {};\n\n    // Extract item categories for computing hidden items\n    this.itemCategories = extractItemCategories(this.schema);\n\n    // Initialize disabled categories from config\n    if (config.disabledCategories?.length) {\n      this.dispatch(setDisabledCategories(config.disabledCategories));\n      // Also compute and dispatch hidden items\n      const hiddenItems = computeHiddenItems(this.itemCategories, config.disabledCategories);\n      this.dispatch(setHiddenItems(hiddenItems));\n    }\n\n    this.i18n = registry.getPlugin<I18nPlugin>('i18n')?.provides() ?? null;\n\n    if (this.i18n) {\n      this.i18nCleanup = this.i18n.onLocaleChange(({ currentLocale }) => {\n        this.handleLocaleChange(currentLocale);\n      });\n\n      // Initialize cached locale\n      this.cachedLocale = this.i18n.getLocale();\n    }\n  }\n\n  async initialize(): Promise<void> {\n    this.logger.info('UIPlugin', 'Initialize', 'UI plugin initialized');\n  }\n\n  async destroy(): Promise<void> {\n    if (this.i18nCleanup) {\n      this.i18nCleanup();\n      this.i18nCleanup = null;\n    }\n\n    this.toolbarChanged$.clear();\n    this.sidebarChanged$.clear();\n    this.modalChanged$.clear();\n    this.menuChanged$.clear();\n    this.overlayChanged$.clear();\n    this.stylesheetInvalidated$.clear();\n    super.destroy();\n  }\n\n  protected override onDocumentLoadingStarted(documentId: string): void {\n    this.dispatch(initUIState(documentId, this.schema));\n  }\n\n  protected override onDocumentClosed(documentId: string): void {\n    this.dispatch(cleanupUIState(documentId));\n\n    // Clear scoped emitters\n    this.toolbarChanged$.clearScope(documentId);\n    this.sidebarChanged$.clearScope(documentId);\n    this.modalChanged$.clearScope(documentId);\n    this.menuChanged$.clearScope(documentId);\n    this.overlayChanged$.clearScope(documentId);\n  }\n\n  /**\n   * Handle locale changes from i18n plugin.\n   * Invalidates stylesheet and emits change event.\n   */\n  private handleLocaleChange(newLocale: string): void {\n    if (this.cachedLocale === newLocale) return;\n\n    this.logger.debug(\n      'UIPlugin',\n      'LocaleChange',\n      `Locale changed: ${this.cachedLocale} -> ${newLocale}`,\n    );\n\n    this.cachedLocale = newLocale;\n    this.invalidateStylesheet();\n    this.stylesheetInvalidated$.emit();\n  }\n\n  /**\n   * Get the generated CSS stylesheet.\n   * Automatically regenerates if locale has changed.\n   * This is pure logic - DOM injection is handled by framework layer.\n   */\n  public getStylesheet(): string {\n    const currentLocale = this.i18n?.getLocale() ?? null;\n\n    // Check if we need to regenerate\n    if (this.cachedStylesheet && this.cachedLocale === currentLocale) {\n      return this.cachedStylesheet;\n    }\n\n    // Generate new stylesheet\n    this.cachedStylesheet = generateUIStylesheet(this.schema, {\n      config: this.stylesheetConfig,\n      locale: currentLocale ?? undefined,\n    });\n    this.cachedLocale = currentLocale;\n\n    return this.cachedStylesheet;\n  }\n\n  /**\n   * Get the current locale (if i18n is available)\n   */\n  public getLocale(): string | null {\n    return this.i18n?.getLocale() ?? null;\n  }\n\n  /**\n   * Regenerate stylesheet (call after schema changes)\n   */\n  public invalidateStylesheet(): void {\n    this.cachedStylesheet = null;\n  }\n\n  public onStylesheetInvalidated(listener: Listener<void>): Unsubscribe {\n    return this.stylesheetInvalidated$.on(listener);\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Category Management\n  // ─────────────────────────────────────────────────────────\n\n  private disableCategoryImpl(category: string): void {\n    const current = new Set(this.state.disabledCategories);\n    if (!current.has(category)) {\n      current.add(category);\n      const categories = Array.from(current);\n      this.dispatch(setDisabledCategories(categories));\n      const hiddenItems = computeHiddenItems(this.itemCategories, categories);\n      this.dispatch(setHiddenItems(hiddenItems));\n      this.categoryChanged$.emit({ disabledCategories: categories, hiddenItems });\n    }\n  }\n\n  private enableCategoryImpl(category: string): void {\n    const current = new Set(this.state.disabledCategories);\n    if (current.has(category)) {\n      current.delete(category);\n      const categories = Array.from(current);\n      this.dispatch(setDisabledCategories(categories));\n      const hiddenItems = computeHiddenItems(this.itemCategories, categories);\n      this.dispatch(setHiddenItems(hiddenItems));\n      this.categoryChanged$.emit({ disabledCategories: categories, hiddenItems });\n    }\n  }\n\n  private toggleCategoryImpl(category: string): void {\n    if (this.state.disabledCategories.includes(category)) {\n      this.enableCategoryImpl(category);\n    } else {\n      this.disableCategoryImpl(category);\n    }\n  }\n\n  private setDisabledCategoriesImpl(categories: string[]): void {\n    this.dispatch(setDisabledCategories(categories));\n    // Compute and dispatch hidden items based on disabled categories\n    const hiddenItems = computeHiddenItems(this.itemCategories, categories);\n    this.dispatch(setHiddenItems(hiddenItems));\n    this.categoryChanged$.emit({ disabledCategories: categories, hiddenItems });\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Capability\n  // ─────────────────────────────────────────────────────────\n\n  protected buildCapability(): UICapability {\n    return {\n      // Active document operations\n      setActiveToolbar: (placement, slot, toolbarId, documentId) =>\n        this.setToolbarForDocument(placement, slot, toolbarId, documentId),\n      setActiveSidebar: (placement, slot, sidebarId, documentId, activeTab, props) =>\n        this.setSidebarForDocument(placement, slot, sidebarId, documentId, activeTab, props),\n      toggleSidebar: (placement, slot, sidebarId, documentId, activeTab, props) =>\n        this.toggleSidebarForDocument(placement, slot, sidebarId, documentId, activeTab, props),\n      openModal: (modalId, props, documentId) =>\n        this.openModalForDocument(modalId, props, documentId),\n      openMenu: (menuId, triggeredByCommandId, triggeredByItemId, documentId) =>\n        this.openMenuForDocument(menuId, triggeredByCommandId, triggeredByItemId, documentId),\n      toggleMenu: (menuId, triggeredByCommandId, triggeredByItemId, documentId) =>\n        this.toggleMenuForDocument(menuId, triggeredByCommandId, triggeredByItemId, documentId),\n\n      // Overlay operations\n      enableOverlay: (overlayId, documentId) =>\n        this.enableOverlayForDocument(overlayId, documentId),\n      disableOverlay: (overlayId, documentId) =>\n        this.disableOverlayForDocument(overlayId, documentId),\n      toggleOverlay: (overlayId, documentId) =>\n        this.toggleOverlayForDocument(overlayId, documentId),\n\n      // Document-scoped operations\n      forDocument: (documentId) => this.createUIScope(documentId),\n\n      // Schema\n      getSchema: () => this.schema,\n      mergeSchema: (partial) => {\n        this.schema = mergeUISchema(this.schema, partial);\n      },\n\n      // Category management\n      disableCategory: (category) => this.disableCategoryImpl(category),\n      enableCategory: (category) => this.enableCategoryImpl(category),\n      toggleCategory: (category) => this.toggleCategoryImpl(category),\n      setDisabledCategories: (categories) => this.setDisabledCategoriesImpl(categories),\n      getDisabledCategories: () => this.state.disabledCategories,\n      isCategoryDisabled: (category) => this.state.disabledCategories.includes(category),\n      getHiddenItems: () => this.state.hiddenItems,\n\n      // Events\n      onToolbarChanged: this.toolbarChanged$.onGlobal,\n      onSidebarChanged: this.sidebarChanged$.onGlobal,\n      onModalChanged: this.modalChanged$.onGlobal,\n      onMenuChanged: this.menuChanged$.onGlobal,\n      onOverlayChanged: this.overlayChanged$.onGlobal,\n      onCategoryChanged: this.categoryChanged$.on,\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Document Scoping\n  // ─────────────────────────────────────────────────────────\n\n  private createUIScope(documentId: string): UIScope {\n    return {\n      // ───── Toolbars ─────\n      setActiveToolbar: (placement, slot, toolbarId) =>\n        this.setToolbarForDocument(placement, slot, toolbarId, documentId),\n      getActiveToolbar: (placement, slot) =>\n        this.getToolbarForDocument(placement, slot, documentId),\n      closeToolbarSlot: (placement, slot) =>\n        this.closeToolbarForDocument(placement, slot, documentId),\n      isToolbarOpen: (placement, slot, toolbarId) =>\n        this.isToolbarOpenForDocument(placement, slot, toolbarId, documentId),\n\n      // ───── Sidebars ─────\n      setActiveSidebar: (placement, slot, sidebarId, activeTab, props) =>\n        this.setSidebarForDocument(placement, slot, sidebarId, documentId, activeTab, props),\n      getActiveSidebar: (placement, slot) =>\n        this.getSidebarForDocument(placement, slot, documentId),\n      closeSidebarSlot: (placement, slot) =>\n        this.closeSidebarForDocument(placement, slot, documentId),\n      toggleSidebar: (placement, slot, sidebarId, activeTab, props) =>\n        this.toggleSidebarForDocument(placement, slot, sidebarId, documentId, activeTab, props),\n      isSidebarOpen: (placement, slot, sidebarId) =>\n        this.isSidebarOpenForDocument(placement, slot, sidebarId, documentId),\n\n      // ───── Sidebar tabs ─────\n      setSidebarTab: (sidebarId, tabId) =>\n        this.setSidebarTabForDocument(sidebarId, tabId, documentId),\n      getSidebarTab: (sidebarId) => this.getSidebarTabForDocument(sidebarId, documentId),\n\n      // ───── Modals (with animation lifecycle) ─────\n      openModal: (modalId, props) => this.openModalForDocument(modalId, props, documentId),\n      closeModal: () => this.closeModalForDocument(documentId),\n      clearModal: () => this.clearModalForDocument(documentId),\n      getActiveModal: () => this.getActiveModalForDocument(documentId),\n      isModalOpen: () => this.isModalOpenForDocument(documentId),\n\n      // ───── Menus ─────\n      openMenu: (menuId, triggeredByCommandId, triggeredByItemId) =>\n        this.openMenuForDocument(menuId, triggeredByCommandId, triggeredByItemId, documentId),\n      closeMenu: (menuId) => this.closeMenuForDocument(menuId, documentId),\n      toggleMenu: (menuId, triggeredByCommandId, triggeredByItemId) =>\n        this.toggleMenuForDocument(menuId, triggeredByCommandId, triggeredByItemId, documentId),\n      closeAllMenus: () => this.closeAllMenusForDocument(documentId),\n      isMenuOpen: (menuId) => this.isMenuOpenForDocument(menuId, documentId),\n      getOpenMenus: () => this.getOpenMenusForDocument(documentId),\n\n      // ───── Overlays ─────\n      enableOverlay: (overlayId) => this.enableOverlayForDocument(overlayId, documentId),\n      disableOverlay: (overlayId) => this.disableOverlayForDocument(overlayId, documentId),\n      toggleOverlay: (overlayId) => this.toggleOverlayForDocument(overlayId, documentId),\n      isOverlayEnabled: (overlayId) => this.isOverlayEnabledForDocument(overlayId, documentId),\n      getEnabledOverlays: () => this.getEnabledOverlaysForDocument(documentId),\n\n      // ───── Schema & state ─────\n      getSchema: () => this.schema,\n      getState: () => this.getDocumentStateOrThrow(documentId),\n\n      // ───── Scoped events ─────\n      onToolbarChanged: this.toolbarChanged$.forScope(documentId),\n      onSidebarChanged: this.sidebarChanged$.forScope(documentId),\n      onModalChanged: this.modalChanged$.forScope(documentId),\n      onMenuChanged: this.menuChanged$.forScope(documentId),\n      onOverlayChanged: this.overlayChanged$.forScope(documentId),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // State Helpers\n  // ─────────────────────────────────────────────────────────\n\n  private getDocumentState(documentId?: string): UIDocumentState | null {\n    const id = documentId ?? this.getActiveDocumentId();\n    return this.state.documents[id] ?? null;\n  }\n\n  private getDocumentStateOrThrow(documentId?: string): UIDocumentState {\n    const state = this.getDocumentState(documentId);\n    if (!state) {\n      throw new Error(`UI state not found for document: ${documentId ?? 'active'}`);\n    }\n    return state;\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Toolbars\n  // ─────────────────────────────────────────────────────────\n\n  private setToolbarForDocument(\n    placement: string,\n    slot: string,\n    toolbarId: string,\n    documentId?: string,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(setActiveToolbar(id, placement, slot, toolbarId));\n    this.toolbarChanged$.emit(id, { placement, slot, toolbarId });\n  }\n\n  private getToolbarForDocument(\n    placement: string,\n    slot: string,\n    documentId?: string,\n  ): string | null {\n    const slotKey = `${placement}-${slot}`;\n    const toolbarSlot = this.getDocumentStateOrThrow(documentId).activeToolbars[slotKey];\n    return toolbarSlot?.isOpen ? toolbarSlot.toolbarId : null;\n  }\n\n  private closeToolbarForDocument(placement: string, slot: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(closeToolbarSlot(id, placement, slot));\n    this.toolbarChanged$.emit(id, { placement, slot, toolbarId: '' });\n  }\n\n  private isToolbarOpenForDocument(\n    placement: string,\n    slot: string,\n    toolbarId?: string,\n    documentId?: string,\n  ): boolean {\n    const slotKey = `${placement}-${slot}`;\n    const toolbarSlot = this.getDocumentStateOrThrow(documentId).activeToolbars[slotKey];\n    if (!toolbarSlot || !toolbarSlot.isOpen) return false;\n    return toolbarId ? toolbarSlot.toolbarId === toolbarId : true;\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Sidebars\n  // ─────────────────────────────────────────────────────────\n\n  private setSidebarForDocument(\n    placement: string,\n    slot: string,\n    sidebarId: string,\n    documentId?: string,\n    activeTab?: string,\n    props?: Record<string, unknown>,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(setActiveSidebar(id, placement, slot, sidebarId, activeTab, props));\n    this.sidebarChanged$.emit(id, { placement, slot, sidebarId });\n  }\n\n  private getSidebarForDocument(\n    placement: string,\n    slot: string,\n    documentId?: string,\n  ): string | null {\n    const slotKey = `${placement}-${slot}`;\n    const sidebarSlot = this.getDocumentStateOrThrow(documentId).activeSidebars[slotKey];\n    return sidebarSlot?.isOpen ? sidebarSlot.sidebarId : null;\n  }\n\n  private closeSidebarForDocument(placement: string, slot: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(closeSidebarSlot(id, placement, slot));\n    this.sidebarChanged$.emit(id, { placement, slot, sidebarId: '' });\n  }\n\n  private toggleSidebarForDocument(\n    placement: string,\n    slot: string,\n    sidebarId: string,\n    documentId?: string,\n    activeTab?: string,\n    props?: Record<string, unknown>,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    const slotKey = `${placement}-${slot}`;\n    const sidebarSlot = this.getDocumentStateOrThrow(id).activeSidebars[slotKey];\n\n    if (sidebarSlot?.sidebarId === sidebarId && sidebarSlot?.isOpen) {\n      this.dispatch(closeSidebarSlot(id, placement, slot));\n      this.sidebarChanged$.emit(id, { placement, slot, sidebarId: '' });\n    } else {\n      this.dispatch(setActiveSidebar(id, placement, slot, sidebarId, activeTab, props));\n      this.sidebarChanged$.emit(id, { placement, slot, sidebarId });\n    }\n  }\n\n  private isSidebarOpenForDocument(\n    placement: string,\n    slot: string,\n    sidebarId?: string,\n    documentId?: string,\n  ): boolean {\n    const slotKey = `${placement}-${slot}`;\n    const sidebarSlot = this.getDocumentStateOrThrow(documentId).activeSidebars[slotKey];\n    if (!sidebarSlot || !sidebarSlot.isOpen) return false;\n    return sidebarId ? sidebarSlot.sidebarId === sidebarId : true;\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Sidebar Tabs\n  // ─────────────────────────────────────────────────────────\n\n  private setSidebarTabForDocument(sidebarId: string, tabId: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(setSidebarTab(id, sidebarId, tabId));\n  }\n\n  private getSidebarTabForDocument(sidebarId: string, documentId?: string): string | null {\n    return this.getDocumentStateOrThrow(documentId).sidebarTabs[sidebarId] ?? null;\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Modals (with animation lifecycle)\n  // ─────────────────────────────────────────────────────────\n\n  private openModalForDocument(\n    modalId: string,\n    props?: Record<string, unknown>,\n    documentId?: string,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(openModal(id, modalId, props));\n    this.modalChanged$.emit(id, { modalId, isOpen: true });\n  }\n\n  private closeModalForDocument(documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    const currentModal = this.getDocumentStateOrThrow(id).activeModal;\n    this.dispatch(closeModal(id));\n    this.modalChanged$.emit(id, { modalId: currentModal?.modalId ?? null, isOpen: false });\n  }\n\n  private clearModalForDocument(documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(clearModal(id));\n  }\n\n  private getActiveModalForDocument(documentId?: string): ModalSlotState | null {\n    return this.getDocumentStateOrThrow(documentId).activeModal;\n  }\n\n  private isModalOpenForDocument(documentId?: string): boolean {\n    const modal = this.getDocumentStateOrThrow(documentId).activeModal;\n    return modal?.isOpen ?? false;\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Menus\n  // ─────────────────────────────────────────────────────────\n\n  private openMenuForDocument(\n    menuId: string,\n    triggeredByCommandId?: string,\n    triggeredByItemId?: string,\n    documentId?: string,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(openMenu(id, { menuId, triggeredByCommandId, triggeredByItemId }));\n    this.menuChanged$.emit(id, { menuId, isOpen: true });\n  }\n\n  private closeMenuForDocument(menuId: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(closeMenu(id, menuId));\n    this.menuChanged$.emit(id, { menuId, isOpen: false });\n  }\n\n  private toggleMenuForDocument(\n    menuId: string,\n    triggeredByCommandId?: string,\n    triggeredByItemId?: string,\n    documentId?: string,\n  ): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    const isOpen = !!this.getDocumentStateOrThrow(id).openMenus[menuId];\n\n    if (isOpen) {\n      this.dispatch(closeMenu(id, menuId));\n      this.menuChanged$.emit(id, { menuId, isOpen: false });\n    } else {\n      this.dispatch(openMenu(id, { menuId, triggeredByCommandId, triggeredByItemId }));\n      this.menuChanged$.emit(id, { menuId, isOpen: true });\n    }\n  }\n\n  private closeAllMenusForDocument(documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(closeAllMenus(id));\n  }\n\n  private isMenuOpenForDocument(menuId: string, documentId?: string): boolean {\n    return !!this.getDocumentStateOrThrow(documentId).openMenus[menuId];\n  }\n\n  private getOpenMenusForDocument(documentId?: string): Array<{\n    menuId: string;\n    triggeredByCommandId?: string;\n    triggeredByItemId?: string;\n  }> {\n    return Object.values(this.getDocumentStateOrThrow(documentId).openMenus);\n  }\n\n  // ─────────────────────────────────────────────────────────\n  // Core Operations - Overlays\n  // ─────────────────────────────────────────────────────────\n\n  private enableOverlayForDocument(overlayId: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(setOverlayEnabled(id, overlayId, true));\n    this.overlayChanged$.emit(id, { overlayId, isEnabled: true });\n  }\n\n  private disableOverlayForDocument(overlayId: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    this.dispatch(setOverlayEnabled(id, overlayId, false));\n    this.overlayChanged$.emit(id, { overlayId, isEnabled: false });\n  }\n\n  private toggleOverlayForDocument(overlayId: string, documentId?: string): void {\n    const id = documentId ?? this.getActiveDocumentId();\n    const isEnabled = this.isOverlayEnabledForDocument(overlayId, id);\n\n    if (isEnabled) {\n      this.disableOverlayForDocument(overlayId, id);\n    } else {\n      this.enableOverlayForDocument(overlayId, id);\n    }\n  }\n\n  private isOverlayEnabledForDocument(overlayId: string, documentId?: string): boolean {\n    const enabledOverlays = this.getDocumentStateOrThrow(documentId).enabledOverlays;\n    // Default to true if not explicitly set (matches schema behavior)\n    return enabledOverlays[overlayId] ?? true;\n  }\n\n  private getEnabledOverlaysForDocument(documentId?: string): string[] {\n    const enabledOverlays = this.getDocumentStateOrThrow(documentId).enabledOverlays;\n    return Object.entries(enabledOverlays)\n      .filter(([, enabled]) => enabled)\n      .map(([overlayId]) => overlayId);\n  }\n}\n","import { UIState, UIDocumentState } from './types';\nimport {\n  UIAction,\n  INIT_UI_STATE,\n  CLEANUP_UI_STATE,\n  SET_ACTIVE_TOOLBAR,\n  SET_ACTIVE_SIDEBAR,\n  CLOSE_SIDEBAR_SLOT,\n  CLOSE_TOOLBAR_SLOT,\n  SET_SIDEBAR_TAB,\n  OPEN_MODAL,\n  CLOSE_MODAL,\n  CLEAR_MODAL,\n  OPEN_MENU,\n  CLOSE_MENU,\n  CLOSE_ALL_MENUS,\n  SET_OVERLAY_ENABLED,\n  SET_DISABLED_CATEGORIES,\n  SET_HIDDEN_ITEMS,\n} from './actions';\n\nexport const initialDocumentState: UIDocumentState = {\n  activeToolbars: {},\n  activeSidebars: {},\n  activeModal: null,\n  openMenus: {},\n  sidebarTabs: {},\n  enabledOverlays: {},\n};\n\nexport const initialState: UIState = {\n  documents: {},\n  disabledCategories: [],\n  hiddenItems: [],\n};\n\nexport const uiReducer = (state = initialState, action: UIAction): UIState => {\n  switch (action.type) {\n    case INIT_UI_STATE: {\n      const { documentId, schema } = action.payload;\n\n      // Initialize permanent toolbars from schema\n      const activeToolbars: Record<string, { toolbarId: string; isOpen: boolean }> = {};\n\n      Object.values(schema.toolbars).forEach((toolbar) => {\n        if (toolbar.permanent && toolbar.position) {\n          const slotKey = `${toolbar.position.placement}-${toolbar.position.slot}`;\n          activeToolbars[slotKey] = {\n            toolbarId: toolbar.id,\n            isOpen: true, // Permanent toolbars are always open\n          };\n        }\n      });\n\n      // Initialize overlay enabled state from schema's defaultEnabled\n      const enabledOverlays: Record<string, boolean> = {};\n\n      if (schema.overlays) {\n        Object.values(schema.overlays).forEach((overlay) => {\n          // Default to true if defaultEnabled is not specified\n          enabledOverlays[overlay.id] = overlay.defaultEnabled ?? true;\n        });\n      }\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...initialDocumentState,\n            activeToolbars, // Initialize with permanent toolbars\n            enabledOverlays, // Initialize with overlay enabled states\n          },\n        },\n      };\n    }\n\n    case CLEANUP_UI_STATE: {\n      const { documentId } = action.payload;\n      const { [documentId]: removed, ...remaining } = state.documents;\n      return {\n        ...state,\n        documents: remaining,\n      };\n    }\n\n    case SET_ACTIVE_TOOLBAR: {\n      const { documentId, placement, slot, toolbarId } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n      const slotKey = `${placement}-${slot}`;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeToolbars: {\n              ...docState.activeToolbars,\n              [slotKey]: {\n                toolbarId,\n                isOpen: true,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case CLOSE_TOOLBAR_SLOT: {\n      const { documentId, placement, slot } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      const slotKey = `${placement}-${slot}`;\n      const toolbarSlot = docState.activeToolbars[slotKey];\n\n      // If no toolbar in this slot, nothing to close\n      if (!toolbarSlot) return state;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeToolbars: {\n              ...docState.activeToolbars,\n              [slotKey]: {\n                ...toolbarSlot,\n                isOpen: false, // Keep toolbar, just close it\n              },\n            },\n          },\n        },\n      };\n    }\n\n    // ─────────────────────────────────────────────────────────\n    // Sidebar Actions\n    // ─────────────────────────────────────────────────────────\n\n    case SET_ACTIVE_SIDEBAR: {\n      const { documentId, placement, slot, sidebarId, activeTab, props } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n      const slotKey = `${placement}-${slot}`;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeSidebars: {\n              ...docState.activeSidebars,\n              [slotKey]: {\n                sidebarId,\n                isOpen: true,\n                props,\n              },\n            },\n            ...(activeTab && {\n              sidebarTabs: {\n                ...docState.sidebarTabs,\n                [sidebarId]: activeTab,\n              },\n            }),\n          },\n        },\n      };\n    }\n\n    case CLOSE_SIDEBAR_SLOT: {\n      const { documentId, placement, slot } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      const slotKey = `${placement}-${slot}`;\n      const sidebarSlot = docState.activeSidebars[slotKey];\n\n      // If no sidebar in this slot, nothing to close\n      if (!sidebarSlot) return state;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeSidebars: {\n              ...docState.activeSidebars,\n              [slotKey]: {\n                ...sidebarSlot,\n                isOpen: false, // Keep sidebar, just close it\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_SIDEBAR_TAB: {\n      const { documentId, sidebarId, tabId } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            sidebarTabs: {\n              ...docState.sidebarTabs,\n              [sidebarId]: tabId,\n            },\n          },\n        },\n      };\n    }\n\n    // ─────────────────────────────────────────────────────────\n    // Modal Actions (with animation lifecycle)\n    // ─────────────────────────────────────────────────────────\n\n    case OPEN_MODAL: {\n      const { documentId, modalId, props } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeModal: {\n              modalId,\n              isOpen: true,\n              props,\n            },\n            openMenus: {}, // Close all menus when opening modal\n          },\n        },\n      };\n    }\n\n    case CLOSE_MODAL: {\n      const { documentId } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState?.activeModal) return state;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeModal: {\n              ...docState.activeModal,\n              isOpen: false, // Keep modal for exit animation\n            },\n          },\n        },\n      };\n    }\n\n    case CLEAR_MODAL: {\n      const { documentId } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      // Only clear if modal is closed (animation completed)\n      if (docState.activeModal?.isOpen) return state;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            activeModal: null,\n          },\n        },\n      };\n    }\n\n    // ─────────────────────────────────────────────────────────\n    // Menu Actions\n    // ─────────────────────────────────────────────────────────\n\n    case OPEN_MENU: {\n      const { documentId, menuState } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            openMenus: {\n              // Close other menus, open this one\n              [menuState.menuId]: menuState,\n            },\n          },\n        },\n      };\n    }\n\n    case CLOSE_MENU: {\n      const { documentId, menuId } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      const { [menuId]: removed, ...remainingMenus } = docState.openMenus;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            openMenus: remainingMenus,\n          },\n        },\n      };\n    }\n\n    case CLOSE_ALL_MENUS: {\n      const { documentId } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            openMenus: {},\n          },\n        },\n      };\n    }\n\n    // ─────────────────────────────────────────────────────────\n    // Overlay Actions\n    // ─────────────────────────────────────────────────────────\n\n    case SET_OVERLAY_ENABLED: {\n      const { documentId, overlayId, enabled } = action.payload;\n      const docState = state.documents[documentId] || initialDocumentState;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            enabledOverlays: {\n              ...docState.enabledOverlays,\n              [overlayId]: enabled,\n            },\n          },\n        },\n      };\n    }\n\n    case SET_DISABLED_CATEGORIES: {\n      return {\n        ...state,\n        disabledCategories: action.payload.categories,\n      };\n    }\n\n    case SET_HIDDEN_ITEMS: {\n      return {\n        ...state,\n        hiddenItems: action.payload.hiddenItems,\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n","import { UIState, UIDocumentState, ToolbarSlotState, SidebarSlotState } from './types';\n\n// Shape of state.plugins passed into command active()\nexport type PluginsSlice = Record<string, any>;\n\nexport function selectUIState(plugins: PluginsSlice): UIState | null {\n  return (plugins['ui'] as UIState | undefined) ?? null;\n}\n\nexport function selectUIDocumentState(\n  plugins: PluginsSlice,\n  documentId: string,\n): UIDocumentState | null {\n  const ui = selectUIState(plugins);\n  return ui?.documents[documentId] ?? null;\n}\n\nfunction makeSlotKey(placement: string, slot: string): string {\n  return `${placement}-${slot}`;\n}\n\n// ─────────────────────────────────────────────────────────\n// Toolbars\n// ─────────────────────────────────────────────────────────\n\nexport function selectToolbarSlot(\n  plugins: PluginsSlice,\n  documentId: string,\n  placement: string,\n  slot: string,\n): ToolbarSlotState | null {\n  const doc = selectUIDocumentState(plugins, documentId);\n  if (!doc) return null;\n  return doc.activeToolbars[makeSlotKey(placement, slot)] ?? null;\n}\n\n/**\n * Is a toolbar open in this slot?\n * If toolbarId is provided, also matches that specific toolbar.\n */\nexport function isToolbarOpen(\n  plugins: PluginsSlice,\n  documentId: string,\n  placement: string,\n  slot: string,\n  toolbarId?: string,\n): boolean {\n  const slotState = selectToolbarSlot(plugins, documentId, placement, slot);\n  if (!slotState || !slotState.isOpen) return false;\n  return toolbarId ? slotState.toolbarId === toolbarId : true;\n}\n\n// ─────────────────────────────────────────────────────────\n// Sidebars\n// ─────────────────────────────────────────────────────────\n\nexport function selectSidebarSlot(\n  plugins: PluginsSlice,\n  documentId: string,\n  placement: string,\n  slot: string,\n): SidebarSlotState | null {\n  const doc = selectUIDocumentState(plugins, documentId);\n  if (!doc) return null;\n  return doc.activeSidebars[makeSlotKey(placement, slot)] ?? null;\n}\n\n/**\n * Is a sidebar open in this slot?\n * If sidebarId is provided, also matches that specific sidebar.\n */\nexport function isSidebarOpen(\n  plugins: PluginsSlice,\n  documentId: string,\n  placement: string,\n  slot: string,\n  sidebarId?: string,\n): boolean {\n  const slotState = selectSidebarSlot(plugins, documentId, placement, slot);\n  if (!slotState || !slotState.isOpen) return false;\n  return sidebarId ? slotState.sidebarId === sidebarId : true;\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, UI_PLUGIN_ID } from './manifest';\nimport { UIPluginConfig, UIState } from './types';\nimport { UIPlugin } from './ui-plugin';\nimport { UIAction } from './actions';\nimport { uiReducer, initialState } from './reducer';\n\nexport const UIPluginPackage: PluginPackage<UIPlugin, UIPluginConfig, UIState, UIAction> = {\n  manifest,\n  create: (registry, config) => new UIPlugin(UI_PLUGIN_ID, registry, config),\n  reducer: uiReducer,\n  initialState,\n};\n\nexport * from './ui-plugin';\nexport * from './types';\nexport * from './schema';\nexport * from './manifest';\nexport * from './utils';\nexport * from './selectors';\nexport * from './actions';\n\n// Explicit exports for stylesheet generation (useful for SSR/build-time generation)\nexport {\n  generateUIStylesheet,\n  extractCategories,\n  getStylesheetConfig,\n  type StylesheetConfig,\n} from './utils/stylesheet-generator';\n","import { UI_ATTRIBUTES } from './consts';\n\nexport interface UIItemLike {\n  id: string;\n  categories?: string[];\n}\n\nexport interface UIItemProps {\n  [UI_ATTRIBUTES.ITEM]: string;\n  [UI_ATTRIBUTES.CATEGORIES]?: string;\n}\n\n/**\n * Get data attribute props for a UI item.\n * Spread these onto the wrapper element for CSS-based visibility control.\n */\nexport function getUIItemProps<\n  T extends Record<string, string | undefined> = Record<string, never>,\n>(item: UIItemLike, extra?: T): UIItemProps & T {\n  const props = {\n    [UI_ATTRIBUTES.ITEM]: item.id,\n    [UI_ATTRIBUTES.CATEGORIES]: item.categories?.join(' ') || undefined,\n    ...extra,\n  } as UIItemProps & T;\n\n  return props;\n}\n"],"names":["UI_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","schema","toolbars","menus","sidebars","modals","selectionMenus","INIT_UI_STATE","CLEANUP_UI_STATE","SET_ACTIVE_TOOLBAR","CLOSE_TOOLBAR_SLOT","SET_ACTIVE_SIDEBAR","CLOSE_SIDEBAR_SLOT","SET_SIDEBAR_TAB","OPEN_MODAL","CLOSE_MODAL","CLEAR_MODAL","OPEN_MENU","CLOSE_MENU","CLOSE_ALL_MENUS","SET_OVERLAY_ENABLED","SET_DISABLED_CATEGORIES","SET_HIDDEN_ITEMS","initUIState","documentId","type","payload","cleanupUIState","setActiveToolbar","placement","slot","toolbarId","closeToolbarSlot","setActiveSidebar","sidebarId","activeTab","props","closeSidebarSlot","setSidebarTab","tabId","openModal","modalId","closeModal","clearModal","openMenu","menuState","closeMenu","menuId","closeAllMenus","setOverlayEnabled","overlayId","enabled","setDisabledCategories","categories","setHiddenItems","hiddenItems","mergeUISchema","base","override","mergeToolbars","mergeMenus","mergeSidebars","result","toolbar","Object","entries","items","responsive","menu","panel","content","resolveResponsiveMetadata","currentLocale","_a","breakpoints","effectiveBreakpoints","baseBreakpoints","localeOverrides","groups","matchingGroup","find","group","locales","includes","effective","breakpointId","baseRule","minWidth","maxWidth","hide","replaceHide","show","replaceShow","applyLocaleOverrides","Map","config","set","allItemIds","Set","collectItemIds","forEach","item","add","tabs","itemId","rules","defaultVisible","Array","from","sort","a","b","index","isHidden","isShown","_b","push","visible","priority","length","shouldRender","visibilityRules","UI_ATTRIBUTES","ROOT","STYLES","ITEM","CATEGORIES","DISABLED_CATEGORIES","HIDDEN_ITEMS","UI_SELECTORS","category","DISABLED_CATEGORY","HIDDEN_ITEM","DEFAULT_CONFIG","useContainerQueries","generateUIStylesheet","options","cfg","locale","analysis","analyzeSchema","sections","localeInfo","generateHeader","responsiveCSS","queryType","processedItems","responsiveItems","itemMeta","has","itemRules","metadata","selector","rule","conditions","display","join","generateItemResponsiveRules","generateResponsiveRules","categoryCSS","size","sortedCategories","generateCategoryRules","dependencyCSS","dependencies","dep","depRules","generateSingleDependencyRules","generateDependencyRules","filter","s","trim","extractItemCategories","itemCategories","computeHiddenItems","disabledCategories","disabledSet","some","cat","menuBreakpoints","analyzeMenu","analyzeToolbar","panelId","analyzePanel","selMenuId","selMenu","analyzeSelectionMenu","overlay","overlays","collectCategoriesAndDependency","visibilityDependsOn","analyzeMenuItems","breakpointVisibilities","sortedBreakpoints","_bpId","bp","visibleItems","computeVisibleItemsAtBreakpoint","visibleCats","cats","get","c","visibleItemIds","visibleCategories","allCats","collectAllMenuItemInfo","computeMenuBreakpointVisibilities","resultIds","resultCats","targetBp","isVisible","analyzeToolbarItems","analyzeTabItems","tab","analyzeSelectionMenuItems","itemCats","visibilityDep","itemIds","dependsOnMenuId","dependsOnItemIds","hiddenItemSelectors","map","cssRule","_UIPlugin","BasePlugin","constructor","registry","super","this","cachedStylesheet","cachedLocale","i18n","i18nCleanup","categoryChanged$","createBehaviorEmitter","stylesheetInvalidated$","createEmitter","toolbarChanged$","createScopedEmitter","data","cache","sidebarChanged$","modalChanged$","menuChanged$","overlayChanged$","stylesheetConfig","dispatch","getPlugin","onLocaleChange","handleLocaleChange","getLocale","initialize","logger","info","destroy","clear","onDocumentLoadingStarted","onDocumentClosed","clearScope","newLocale","debug","invalidateStylesheet","emit","getStylesheet","onStylesheetInvalidated","listener","on","disableCategoryImpl","current","state","enableCategoryImpl","delete","toggleCategoryImpl","setDisabledCategoriesImpl","buildCapability","setToolbarForDocument","setSidebarForDocument","toggleSidebar","toggleSidebarForDocument","openModalForDocument","triggeredByCommandId","triggeredByItemId","openMenuForDocument","toggleMenu","toggleMenuForDocument","enableOverlay","enableOverlayForDocument","disableOverlay","disableOverlayForDocument","toggleOverlay","toggleOverlayForDocument","forDocument","createUIScope","getSchema","mergeSchema","partial","disableCategory","enableCategory","toggleCategory","getDisabledCategories","isCategoryDisabled","getHiddenItems","onToolbarChanged","onGlobal","onSidebarChanged","onModalChanged","onMenuChanged","onOverlayChanged","onCategoryChanged","getActiveToolbar","getToolbarForDocument","closeToolbarForDocument","isToolbarOpen","isToolbarOpenForDocument","getActiveSidebar","getSidebarForDocument","closeSidebarForDocument","isSidebarOpen","isSidebarOpenForDocument","setSidebarTabForDocument","getSidebarTab","getSidebarTabForDocument","closeModalForDocument","clearModalForDocument","getActiveModal","getActiveModalForDocument","isModalOpen","isModalOpenForDocument","closeMenuForDocument","closeAllMenusForDocument","isMenuOpen","isMenuOpenForDocument","getOpenMenus","getOpenMenusForDocument","isOverlayEnabled","isOverlayEnabledForDocument","getEnabledOverlays","getEnabledOverlaysForDocument","getState","getDocumentStateOrThrow","forScope","getDocumentState","getActiveDocumentId","documents","Error","slotKey","toolbarSlot","activeToolbars","isOpen","sidebarSlot","activeSidebars","sidebarTabs","currentModal","activeModal","modal","openMenus","values","isEnabled","enabledOverlays","UIPlugin","initialDocumentState","initialState","selectUIState","plugins","selectUIDocumentState","ui","makeSlotKey","selectToolbarSlot","doc","selectSidebarSlot","UIPluginPackage","create","reducer","action","permanent","position","defaultEnabled","removed","remaining","docState","remainingMenus","extra","slotState","commands","commandIds","commandId","child","removeCommandsFromToolbars","removeCommandsFromMenus"],"mappings":"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"}