UNPKG

@decidables/discountable-elements

Version:

discountable-elements: Web Components for visualizing Hyperbolic Temporal Discounting

113 lines (92 loc) 2.46 kB
import {html, css} from 'lit'; import '@decidables/decidables-elements/slider'; import HTDMath from '@decidables/discountable-math'; import DiscountableElement from '../discountable-element'; /* HTDParameters element <htd-paramters> Attributes: */ export default class HTDParameters extends DiscountableElement { static get properties() { return { k: { attribute: 'k', type: Number, reflect: true, }, }; } constructor() { super(); // Attributes this.k = undefined; } updated(changedProperties) { super.updated(changedProperties); if ((this.k !== undefined) && (this.kSlider === undefined)) { this.kSlider = this.shadowRoot.querySelector('decidables-slider.k'); this.kSlider.nonlinearRange( true, (k) => { return k ** (1 / 2) / (k ** (1 / 2) + 1); }, (r) => { return (r / (1 - r)) ** 2; }, ); } else if ((this.k === undefined) && (this.kSlider !== undefined)) { this.kSlider = undefined; } } setK(e) { this.k = +e.target.value; this.dispatchEvent(new CustomEvent('htd-parameters-k', { detail: { k: this.k, }, 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; } .k { --decidables-slider-background-color: var(---color-k-light); --decidables-slider-color: var(---color-k); } `, ]; } render() { return html` <div class="holder"> ${this.k != null ? html`<decidables-slider class="k" ?disabled=${!this.interactive} scale min=${HTDMath.k.MIN} max=${HTDMath.k.MAX} step=${HTDMath.k.STEP} .value=${+this.k.toFixed(3)} @change=${this.setK.bind(this)} @input=${this.setK.bind(this)} ><div>Discounting Factor<br><span class="math-var">k</span></div></decidables-slider>` : html``} </div>`; } } customElements.define('htd-parameters', HTDParameters);