UNPKG

@decidables/detectable-elements

Version:

detectable-elements: Web Components for visualizing Signal Detection Theory

164 lines (141 loc) 3.83 kB
import {html, css} from 'lit'; import '@decidables/decidables-elements/slider'; import SDTMath from '@decidables/detectable-math'; import DetectableElement from '../detectable-element'; /* SDTParameters element <sdt-paramters> Attributes: */ export default class SDTParameters extends DetectableElement { static get properties() { return { d: { attribute: 'd', type: Number, reflect: true, }, c: { attribute: 'c', type: Number, reflect: true, }, s: { attribute: 's', type: Number, reflect: true, }, }; } constructor() { super(); // Attributes this.d = undefined; this.c = undefined; this.s = undefined; } setSensitivity(e) { this.d = +e.target.value; this.dispatchEvent(new CustomEvent('sdt-parameters-d', { detail: { d: this.d, }, bubbles: true, })); } setBias(e) { this.c = +e.target.value; this.dispatchEvent(new CustomEvent('sdt-parameters-c', { detail: { c: this.c, }, bubbles: true, })); } setVariance(e) { this.s = +e.target.value; this.dispatchEvent(new CustomEvent('sdt-parameters-s', { detail: { s: this.s, }, bubbles: true, })); } static get styles() { return [ super.styles, css` :host { display: inline-block; } .holder { display: flex; flex-direction: row; align-items: stretch; justify-content: center; } decidables-slider { line-height: 1; text-align: center; } decidables-slider div { margin-bottom: 0.25rem; } .d { --decidables-slider-background-color: var(---color-d-light); --decidables-slider-color: var(---color-d); } .c { --decidables-slider-background-color: var(---color-c-light); --decidables-slider-color: var(---color-c); } .s { --decidables-slider-background-color: var(---color-s-light); --decidables-slider-color: var(---color-s); } `, ]; } render() { return html` <div class="holder"> ${this.d != null ? html`<decidables-slider class="d" ?disabled=${!this.interactive} scale min=${SDTMath.d.MIN} max=${SDTMath.d.MAX} step=${SDTMath.d.STEP} .value=${+this.d.toFixed(2)} @change=${this.setSensitivity.bind(this)} @input=${this.setSensitivity.bind(this)} ><div>Sensitivity<br><span class="math-var">d′</span></div></decidables-slider>` : html``} ${this.c != null ? html`<decidables-slider class="c" ?disabled=${!this.interactive} scale min=${SDTMath.c.MIN} max=${SDTMath.c.MAX} step=${SDTMath.c.STEP} .value=${+this.c.toFixed(2)} @change=${this.setBias.bind(this)} @input=${this.setBias.bind(this)} ><div>Bias<br><span class="math-var">c</span></div></decidables-slider>` : html``} ${this.s != null ? html`<decidables-slider class="s" ?disabled=${!this.interactive} scale min=${SDTMath.s.MIN} max=${SDTMath.s.MAX} step=${SDTMath.s.STEP} .value=${+this.s.toFixed(2)} @change=${this.setVariance.bind(this)} @input=${this.setVariance.bind(this)} ><div>Variance<br><span class="math-var">σ</span></div></decidables-slider>` : html``} </div>`; } } customElements.define('sdt-parameters', SDTParameters);