UNPKG

@progressive-development/pd-content

Version:

Progressive Development content components.

177 lines (165 loc) 5.51 kB
import { LitElement, css, html } from 'lit'; import { property } from 'lit/decorators.js'; import '@progressive-development/pd-icon/pd-icon'; var __defProp = Object.defineProperty; var __decorateClass = (decorators, target, key, kind) => { var result = void 0 ; for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (decorator(target, key, result) ) || result; if (result) __defProp(target, key, result); return result; }; class PdTab extends LitElement { constructor() { super(...arguments); this.tabs = []; } static { this.styles = [ css` :host { display: block; } .header-container { display: flex; } .tab-header { padding: var(--pd-tab-header-padding, 0.8em 1.5em); background-color: var(--pd-tab-bg-col, var(--pd-default-light-col)); font-family: var(--pd-default-font-title-family); color: var(--pd-tab-text-col, var(--pd-default-font-title-col)); cursor: pointer; border: 2px solid var(--pd-tab-border-col, #ccc); /* Dünner Rahmen */ border-bottom: none; /* Tabs sollen nahtlos an den Inhalt anschließen */ border-radius: 8px 8px 0 0; /* Abgerundete obere Ecken */ display: inline-block; /* Tabs nebeneinander anzeigen */ margin-right: 5px; /* Abstand zwischen Tabs */ box-shadow: var( --pd-tab-shadow, 0 2px 4px rgba(0, 0, 0, 0.1) ); /* Leichter Schatten für Tiefe */ transition: background-color 0.3s, box-shadow 0.3s; /* Weiche Übergänge bei Hover */ } .tab-header:hover { background-color: var( --pd-tab-bg-hover-col, var(--pd-default-hover-col) ); box-shadow: var( --pd-tab-shadow-hover, 0 4px 8px rgba(0, 0, 0, 0.2) ); /* Schattenintensität bei Hover erhöhen */ } .tab-header.active-header { background-color: var(--pd-tab-bg-active-col, var(--pd-default-col)); border-bottom: 2px solid var(--pd-tab-border-active-col, var(--pd-default-col)); color: var( --pd-tab-active-text-col, var(--pd-default-bg-col) ); /* Textfarbe für aktiven Tab */ box-shadow: none; /* Schatten entfernen, wenn Tab aktiv ist */ } .tab-header.disabled-header { background-color: var(--pd-tab-bg-active-col, var(--pd-default-col)); border-bottom: 2px solid var(--pd-tab-border-active-col, var(--pd-default-col)); color: var( --pd-tab-active-text-col, var(--pd-default-bg-col) ); /* Textfarbe für aktiven Tab */ box-shadow: none; /* Schatten entfernen, wenn Tab aktiv ist */ } .tab-header.disabled-header { pointer-events: none; /* Deaktiviert die Klickbarkeit */ background-color: var( --pd-tab-disabled-bg-col, #f0f0f0 ); /* Hellere Farbe für deaktivierte Tabs */ color: var(--pd-tab-disabled-text-col, #999); /* Hellere Textfarbe */ border-color: var( --pd-tab-disabled-border-col, #ddd ); /* Angepasste Rahmenfarbe */ cursor: not-allowed; /* Zeigt an, dass der Tab nicht interaktiv ist */ opacity: 0.6; /* Reduziert die Sichtbarkeit für einen "deaktivierten" Look */ } .tab-header:focus { outline: none; /* Entfernt den Standardfokusrahmen */ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.5); /* Fokusring für Tastaturnavigation */ } .slot-container { display: none; } .active-slot { padding: var(--pd-tab-content-padding, 1em); display: block; border: var(--pd-tab-content-border, 1px solid var(--pd-default-col)); border-top: var( --pd-tab-content-border-top, 3px solid var(--pd-default-col) ); } ` ]; } update(changedProperties) { if (changedProperties.has("defaultTab") && this.defaultTab) { console.log("PdTab: Set active from default selection", this.defaultTab); this._activeTab = this.defaultTab; } super.update(changedProperties); } render() { return html` <div class="header-container"> ${this.tabs.map( (t) => html` <div class="tab-header ${this._activeTab === t.key ? "active-header" : ""} ${t.disabled ? "disabled-header" : ""}" data-key="${t.key}" @click="${this._tabSelected}" > ${t.name} </div> ` )} </div> ${this.tabs.map( (t) => html` <div id="${`slot${t.key}`}" class="slot-container ${this._activeTab === t.key ? "active-slot" : ""}" > <slot name="${t.key}"></slot> </div> ` )} `; } reset() { this._activeTab = this.defaultTab; } // eslint-disable-next-line class-methods-use-this _tabSelected(e) { this._activeTab = e.target?.dataset?.key; this.dispatchEvent( new CustomEvent("tab-selected", { detail: this._activeTab }) ); } } __decorateClass([ property({ type: Array }) ], PdTab.prototype, "tabs"); __decorateClass([ property({ type: String }) ], PdTab.prototype, "defaultTab"); __decorateClass([ property({ type: String, state: true }) ], PdTab.prototype, "_activeTab"); export { PdTab };