100 lines
2.1 KiB
JavaScript
100 lines
2.1 KiB
JavaScript
import { LitElement, css, html, unsafeCSS } from 'lit'
|
|
|
|
import MainCSS from '../assets/styles/main.scss?inline'
|
|
|
|
import './SvgIcon.js'
|
|
|
|
class AudioCard extends LitElement {
|
|
static properties = {
|
|
idx: { type: Number },
|
|
icon: { type: String },
|
|
details: { type: Object },
|
|
selected: { type: Boolean }
|
|
}
|
|
|
|
constructor() {
|
|
super()
|
|
this.details = {}
|
|
this.icon = 'play-circle'
|
|
}
|
|
|
|
clickHandler() {
|
|
if (!this.selected) {
|
|
const event = new CustomEvent('select-audio', {
|
|
bubbles: true, composed: true,
|
|
detail: { ...this.details, idx: this.idx }
|
|
})
|
|
|
|
this.dispatchEvent(event)
|
|
}
|
|
}
|
|
|
|
render() {
|
|
return html`
|
|
<div class="card ${this.selected ? 'selected' : ''}" @click=${this.clickHandler}>
|
|
${this.details.album && this.details.image
|
|
? html`<img
|
|
class="albumCover"
|
|
src=${this.details.image}
|
|
/>`
|
|
: html`<mm-icon name=${this.icon}></mm-icon>`
|
|
}
|
|
|
|
<main>
|
|
<p class="heading">${this.details?.title}</p>
|
|
<p class="info">${this.details?.details}</p>
|
|
</main>
|
|
</div>
|
|
`
|
|
}
|
|
|
|
static styles = [ css`${unsafeCSS(MainCSS)}`, css`
|
|
* {
|
|
margin: 0;
|
|
}
|
|
|
|
.heading {
|
|
font-weight: 500;
|
|
}
|
|
|
|
mm-icon {
|
|
color: var(--green-400, black);
|
|
font-size: 3em;
|
|
}
|
|
|
|
.albumCover {
|
|
display: block;
|
|
height: 3em;
|
|
aspect-ratio: 1 / 1;
|
|
object-fit: cover;
|
|
background: lightgrey;
|
|
}
|
|
|
|
.card {
|
|
display: grid;
|
|
grid-auto-flow: column;
|
|
grid-template-columns: auto 1fr;
|
|
gap: 1em;
|
|
align-items: center;
|
|
padding-inline: 0.75em;
|
|
padding-block: 0.5em;
|
|
background: var(--neutral-100, white);
|
|
min-height: 3.5em;
|
|
border-radius: 0.5em;
|
|
box-shadow: var(--box-shadow);
|
|
outline: 2px solid transparent;
|
|
transition: outline 0.5s ease;
|
|
}
|
|
|
|
.card.selected {
|
|
outline: 2px solid var(--green-400, black);
|
|
}
|
|
|
|
.info {
|
|
max-width: 30ch;
|
|
}
|
|
` ]
|
|
}
|
|
|
|
customElements.define('mm-acard', AudioCard)
|