<template> <div v-if="clickable.unlocked"> <button :style="style" @click="clickable.click" @mousedown="start" @mouseleave="stop" @mouseup="stop" @touchstart="start" @touchend="stop" @touchcancel="stop" :disabled="!clickable.canClick" :class="{ feature: true, [layer || tab.layer]: true, clickable: true, can: clickable.canClick, locked: !clickable.canClick }"> <div v-if="title"> <component :is="title" /> </div> <component :is="display" style="white-space: pre-line;" /> <mark-node :mark="clickable.mark" /> <branch-node :branches="clickable.branches" :id="id" featureType="clickable" /> </button> </div> </template> <script> import { layers } from '../../store/layers'; import { coerceComponent } from '../../util/vue'; export default { name: 'clickable', inject: [ 'tab' ], props: { layer: String, id: [ Number, String ], size: { type: [ Number, String ] } }, data() { return { interval: false, time: 0 }; }, computed: { clickable() { return layers[this.layer || this.tab.layer].clickables[this.id]; }, style() { return [ this.clickable.canClick ? { 'background-color': layers[this.layer || this.tab.layer].color } : {}, this.size ? {'height': this.size, 'width': this.size} : {}, layers[this.layer || this.tab.layer].componentStyles?.clickable, this.clickable.style ]; }, title() { if (this.clickable.title) { return coerceComponent(this.clickable.title, 'h2'); } return null; }, display() { return coerceComponent(this.clickable.display, 'div'); } }, methods: { start() { if (!this.interval) { this.interval = setInterval(this.clickable.click, 250); } }, stop() { clearInterval(this.interval); this.interval = false; this.time = 0; } } }; </script> <style scoped> .clickable { min-height: 120px; width: 120px; font-size: 10px; } </style>