@nuralyui/collapse 0.0.8 → 0.0.9
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.
- package/bundle.js +1 -1
- package/collapse.component.d.ts +1 -1
- package/collapse.component.js +1 -1
- package/collapse.component.js.map +1 -1
- package/package.json +1 -1
package/bundle.js
CHANGED
|
@@ -458,7 +458,7 @@ const Qc=1;class Jc{constructor(c){}get _$AU(){return this._$AM._$AU}_$AT(c,a,s)
|
|
|
458
458
|
|
|
459
459
|
/* Size properties with fallbacks */
|
|
460
460
|
--nuraly-icon-size-fallback: 18px;
|
|
461
|
-
--nuraly-icon-size-small-fallback:
|
|
461
|
+
--nuraly-icon-size-small-fallback: 14px;
|
|
462
462
|
--nuraly-icon-size-medium-fallback: 20px;
|
|
463
463
|
--nuraly-icon-size-large-fallback: 24px;
|
|
464
464
|
--nuraly-icon-size-xlarge-fallback: 32px;
|
package/collapse.component.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { LitElement } from 'lit';
|
|
7
7
|
import { CollapseSection, CollapseSize, CollapseVariant, CollapseAnimation } from './collapse.type.js';
|
|
8
8
|
import '../icon/icon.component.js';
|
|
9
|
-
declare const HyCollapse_base: (new (...args: any[]) => import("
|
|
9
|
+
declare const HyCollapse_base: (new (...args: any[]) => import("@nuralyui/common/mixins").DependencyAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").ThemeAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").EventHandlerCapable) & typeof LitElement;
|
|
10
10
|
/**
|
|
11
11
|
* Versatile collapse/accordion component with multiple variants, animations, and accessibility features.
|
|
12
12
|
*
|
package/collapse.component.js
CHANGED
|
@@ -22,7 +22,7 @@ import { html, LitElement, nothing } from 'lit';
|
|
|
22
22
|
import { customElement, property } from 'lit/decorators.js';
|
|
23
23
|
import { EMPTY_STRING } from './collapse.type.js';
|
|
24
24
|
import { styles } from './collapse.style.js';
|
|
25
|
-
import { NuralyUIBaseMixin } from '
|
|
25
|
+
import { NuralyUIBaseMixin } from '@nuralyui/common/mixins';
|
|
26
26
|
import { map } from 'lit/directives/map.js';
|
|
27
27
|
import { classMap } from 'lit/directives/class-map.js';
|
|
28
28
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapse.component.js","sourceRoot":"","sources":["../../../src/components/collapse/collapse.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n CollapseSection,\n CollapseSize,\n CollapseVariant,\n CollapseAnimation,\n CollapseSectionToggleEvent,\n CollapseBeforeToggleEvent,\n EMPTY_STRING\n} from './collapse.type.js';\nimport { styles } from './collapse.style.js';\nimport { NuralyUIBaseMixin } from '../../shared/base-mixin.js';\nimport { map } from 'lit/directives/map.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\n// Import icon component\nimport '../icon/icon.component.js';\n\n// Import controllers\nimport {\n CollapseAnimationController,\n CollapseAccordionController\n} from './controllers/index.js';\n\n/**\n * Versatile collapse/accordion component with multiple variants, animations, and accessibility features.\n * \n * @example\n * ```html\n * <nr-collapse\n * .sections=\"${sections}\"\n * size=\"medium\"\n * variant=\"default\"\n * accordion\n * ></nr-collapse>\n * ```\n * \n * @element nr-collapse\n * @fires section-toggle - Fired when a section is toggled\n * @fires section-before-toggle - Fired before a section is toggled (cancellable)\n */\n@customElement('nr-collapse')\nexport class HyCollapse extends NuralyUIBaseMixin(LitElement) {\n static override styles = styles;\n override requiredComponents = ['nr-icon'];\n\n // Controllers\n private animationController = new CollapseAnimationController(this);\n private accordionController = new CollapseAccordionController(this);\n\n // Public properties\n @property({ type: Array }) sections: CollapseSection[] = [];\n @property({ type: String }) size: CollapseSize = CollapseSize.Medium;\n @property({ type: String }) variant: CollapseVariant = CollapseVariant.Default;\n @property({ type: String }) animation: CollapseAnimation = CollapseAnimation.Slide;\n @property({ type: Boolean }) accordion = false;\n @property({ type: Boolean, attribute: 'allow-multiple' }) allowMultiple = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: 'expand-icon' }) expandIcon = 'chevron-right';\n @property({ type: String, attribute: 'collapse-icon' }) collapseIcon = 'chevron-down';\n\n override connectedCallback(): void {\n super.connectedCallback();\n \n // Listen for internal events from controllers\n this.addEventListener('section-toggle-requested', this.handleToggleRequest as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('section-toggle-requested', this.handleToggleRequest as EventListener);\n }\n\n override updated(changedProperties: Map<string, any>): void {\n super.updated(changedProperties);\n \n if (changedProperties.has('accordion') || changedProperties.has('allowMultiple')) {\n this.accordionController.enforceAccordionMode();\n }\n }\n\n /**\n * Toggle a section by index\n */\n async toggleSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (!section || section.disabled || section.collapsible === false) {\n return;\n }\n\n const isCurrentlyOpen = !!section.open;\n const willBeOpen = !isCurrentlyOpen;\n\n // Dispatch before-toggle event (cancellable)\n const beforeToggleEvent: CustomEvent<CollapseBeforeToggleEvent> = new CustomEvent<CollapseBeforeToggleEvent>('section-before-toggle', {\n detail: {\n index,\n section,\n isOpen: isCurrentlyOpen,\n preventDefault: () => beforeToggleEvent.preventDefault()\n },\n cancelable: true,\n bubbles: true\n });\n\n if (!this.dispatchEvent(beforeToggleEvent)) {\n return; // Event was cancelled\n }\n\n // Handle accordion logic\n this.accordionController.handleSectionToggle(index, willBeOpen);\n\n // Update section state\n this.updateSection(index, { open: willBeOpen });\n\n // Handle animation\n if (this.animation !== CollapseAnimation.None) {\n await this.animationController.animateToggle(index, willBeOpen);\n }\n\n // Dispatch toggle event\n this.dispatchEvent(new CustomEvent<CollapseSectionToggleEvent>('section-toggle', {\n detail: {\n index,\n section: this.sections[index],\n isOpen: willBeOpen\n },\n bubbles: true\n }));\n }\n\n /**\n * Open a specific section\n */\n async openSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (section && !section.open) {\n await this.toggleSection(index);\n }\n }\n\n /**\n * Close a specific section\n */\n async closeSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (section && section.open) {\n await this.toggleSection(index);\n }\n }\n\n /**\n * Open all sections (respects accordion mode)\n */\n openAllSections(): void {\n this.accordionController.openAllSections();\n }\n\n /**\n * Close all sections\n */\n closeAllSections(): void {\n this.accordionController.closeAllSections();\n }\n\n /**\n * Update a specific section (used by controllers and internal logic)\n */\n updateSection(index: number, updates: Partial<CollapseSection>): void {\n if (index < 0 || index >= this.sections.length) {\n return;\n }\n \n this.sections = this.sections.map((section, i) => \n i === index ? { ...section, ...updates } : section\n );\n }\n\n /**\n * Update multiple sections at once (used by controllers for batch operations)\n */\n updateSections(updates: Array<{ index: number; updates: Partial<CollapseSection> }>): void {\n if (updates.length === 0) {\n return;\n }\n \n this.sections = this.sections.map((section, i) => {\n const update = updates.find(u => u.index === i);\n return update ? { ...section, ...update.updates } : section;\n });\n }\n\n /**\n * Handle toggle request from keyboard controller\n */\n private handleToggleRequest = (event: CustomEvent): void => {\n const { index } = event.detail;\n this.toggleSection(index);\n };\n\n /**\n * Get icon for section state\n */\n private getSectionIcon(section: CollapseSection): string {\n if (section.expandIcon && section.collapseIcon) {\n return section.open ? section.collapseIcon : section.expandIcon;\n }\n \n if (section.headerIcon) {\n return section.headerIcon;\n }\n\n return section.open ? this.collapseIcon : this.expandIcon;\n }\n\n /**\n * Check if section is animating\n */\n private isSectionAnimating(index: number): boolean {\n return this.animationController.isAnimating(index);\n }\n\n override render() {\n return html`\n <div class=\"collapse-container ${classMap({\n [`collapse-${this.size}`]: true,\n [`collapse-${this.variant}`]: true,\n 'collapse-accordion': this.accordion,\n 'collapse-disabled': this.disabled\n })}\">\n ${map(this.sections, (section, index) => this.renderSection(section, index))}\n </div>\n `;\n }\n\n /**\n * Render individual section\n */\n private renderSection(section: CollapseSection, index: number) {\n const isOpen = !!section.open;\n const isDisabled = this.disabled || section.disabled;\n const isCollapsible = section.collapsible !== false;\n const isAnimating = this.isSectionAnimating(index);\n\n return html`\n <div \n class=\"collapse-section ${classMap({\n 'collapse-section--open': isOpen,\n 'collapse-section--disabled': isDisabled ?? false,\n 'collapse-section--non-collapsible': !isCollapsible,\n 'collapse-section--animating': isAnimating,\n [section.className || EMPTY_STRING]: !!section.className\n })}\"\n data-section-index=\"${index}\"\n >\n <!-- Section Header -->\n <div\n class=\"collapse-header ${classMap({\n 'collapse-header--expanded': isOpen,\n 'collapse-header--disabled': isDisabled ?? false,\n 'collapse-header--clickable': isCollapsible && !isDisabled\n })}\"\n data-section-index=\"${index}\"\n role=\"button\"\n tabindex=\"${isCollapsible && !isDisabled ? '0' : '-1'}\"\n aria-expanded=\"${isOpen}\"\n aria-controls=\"collapse-content-${index}\"\n aria-disabled=\"${ifDefined(isDisabled)}\"\n @click=\"${isCollapsible && !isDisabled ? () => this.toggleSection(index) : nothing}\"\n >\n ${isCollapsible ? html`\n <nr-icon\n class=\"collapse-icon ${classMap({\n 'collapse-icon--expanded': isOpen\n })}\"\n name=\"${this.getSectionIcon(section)}\"\n aria-hidden=\"true\"\n ></nr-icon>\n ` : nothing}\n \n <span class=\"collapse-header-text\">\n ${section.headerSlot ? html`<slot name=\"${section.headerSlot}\"></slot>` : section.header}\n </span>\n\n ${section.headerRight || section.headerRightSlot ? html`\n <div class=\"collapse-header-right\" @click=\"${(e: Event) => e.stopPropagation()}\">\n ${section.headerRightSlot ? html`<slot name=\"${section.headerRightSlot}\"></slot>` : section.headerRight}\n </div>\n ` : nothing}\n </div>\n\n <!-- Section Content -->\n ${isOpen ? html`\n <div\n id=\"collapse-content-${index}\"\n class=\"collapse-content\"\n data-section-index=\"${index}\"\n role=\"region\"\n aria-labelledby=\"collapse-header-${index}\"\n >\n <div class=\"collapse-content-inner\">\n ${section.contentSlot ? html`<slot name=\"${section.contentSlot}\"></slot>` : section.content}\n </div>\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collapse.component.js","sourceRoot":"","sources":["../../../src/components/collapse/collapse.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n CollapseSection,\n CollapseSize,\n CollapseVariant,\n CollapseAnimation,\n CollapseSectionToggleEvent,\n CollapseBeforeToggleEvent,\n EMPTY_STRING\n} from './collapse.type.js';\nimport { styles } from './collapse.style.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport { map } from 'lit/directives/map.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\n// Import icon component\nimport '../icon/icon.component.js';\n\n// Import controllers\nimport {\n CollapseAnimationController,\n CollapseAccordionController\n} from './controllers/index.js';\n\n/**\n * Versatile collapse/accordion component with multiple variants, animations, and accessibility features.\n * \n * @example\n * ```html\n * <nr-collapse\n * .sections=\"${sections}\"\n * size=\"medium\"\n * variant=\"default\"\n * accordion\n * ></nr-collapse>\n * ```\n * \n * @element nr-collapse\n * @fires section-toggle - Fired when a section is toggled\n * @fires section-before-toggle - Fired before a section is toggled (cancellable)\n */\n@customElement('nr-collapse')\nexport class HyCollapse extends NuralyUIBaseMixin(LitElement) {\n static override styles = styles;\n override requiredComponents = ['nr-icon'];\n\n // Controllers\n private animationController = new CollapseAnimationController(this);\n private accordionController = new CollapseAccordionController(this);\n\n // Public properties\n @property({ type: Array }) sections: CollapseSection[] = [];\n @property({ type: String }) size: CollapseSize = CollapseSize.Medium;\n @property({ type: String }) variant: CollapseVariant = CollapseVariant.Default;\n @property({ type: String }) animation: CollapseAnimation = CollapseAnimation.Slide;\n @property({ type: Boolean }) accordion = false;\n @property({ type: Boolean, attribute: 'allow-multiple' }) allowMultiple = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: 'expand-icon' }) expandIcon = 'chevron-right';\n @property({ type: String, attribute: 'collapse-icon' }) collapseIcon = 'chevron-down';\n\n override connectedCallback(): void {\n super.connectedCallback();\n \n // Listen for internal events from controllers\n this.addEventListener('section-toggle-requested', this.handleToggleRequest as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('section-toggle-requested', this.handleToggleRequest as EventListener);\n }\n\n override updated(changedProperties: Map<string, any>): void {\n super.updated(changedProperties);\n \n if (changedProperties.has('accordion') || changedProperties.has('allowMultiple')) {\n this.accordionController.enforceAccordionMode();\n }\n }\n\n /**\n * Toggle a section by index\n */\n async toggleSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (!section || section.disabled || section.collapsible === false) {\n return;\n }\n\n const isCurrentlyOpen = !!section.open;\n const willBeOpen = !isCurrentlyOpen;\n\n // Dispatch before-toggle event (cancellable)\n const beforeToggleEvent: CustomEvent<CollapseBeforeToggleEvent> = new CustomEvent<CollapseBeforeToggleEvent>('section-before-toggle', {\n detail: {\n index,\n section,\n isOpen: isCurrentlyOpen,\n preventDefault: () => beforeToggleEvent.preventDefault()\n },\n cancelable: true,\n bubbles: true\n });\n\n if (!this.dispatchEvent(beforeToggleEvent)) {\n return; // Event was cancelled\n }\n\n // Handle accordion logic\n this.accordionController.handleSectionToggle(index, willBeOpen);\n\n // Update section state\n this.updateSection(index, { open: willBeOpen });\n\n // Handle animation\n if (this.animation !== CollapseAnimation.None) {\n await this.animationController.animateToggle(index, willBeOpen);\n }\n\n // Dispatch toggle event\n this.dispatchEvent(new CustomEvent<CollapseSectionToggleEvent>('section-toggle', {\n detail: {\n index,\n section: this.sections[index],\n isOpen: willBeOpen\n },\n bubbles: true\n }));\n }\n\n /**\n * Open a specific section\n */\n async openSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (section && !section.open) {\n await this.toggleSection(index);\n }\n }\n\n /**\n * Close a specific section\n */\n async closeSection(index: number): Promise<void> {\n const section = this.sections[index];\n if (section && section.open) {\n await this.toggleSection(index);\n }\n }\n\n /**\n * Open all sections (respects accordion mode)\n */\n openAllSections(): void {\n this.accordionController.openAllSections();\n }\n\n /**\n * Close all sections\n */\n closeAllSections(): void {\n this.accordionController.closeAllSections();\n }\n\n /**\n * Update a specific section (used by controllers and internal logic)\n */\n updateSection(index: number, updates: Partial<CollapseSection>): void {\n if (index < 0 || index >= this.sections.length) {\n return;\n }\n \n this.sections = this.sections.map((section, i) => \n i === index ? { ...section, ...updates } : section\n );\n }\n\n /**\n * Update multiple sections at once (used by controllers for batch operations)\n */\n updateSections(updates: Array<{ index: number; updates: Partial<CollapseSection> }>): void {\n if (updates.length === 0) {\n return;\n }\n \n this.sections = this.sections.map((section, i) => {\n const update = updates.find(u => u.index === i);\n return update ? { ...section, ...update.updates } : section;\n });\n }\n\n /**\n * Handle toggle request from keyboard controller\n */\n private handleToggleRequest = (event: CustomEvent): void => {\n const { index } = event.detail;\n this.toggleSection(index);\n };\n\n /**\n * Get icon for section state\n */\n private getSectionIcon(section: CollapseSection): string {\n if (section.expandIcon && section.collapseIcon) {\n return section.open ? section.collapseIcon : section.expandIcon;\n }\n \n if (section.headerIcon) {\n return section.headerIcon;\n }\n\n return section.open ? this.collapseIcon : this.expandIcon;\n }\n\n /**\n * Check if section is animating\n */\n private isSectionAnimating(index: number): boolean {\n return this.animationController.isAnimating(index);\n }\n\n override render() {\n return html`\n <div class=\"collapse-container ${classMap({\n [`collapse-${this.size}`]: true,\n [`collapse-${this.variant}`]: true,\n 'collapse-accordion': this.accordion,\n 'collapse-disabled': this.disabled\n })}\">\n ${map(this.sections, (section, index) => this.renderSection(section, index))}\n </div>\n `;\n }\n\n /**\n * Render individual section\n */\n private renderSection(section: CollapseSection, index: number) {\n const isOpen = !!section.open;\n const isDisabled = this.disabled || section.disabled;\n const isCollapsible = section.collapsible !== false;\n const isAnimating = this.isSectionAnimating(index);\n\n return html`\n <div \n class=\"collapse-section ${classMap({\n 'collapse-section--open': isOpen,\n 'collapse-section--disabled': isDisabled ?? false,\n 'collapse-section--non-collapsible': !isCollapsible,\n 'collapse-section--animating': isAnimating,\n [section.className || EMPTY_STRING]: !!section.className\n })}\"\n data-section-index=\"${index}\"\n >\n <!-- Section Header -->\n <div\n class=\"collapse-header ${classMap({\n 'collapse-header--expanded': isOpen,\n 'collapse-header--disabled': isDisabled ?? false,\n 'collapse-header--clickable': isCollapsible && !isDisabled\n })}\"\n data-section-index=\"${index}\"\n role=\"button\"\n tabindex=\"${isCollapsible && !isDisabled ? '0' : '-1'}\"\n aria-expanded=\"${isOpen}\"\n aria-controls=\"collapse-content-${index}\"\n aria-disabled=\"${ifDefined(isDisabled)}\"\n @click=\"${isCollapsible && !isDisabled ? () => this.toggleSection(index) : nothing}\"\n >\n ${isCollapsible ? html`\n <nr-icon\n class=\"collapse-icon ${classMap({\n 'collapse-icon--expanded': isOpen\n })}\"\n name=\"${this.getSectionIcon(section)}\"\n aria-hidden=\"true\"\n ></nr-icon>\n ` : nothing}\n \n <span class=\"collapse-header-text\">\n ${section.headerSlot ? html`<slot name=\"${section.headerSlot}\"></slot>` : section.header}\n </span>\n\n ${section.headerRight || section.headerRightSlot ? html`\n <div class=\"collapse-header-right\" @click=\"${(e: Event) => e.stopPropagation()}\">\n ${section.headerRightSlot ? html`<slot name=\"${section.headerRightSlot}\"></slot>` : section.headerRight}\n </div>\n ` : nothing}\n </div>\n\n <!-- Section Content -->\n ${isOpen ? html`\n <div\n id=\"collapse-content-${index}\"\n class=\"collapse-content\"\n data-section-index=\"${index}\"\n role=\"region\"\n aria-labelledby=\"collapse-header-${index}\"\n >\n <div class=\"collapse-content-inner\">\n ${section.contentSlot ? html`<slot name=\"${section.contentSlot}\"></slot>` : section.content}\n </div>\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n"]}
|