import { css, html, TemplateResult } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { OmniElement } from '../core/OmniElement.js'; import { Expander } from './Expander.js'; /** * Layout container that groups expanders. * * @import * ```js * import '@capitec/omni-components/expander'; * ``` * @example * html``` * * * * * * * * * ``` * * @element omni-expander-group * * @slot - Default slot to slot multiple expanders. * * @cssprop --omni-expander-group-container-min-width - Expander group min width. * @cssprop --omni-expander-group-container-min-height - Expander group min height. * * @cssprop --omni-expander-group-container-margin-bottom - Expander group container margin bottom. */ @customElement('omni-expander-group') export class ExpanderGroup extends OmniElement { /** * Expander component label. * @attr [expand-mode] */ @property({ type: String, reflect: true, attribute: 'expand-mode' }) expandMode?: 'multiple' | 'single' = 'single'; override connectedCallback(): void { super.connectedCallback(); this.addEventListener('expand', this._expanderExpanded.bind(this), { capture: true }); } override disconnectedCallback() { // Ensure the component is cleaned up correctly. super.disconnectedCallback(); } _expanderExpanded(e: Event) { if (this.expandMode === 'single') { const expanders = Array.from(this.children as unknown as Expander[]); expanders.forEach((expander: Expander) => { if (expander !== e.target) { expander._collapse(); } }); } } static override get styles() { return [ super.styles, css` :host { display: flex; flex-direction: column; justify-content: stretch; align-items: stretch; min-width: var(--omni-expander-group-container-min-width, 200px); min-height: var(--omni-expander-group-container-min-height, 100px); } .group-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: stretch; } ::slotted(*) { margin-bottom: var(--omni-expander-group-container-margin-bottom, 0px); } ::slotted(*[expanded]) { flex: 1 1 auto; } ::slotted(omni-expander:not(:last-of-type)) { --omni-expander-content-expanded-border-bottom : none; } ` ]; } protected override render(): TemplateResult { return html`
`; } } declare global { interface HTMLElementTagNameMap { 'omni-expander-group': ExpanderGroup; } }