import { NavigationMixin } from '@littoral/literally/navigation/navigation.mixin'; import { breakpoints } from '@littoral/literally/structure/devices'; import { LitElement, type PropertyValues, css, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; /** * Card element for displaying information grouped together. */ @customElement('er-card') export class ErCard extends NavigationMixin(LitElement) { static styles = [ css` :host { background-color: var( --er-card-background-color, var(--md-sys-color-surface) ); border-radius: var(--er-card-border-radius, var(--space-medium)); box-sizing: border-box; color: var(--er-card-color, var(--md-sys-color-on-surface)); display: block; padding: var(--er-card-padding, var(--space-medium)); } :host([path]:hover), :host(.link:hover) { /* background-color: var(--er-card-background-color-hover); */ box-shadow: color-mix(in srgb, var(--md-sys-color-shadow) 12%, transparent) 0px 1px 3px, color-mix(in srgb, var(--md-sys-color-shadow) 24%, transparent) 0px 1px 2px; cursor: pointer; } :host(.full-height) { height: 100%; } :host(.hover-effect) { transition: box-shadow 0.3s ease, transform 0.3s ease, background-color 0.3s ease; } :host(.hover-effect:hover) { box-shadow: 0 8px 24px color-mix( in srgb, var(--md-sys-color-shadow, #000000) 8%, transparent ); transform: translateY(-2px); } :host(.maybeHighlight) { border-bottom: 5px solid transparent; border-top: 5px solid transparent; } :host([highlight]) { background: radial-gradient( ellipse at 85% 5%, color-mix(in srgb, var(--er-card-highlight-color) 32%, transparent), transparent 60% ), radial-gradient( ellipse at 10% 185%, color-mix(in srgb, var(--er-card-highlight-color) 35%, transparent), transparent 60% ); background-color: var( --er-card-background-color, var(--md-sys-color-surface) ); } :host(.outlined) { border: 1px solid var(--er-card-border-color, var(--md-sys-color-on-surface)); } :host(.themeSurfaceVariant) { --er-card-background-color: var(--md-sys-color-surface-variant); --er-card-background-color-hover: color-mix( in srgb, var(--er-card-background-color) 80%, transparent ); --er-card-color: var(--md-sys-color-on-surface-variant); } :host(.themePrimary) { --er-card-background-color: var(--md-sys-color-primary); --er-card-background-color-hover: color-mix( in srgb, var(--er-card-background-color) 80%, transparent ); --er-card-color: var(--md-sys-color-on-primary); } :host(.themeSecondary) { --er-card-background-color: var(--md-sys-color-secondary); --er-card-background-color-hover: color-mix( in srgb, var(--er-card-background-color) 80%, transparent ); --er-card-color: var(--md-sys-color-on-secondary); } :host(.themeTertiary) { --er-card-background-color: var(--md-sys-color-tertiary); --er-card-background-color-hover: color-mix( in srgb, var(--er-card-background-color) 80%, transparent ); --er-card-color: var(--md-sys-color-on-tertiary); } :host(.themeError) { --er-card-background-color: var(--md-sys-color-error-container); --er-card-background-color-hover: color-mix( in srgb, var(--er-card-background-color) 80%, transparent ); --er-card-color: var(--md-sys-color-on-error-container); } `, // Targeted breakpoint styles. ...breakpoints.mixupStyles((breakpoint) => { const styling = css` :host(.pad-xsmall${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-xsmall); } :host(.pad-small${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-small); } :host(.pad-medium${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-medium); } :host(.pad-large${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-large); } :host(.pad-xlarge${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-xlarge); } :host(.pad-xxlarge${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-xxlarge); } :host(.pad-xxxlarge${breakpoint?.targetClass ?? css``}) { --er-card-padding: var(--space-xxxlarge); } `; if (!breakpoint) { return styling; } return css` ${breakpoint.mediaQuery} { ${styling} } `; }), ]; @property() highlight?: string; connectedCallback(): void { super.connectedCallback(); this.updateHighlight(); } render() { return html` `; } protected updated(changedProperties: PropertyValues): void { super.updated(changedProperties); if (changedProperties.has('highlight')) { this.updateHighlight(); } } updateHighlight() { if (!this.highlight) { this.style.setProperty('--er-card-highlight-color', 'transparent'); return; } this.style.setProperty('--er-card-highlight-color', this.highlight); } } declare global { interface HTMLElementTagNameMap { 'er-card': ErCard; } }