import { LitElement, html, css } from 'lit'; import { customElement } from 'lit/decorators.js'; type AsideType = 'note' | 'tip' | 'caution' | 'danger'; const ICONS: Record = { note: 'ℹ️', // ℹ️ tip: '💡', // 💡 caution: '⚠️', // ⚠️ danger: '🚨', // 🚨 }; const LABELS: Record = { note: 'Note', tip: 'Tip', caution: 'Caution', danger: 'Danger', }; /** * * Callout box with an icon and colored left border. * Slot content is the body. * */ @customElement('litro-aside') export class LitroAside extends LitElement { static override properties = { type: { type: String }, title: { type: String }, }; static override styles = css` :host { display: block; } .aside { margin: 1.5rem 0; padding: 1rem 1.25rem; border-left: 4px solid; border-radius: 0 var(--sl-border-radius, 0.375rem) var(--sl-border-radius, 0.375rem) 0; } .aside.note { border-color: var(--sl-color-note, #1d4ed8); background-color: color-mix(in srgb, var(--sl-color-note, #1d4ed8) 8%, transparent); } .aside.tip { border-color: var(--sl-color-tip, #15803d); background-color: color-mix(in srgb, var(--sl-color-tip, #15803d) 8%, transparent); } .aside.caution{ border-color: var(--sl-color-caution, #b45309); background-color: color-mix(in srgb, var(--sl-color-caution, #b45309) 8%, transparent); } .aside.danger { border-color: var(--sl-color-danger, #b91c1c); background-color: color-mix(in srgb, var(--sl-color-danger, #b91c1c) 8%, transparent); } .aside-title { display: flex; align-items: center; gap: 0.4em; font-size: var(--sl-text-sm, 0.875rem); font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 0.5rem; } .aside-title .icon { font-style: normal; } .aside.note .aside-title { color: var(--sl-color-note, #1d4ed8); } .aside.tip .aside-title { color: var(--sl-color-tip, #15803d); } .aside.caution .aside-title { color: var(--sl-color-caution, #b45309); } .aside.danger .aside-title { color: var(--sl-color-danger, #b91c1c); } ::slotted(p:last-child) { margin-bottom: 0; } `; type: AsideType = 'note'; title = ''; override render() { const t = (['note', 'tip', 'caution', 'danger'].includes(this.type) ? this.type : 'note') as AsideType; const label = this.title || LABELS[t]; return html` `; } } export default LitroAside;