@embedpdf/plugin-ui 2.0.0-next.1 → 2.0.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +235 -146
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +31 -15
  6. package/dist/lib/schema.d.ts +51 -10
  7. package/dist/lib/selectors.d.ts +5 -5
  8. package/dist/lib/types.d.ts +39 -23
  9. package/dist/lib/ui-plugin.d.ts +11 -8
  10. package/dist/lib/utils/consts.d.ts +3 -0
  11. package/dist/lib/utils/schema-merger.d.ts +1 -1
  12. package/dist/lib/utils/stylesheet-generator.d.ts +17 -0
  13. package/dist/preact/adapter.d.ts +1 -1
  14. package/dist/preact/index.cjs +1 -1
  15. package/dist/preact/index.cjs.map +1 -1
  16. package/dist/preact/index.js +143 -38
  17. package/dist/preact/index.js.map +1 -1
  18. package/dist/react/adapter.d.ts +1 -1
  19. package/dist/react/index.cjs +1 -1
  20. package/dist/react/index.cjs.map +1 -1
  21. package/dist/react/index.js +143 -38
  22. package/dist/react/index.js.map +1 -1
  23. package/dist/shared/hooks/index.d.ts +1 -0
  24. package/dist/shared/hooks/use-schema-renderer.d.ts +41 -9
  25. package/dist/shared/hooks/use-ui-container.d.ts +39 -0
  26. package/dist/shared/root.d.ts +1 -1
  27. package/dist/shared/types.d.ts +31 -6
  28. package/dist/shared-preact/hooks/index.d.ts +1 -0
  29. package/dist/shared-preact/hooks/use-schema-renderer.d.ts +41 -9
  30. package/dist/shared-preact/hooks/use-ui-container.d.ts +39 -0
  31. package/dist/shared-preact/root.d.ts +1 -1
  32. package/dist/shared-preact/types.d.ts +31 -6
  33. package/dist/shared-react/hooks/index.d.ts +1 -0
  34. package/dist/shared-react/hooks/use-schema-renderer.d.ts +41 -9
  35. package/dist/shared-react/hooks/use-ui-container.d.ts +39 -0
  36. package/dist/shared-react/root.d.ts +1 -1
  37. package/dist/shared-react/types.d.ts +31 -6
  38. package/dist/svelte/hooks/index.d.ts +1 -0
  39. package/dist/svelte/hooks/use-schema-renderer.svelte.d.ts +55 -12
  40. package/dist/svelte/hooks/use-ui-container.svelte.d.ts +41 -0
  41. package/dist/svelte/hooks/use-ui.svelte.d.ts +2 -2
  42. package/dist/svelte/index.cjs +1 -1
  43. package/dist/svelte/index.cjs.map +1 -1
  44. package/dist/svelte/index.js +112 -20
  45. package/dist/svelte/index.js.map +1 -1
  46. package/dist/svelte/types.d.ts +31 -6
  47. package/dist/vue/hooks/index.d.ts +1 -0
  48. package/dist/vue/hooks/use-schema-renderer.d.ts +41 -9
  49. package/dist/vue/hooks/use-ui-container.d.ts +39 -0
  50. package/dist/vue/hooks/use-ui.d.ts +148 -20
  51. package/dist/vue/index.cjs +1 -1
  52. package/dist/vue/index.cjs.map +1 -1
  53. package/dist/vue/index.js +126 -25
  54. package/dist/vue/index.js.map +1 -1
  55. package/dist/vue/types.d.ts +31 -6
  56. package/package.json +12 -12
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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/utils/ui-props.ts","../src/lib/ui-plugin.ts","../src/lib/reducer.ts","../src/lib/selectors.ts","../src/lib/index.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: ['commands'], // Depends on commands\n optional: ['i18n'],\n defaultConfig: {\n enabled: true,\n schema: {\n id: 'empty',\n version: '1.0.0',\n toolbars: {},\n menus: {},\n panels: {},\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';\nexport const SET_ACTIVE_PANEL = 'UI/SET_ACTIVE_PANEL';\nexport const CLOSE_PANEL_SLOT = 'UI/CLOSE_PANEL_SLOT';\nexport const SET_PANEL_TAB = 'UI/SET_PANEL_TAB';\nexport const OPEN_MODAL = 'UI/OPEN_MODAL';\nexport const CLOSE_MODAL = 'UI/CLOSE_MODAL';\nexport const OPEN_MENU = 'UI/OPEN_MENU';\nexport const CLOSE_MENU = 'UI/CLOSE_MENU';\nexport const CLOSE_ALL_MENUS = 'UI/CLOSE_ALL_MENUS';\nexport const SET_DISABLED_CATEGORIES = 'UI/SET_DISABLED_CATEGORIES';\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\nexport interface SetActivePanelAction extends Action {\n type: typeof SET_ACTIVE_PANEL;\n payload: {\n documentId: string;\n placement: string;\n slot: string;\n panelId: string;\n activeTab?: string;\n };\n}\n\nexport interface ClosePanelSlotAction extends Action {\n type: typeof CLOSE_PANEL_SLOT;\n payload: { documentId: string; placement: string; slot: string };\n}\n\nexport interface SetPanelTabAction extends Action {\n type: typeof SET_PANEL_TAB;\n payload: { documentId: string; panelId: string; tabId: string };\n}\n\nexport interface OpenModalAction extends Action {\n type: typeof OPEN_MODAL;\n payload: { documentId: string; modalId: string };\n}\n\nexport interface CloseModalAction extends Action {\n type: typeof CLOSE_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\nexport interface SetDisabledCategoriesAction extends Action {\n type: typeof SET_DISABLED_CATEGORIES;\n payload: { categories: string[] };\n}\n\nexport type UIAction =\n | InitUIStateAction\n | CleanupUIStateAction\n | SetActiveToolbarAction\n | CloseToolbarSlotAction\n | SetActivePanelAction\n | ClosePanelSlotAction\n | SetPanelTabAction\n | OpenModalAction\n | CloseModalAction\n | OpenMenuAction\n | CloseMenuAction\n | CloseAllMenusAction\n | SetDisabledCategoriesAction;\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\nexport const setActivePanel = (\n documentId: string,\n placement: string,\n slot: string,\n panelId: string,\n activeTab?: string,\n): SetActivePanelAction => ({\n type: SET_ACTIVE_PANEL,\n payload: { documentId, placement, slot, panelId, activeTab },\n});\n\nexport const closePanelSlot = (\n documentId: string,\n placement: string,\n slot: string,\n): ClosePanelSlotAction => ({\n type: CLOSE_PANEL_SLOT,\n payload: { documentId, placement, slot },\n});\n\nexport const setPanelTab = (\n documentId: string,\n panelId: string,\n tabId: string,\n): SetPanelTabAction => ({\n type: SET_PANEL_TAB,\n payload: { documentId, panelId, tabId },\n});\n\nexport const openModal = (documentId: string, modalId: string): OpenModalAction => ({\n type: OPEN_MODAL,\n payload: { documentId, modalId },\n});\n\nexport const closeModal = (documentId: string): CloseModalAction => ({\n type: CLOSE_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\nexport const setDisabledCategories = (categories: string[]): SetDisabledCategoriesAction => ({\n type: SET_DISABLED_CATEGORIES,\n payload: { categories },\n});\n","import { UISchema, ToolbarSchema, MenuSchema, PanelSchema } 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 panels: mergePanels(base.panels, override.panels),\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 mergePanels(\n base: Record<string, PanelSchema>,\n override?: Record<string, PanelSchema>,\n): Record<string, PanelSchema> {\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 panels?: 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.panels) {\n result.panels = { ...result.panels };\n options.panels.forEach((id) => delete result.panels[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} 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} as const;\n","import {\n UISchema,\n ToolbarSchema,\n ToolbarItem,\n TabItem,\n MenuSchema,\n MenuItem,\n PanelSchema,\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 /** Categories that are responsive-visible at this breakpoint */\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 * 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.panels)) {\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 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 visibleCategories: visibleCats,\n });\n }\n } else {\n // No responsive rules - collect all item categories\n const allCats = new Set<string>();\n collectAllMenuItemCategories(menu.items, itemCategories, allCats);\n breakpointVisibilities.push({ visibleCategories: allCats });\n }\n\n return breakpointVisibilities;\n}\n\nfunction collectAllMenuItemCategories(\n items: MenuItem[],\n itemCategories: Map<string, string[]>,\n result: Set<string>,\n): void {\n for (const item of items) {\n const cats = itemCategories.get(item.id);\n if (cats) cats.forEach((c) => result.add(c));\n\n if (item.type === 'section') {\n collectAllMenuItemCategories(item.items, itemCategories, result);\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: PanelSchema,\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 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.visibleCategories.size === 0) continue;\n\n // Generate selector: hide when ALL visible categories are disabled\n const categorySelectors = Array.from(bp.visibleCategories)\n .sort()\n .map((cat) => UI_SELECTORS.DISABLED_CATEGORY(cat))\n .join('');\n\n const cssRule = `${UI_SELECTORS.ROOT}${categorySelectors} ${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 if (dep.dependsOnItemIds?.length) {\n const relevantCategories = new Set<string>();\n for (const itemId of dep.dependsOnItemIds) {\n const cats = analysis.itemCategories.get(itemId);\n if (cats) cats.forEach((c) => relevantCategories.add(c));\n }\n\n if (relevantCategories.size > 0) {\n const categorySelectors = Array.from(relevantCategories)\n .sort()\n .map((cat) => UI_SELECTORS.DISABLED_CATEGORY(cat))\n .join('');\n\n rules.push(`/* \"${dep.itemId}\" depends on items: ${dep.dependsOnItemIds.join(', ')} */\n${UI_SELECTORS.ROOT}${categorySelectors} ${UI_SELECTORS.ITEM(dep.itemId)} {\n display: none !important;\n}`);\n }\n }\n\n return rules;\n}\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","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 PanelChangedData,\n PanelChangedEvent,\n ModalChangedData,\n ModalChangedEvent,\n MenuChangedData,\n MenuChangedEvent,\n} from './types';\nimport {\n UIAction,\n initUIState,\n cleanupUIState,\n setActiveToolbar,\n closeToolbarSlot,\n setActivePanel,\n closePanelSlot,\n setPanelTab,\n openModal,\n closeModal,\n openMenu,\n closeMenu,\n closeAllMenus,\n setDisabledCategories,\n} from './actions';\nimport { mergeUISchema } from './utils/schema-merger';\nimport { generateUIStylesheet, StylesheetConfig } 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 // 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<{ disabledCategories: string[] }>();\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 panelChanged$ = createScopedEmitter<PanelChangedData, PanelChangedEvent, string>(\n (documentId, data) => ({ documentId, ...data }),\n { cache: false },\n );\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 constructor(id: string, registry: PluginRegistry, config: UIPluginConfig) {\n super(id, registry);\n this.schema = config.schema;\n this.stylesheetConfig = config.stylesheetConfig || {};\n\n // Initialize disabled categories from config\n if (config.disabledCategories?.length) {\n this.dispatch(setDisabledCategories(config.disabledCategories));\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.panelChanged$.clear();\n this.modalChanged$.clear();\n this.menuChanged$.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.panelChanged$.clearScope(documentId);\n this.modalChanged$.clearScope(documentId);\n this.menuChanged$.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 this.dispatch(setDisabledCategories(Array.from(current)));\n this.categoryChanged$.emit({ disabledCategories: Array.from(current) });\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 this.dispatch(setDisabledCategories(Array.from(current)));\n this.categoryChanged$.emit({ disabledCategories: Array.from(current) });\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 this.categoryChanged$.emit({ disabledCategories: categories });\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 setActivePanel: (placement, slot, panelId, documentId, activeTab) =>\n this.setPanelForDocument(placement, slot, panelId, documentId, activeTab),\n togglePanel: (placement, slot, panelId, documentId, activeTab) =>\n this.togglePanelForDocument(placement, slot, panelId, documentId, activeTab),\n openModal: (modalId, documentId) => this.openModalForDocument(modalId, 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 // 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\n // Events\n onToolbarChanged: this.toolbarChanged$.onGlobal,\n onPanelChanged: this.panelChanged$.onGlobal,\n onModalChanged: this.modalChanged$.onGlobal,\n onMenuChanged: this.menuChanged$.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 // ───── Panels ─────\n setActivePanel: (placement, slot, panelId, activeTab) =>\n this.setPanelForDocument(placement, slot, panelId, documentId, activeTab),\n getActivePanel: (placement, slot) => this.getPanelForDocument(placement, slot, documentId),\n closePanelSlot: (placement, slot) => this.closePanelForDocument(placement, slot, documentId),\n togglePanel: (placement, slot, panelId, activeTab) =>\n this.togglePanelForDocument(placement, slot, panelId, documentId, activeTab),\n isPanelOpen: (placement, slot, panelId) =>\n this.isPanelOpenForDocument(placement, slot, panelId, documentId),\n\n // ───── Panel tabs ─────\n setPanelTab: (panelId, tabId) => this.setPanelTabForDocument(panelId, tabId, documentId),\n getPanelTab: (panelId) => this.getPanelTabForDocument(panelId, documentId),\n\n // ───── Modals ─────\n openModal: (modalId) => this.openModalForDocument(modalId, documentId),\n closeModal: () => this.closeModalForDocument(documentId),\n getActiveModal: () => this.getActiveModalForDocument(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 // ───── Schema & state ─────\n getSchema: () => this.schema,\n getState: () => this.getDocumentStateOrThrow(documentId),\n\n // ───── Scoped events ─────\n onToolbarChanged: this.toolbarChanged$.forScope(documentId),\n onPanelChanged: this.panelChanged$.forScope(documentId),\n onModalChanged: this.modalChanged$.forScope(documentId),\n onMenuChanged: this.menuChanged$.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 - Panels\n // ─────────────────────────────────────────────────────────\n\n private setPanelForDocument(\n placement: string,\n slot: string,\n panelId: string,\n documentId?: string,\n activeTab?: string,\n ): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(setActivePanel(id, placement, slot, panelId, activeTab));\n this.panelChanged$.emit(id, { placement, slot, panelId });\n }\n\n private getPanelForDocument(placement: string, slot: string, documentId?: string): string | null {\n const slotKey = `${placement}-${slot}`;\n const panelSlot = this.getDocumentStateOrThrow(documentId).activePanels[slotKey];\n return panelSlot?.isOpen ? panelSlot.panelId : null;\n }\n\n private closePanelForDocument(placement: string, slot: string, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(closePanelSlot(id, placement, slot));\n this.panelChanged$.emit(id, { placement, slot, panelId: '' });\n }\n\n private togglePanelForDocument(\n placement: string,\n slot: string,\n panelId: string,\n documentId?: string,\n activeTab?: string,\n ): void {\n const id = documentId ?? this.getActiveDocumentId();\n const slotKey = `${placement}-${slot}`;\n const panelSlot = this.getDocumentStateOrThrow(id).activePanels[slotKey];\n\n if (panelSlot?.panelId === panelId && panelSlot?.isOpen) {\n this.dispatch(closePanelSlot(id, placement, slot));\n this.panelChanged$.emit(id, { placement, slot, panelId: '' });\n } else {\n this.dispatch(setActivePanel(id, placement, slot, panelId, activeTab));\n this.panelChanged$.emit(id, { placement, slot, panelId });\n }\n }\n\n private isPanelOpenForDocument(\n placement: string,\n slot: string,\n panelId?: string,\n documentId?: string,\n ): boolean {\n const slotKey = `${placement}-${slot}`;\n const panelSlot = this.getDocumentStateOrThrow(documentId).activePanels[slotKey];\n if (!panelSlot || !panelSlot.isOpen) return false;\n return panelId ? panelSlot.panelId === panelId : true;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations - Panel Tabs\n // ─────────────────────────────────────────────────────────\n\n private setPanelTabForDocument(panelId: string, tabId: string, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(setPanelTab(id, panelId, tabId));\n }\n\n private getPanelTabForDocument(panelId: string, documentId?: string): string | null {\n return this.getDocumentStateOrThrow(documentId).panelTabs[panelId] ?? null;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations - Modals\n // ─────────────────────────────────────────────────────────\n\n private openModalForDocument(modalId: string, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(openModal(id, modalId));\n this.modalChanged$.emit(id, { modalId });\n }\n\n private closeModalForDocument(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(closeModal(id));\n this.modalChanged$.emit(id, { modalId: null });\n }\n\n private getActiveModalForDocument(documentId?: string): string | null {\n return this.getDocumentStateOrThrow(documentId).activeModal;\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","import { UIState, UIDocumentState } from './types';\nimport {\n UIAction,\n INIT_UI_STATE,\n CLEANUP_UI_STATE,\n SET_ACTIVE_TOOLBAR,\n SET_ACTIVE_PANEL,\n CLOSE_PANEL_SLOT,\n CLOSE_TOOLBAR_SLOT,\n SET_PANEL_TAB,\n OPEN_MODAL,\n CLOSE_MODAL,\n OPEN_MENU,\n CLOSE_MENU,\n CLOSE_ALL_MENUS,\n SET_DISABLED_CATEGORIES,\n} from './actions';\n\nexport const initialDocumentState: UIDocumentState = {\n activeToolbars: {},\n activePanels: {},\n activeModal: null,\n openMenus: {},\n panelTabs: {},\n};\n\nexport const initialState: UIState = {\n documents: {},\n disabledCategories: [],\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 return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...initialDocumentState,\n activeToolbars, // Initialize with permanent toolbars\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 SET_ACTIVE_PANEL: {\n const { documentId, placement, slot, panelId, activeTab } = 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 activePanels: {\n ...docState.activePanels,\n [slotKey]: {\n panelId,\n isOpen: true,\n },\n },\n ...(activeTab && {\n panelTabs: {\n ...docState.panelTabs,\n [panelId]: activeTab,\n },\n }),\n },\n },\n };\n }\n\n case CLOSE_PANEL_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 panelSlot = docState.activePanels[slotKey];\n\n // If no panel in this slot, nothing to close\n if (!panelSlot) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activePanels: {\n ...docState.activePanels,\n [slotKey]: {\n ...panelSlot,\n isOpen: false, // Keep panel, just close it\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 case SET_PANEL_TAB: {\n const { documentId, panelId, 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 panelTabs: {\n ...docState.panelTabs,\n [panelId]: tabId,\n },\n },\n },\n };\n }\n\n case OPEN_MODAL: {\n const { documentId, modalId } = 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: modalId,\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) 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 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 case SET_DISABLED_CATEGORIES: {\n return {\n ...state,\n disabledCategories: action.payload.categories,\n };\n }\n\n default:\n return state;\n }\n};\n","import { UIState, UIDocumentState, ToolbarSlotState, PanelSlotState } 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// Panels\n// ─────────────────────────────────────────────────────────\n\nexport function selectPanelSlot(\n plugins: PluginsSlice,\n documentId: string,\n placement: string,\n slot: string,\n): PanelSlotState | null {\n const doc = selectUIDocumentState(plugins, documentId);\n if (!doc) return null;\n return doc.activePanels[makeSlotKey(placement, slot)] ?? null;\n}\n\n/**\n * Is a panel open in this slot?\n * If panelId is provided, also matches that specific panel.\n */\nexport function isPanelOpen(\n plugins: PluginsSlice,\n documentId: string,\n placement: string,\n slot: string,\n panelId?: string,\n): boolean {\n const slotState = selectPanelSlot(plugins, documentId, placement, slot);\n if (!slotState || !slotState.isOpen) return false;\n return panelId ? slotState.panelId === panelId : 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"],"names":["items","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","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/utils/ui-props.ts","../src/lib/ui-plugin.ts","../src/lib/reducer.ts","../src/lib/selectors.ts","../src/lib/index.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: ['commands'], // Depends on commands\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// 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 };\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 };\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\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 | 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): SetActiveSidebarAction => ({\n type: SET_ACTIVE_SIDEBAR,\n payload: { documentId, placement, slot, sidebarId, activeTab },\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 = (documentId: string, modalId: string): OpenModalAction => ({\n type: OPEN_MODAL,\n payload: { documentId, modalId },\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\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 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 { 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","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 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 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 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.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 }\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) =>\n this.setSidebarForDocument(placement, slot, sidebarId, documentId, activeTab),\n toggleSidebar: (placement, slot, sidebarId, documentId, activeTab) =>\n this.toggleSidebarForDocument(placement, slot, sidebarId, documentId, activeTab),\n openModal: (modalId, documentId) => this.openModalForDocument(modalId, 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 // 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 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) =>\n this.setSidebarForDocument(placement, slot, sidebarId, documentId, activeTab),\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) =>\n this.toggleSidebarForDocument(placement, slot, sidebarId, documentId, activeTab),\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) => this.openModalForDocument(modalId, 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 // ───── 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 };\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 ): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(setActiveSidebar(id, placement, slot, sidebarId, activeTab));\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 ): 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));\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(modalId: string, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(openModal(id, modalId));\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","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_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};\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 return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...initialDocumentState,\n activeToolbars, // Initialize with permanent toolbars\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 } = 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 },\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 } = 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 },\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 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"],"names":["items","_a"],"mappings":"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"}