import * as interfaces from '../../interfaces/index.js'; import { DeesElement, type TemplateResult, property, customElement, html, css, cssManager, state, } from '@design.estate/dees-element'; import '../dees-appui-tabs/dees-appui-tabs.js'; import type { DeesAppuiTabs } from '../dees-appui-tabs/dees-appui-tabs.js'; import { demoFunc } from './dees-appui-view.demo.js'; import { themeDefaultStyles } from '../../00theme.js'; export interface IViewTab extends interfaces.IMenuItem { content?: TemplateResult | (() => TemplateResult); useSlotName?: boolean; slotName?: string; paddingPx?: number; } export interface IAppView { id: string; name: string; description?: string; iconName?: string; tabs: IViewTab[]; menuItems?: interfaces.IMenuItem[]; } @customElement('dees-appui-view') export class DeesAppuiView extends DeesElement { public static demo = demoFunc; // INSTANCE @property({ type: Object }) accessor viewConfig: IAppView; @state() accessor selectedTab: IViewTab | null = null; @state() accessor tabs: DeesAppuiTabs; @property({ type: Number }) accessor paddingPx: number = 16; public static styles = [ themeDefaultStyles, cssManager.defaultStyles, css` /* TODO: Migrate hardcoded values to --dees-* CSS variables */ :host { display: block; position: relative; width: 100%; height: 100%; background: #161616; } .view-container { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; } .view-header { background: #000000; border-bottom: 1px solid #333; flex-shrink: 0; } .view-content { flex: 1; position: relative; overflow: hidden; } .tab-content { position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: auto; opacity: 0; transition: opacity 0.2s; } .tab-content.active { opacity: 1; } dees-appui-tabs { height: 60px; } `, ]; public render(): TemplateResult { if (!this.viewConfig) { return html`