import { css, html, nothing, TemplateResult } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { OmniElement } from '../core/OmniElement.js'; /** * Control that can be used to display custom slotted content, for use within Tab Group component with associated Tab component. * * @import * ```js * import '@capitec/omni-components/tab'; * ``` * @example * html``` * * Slotted Content * * ``` * * @element omni-tab-header * * @slot - Content to render inside the tab header. * * @cssprop --omni-tab-header-font-color - Tab header font color. * @cssprop --omni-tab-header-font-family - Tab header font family. * @cssprop --omni-tab-header-font-size - Tab header font size. * @cssprop --omni-tab-header-font-weight - Tab header font weight. * @cssprop --omni-tab-header-min-width - Tab header tab min width. * @cssprop --omni-tab-header-height - Tab header height. * @cssprop --omni-tab-header-width - Tab header width. * @cssprop --omni-tab-header-padding - Tab header padding. * * @cssprop --omni-tab-header-disabled-cursor - Tab header disabled cursor. * @cssprop --omni-tab-header-disabled-background-color - Tab header disabled background color. * @cssprop --omni-tab-header-active-font-color - Tab header active font color. * * @cssprop --omni-tab-header-tab-height - Tab header tab height. * @cssprop --omni-tab-header-tab-min-width - Tab header tab min width. * @cssprop --omni-tab-header-tab-max-width - Tab header tab max width. * @cssprop --omni-tab-header-tab-margin - Tab header tab margin. * * @cssprop --omni-tab-header-hover-background-color - Tab header tab hover background. * * @cssprop --omni-tab-header-indicator-bar-height - Tab header indicator bar height. * @cssprop --omni-tab-header-indicator-bar-border-radius - Tab header indicator bar border radius. * @cssprop --omni-tab-header-indicator-bar-width - Tab header indicator bar width. * * @cssprop --omni-tab-header-indicator-height - Tab header indicator height. * @cssprop --omni-tab-header-indicator-color - Tab header indicator color. * @cssprop --omni-tab-header-indicator-border-radius - Tab header indicator border radius. * @cssprop --omni-tab-header-indicator-width - Tab header indicator width. */ @customElement('omni-tab-header') export class TabHeader extends OmniElement { /** * Indicator of which omni-tab element with the matching corresponding id attribute should be displayed. * @attr */ @property({ type: String, reflect: true }) for?: string; /** * Data associated with the component. * @no_attribute */ @property({ type: Object, reflect: false }) data?: unknown; static override get styles() { return [ super.styles, css` /* host styles */ :host { color: var(--omni-tab-header-font-color, var(--omni-font-color)); font-family: var(--omni-tab-header-font-family, var(--omni-font-family)); font-size: var(--omni-tab-header-font-size, var(--omni-font-size)); font-weight: var(--omni-tab-header-font-weight, var(--omni-font-weight)); min-width: var(--omni-tab-header-min-width, 50px); width: var(--omni-tab-header-width, 100%); height: var(--omni-tab-header-height, 100%); padding: var(--omni-tab-header-padding); cursor: pointer; } :host([data-disabled]){ cursor: var(--omni-tab-header-disabled-cursor, not-allowed); background-color: var(--omni-tab-header-disabled-background-color, var(--omni-disabled-background-color)); } /*Active styles*/ :host([data-active]){ color: var(--omni-tab-header-active-font-color, var(--omni-primary-color)); } ::slotted(*) { display: flex; justify-content: center; align-items: center; height: calc(var(--omni-tab-header-height, 100%) - var(--omni-tab-header-indicator-height, 4px)); } /* Tab */ :host > .tab { height: var(--omni-tab-header-tab-height, 100%); min-width: var(--omni-tab-header-tab-min-width, auto); max-width: var(--omni-tab-header-tab-max-width, auto); margin: var(--omni-tab-header-tab-margin, 6px); display: flex; justify-content: center; align-items: center; } /* Added to resolve sticky hover state on mobile devices */ @media (hover: hover) { :host(:not([data-disabled]):hover) { background-color: var(--omni-tab-header-hover-background-color, var(--omni-background-hover-color)); } } :host > .indicator-bar { flex-shrink: 0; height: var(--omni-tab-header-indicator-bar-height, 4px); border-radius: var(--omni-tab-header-indicator-bar-border-radius, 100px 100px 0 0); width: var(--omni-tab-header-indicator-bar-width, 100%); } :host > .indicator-bar > .indicator { height: var(--omni-tab-header-indicator-height, 4px); background-color: var(--omni-tab-header-indicator-color, var(--omni-primary-color)); border-radius: var(--omni-tab-header-indicator-border-radius, 100px 100px 0 0); width: var(--omni-tab-header-indicator-width, auto); } ` ]; } protected override render(): TemplateResult { return html`
${this.hasAttribute('data-active') ? html`
` : nothing}
`; } } declare global { interface HTMLElementTagNameMap { 'omni-tab-header': TabHeader; } }