import { applyColorSet } from '../designApplication'; import { ColorSet, ComponentId } from '../models'; import { ComponentBase, ComponentState } from './componentBase'; import { SingleContainer } from './singleContainer'; export type CardState = ComponentState & { _type_: 'Card-builtin'; content?: ComponentId; corner_radius?: number | [number, number, number, number]; reportPress?: boolean; elevate_on_hover?: boolean; colorize_on_hover?: boolean; color?: ColorSet; }; export class CardComponent extends SingleContainer { state: Required; createElement(): HTMLElement { // Create the element let element = document.createElement('div'); element.classList.add('rio-card'); // Detect presses element.onclick = (event) => { // Is the backend interested in presses? if (!this.state.reportPress) { return; } // The event was handled. Stop it from propagating further. event.stopPropagation(); // Notify the backend this.sendMessageToBackend({}); }; return element; } updateElement( deltaState: CardState, latentComponents: Set ): void { // Update the child this.replaceFirstChild(latentComponents, deltaState.content); // Update the corner radius if (deltaState.corner_radius !== undefined) { if (typeof deltaState.corner_radius === 'number') { this.element.style.borderRadius = `${deltaState.corner_radius}rem`; } else { this.element.style.borderRadius = `${deltaState.corner_radius[0]}rem ${deltaState.corner_radius[1]}rem ${deltaState.corner_radius[2]}rem ${deltaState.corner_radius[3]}rem`; } } // Report presses? if (deltaState.reportPress === true) { this.element.style.cursor = 'pointer'; } else if (deltaState.reportPress === false) { this.element.style.cursor = 'default'; } // Elevate on hover if (deltaState.elevate_on_hover === true) { this.element.classList.add('rio-card-elevate-on-hover'); } else if (deltaState.elevate_on_hover === false) { this.element.classList.remove('rio-card-elevate-on-hover'); } // Colorize on hover if (deltaState.colorize_on_hover === true) { this.element.classList.add('rio-card-colorize-on-hover'); } else if (deltaState.colorize_on_hover === false) { this.element.classList.remove('rio-card-colorize-on-hover'); } // Colorize if (deltaState.color !== undefined) { applyColorSet(this.element, deltaState.color); } } }