import { property, state, html, customElement, css, cssManager, type TemplateResult, type CSSResult, } from '@design.estate/dees-element'; import { DeesTileBase } from '../dees-tile-shared/DeesTileBase.js'; import { tileBaseStyles } from '../dees-tile-shared/styles.js'; import { demo } from './demo.js'; declare global { interface HTMLElementTagNameMap { 'dees-tile-image': DeesTileImage; } } @customElement('dees-tile-image') export class DeesTileImage extends DeesTileBase { public static demo = demo; public static demoGroups = ['Media']; public static styles = [ ...tileBaseStyles, css` .image-wrapper { position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; overflow: hidden; background: ${cssManager.bdTheme( 'repeating-conic-gradient(#e8e8e8 0% 25%, white 0% 50%) 50% / 16px 16px', 'repeating-conic-gradient(hsl(215 20% 18%) 0% 25%, hsl(215 20% 14%) 0% 50%) 50% / 16px 16px' )}; } .image-wrapper img { width: 100%; height: 100%; object-fit: cover; display: block; transition: opacity 0.3s ease; } .image-wrapper img.loaded { opacity: 1; } .image-wrapper img.loading { opacity: 0; } .dimension-badge { position: absolute; top: 8px; right: 8px; padding: 3px 8px; background: ${cssManager.bdTheme('hsl(0 0% 0% / 0.6)', 'hsl(0 0% 100% / 0.85)')}; color: ${cssManager.bdTheme('white', 'hsl(215 20% 12%)')}; border-radius: 4px; font-size: 10px; font-weight: 600; backdrop-filter: blur(8px); z-index: 15; pointer-events: none; opacity: 0; transition: opacity 0.2s ease; } .tile-container.clickable:hover .dimension-badge { opacity: 1; } `, ] as any; @property({ type: String }) accessor src: string = ''; @property({ type: String }) accessor alt: string = ''; @state() accessor imageLoaded: boolean = false; @state() accessor imageWidth: number = 0; @state() accessor imageHeight: number = 0; private hasStartedLoading: boolean = false; protected renderTileContent(): TemplateResult { return html`