UNPKG

ng-hub-ui-accordion

Version:

A flexible, accessible, and customizable accordion component for Angular 19, part of the ng-hub-ui family.

1 lines 44.2 kB
{"version":3,"file":"ng-hub-ui-accordion.mjs","sources":["../../../projects/accordion/src/lib/directives/accordion-panel-header.directive.ts","../../../projects/accordion/src/lib/components/accordion-panel/accordion-panel.component.ts","../../../projects/accordion/src/lib/components/accordion-panel/accordion-panel.component.html","../../../projects/accordion/src/lib/components/accordion/accordion.component.ts","../../../projects/accordion/src/lib/components/accordion/accordion.component.html","../../../projects/accordion/src/lib/services/accordion-config.service.ts","../../../projects/accordion/src/public-api.ts","../../../projects/accordion/src/ng-hub-ui-accordion.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core';\n\n@Directive({\n\tselector: '[hubAccordionPanelHeader]'\n})\nexport class AccordionPanelHeaderDirective {\n\tconstructor(public templateRef: TemplateRef<any>) {}\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tComponent,\n\tcontentChild,\n\tElementRef,\n\tHostListener,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tTemplateRef\n} from '@angular/core';\nimport { AccordionPanelHeaderDirective } from '../../directives/accordion-panel-header.directive';\nimport { CollapseEvent } from '../../models/collapse-event';\n\n/**\n * A component that represents a single panel within an accordion.\n * Each panel can be expanded or collapsed independently and contains a header and content section.\n *\n * @example\n * ```html\n * <hub-accordion-panel [title]=\"'Panel Title'\" [value]=\"panelValue\">\n * <ng-template hubAccordionPanelHeader>Custom Header</ng-template>\n * Panel Content\n * </hub-accordion-panel>\n * ```\n *\n * @implements {OnInit}\n *\n * @property {number} index - The position of this panel within its parent accordion\n * @property {any} value - The value associated with this panel\n * @property {WritableSignal<boolean>} collapsed - Signal controlling the panel's collapsed state\n * @property {string} title - The title text displayed in the panel's header\n * @property {TemplateRef<any>} headerTpt - Template reference for custom header content\n *\n * @emits {collapseEvent} collapsedChange - Fired when the panel's collapsed state changes\n */\n@Component({\n\tselector: 'hub-accordion-panel',\n\timports: [NgTemplateOutlet],\n\ttemplateUrl: './accordion-panel.component.html',\n\tstyleUrl: './accordion-panel.component.scss',\n\thost: { class: 'hub-accordion-panel' }\n})\nexport class AccordionPanelComponent {\n\t/**\n\t * The position of this panel within its parent accordion.\n\t *\n\t * @type {number}\n\t */\n\tindex!: number;\n\n\t/**\n\t * ElementRef for accessing the native element.\n\t * @private\n\t */\n\tprivate elementRef = inject(ElementRef);\n\n\tvalue: any = input();\n\n\t/**\n\t * Signal that controls the collapsed state of the accordion panel.\n\t * When true, the panel is collapsed. When false, the panel is expanded.\n\t * @default true\n\t */\n\tcollapsed = model(true);\n\n\t/**\n\t * The title of the accordion panel.\n\t *\n\t * @type {string}\n\t */\n\ttitle = input();\n\n\t/**\n\t * Reference to the header template of the accordion panel.\n\t * Uses contentChild query to find a template marked with AccordionPanelHeaderDirective.\n\t * The template reference is read using TemplateRef.\n\t */\n\theaderTpt = contentChild(AccordionPanelHeaderDirective, {\n\t\tread: TemplateRef\n\t});\n\n\t/**\n\t * Event emitter that fires when the panel's collapsed state changes.\n\t * Emits a collapseEvent object containing the collapse state and animation details.\n\t * @event\n\t */\n\tcollapsedChange = output<CollapseEvent>();\n\n\t/**\n\t * Toggles the collapse state of the accordion panel and emits the change event.\n\t * The event includes the panel's index and its new collapsed state.\n\t *\n\t * @emits collapsedChange - Emits an object containing the panel index and collapsed state\n\t */\n\ttoggleCollapse() {\n\t\tthis.collapsed.update((value) => !value);\n\t\tthis.collapsedChange.emit({\n\t\t\tindex: this.index,\n\t\t\tcollapsed: this.collapsed(),\n\t\t\tuncollapsed: !this.collapsed(),\n\t\t\tvalue: this.value()\n\t\t});\n\t}\n\n\t/**\n\t * Handles keyboard navigation for the accordion panel.\n\t * Supports Arrow keys, Home, End, Space, and Enter.\n\t *\n\t * @param event - The keyboard event\n\t */\n\t@HostListener('keydown', ['$event'])\n\tonKeyDown(event: KeyboardEvent) {\n\t\t// Only handle keyboard events on the button element\n\t\tconst target = event.target as HTMLElement;\n\t\tif (!target.classList.contains('hub-accordion-button')) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tthis.focusNextPanel();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tthis.focusPreviousPanel();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tthis.focusFirstPanel();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tthis.focusLastPanel();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase ' ':\n\t\t\tcase 'Enter':\n\t\t\t\tthis.toggleCollapse();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Focuses the next accordion panel button.\n\t * @private\n\t */\n\tprivate focusNextPanel() {\n\t\tconst allPanels = this.getAllPanelButtons();\n\t\tconst currentIndex = this.getCurrentPanelIndex(allPanels);\n\t\tconst nextIndex = (currentIndex + 1) % allPanels.length;\n\t\tallPanels[nextIndex]?.focus();\n\t}\n\n\t/**\n\t * Focuses the previous accordion panel button.\n\t * @private\n\t */\n\tprivate focusPreviousPanel() {\n\t\tconst allPanels = this.getAllPanelButtons();\n\t\tconst currentIndex = this.getCurrentPanelIndex(allPanels);\n\t\tconst previousIndex = currentIndex === 0 ? allPanels.length - 1 : currentIndex - 1;\n\t\tallPanels[previousIndex]?.focus();\n\t}\n\n\t/**\n\t * Focuses the first accordion panel button.\n\t * @private\n\t */\n\tprivate focusFirstPanel() {\n\t\tconst allPanels = this.getAllPanelButtons();\n\t\tallPanels[0]?.focus();\n\t}\n\n\t/**\n\t * Focuses the last accordion panel button.\n\t * @private\n\t */\n\tprivate focusLastPanel() {\n\t\tconst allPanels = this.getAllPanelButtons();\n\t\tallPanels[allPanels.length - 1]?.focus();\n\t}\n\n\t/**\n\t * Gets all accordion panel buttons within the parent accordion.\n\t * @private\n\t * @returns Array of button elements\n\t */\n\tprivate getAllPanelButtons(): HTMLButtonElement[] {\n\t\tconst accordionElement = this.elementRef.nativeElement.closest('.hub-accordion');\n\t\tif (!accordionElement) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Array.from(accordionElement.querySelectorAll('.hub-accordion-button'));\n\t}\n\n\t/**\n\t * Gets the current panel's index within all panel buttons.\n\t * @private\n\t * @param allPanels - Array of all panel buttons\n\t * @returns Current panel index or 0 if not found\n\t */\n\tprivate getCurrentPanelIndex(allPanels: HTMLButtonElement[]): number {\n\t\tconst currentButton = this.elementRef.nativeElement.querySelector('.hub-accordion-button');\n\t\treturn Math.max(0, allPanels.indexOf(currentButton));\n\t}\n\n}\n","<h2 class=\"hub-accordion-header\">\n\t<button\n\t\tclass=\"hub-accordion-button\"\n\t\ttype=\"button\"\n\t\t[class.collapsed]=\"collapsed()\"\n\t\t[attr.data-bs-target]=\"'#collapse' + index\"\n\t\t[attr.aria-expanded]=\"!collapsed()\"\n\t\t[attr.aria-controls]=\"'collapse' + index\"\n\t\t(click)=\"toggleCollapse()\"\n\t>\n\t\t@if (headerTpt()) {\n\t\t\t<ng-container [ngTemplateOutlet]=\"$any(headerTpt())\"></ng-container>\n\t\t} @else if (title()) {\n\t\t\t{{ title() }}\n\t\t}\n\t</button>\n</h2>\n<div\n\t[attr.id]=\"'collapse' + index\"\n\tclass=\"hub-accordion-collapse\"\n\t[class.hub-accordion-collapse--collapsed]=\"collapsed()\"\n\t[attr.aria-hidden]=\"collapsed()\"\n\t[attr.inert]=\"collapsed() ? '' : null\"\n>\n\t<div class=\"hub-accordion-body\">\n\t\t<ng-content></ng-content>\n\t</div>\n</div>\n","import {\n\tComponent,\n\tcontentChildren,\n\teffect,\n\tforwardRef,\n\tHostBinding,\n\tinput,\n\tOnDestroy\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { OutputRefSubscription } from '@angular/core';\nimport { CollapseEvent } from '../../models/collapse-event';\nimport { AccordionPanelComponent } from '../accordion-panel/accordion-panel.component';\n\n/**\n * A component that implements an accordion UI pattern, allowing users to show and hide\n * sections of related content. Supports single or multiple expanded panels and flush styling.\n * Implements ControlValueAccessor for form integration.\n *\n * @example\n * ```html\n * <hub-accordion [multiple]=\"true\" [options]=\"{flush: true}\">\n * <hub-accordion-panel>...</hub-accordion-panel>\n * <hub-accordion-panel>...</hub-accordion-panel>\n * </hub-accordion>\n * ```\n *\n * @implements {ControlValueAccessor}\n * @extends {SelectMultipleControlValueAccessor}\n */\n@Component({\n\tselector: 'hub-accordion',\n\ttemplateUrl: './accordion.component.html',\n\tstyleUrl: './accordion.component.scss',\n\thost: { class: 'hub-accordion' },\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => AccordionComponent),\n\t\t\tmulti: true\n\t\t}\n\t]\n})\nexport class AccordionComponent implements ControlValueAccessor, OnDestroy {\n\t/**\n\t * The current value of the accordion component.\n\t * An array that may contain any type of data.\n\t */\n\tvalue: any[] = [];\n\n\t/**\n\t * Input binding that configures the property or attribute to bind to.\n\t * Defines the property that will be bound to the value of the accordion.\n\t * @default undefined\n\t */\n\tbindValue = input<string>();\n\n\t/**\n\t * Configuration options for the accordion component.\n\t *\n\t * @property {Object} options - The options object for configuring the accordion.\n\t * @property {boolean} options.flush - When true, removes some borders and rounded corners to render\n\t * accordions edge-to-edge with their parent container. Defaults to false.\n\t */\n\toptions = input({ flush: false }, {\n\t\ttransform: (value: { flush: boolean } | any): { flush: boolean } => {\n\t\t\t// Input validation and sanitization\n\t\t\tif (!value || typeof value !== 'object') {\n\t\t\t\tconsole.warn('[AccordionComponent] Invalid options provided, using defaults');\n\t\t\t\treturn { flush: false };\n\t\t\t}\n\n\t\t\t// Ensure flush is a boolean\n\t\t\tconst flush = typeof value.flush === 'boolean' ? value.flush : false;\n\t\t\t\n\t\t\treturn { flush };\n\t\t}\n\t});\n\n\t/**\n\t * Defines a comparison function to determine if two accordion items are equal.\n\t * Used to track identity of objects in accordion selections.\n\t *\n\t * @param o1 First object to compare\n\t * @param o2 Second object to compare\n\t * @returns {boolean} True if objects are considered equal, false otherwise\n\t * @defaultValue Default implementation uses strict equality (===)\n\t */\n\treadonly compareWith = input<(o1: any, o2: any) => boolean>(\n\t\t(o1, o2) => o1 === o2\n\t);\n\n\t/**\n\t * When true, expanding an accordion item will close all other expanded items.\n\t * Defaults to false.\n\t */\n\tmultiple = input(false);\n\n\t/**\n\t * Collection of child AccordionPanelComponent instances within this accordion.\n\t * Uses Angular's contentChildren query to obtain all panel components.\n\t * @type {QueryList<AccordionPanelComponent>}\n\t */\n\tpanels = contentChildren(AccordionPanelComponent);\n\n\t/**\n\t * Subject for managing component destruction and cleanup.\n\t * @private\n\t */\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * Map to track panel subscriptions for proper cleanup.\n\t * @private\n\t */\n\tprivate panelSubscriptions = new Map<number, OutputRefSubscription>();\n\n\t/**\n\t * Effect that manages panel changes and their subscriptions.\n\t * Initializes panel indices and subscribes to collapse events for each panel.\n\t * This effect runs whenever the panels signal changes.\n\t * \n\t * Properly manages subscriptions to prevent memory leaks by:\n\t * - Unsubscribing from previous panel subscriptions\n\t * - Creating new subscriptions for current panels\n\t * - Storing subscription references for cleanup\n\t */\n\tpanelsChangeEffect = effect(() => {\n\t\t// Clean up existing subscriptions\n\t\tthis.panelSubscriptions.forEach(subscription => subscription.unsubscribe());\n\t\tthis.panelSubscriptions.clear();\n\n\t\t// Create new subscriptions for current panels\n\t\tthis.panels().forEach((panel, index) => {\n\t\t\tpanel.index = index;\n\t\t\tconst subscription = panel.collapsedChange.subscribe((event) => {\n\t\t\t\tthis.handlePanelCollapse(event);\n\t\t\t});\n\t\t\tthis.panelSubscriptions.set(index, subscription);\n\t\t});\n\t});\n\n\t/**\n\t * Gets whether the accordion has the flush styling option enabled\n\t * @returns {boolean} True if the flush option is enabled, false otherwise\n\t */\n\t@HostBinding('class.hub-accordion-flush')\n\tget haveFlushClass() {\n\t\treturn this.options().flush;\n\t}\n\n\tonChange: any = () => {};\n\tonTouch: any = () => {};\n\n\t/**\n\t * Implements the ControlValueAccessor interface to write a new value to the form control.\n\t * Validates and sanitizes the input value before setting it.\n\t * @param obj The value to be written to the form control\n\t */\n\twriteValue(obj: any): void {\n\t\t// Handle null/undefined values\n\t\tif (obj == null) {\n\t\t\tthis.value = [];\n\t\t\tthis.handleValue();\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Validate and transform the input value\n\t\t\tif (this.multiple()) {\n\t\t\t\t// Multiple mode: expect an array\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tthis.value = [...obj]; // Create a copy to avoid reference issues\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('[AccordionComponent] Expected array for multiple selection mode, received:', typeof obj);\n\t\t\t\t\tthis.value = [obj]; // Wrap single value in array\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Single mode: wrap in array for internal consistency\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tconsole.warn('[AccordionComponent] Expected single value for single selection mode, received array. Using first element.');\n\t\t\t\t\tthis.value = obj.length > 0 ? [obj[0]] : [];\n\t\t\t\t} else {\n\t\t\t\t\tthis.value = [obj];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.handleValue();\n\t\t} catch (error) {\n\t\t\tconsole.error('[AccordionComponent] Error processing writeValue:', error);\n\t\t\tthis.value = [];\n\t\t\tthis.handleValue();\n\t\t}\n\t}\n\n\t/**\n\t * Registers a callback function that is invoked when the control's value changes in the UI.\n\t * This is part of the ControlValueAccessor interface implementation.\n\t * @param fn - The callback function to register. This function will be called with the new value when the control's value changes.\n\t */\n\tregisterOnChange(fn: any): void {\n\t\tthis.onChange = fn;\n\t}\n\n\t/**\n\t * Registers a callback function that is called when the control receives a touch event.\n\t * Part of the ControlValueAccessor interface implementation.\n\t * @param fn - The callback function to register. Gets called when the control is touched.\n\t */\n\tregisterOnTouched(fn: any): void {\n\t\tthis.onTouch = fn;\n\t}\n\n\t/**\n\t * Component cleanup method. Unsubscribes from all panel subscriptions and\n\t * completes the destroy subject to prevent memory leaks.\n\t */\n\tngOnDestroy(): void {\n\t\t// Clean up all panel subscriptions\n\t\tthis.panelSubscriptions.forEach(subscription => subscription.unsubscribe());\n\t\tthis.panelSubscriptions.clear();\n\n\t\t// Complete the destroy subject\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * Updates the collapse state of all panels based on the current value.\n\t * Each panel is collapsed if its value is not found in the accordion's value array using the compareWith function.\n\t * @internal\n\t */\n\thandleValue() {\n\t\tfor (const panel of this.panels()) {\n\t\t\tconst panelComparableValue = this.getComparableValue(panel.value());\n\t\t\tpanel.collapsed.set(\n\t\t\t\t!this.value.find((selectedValue) => this.compareWith()(selectedValue, panelComparableValue))\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handles the collapse/expand event of an accordion panel.\n\t * Manages state consistently and handles both single and multiple selection modes.\n\t *\n\t * @param {CollapseEvent} collapseEvent - Object containing panel collapse event data\n\t */\n\thandlePanelCollapse(collapseEvent: CollapseEvent) {\n\t\tthis.updateAccordionValue(collapseEvent.value, collapseEvent.collapsed);\n\t\t\n\t\t// Handle single-selection mode: close other panels when one expands\n\t\tif (!collapseEvent.collapsed && !this.multiple()) {\n\t\t\tthis.closeOtherPanels(collapseEvent.index);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the accordion's value based on panel state changes.\n\t * Maintains consistency between single and multiple selection modes.\n\t * \n\t * @param panelValue - The value of the panel being toggled\n\t * @param collapsed - Whether the panel is being collapsed (true) or expanded (false)\n\t * @private\n\t */\n\tprivate updateAccordionValue(panelValue: any, collapsed: boolean): void {\n\t\tconst comparablePanelValue = this.getComparableValue(panelValue);\n\n\t\t// Ensure value is always an array for consistent processing\n\t\tconst currentValues = Array.isArray(this.value) ? [...this.value] : [];\n\t\t\n\t\tif (collapsed) {\n\t\t\t// Remove value from selection\n\t\t\tthis.value = currentValues.filter((selectedValue) => !this.compareWith()(selectedValue, comparablePanelValue));\n\t\t} else {\n\t\t\t// Add value to selection\n\t\t\tif (this.multiple()) {\n\t\t\t\t// Multiple mode: add if not already present\n\t\t\t\tif (!currentValues.some((selectedValue) => this.compareWith()(selectedValue, comparablePanelValue))) {\n\t\t\t\t\tthis.value = [...currentValues, comparablePanelValue];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Single mode: replace current selection\n\t\t\t\tthis.value = [comparablePanelValue];\n\t\t\t}\n\t\t}\n\n\t\t// Emit the appropriate value format based on mode\n\t\tthis.emitValueChange();\n\t}\n\n\t/**\n\t * Closes all panels except the one at the specified index.\n\t * Used in single-selection mode to ensure only one panel is open at a time.\n\t * \n\t * @param excludeIndex - Index of the panel to keep open\n\t * @private\n\t */\n\tprivate closeOtherPanels(excludeIndex: number): void {\n\t\tthis.panels().forEach((panel, index) => {\n\t\t\tif (index !== excludeIndex) {\n\t\t\t\tpanel.collapsed.set(true);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Emits the current value in the appropriate format for the current mode.\n\t * Single mode emits a single value or null, multiple mode emits an array.\n\t * \n\t * @private\n\t */\n\tprivate emitValueChange(): void {\n\t\tconst emittedValue = this.multiple() \n\t\t\t? this.value \n\t\t\t: (this.value.length > 0 ? this.value[0] : null);\n\t\t\n\t\tthis.onChange(emittedValue);\n\t}\n\n\t/**\n\t * Returns the value used by selection/comparison logic, applying `bindValue` when configured.\n\t *\n\t * @param sourceValue Raw panel value.\n\t * @returns Comparable value used for internal selection state and emitted form value.\n\t */\n\tprivate getComparableValue(sourceValue: any): any {\n\t\tconst bindPath = this.bindValue();\n\t\tif (!bindPath) {\n\t\t\treturn sourceValue;\n\t\t}\n\t\treturn this.readByPath(sourceValue, bindPath);\n\t}\n\n\t/**\n\t * Reads a nested value from an object using dot notation path syntax.\n\t *\n\t * @param source Object to read from.\n\t * @param path Dot notation path (e.g. `id`, `meta.key`).\n\t * @returns Resolved value or `undefined` when the path cannot be resolved.\n\t */\n\tprivate readByPath(source: any, path: string): any {\n\t\tif (source == null || !path) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn path.split('.').reduce((currentValue: any, segment: string) => {\n\t\t\tif (currentValue == null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn currentValue[segment];\n\t\t}, source);\n\t}\n}\n","<ng-content></ng-content>\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * Global configuration interface for accordion components.\n */\nexport interface AccordionGlobalConfig {\n\t/**\n\t * Default animation duration in milliseconds.\n\t * @default 300\n\t */\n\tanimationDuration: number;\n\n\t/**\n\t * Whether multiple panels can be open by default.\n\t * @default false\n\t */\n\tmultipleDefault: boolean;\n\n\t/**\n\t * Whether flush mode is enabled by default.\n\t * @default false\n\t */\n\tflushDefault: boolean;\n\n\t/**\n\t * Default theme for accordion styling.\n\t * @default 'default'\n\t */\n\ttheme: 'default' | 'corporate' | 'vibrant' | 'dark' | string;\n\n\t/**\n\t * Whether to enable accessibility features by default.\n\t * @default true\n\t */\n\taccessibilityEnabled: boolean;\n\n\t/**\n\t * Whether to show warnings in development mode.\n\t * @default true\n\t */\n\tdevelopmentWarnings: boolean;\n\n\t/**\n\t * Custom CSS class prefix for accordion components.\n\t * @default 'hub-accordion'\n\t */\n\tcssPrefix: string;\n\n\t/**\n\t * Whether animations are enabled globally.\n\t * @default true\n\t */\n\tanimationsEnabled: boolean;\n}\n\n/**\n * Default configuration values.\n */\nconst DEFAULT_CONFIG: AccordionGlobalConfig = {\n\tanimationDuration: 300,\n\tmultipleDefault: false,\n\tflushDefault: false,\n\ttheme: 'default',\n\taccessibilityEnabled: true,\n\tdevelopmentWarnings: true,\n\tcssPrefix: 'hub-accordion',\n\tanimationsEnabled: true\n};\n\n/**\n * Global configuration service for accordion components.\n * Provides centralized configuration management with type safety and validation.\n * \n * @example\n * ```typescript\n * // In your app config or module\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * // other providers...\n * {\n * provide: ACCORDION_CONFIG,\n * useValue: {\n * theme: 'corporate',\n * animationDuration: 500,\n * multipleDefault: true\n * }\n * }\n * ]\n * };\n * \n * // Or use the service directly\n * constructor(private accordionConfig: AccordionConfigService) {\n * this.accordionConfig.updateConfig({\n * theme: 'dark',\n * animationsEnabled: false\n * });\n * }\n * ```\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class AccordionConfigService {\n\t/**\n\t * Signal containing the current global configuration.\n\t * @private\n\t */\n\tprivate config = signal<AccordionGlobalConfig>({ ...DEFAULT_CONFIG });\n\n\t/**\n\t * Updates the global configuration with partial values.\n\t * Validates input values and provides warnings for invalid options.\n\t * \n\t * @param partialConfig - Partial configuration object to merge with current config\n\t * @example\n\t * ```typescript\n\t * configService.updateConfig({\n\t * theme: 'corporate',\n\t * animationDuration: 500\n\t * });\n\t * ```\n\t */\n\tupdateConfig(partialConfig: Partial<AccordionGlobalConfig>): void {\n\t\tconst validatedConfig = this.validateConfig(partialConfig);\n\t\t\n\t\tthis.config.update(currentConfig => ({\n\t\t\t...currentConfig,\n\t\t\t...validatedConfig\n\t\t}));\n\n\t\tif (this.config().developmentWarnings) {\n\t\t\tthis.logConfigUpdate(validatedConfig);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the current global configuration as a readonly signal.\n\t * \n\t * @returns Readonly signal with current configuration\n\t * @example\n\t * ```typescript\n\t * const config = configService.getConfig();\n\t * const animationDuration = config().animationDuration;\n\t * ```\n\t */\n\tgetConfig() {\n\t\treturn this.config.asReadonly();\n\t}\n\n\t/**\n\t * Resets the configuration to default values.\n\t * \n\t * @example\n\t * ```typescript\n\t * configService.resetToDefaults();\n\t * ```\n\t */\n\tresetToDefaults(): void {\n\t\tthis.config.set({ ...DEFAULT_CONFIG });\n\t\t\n\t\tif (this.config().developmentWarnings) {\n\t\t\tconsole.info('[AccordionConfigService] Configuration reset to defaults');\n\t\t}\n\t}\n\n\t/**\n\t * Gets a specific configuration value with type safety.\n\t * \n\t * @param key - Configuration key to retrieve\n\t * @returns The configuration value\n\t * @example\n\t * ```typescript\n\t * const duration = configService.getValue('animationDuration');\n\t * ```\n\t */\n\tgetValue<K extends keyof AccordionGlobalConfig>(key: K): AccordionGlobalConfig[K] {\n\t\treturn this.config()[key];\n\t}\n\n\t/**\n\t * Validates and sanitizes configuration values.\n\t * \n\t * @param config - Configuration object to validate\n\t * @returns Validated and sanitized configuration\n\t * @private\n\t */\n\tprivate validateConfig(config: Partial<AccordionGlobalConfig>): Partial<AccordionGlobalConfig> {\n\t\tconst validated: Partial<AccordionGlobalConfig> = {};\n\n\t\tif (config.animationDuration !== undefined) {\n\t\t\tif (typeof config.animationDuration === 'number' && config.animationDuration >= 0) {\n\t\t\t\tvalidated.animationDuration = Math.max(0, Math.min(5000, config.animationDuration));\n\t\t\t} else {\n\t\t\t\tthis.warn('animationDuration must be a positive number, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.multipleDefault !== undefined) {\n\t\t\tif (typeof config.multipleDefault === 'boolean') {\n\t\t\t\tvalidated.multipleDefault = config.multipleDefault;\n\t\t\t} else {\n\t\t\t\tthis.warn('multipleDefault must be a boolean, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.flushDefault !== undefined) {\n\t\t\tif (typeof config.flushDefault === 'boolean') {\n\t\t\t\tvalidated.flushDefault = config.flushDefault;\n\t\t\t} else {\n\t\t\t\tthis.warn('flushDefault must be a boolean, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.theme !== undefined) {\n\t\t\tif (typeof config.theme === 'string' && config.theme.length > 0) {\n\t\t\t\tvalidated.theme = config.theme;\n\t\t\t} else {\n\t\t\t\tthis.warn('theme must be a non-empty string, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.accessibilityEnabled !== undefined) {\n\t\t\tif (typeof config.accessibilityEnabled === 'boolean') {\n\t\t\t\tvalidated.accessibilityEnabled = config.accessibilityEnabled;\n\t\t\t} else {\n\t\t\t\tthis.warn('accessibilityEnabled must be a boolean, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.developmentWarnings !== undefined) {\n\t\t\tif (typeof config.developmentWarnings === 'boolean') {\n\t\t\t\tvalidated.developmentWarnings = config.developmentWarnings;\n\t\t\t}\n\t\t}\n\n\t\tif (config.cssPrefix !== undefined) {\n\t\t\tif (typeof config.cssPrefix === 'string' && config.cssPrefix.length > 0) {\n\t\t\t\tvalidated.cssPrefix = config.cssPrefix;\n\t\t\t} else {\n\t\t\t\tthis.warn('cssPrefix must be a non-empty string, using default value');\n\t\t\t}\n\t\t}\n\n\t\tif (config.animationsEnabled !== undefined) {\n\t\t\tif (typeof config.animationsEnabled === 'boolean') {\n\t\t\t\tvalidated.animationsEnabled = config.animationsEnabled;\n\t\t\t} else {\n\t\t\t\tthis.warn('animationsEnabled must be a boolean, using default value');\n\t\t\t}\n\t\t}\n\n\t\treturn validated;\n\t}\n\n\t/**\n\t * Logs configuration updates in development mode.\n\t * \n\t * @param config - Updated configuration values\n\t * @private\n\t */\n\tprivate logConfigUpdate(config: Partial<AccordionGlobalConfig>): void {\n\t\tconst keys = Object.keys(config);\n\t\tif (keys.length > 0) {\n\t\t\tconsole.info('[AccordionConfigService] Configuration updated:', \n\t\t\t\tkeys.map(key => `${key}: ${config[key as keyof AccordionGlobalConfig]}`).join(', ')\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Logs warnings for invalid configuration values.\n\t * \n\t * @param message - Warning message\n\t * @private\n\t */\n\tprivate warn(message: string): void {\n\t\tif (this.config().developmentWarnings) {\n\t\t\tconsole.warn(`[AccordionConfigService] ${message}`);\n\t\t}\n\t}\n}\n\n/**\n * Injection token for providing global accordion configuration.\n * Use this token to provide custom configuration at application startup.\n * \n * @example\n * ```typescript\n * import { ACCORDION_CONFIG } from 'ng-hub-ui-accordion';\n * \n * export const appConfig: ApplicationConfig = {\n * providers: [\n * {\n * provide: ACCORDION_CONFIG,\n * useValue: {\n * theme: 'corporate',\n * animationDuration: 500\n * }\n * }\n * ]\n * };\n * ```\n */\nexport const ACCORDION_CONFIG = 'ACCORDION_CONFIG';","/*\n * Public API Surface of accordion\n */\n\nexport * from './lib/components/accordion-panel/accordion-panel.component';\nexport * from './lib/components/accordion/accordion.component';\nexport * from './lib/directives/accordion-panel-header.directive';\nexport * from './lib/models/collapse-event';\nexport * from './lib/services/accordion-config.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}