platypush/platypush/backend/http/webapp/dist/static/js/747.396e4125.js.map

1 line
87 KiB
Plaintext

{"version":3,"file":"static/js/747.396e4125.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Light/color.js","webpack://platypush/./src/components/elements/Slider.vue","webpack://platypush/./src/components/elements/Slider.vue?787f","webpack://platypush/./src/components/elements/ToggleSwitch.vue","webpack://platypush/./src/components/elements/ToggleSwitch.vue?94aa","webpack://platypush/./src/components/panels/Light/Index.vue","webpack://platypush/./src/components/panels/Panel.vue","webpack://platypush/./src/components/panels/Panel.vue?40a7","webpack://platypush/./src/components/Light/Groups.vue","webpack://platypush/./src/components/MenuPanel.vue","webpack://platypush/./src/components/MenuPanel.vue?e8bb","webpack://platypush/./src/components/Light/Groups.vue?f495","webpack://platypush/./src/components/Light/Group.vue","webpack://platypush/./src/components/Light/Light.vue","webpack://platypush/./src/components/Light/Controls.vue","webpack://platypush/./src/components/Light/Controls.vue?5766","webpack://platypush/./src/components/Light/Light.vue?eed6","webpack://platypush/./src/components/Light/Scene.vue","webpack://platypush/./src/components/Light/Scene.vue?87a4","webpack://platypush/./src/components/Light/Animate.vue","webpack://platypush/./src/components/elements/RangeSlider.vue","webpack://platypush/./src/components/elements/RangeSlider.vue?500a","webpack://platypush/./src/components/Light/Animate.vue?a3c2","webpack://platypush/./src/components/Light/Group.vue?06ce","webpack://platypush/./src/components/panels/Light/Index.vue?36e9"],"sourcesContent":["export class ColorConverter {\n constructor(ranges) {\n this.ranges = {\n hue: [0, 360],\n sat: [0, 100],\n bri: [0, 100],\n ct: [154, 500],\n }\n\n if (ranges)\n for (const attr of Object.keys(this.ranges))\n if (ranges[attr])\n this.ranges[attr] = ranges[attr]\n }\n\n normalize(x, xRange, yRange) {\n return yRange[0] + (((x-xRange[0]) * (yRange[1]-yRange[0])) / (xRange[1]-xRange[0]))\n }\n\n hslToRgb(h, s, l) {\n [h, s, l] = [\n this.normalize(h, this.ranges.hue, [0, 360]),\n this.normalize(s, this.ranges.sat, [0, 100]),\n this.normalize(l, this.ranges.bri, [0, 100]),\n ]\n\n l /= 100\n const a = s * Math.min(l, 1 - l) / 100\n const f = n => {\n const k = (n + h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color)\n }\n\n return [f(0), f(8), f(4)]\n }\n\n rgbToHsl(r, g, b){\n r /= 255\n g /= 255\n b /= 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h, s, l = (max + min) / 2;\n\n if(max === min){\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch(max){\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n\n return [\n parseInt(this.normalize(h, [0, 1], this.ranges.hue)),\n parseInt(this.normalize(s, [0, 1], this.ranges.sat)),\n parseInt(this.normalize(l, [0, 1], this.ranges.bri)),\n ]\n }\n\n xyToRgb(x, y, brightness) {\n // Set to maximum brightness if no custom value was given (Not the slick ECMAScript 6 way for compatibility reasons)\n if (brightness == null)\n brightness = this.ranges.bri[1];\n\n const z = 1.0 - x - y;\n const Y = (brightness / (this.ranges.bri[1]-1)).toFixed(2);\n const X = (Y / y) * x;\n const Z = (Y / y) * z;\n\n //Convert to RGB using Wide RGB D65 conversion\n let red \t= X * 1.656492 - Y * 0.354851 - Z * 0.255038;\n let green = -X * 0.707196 + Y * 1.655397 + Z * 0.036152;\n let blue \t= X * 0.051713 - Y * 0.121364 + Z * 1.011530;\n\n //If red, green or blue is larger than 1.0 set it back to the maximum of 1.0\n if (red > blue && red > green && red > 1.0) {\n green = green / red;\n blue = blue / red;\n red = 1.0;\n } else if (green > blue && green > red && green > 1.0) {\n red = red / green;\n blue = blue / green;\n green = 1.0;\n } else if (blue > red && blue > green && blue > 1.0) {\n red = red / blue;\n green = green / blue;\n blue = 1.0;\n }\n\n //Reverse gamma correction\n red \t= red <= 0.0031308 ? 12.92 * red : (1.0 + 0.055) * Math.pow(red, (1.0 / 2.4)) - 0.055;\n green \t= green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055;\n blue \t= blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055;\n\n //Convert normalized decimal to decimal\n red \t= Math.round(red * 255);\n green \t= Math.round(green * 255);\n blue \t= Math.round(blue * 255);\n\n if (isNaN(red))\n red = 0;\n if (isNaN(green))\n green = 0;\n if (isNaN(blue))\n blue = 0;\n\n return [red, green, blue].map(\n (c) => Math.min(Math.max(0, c), 255)) // lgtm [js/automatic-semicolon-insertion]\n }\n\n rgbToXY(red, green, blue) {\n if (red > 1) { red /= 255; }\n if (green > 1) { green /= 255; }\n if (blue > 1) { blue /= 255; }\n\n //Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device\n red \t= (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);\n green \t= (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);\n blue \t= (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);\n\n //RGB values to XYZ using the Wide RGB D65 conversion formula\n const X \t\t= red * 0.664511 + green * 0.154324 + blue * 0.162028;\n const Y \t\t= red * 0.283881 + green * 0.668433 + blue * 0.047685;\n const Z \t\t= red * 0.000088 + green * 0.072310 + blue * 0.986039;\n\n //Calculate the xy values from the XYZ values\n let x \t\t= parseFloat((X / (X + Y + Z)).toFixed(4));\n let y \t\t= parseFloat((Y / (X + Y + Z)).toFixed(4));\n\n if (isNaN(x))\n x = 0;\n if (isNaN(y))\n y = 0;\n\n return [x, y];\n }\n\n rgbToBri(red, green, blue) {\n return Math.min(2 * this.rgbToHsl(red, green, blue)[2], this.ranges.bri[1])\n }\n\n getRGB(color) {\n if (color.red != null && color.green != null && color.blue != null)\n return [color.red, color.green, color.blue]\n if (color.r != null && color.g != null && color.b != null)\n return [color.r, color.g, color.b]\n if (color.rgb)\n return color.rgb\n }\n\n getXY(color) {\n if (color.x != null && color.y != null)\n return [color.x, color.y]\n if (color.xy)\n return color.xy\n }\n\n toRGB(color) {\n const rgb = this.getRGB(color)\n if (rgb)\n return rgb\n\n const xy = this.getXY(color)\n if (xy && color.bri)\n return this.xyToRgb(...xy, color.bri)\n if (color.hue && color.sat && color.bri)\n return this.hslToRgb(color.hue, color.sat, color.bri)\n\n console.debug('Could not determine color space')\n console.debug(color)\n }\n\n toXY(color) {\n const xy = this.getXY(color)\n if (xy && color.bri)\n return [xy[0], xy[1], color.bri]\n\n const rgb = this.getRGB(color)\n if (rgb)\n return this.rgbToXY(...rgb)\n\n if (color.hue && color.sat && color.bri) {\n const rgb = this.hslToRgb(color.hue, color.sat, color.bri)\n return this.rgbToXY(...rgb)\n }\n\n console.debug('Could not determine color space')\n console.debug(color)\n }\n\n toHSL(color) {\n if (color.hue && color.sat && color.bri)\n return [color.hue, color.sat, color.bri]\n\n const rgb = this.getRGB(color)\n if (rgb)\n return this.rgbToHsl(...rgb)\n\n const xy = this.getXY(color)\n if (xy && color.bri) {\n const rgb = this.xyToRgb(...xy, color.bri)\n return this.rgbToHsl(...rgb)\n }\n\n console.debug('Could not determine color space')\n console.debug(color)\n }\n\n hexToRgb(hex) {\n return [\n hex.slice(1, 3),\n hex.slice(3, 5),\n hex.slice(5, 7),\n ].map(_ => parseInt(_, 16))\n }\n\n rgbToHex(rgb) {\n return '#' + rgb.map((x) => {\n let hex = x.toString(16)\n if (hex.length < 2)\n hex = '0' + hex\n return hex\n }).join('')\n }\n}\n","<template>\n <label class=\"slider-wrapper\">\n <span class=\"range-labels\" :class=\"{'with-label': withLabel}\" v-if=\"withRange\">\n <span class=\"label left\" v-if=\"withRange\" v-text=\"range[0]\" />\n <span class=\"label right\" v-if=\"withRange\" v-text=\"range[1]\" />\n </span>\n\n <span class=\"slider-container\">\n <input class=\"slider\"\n type=\"range\"\n :class=\"{'with-label': withLabel}\"\n :min=\"range[0]\"\n :max=\"range[1]\"\n :step=\"step\"\n :disabled=\"disabled\"\n :value=\"value\"\n ref=\"range\"\n @input.stop=\"onUpdate\"\n @change.stop=\"onUpdate\">\n\n <div class=\"track\" :class=\"{'with-label': withLabel}\">\n <div class=\"track-inner\" ref=\"track\"></div>\n </div>\n <div class=\"thumb\" ref=\"thumb\"></div>\n <span class=\"label\" v-if=\"withLabel\" v-text=\"value\" ref=\"label\"></span>\n </span>\n </label>\n</template>\n\n<script>\nexport default {\n name: \"Slider\",\n emits: ['input', 'change', 'mouseup', 'mousedown', 'touchstart', 'touchend', 'keyup', 'keydown'],\n props: {\n value: {\n type: Number,\n },\n\n disabled: {\n type: Boolean,\n default: false,\n },\n\n range: {\n type: Array,\n default: () => [0, 100],\n },\n\n step: {\n type: Number,\n default: 1,\n },\n\n withLabel: {\n type: Boolean,\n default: false,\n },\n\n withRange: {\n type: Boolean,\n default: false,\n }\n },\n\n methods: {\n onUpdate(event) {\n this.update(event.target.value)\n this.$emit(event.type, {\n ...event,\n target: {\n ...event.target,\n value: this.$refs.range.value,\n }\n })\n },\n\n update(value) {\n const sliderWidth = this.$refs.range.clientWidth\n const percent = (value - this.range[0]) / (this.range[1] - this.range[0])\n const innerWidth = percent * sliderWidth\n const thumb = this.$refs.thumb\n\n thumb.style.left = `${innerWidth - thumb.clientWidth / 2}px`\n this.$refs.thumb.style.transform = `translate(-${percent}%, -50%)`\n this.$refs.track.style.width = `${innerWidth}px`\n },\n },\n\n mounted() {\n if (this.value != null)\n this.update(this.value)\n this.$watch(() => this.value, (newValue) => this.update(newValue))\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$label-width: 3em;\n\n.slider-wrapper {\n width: 100%;\n display: flex;\n position: relative;\n flex-direction: column;\n\n .slider-container {\n width: 100%;\n display: flex;\n position: relative;\n }\n\n .slider {\n width: 100%;\n cursor: pointer;\n opacity: 0;\n\n &::-ms-tooltip {\n display: none;\n }\n }\n\n .range-labels {\n width: 100%;\n\n &.with-label {\n width: calc(100% - $label-width);\n }\n\n .right {\n @extend .pull-right;\n }\n }\n\n .track {\n width: 100%;\n height: 0.75em;\n background: $slider-bg;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n border-radius: 0.5em;\n box-shadow: inset 1px 0px 3px 0 $slider-track-shadow;\n pointer-events: none;\n\n .track-inner {\n width: 0;\n height: 100%;\n background: $slider-progress-bg;\n border-radius: 0.5em 0 0 0.5em;\n }\n\n &.with-label {\n width: calc(100% - $label-width);\n }\n }\n\n .thumb {\n width: 1.25em;\n height: 1.25em;\n background: $slider-thumb-bg;\n position: absolute;\n top: 50%;\n left: 0;\n transform: translate(0%, -50%);\n border-radius: 50%;\n box-shadow: 1px 0px 2px 0 $slider-thumb-shadow;\n pointer-events: none;\n }\n\n .label {\n width: $label-width;\n position: relative;\n font-weight: normal;\n text-align: center;\n }\n}\n</style>\n","import { render } from \"./Slider.vue?vue&type=template&id=28d31846&scoped=true\"\nimport script from \"./Slider.vue?vue&type=script&lang=js\"\nexport * from \"./Slider.vue?vue&type=script&lang=js\"\n\nimport \"./Slider.vue?vue&type=style&index=0&id=28d31846&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-28d31846\"]])\n\nexport default __exports__","<template>\n <div class=\"power-switch\" :class=\"{disabled: disabled}\" @click.stop=\"onInput\">\n <!--suppress HtmlFormInputWithoutLabel -->\n <input type=\"checkbox\" :checked=\"value\">\n <label>\n <!--suppress HtmlUnknownTag -->\n <div class=\"switch\">\n <div class=\"dot\" />\n </div>\n <span class=\"label\">\n <slot />\n </span>\n </label>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"ToggleSwitch\",\n emits: ['input'],\n props: {\n value: {\n type: Boolean,\n default: false,\n },\n\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n methods: {\n onInput(event) {\n if (this.disabled)\n return false\n\n this.$emit('input', event)\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.power-switch {\n position: relative;\n transition: transform .3s;\n transform: scale(var(--scale, 1)) translateZ(0);\n\n &:active {\n --scale: .96;\n }\n\n &.disabled {\n opacity: 0.6;\n }\n\n input {\n display: none;\n & + label {\n border-radius: 1em;\n display: inline-flex;\n cursor: pointer;\n position: relative;\n transition: box-shadow .4s;\n\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n border-radius: inherit;\n background: none;\n opacity: var(--gradient, 0);\n transition: opacity .4s;\n }\n\n .switch {\n position: relative;\n display: inline-block;\n vertical-align: top;\n height: 1.4em;\n width: 2.5em;\n border-radius: 1em;\n background: $slider-bg;\n box-shadow: inset 1px 0px 3px 0 $slider-track-shadow;\n\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n border-radius: inherit;\n background: $slider-progress-bg;\n opacity: var(--gradient, 0);\n transition: opacity .4s;\n }\n\n .dot {\n background: $toggle-dot-bg;\n position: absolute;\n width: 1.5em;\n height: 1.5em;\n border-radius: 50%;\n box-shadow: 1px 0px 3.5px 0 $slider-thumb-shadow;\n left: -0.25em;\n top: -0.05em;\n transform: translateX(var(--offset, 0));\n transition: transform .4s, box-shadow .4s;\n\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n border-radius: inherit;\n background: $toggle-selected-dot-bg;\n opacity: var(--gradient, 0);\n transition: opacity .4s;\n }\n }\n }\n\n span {\n line-height: 2em;\n font-size: 1.2em;\n color: var(--text, #646B8C);\n font-weight: 500;\n display: inline-block;\n vertical-align: top;\n position: relative;\n margin-left: 0.5em;\n transition: color .4s;\n }\n\n & + span {\n text-align: center;\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 100%;\n opacity: 0;\n font-size: 1em;\n font-weight: 500;\n color: $slider-bg;\n transform: translateY(0.2em);\n transition: opacity .4s, transform .4s;\n }\n }\n\n &:not(:checked) {\n & + label {\n pointer-events: none;\n & + span {\n opacity: 1;\n transform: translateY(0.6em);\n }\n }\n }\n\n &:checked {\n & + label {\n --offset: 1.5em;\n --text: $slider-progress-bg;\n --gradient: 1;\n --shadow: rgba(0, 39, 6, .1);\n }\n }\n }\n}\n</style>\n","import { render } from \"./ToggleSwitch.vue?vue&type=template&id=a6396ae8&scoped=true\"\nimport script from \"./ToggleSwitch.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleSwitch.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleSwitch.vue?vue&type=style&index=0&id=a6396ae8&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-a6396ae8\"]])\n\nexport default __exports__","<template>\n <div class=\"plugin lights-plugin\">\n <div class=\"panel\" v-if=\"selectedGroup == null && groups && Object.keys(groups).length\">\n <Groups :groups=\"groups\" :loading-groups=\"loadingGroups\" :color-converter=\"colorConverter\"\n @select=\"selectedGroup = $event\" @toggle=\"$emit('group-toggle', $event)\" />\n </div>\n <div class=\"panel\" v-else>\n <Group :group=\"groups[selectedGroup]\" :lights=\"displayedLights\" :scenes=\"scenesByGroup[selectedGroup]\"\n :color-converter=\"colorConverter\" :animations=\"animationsByGroup[selectedGroup]\" @close=\"selectedGroup = null\"\n @light-toggle=\"$emit('light-toggle', $event)\" @group-toggle=\"$emit('group-toggle', $event)\"\n @set-light=\"$emit('set-light', $event)\"\n @set-group=\"$emit('set-group', {groupId: selectedGroup, value: $event})\"\n @select-scene=\"$emit('select-scene', {groupId: selectedGroup, sceneId: $event})\"\n @start-animation=\"$emit('start-animation', $event)\" @stop-animation=\"$emit('stop-animation', $event)\" />\n </div>\n </div>\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\nimport Panel from \"@/components/panels/Panel\";\nimport Groups from \"@/components/Light/Groups\";\nimport Group from \"@/components/Light/Group\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\n\n/**\n * Generic component for light plugins panels.\n */\nexport default {\n name: \"Light\",\n components: {Group, Groups},\n mixins: [Utils, Panel],\n emits: ['group-toggle', 'light-toggle', 'set-light', 'set-group', 'select-scene', 'start-animation', 'stop-animation',\n 'refresh', 'light-changed'],\n\n props: {\n lights: {\n type: Object,\n },\n\n groups: {\n type: Object,\n },\n\n scenes: {\n type: Object,\n },\n\n animations: {\n type: Object,\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n\n loadingLights: {\n type: Object,\n default: () => {},\n },\n\n loadingGroups: {\n type: Object,\n default: () => {},\n },\n\n pluginName: {\n type: String,\n },\n\n initialGroup: {\n type: [Number, String],\n },\n },\n\n data() {\n return {\n selectedGroup: null,\n initialized: false,\n }\n },\n\n computed: {\n displayedLights() {\n const selectedGroup = this.selectedGroup || this.initialGroup\n if (selectedGroup == null)\n return this.lights\n\n return this.groups[selectedGroup].lights.reduce((lights, lightId) => {\n lights[lightId] = this.lights[lightId]\n return lights\n }, {})\n },\n\n groupsByLight() {\n if (!this.groups)\n return {}\n\n return Object.entries(this.groups).reduce((obj, [groupId, group]) => {\n group.lights.forEach((lightId) => {\n if (!obj[lightId])\n obj[lightId] = {}\n obj[lightId][groupId] = group\n })\n\n return obj\n }, {})\n },\n\n scenesByGroup() {\n if (!this.scenes)\n return {}\n\n const self = this\n return Object.entries(this.scenes).reduce((obj, [sceneId, scene]) => {\n scene.lights.forEach((lightId) => {\n Object.keys(self.groupsByLight[lightId]).forEach((groupId) => {\n if (!obj[groupId])\n obj[groupId] = {}\n\n obj[groupId][sceneId] = scene\n })\n })\n\n return obj\n }, {})\n },\n\n animationsByGroup() {\n const self = this\n const animations = Object.entries(this.animations?.groups || {}).reduce((obj, [groupId, animation]) => {\n obj[groupId] = {}\n if (animation)\n obj[groupId][null] = animation // lgtm [js/implicit-operand-conversion]\n\n return obj\n }, {})\n\n return {\n ...animations,\n ...Object.entries(this.animations?.lights || {}).reduce((obj, [lightId, animation]) => {\n const group = Object.values(self.groupsByLight[lightId])?.[0]\n if (group) {\n if (animation && group.id != null) {\n if (!obj[group.id])\n obj[group.id] = {}\n obj[group.id][lightId] = animation\n }\n }\n\n return obj\n }, {})\n }\n }\n },\n\n methods: {\n initSelectedGroup() {\n const self = this\n const unwatch = this.$watch(() => self.initialGroup, (newVal) => {\n if (!self.initialized) {\n self.initialized = true\n unwatch()\n if (self.selectedGroup == null && newVal != null) {\n self.selectedGroup = self.initialGroup\n }\n }\n })\n },\n\n refresh() {\n this.$emit('refresh')\n },\n\n onLightChange(event) {\n if (event.plugin_name !== this.pluginName)\n return\n\n if (!this.lights[event.light_id]) {\n this.refresh()\n return\n }\n\n const state = {...event}\n const lightId = state.light_id\n delete state.light_id\n delete state.type\n delete state.plugin_name\n\n this.$emit('light-changed', {\n id: lightId,\n state: state,\n })\n },\n\n onAnimationChange(event) {\n if (event.plugin_name !== this.pluginName)\n return\n\n this.refresh()\n },\n },\n\n mounted() {\n this.subscribe(this.onLightChange, 'on-light-change',\n 'platypush.message.event.light.LightStatusChangeEvent')\n this.subscribe(this.onAnimationChange, 'on-animation-change',\n 'platypush.message.event.light.LightAnimationStartedEvent',\n 'platypush.message.event.light.LightAnimationStoppedEvent')\n\n this.initSelectedGroup()\n },\n\n unmounted() {\n this.unsubscribe('on-light-change')\n this.unsubscribe('on-animation-change')\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.plugin {\n width: 100%;\n height: 100%;\n display: flex;\n}\n\n.panel {\n width: 100%;\n height: 100%;\n box-shadow: none;\n overflow: auto;\n}\n</style>\n\n<style lang=\"scss\">\n.lights-plugin {\n .menu-panel {\n ul {\n li:not(.header) {\n padding: 1.5em 1em;\n }\n }\n }\n}\n</style>","<script>\nexport default {\n name: \"Panel\",\n emits: ['mounted'],\n props: {\n // Plugin configuration.\n config: {\n type: Object,\n default: () => {},\n },\n\n // Plugin name.\n pluginName: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n loading: false,\n }\n },\n\n mounted() {\n this.$emit('mounted', this)\n }\n}\n</script>\n","import script from \"./Panel.vue?vue&type=script&lang=js\"\nexport * from \"./Panel.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n <MenuPanel>\n <div class=\"panel-row header\">\n <div class=\"col-3\">\n <i class=\"icon fas fa-home\" />\n </div>\n <div class=\"col-6 name\">\n Rooms\n </div>\n <div class=\"col-3 pull-right\">\n <ToggleSwitch :value=\"anyLightsOn\" @input=\"$emit('toggle')\" />\n </div>\n </div>\n\n <div class=\"panel-row row group\" v-for=\"group in groupsSorted\" :key=\"group.id\" @click=\"$emit('select', group.id)\">\n <span class=\"name col-9\">\n {{ group.name || `[Group ${group.id}]` }}\n </span>\n <span class=\"controls col-3 pull-right\">\n <ToggleSwitch :value=\"group.state.any_on\" :disabled=\"group.id in (loadingGroups || {})\"\n @input=\"$emit('toggle', group)\" />\n </span>\n </div>\n </MenuPanel>\n</template>\n\n<script>\nimport MenuPanel from \"@/components/MenuPanel\";\nimport ToggleSwitch from \"@/components/elements/ToggleSwitch\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\n\nexport default {\n name: \"Groups\",\n components: {ToggleSwitch, MenuPanel},\n emits: ['select', 'toggle'],\n props: {\n groups: {\n type: Object,\n default: () => {},\n },\n\n loadingGroups: {\n type: Object,\n default: () => {},\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n },\n\n computed: {\n groupsSorted() {\n return Object.entries(this.groups)\n .sort((a, b) => a[1].name.localeCompare(b[1].name))\n .map(([id, group]) => {\n return {\n ...group,\n id: id,\n }\n })\n },\n\n anyLightsOn() {\n for (const group of Object.values(this.groups))\n if (group?.state?.any_on)\n return true\n\n return false\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.header {\n display: flex;\n align-items: center;\n padding-top: 0.75em !important;\n padding-bottom: 0.75em !important;\n\n .icon {\n margin-left: 0.5em;\n }\n\n .name {\n text-align: center;\n }\n}\n\n.group {\n display: flex;\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"menu-panel\">\n <div class=\"content\">\n <slot />\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"MenuPanel\",\n}\n</script>\n\n<style lang=\"scss\">\n.menu-panel {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n background: $menu-panel-bg;\n padding-top: 2em;\n\n .content {\n background: $menu-panel-content-bg;\n border-radius: 15px;\n box-shadow: $plugin-panel-shadow;\n border: 0;\n\n .panel-row {\n display: flex;\n margin: 0 !important;\n padding: 1em;\n box-shadow: $plugin-panel-entry-shadow;\n cursor: pointer;\n border: 0;\n letter-spacing: 0.05em;\n\n &:hover {\n background: $hover-bg;\n }\n\n &:first-child {\n border-radius: 15px 15px 0 0;\n box-shadow: $plugin-panel-first-entry-shadow;\n }\n\n &:last-child {\n border-radius: 0 0 15px 15px;\n box-shadow: $plugin-panel-last-entry-shadow;\n }\n }\n\n .header {\n background: $menu-header-bg;\n font-weight: bold;\n box-shadow: $menu-header-shadow;\n\n &:hover {\n background: $menu-header-bg;\n }\n }\n }\n}\n\n@media screen and (max-width: $desktop) {\n .menu-panel {\n padding-top: 0;\n\n .content {\n min-width: 100%;\n\n .row {\n &:first-child {\n border-radius: 0;\n }\n\n &:last-child {\n border-radius: 0;\n }\n }\n }\n }\n}\n\n@media screen and (min-width: $desktop) {\n .menu-panel {\n .content {\n min-width: 75%;\n }\n }\n}\n\n@media screen and (min-width: $widescreen) {\n .menu-panel {\n .content {\n min-width: 50%;\n }\n }\n}\n\n@media screen and (min-width: $fullhd) {\n .menu-panel {\n .content {\n min-width: 35%;\n }\n }\n}\n</style>\n","import { render } from \"./MenuPanel.vue?vue&type=template&id=02113104\"\nimport script from \"./MenuPanel.vue?vue&type=script&lang=js\"\nexport * from \"./MenuPanel.vue?vue&type=script&lang=js\"\n\nimport \"./MenuPanel.vue?vue&type=style&index=0&id=02113104&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Groups.vue?vue&type=template&id=42318a2b&scoped=true\"\nimport script from \"./Groups.vue?vue&type=script&lang=js\"\nexport * from \"./Groups.vue?vue&type=script&lang=js\"\n\nimport \"./Groups.vue?vue&type=style&index=0&id=42318a2b&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-42318a2b\"]])\n\nexport default __exports__","<template>\n <div class=\"light-group-container\">\n <MenuPanel>\n <div class=\"panel-row header\">\n <div class=\"col-3\" v-if=\"group\">\n <button class=\"back-btn\" title=\"Back\" @click=\"close\">\n <i class=\"fas fa-chevron-left\" />\n </button>\n </div>\n\n <div class=\"col-6 name\" :class=\"{selected: selectedView === 'group'}\"\n v-text=\"groupName\" @click=\"selectedView = selectedView === 'group' ? null : 'group'\" />\n\n <div class=\"col-3 pull-right\" v-if=\"group\">\n <ToggleSwitch :value=\"group.state.any_on\" @input=\"$emit('group-toggle', group)\" />\n </div>\n </div>\n\n <div class=\"no-lights\" v-if=\"!lights || !Object.keys(lights).length\">\n No lights found\n </div>\n\n <div class=\"lights-view\" v-else>\n <div class=\"row view-selector\">\n <button :class=\"{selected: selectedView === 'lights'}\" title=\"Lights\" @click=\"selectedView = 'lights'\">\n <i class=\"icon fas fa-lightbulb\" />\n </button>\n <button :class=\"{selected: selectedView === 'scenes'}\" title=\"Scenes\" @click=\"selectedView = 'scenes'\">\n <i class=\"icon far fa-image\" />\n </button>\n <button :class=\"{selected: selectedView === 'animate'}\" title=\"Animate\" @click=\"selectedView = 'animate'\">\n <i class=\"icon fas fa-video\" />\n </button>\n </div>\n\n <div class=\"view fade-in\" v-if=\"selectedView === 'lights'\">\n <keep-alive>\n <div class=\"panel-row row\" :class=\"{expanded: light.id === selectedLight}\"\n v-for=\"(light, id) in lightsSorted\" :key=\"id\"\n @click=\"selectedLight = selectedLight === light.id ? null : light.id\">\n <Light :light=\"light\" :group=\"group\" :collapsed=\"light.id !== selectedLight\"\n :color-converter=\"colorConverter\" @toggle=\"$emit('light-toggle', light)\"\n @set-light=\"$emit('set-light', {light: light, value: $event})\" />\n </div>\n </keep-alive>\n </div>\n\n <div class=\"view fade-in\" v-else-if=\"selectedView === 'scenes'\">\n <keep-alive>\n <div class=\"panel-row row\" :class=\"{selected: scene.id === selectedScene}\"\n v-for=\"(scene, id) in scenesSorted\" :key=\"id\" @click=\"onSceneSelected(scene.id)\">\n <Scene :scene=\"scene\" :group=\"group\" />\n </div>\n </keep-alive>\n </div>\n\n <div class=\"view group-controls fade-in\" v-else-if=\"selectedView === 'group'\">\n <keep-alive>\n <Controls :group=\"group\" :lights=\"lights\" :color-converter=\"colorConverter\"\n @set-group=\"$emit('set-group', $event)\" />\n </keep-alive>\n </div>\n\n <div class=\"view group-controls fade-in\" v-else-if=\"selectedView === 'animate'\">\n <keep-alive>\n <Animate :group=\"group\" :lights=\"lights\" :color-converter=\"colorConverter\" :running-animations=\"animations\"\n @start=\"$emit('start-animation', $event)\" @stop=\"$emit('stop-animation', $event)\" />\n </keep-alive>\n </div>\n </div>\n </MenuPanel>\n </div>\n</template>\n\n<script>\nimport Light from \"@/components/Light/Light\";\nimport Scene from \"@/components/Light/Scene\";\nimport Controls from \"@/components/Light/Controls\";\nimport MenuPanel from \"@/components/MenuPanel\";\nimport ToggleSwitch from \"@/components/elements/ToggleSwitch\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\nimport Animate from \"@/components/Light/Animate\";\n\nexport default {\n name: \"Group\",\n emits: ['close', 'group-toggle', 'light-toggle', 'set-light', 'select-scene', 'start-animation', 'stop-animation'],\n components: {Animate, ToggleSwitch, MenuPanel, Light, Scene, Controls},\n props: {\n lights: {\n type: Object,\n },\n\n group: {\n type: Object,\n },\n\n scenes: {\n type: Object,\n },\n\n animations: {\n type: Object,\n default: () => {},\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n },\n\n data() {\n return {\n selectedLight: null,\n selectedScene: null,\n selectedView: 'lights',\n }\n },\n\n computed: {\n lightsSorted() {\n if (!this.lights)\n return []\n\n return Object.entries(this.lights)\n .sort((a, b) => a[1].name.localeCompare(b[1].name))\n .map(([id, light]) => {\n return {\n ...light,\n id: id,\n }\n })\n },\n\n scenesSorted() {\n if (!this.scenes)\n return []\n\n return Object.entries(this.scenes)\n .sort((a, b) => a[1].name.localeCompare(b[1].name))\n .map(([id, scene]) => {\n return {\n ...scene,\n id: id,\n }\n })\n },\n\n groupName() {\n if (this.group?.name)\n return this.group.name\n if (this.group?.id != null)\n return `[Group ${this.group.id}]`\n return 'Lights'\n },\n },\n\n methods: {\n close(event) {\n event.stopPropagation()\n this.$emit('close')\n },\n\n onSceneSelected(sceneId) {\n this.selectedScene = sceneId\n this.$emit('select-scene', sceneId)\n },\n },\n}\n</script>\n\n<style lang=\"scss\">\n.light-group-container {\n width: 100%;\n min-height: 100%;\n\n .row.panel-row {\n flex-direction: column;\n\n &.expanded,\n &.selected {\n background: $selected-bg;\n }\n }\n\n .header {\n padding: 0.5em !important;\n display: flex;\n align-items: center;\n\n .back-btn {\n border: 0;\n background: none;\n\n &:hover {\n border: 0;\n color: $default-hover-fg;\n }\n }\n\n .name {\n text-align: center;\n\n &.selected {\n color: $selected-fg;\n }\n\n &:hover {\n color: $default-hover-fg;\n }\n }\n }\n\n .view-selector {\n width: 100%;\n border-radius: 0;\n\n button {\n width: 33.3%;\n padding: 1.5em;\n text-align: left;\n opacity: 0.8;\n box-shadow: $plugin-panel-entry-shadow;\n border-right: 0;\n\n &.selected {\n background: $selected-bg;\n }\n\n &:hover {\n background: $hover-bg;\n }\n }\n\n .icon {\n width: 100%;\n text-align: center;\n font-size: 1.2em;\n }\n }\n}\n</style>\n\n<style lang=\"scss\">\n.light-group-container {\n .group-controls {\n margin: 0;\n padding: 1em;\n background-color: $default-bg-6;\n border-radius: 0 0 1em 1em;\n\n .controls {\n margin: 0;\n padding: 1em;\n }\n }\n}\n</style>\n","<template>\n <div class=\"light\" :class=\"{expanded: !collapsed}\" ref=\"element\">\n <div class=\"row\">\n <span class=\"name col-9\" @click=\"expandToggle\">\n {{ light.name || `[Light ${light.id}]` }}\n </span>\n <span class=\"toggle col-3 pull-right\">\n <ToggleSwitch :value=\"light.state.on\" :disabled=\"loading\" @input=\"$emit('toggle', light)\" />\n </span>\n </div>\n\n <div class=\"row fade-in\" v-if=\"!collapsed\">\n <Controls :light=\"light\" :loading=\"loading\" :color-converter=\"colorConverter\"\n @set-light=\"$emit('set-light', $event)\" />\n </div>\n </div>\n</template>\n\n<script>\nimport ToggleSwitch from \"@/components/elements/ToggleSwitch\";\nimport Controls from \"@/components/Light/Controls\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\n\nexport default {\n name: \"Light\",\n components: {Controls, ToggleSwitch},\n emits: ['toggle', 'set-light', 'collapsed', 'expanded'],\n props: {\n light: {\n type: Object,\n default: () => {},\n },\n\n group: {\n type: Object,\n default: () => {},\n },\n\n loading: {\n type: Boolean,\n default: false,\n },\n\n collapsed: {\n type: Boolean,\n default: true,\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n },\n\n methods: {\n expandToggle() {\n this.$emit(this.collapsed ? 'expanded' : 'collapsed')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.expanded {\n .name {\n font-size: 1.25em;\n }\n}\n</style>\n","<template>\n <div class=\"controls light-controls\" @click=\"$event.stopPropagation()\">\n <Loading v-if=\"loading\" />\n\n <div class=\"row\" v-if=\"state.bri != null\">\n <div class=\"col-1 icon\">\n <i class=\"fas fa-sun\" />\n </div>\n <div class=\"col-11 control\">\n <Slider :range=\"colorConverter.ranges.bri\" :disabled=\"loading\" :value=\"state.bri\"\n @mouseup.stop=\"$emit(light ? 'set-light' : 'set-group', {brightness: parseInt($event.target.value)})\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"state.ct != null\">\n <div class=\"col-1 icon\">\n <i class=\"fas fa-thermometer-half\" />\n </div>\n <div class=\"col-11 control\">\n <Slider :range=\"colorConverter.ranges.ct\" :disabled=\"loading\" :value=\"state.ct\"\n @mouseup.stop=\"$emit(light ? 'set-light' : 'set-group', {temperature: parseInt($event.target.value)})\" />\n </div>\n </div>\n\n <label class=\"row\" v-if=\"rgbColor\">\n <span class=\"col-1 icon\">\n <i class=\"fas fa-palette\" />\n </span>\n <span class=\"col-11 control\">\n <input type=\"color\" :value=\"rgbColor\" @change.stop=\"onColorSelect\" />\n </span>\n </label>\n </div>\n</template>\n\n<script>\nimport Slider from \"@/components/elements/Slider\";\nimport Loading from \"@/components/Loading\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\n\nexport default {\n name: \"Controls\",\n components: {Loading, Slider},\n emits: ['set-light', 'set-group'],\n props: {\n light: {\n type: Object,\n },\n\n lights: {\n type: Object,\n },\n\n group: {\n type: Object,\n },\n\n loading: {\n type: Boolean,\n default: false,\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n },\n\n computed: {\n state() {\n if (this.light?.state)\n return this.light.state\n\n const state = this.group?.state || {}\n if (!this.lights)\n return state\n\n const avg = (values) => {\n if (!(values && values.length))\n return 0\n\n if (values[0] instanceof Array)\n return [...values[0].keys()].map((i) => {\n return avg(values.map((value) => value[i]))\n })\n\n return values.reduce((sum, value) => sum+value, 0) / values.length\n }\n\n return {\n ...state,\n ...Object.entries(\n Object.values(this.lights).reduce((obj, light) => {\n ['bri', 'hue', 'sat', 'rgb', 'xy', 'red', 'green', 'blue', 'ct'].forEach((attr) => {\n if (light.state?.[attr] != null) {\n obj[attr] = [...(obj[attr] || []), light.state[attr]]\n }\n })\n\n return obj\n }, {})\n ).reduce((obj, [attr, values]) => {\n obj[attr] = avg(values)\n return obj\n }, {})\n }\n },\n\n color() {\n return this.getColor(this.state)\n },\n\n rgbColor() {\n const rgb = this.colorConverter.toRGB(this.state)\n if (rgb)\n return '#' + rgb.map((x) => {\n let hex = x.toString(16)\n if (hex.length < 2)\n hex = '0' + hex\n return hex\n }).join('')\n\n return null\n },\n },\n\n methods: {\n onColorSelect(event) {\n const rgb = event.target.value.slice(1).split(/(?=(?:..)*$)/).map((t) => parseInt(`0x${t}`))\n this.$emit(this.light ? 'set-light' : 'set-group', {\n rgb: rgb,\n xy: this.colorConverter.rgbToXY(...rgb),\n hsl: this.colorConverter.rgbToHsl(...rgb),\n brightness: this.colorConverter.rgbToBri(...rgb),\n })\n },\n\n getColor(state) {\n return {\n rgb: this.colorConverter.toRGB(state),\n xy: this.colorConverter.toXY(state),\n hsl: this.colorConverter.toHSL(state),\n }\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$light-controls-bg: white;\n\n.controls {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 2.25em;\n background: $light-controls-bg;\n padding: 0.5em 1em;\n border-radius: 1em;\n box-shadow: $plugin-panel-shadow;\n\n .row {\n width: 100%;\n display: flex;\n align-items: center;\n }\n\n .control {\n padding-top: 0.25em;\n }\n\n .icon {\n opacity: 0.7;\n }\n\n input[type=color] {\n width: 100%;\n border: 0;\n }\n}\n</style>\n\n<style lang=\"scss\">\n.light-controls {\n .row {\n .slider {\n margin-top: 0.4em;\n }\n }\n}\n</style>\n","import { render } from \"./Controls.vue?vue&type=template&id=e2726892&scoped=true\"\nimport script from \"./Controls.vue?vue&type=script&lang=js\"\nexport * from \"./Controls.vue?vue&type=script&lang=js\"\n\nimport \"./Controls.vue?vue&type=style&index=0&id=e2726892&lang=scss&scoped=true\"\nimport \"./Controls.vue?vue&type=style&index=1&id=e2726892&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e2726892\"]])\n\nexport default __exports__","import { render } from \"./Light.vue?vue&type=template&id=52168252&scoped=true\"\nimport script from \"./Light.vue?vue&type=script&lang=js\"\nexport * from \"./Light.vue?vue&type=script&lang=js\"\n\nimport \"./Light.vue?vue&type=style&index=0&id=52168252&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-52168252\"]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n <div class=\"scene row name\" @click=\"onSelect\">\n {{ scene.name || `[Scene ${scene.id}]` }}\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Light\",\n emits: ['select'],\n props: {\n scene: {\n type: Object,\n default: () => {},\n },\n\n group: {\n type: Object,\n default: () => {},\n },\n\n loading: {\n type: Boolean,\n default: false,\n },\n },\n\n methods: {\n onSelect() {\n if (this.loading)\n return false\n\n this.$emit('select')\n },\n },\n}\n</script>\n","import { render } from \"./Scene.vue?vue&type=template&id=6934d062\"\nimport script from \"./Scene.vue?vue&type=script&lang=js\"\nexport * from \"./Scene.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"controls animation-controls\" @click=\"$event.stopPropagation()\">\n <Loading v-if=\"loading\" />\n\n <div class=\"animation-container\">\n <div class=\"animation-header\">\n <div class=\"row\">\n <div class=\"col-3\">\n Run Animation\n </div>\n <div class=\"col-9\">\n <ToggleSwitch :value=\"animationRunning\" @input=\"toggleAnimation\" />\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-3\">Animation</div>\n <div class=\"col-9\">\n <label>\n <select class=\"selector\" @click=\"selectedAnimation = $event.target.value\">\n <option value=\"color_transition\">Color transition</option>\n <option value=\"blink\">Blink</option>\n </select>\n </label>\n </div>\n </div>\n </div>\n\n <div class=\"animation\">\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Hue range\n </div>\n <div class=\"col-9\">\n <RangeSlider :range=\"colorConverter.ranges.hue\" :disabled=\"loading\"\n :value=\"animations.color_transition.hue_range\"\n @mouseup=\"animations.color_transition.hue_range = $event.target.value\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Sat range\n </div>\n <div class=\"col-9\">\n <RangeSlider :range=\"colorConverter.ranges.sat\" :disabled=\"loading\"\n :value=\"animations.color_transition.sat_range\"\n @mouseup=\"animations.color_transition.sat_range = $event.target.value\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Bri range\n </div>\n <div class=\"col-9\">\n <RangeSlider :range=\"colorConverter.ranges.sat\" :disabled=\"loading\"\n :value=\"animations.color_transition.bri_range\"\n @mouseup=\"animations.color_transition.bri_range = $event.target.value\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Hue step\n </div>\n <div class=\"col-9\">\n <Slider :range=\"colorConverter.ranges.hue\" :disabled=\"loading\"\n :value=\"animations.color_transition.hue_step\"\n @mouseup=\"animations.color_transition.hue_step = parseFloat($event.target.value)\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Sat step\n </div>\n <div class=\"col-9\">\n <Slider :range=\"colorConverter.ranges.sat\" :disabled=\"loading\"\n :value=\"animations.color_transition.sat_step\"\n @mouseup=\"animations.color_transition.sat_step = parseFloat($event.target.value)\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"selectedAnimation === 'color_transition'\">\n <div class=\"col-3\">\n Bri step\n </div>\n <div class=\"col-9\">\n <Slider :range=\"colorConverter.ranges.bri\" :disabled=\"loading\"\n :value=\"animations.color_transition.bri_step\"\n @mouseup=\"animations.color_transition.bri_step = parseFloat($event.target.value)\" />\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-3\">\n Refresh seconds\n </div>\n <div class=\"col-9\">\n <label>\n <input type=\"number\" :value=\"animations[selectedAnimation].transition_seconds\" step=\"0.1\"\n @input=\"animations[selectedAnimation].transition_seconds = parseFloat($event.target.value)\" >\n </label>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-3\">\n Duration (seconds)\n </div>\n <div class=\"col-9\">\n <label>\n <input type=\"number\" :value=\"animations[selectedAnimation].duration\" step=\"5\"\n @input=\"animations[selectedAnimation].duration = $event.target.value?.length ? parseFloat($event.target.value) : null\" >\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"lights\">\n <div class=\"row\">\n <label>\n <input type=\"checkbox\"\n :checked=\"Object.keys(lights).length === Object.values(selectedLights).filter((v) => v).length\" @click=\"toggleSelectAll\">\n Select all lights\n </label>\n </div>\n\n <div class=\"row\" v-for=\"(light, id) in lights\" :key=\"id\">\n <label>\n <input type=\"checkbox\" v-model=\"selectedLights[id]\" @input=\"selectedLights[id] = !selectedLights[id]\">\n {{ light.name }}\n </label>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport Loading from \"@/components/Loading\";\nimport {ColorConverter} from \"@/components/panels/Light/color\";\nimport RangeSlider from \"@/components/elements/RangeSlider\";\nimport Slider from \"@/components/elements/Slider\";\nimport ToggleSwitch from \"@/components/elements/ToggleSwitch\";\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Animate\",\n mixins: [Utils],\n components: {ToggleSwitch, Slider, RangeSlider, Loading},\n emits: ['start', 'stop'],\n props: {\n lights: {\n type: Object,\n },\n\n group: {\n type: Object,\n },\n\n loading: {\n type: Boolean,\n default: false,\n },\n\n colorConverter: {\n type: Object,\n default: () => new ColorConverter(),\n },\n\n runningAnimations: {\n type: Object,\n default: () => {},\n }\n },\n\n data() {\n return {\n selectedAnimation: 'color_transition',\n animation: {},\n selectedLights: Object.keys(this.lights).reduce((obj, lightId) => {\n obj[lightId] = true\n return obj\n }, {}),\n animations: {\n color_transition: {\n hue_range: this.colorConverter.ranges.hue,\n sat_range: [\n parseInt((this.colorConverter.ranges.sat[1] - this.colorConverter.ranges.sat[0])/2),\n this.colorConverter.ranges.sat[1]\n ],\n bri_range: [\n parseInt((this.colorConverter.ranges.bri[1] - this.colorConverter.ranges.bri[0]) * 0.75),\n this.colorConverter.ranges.bri[1]\n ],\n\n hue_step: parseInt((this.colorConverter.ranges.hue[1] - this.colorConverter.ranges.hue[0]) / 25),\n sat_step: parseInt((this.colorConverter.ranges.sat[1] - this.colorConverter.ranges.sat[0]) / 50),\n bri_step: parseInt((this.colorConverter.ranges.bri[1] - this.colorConverter.ranges.bri[0]) / 50),\n transition_seconds: 1,\n duration: null,\n },\n\n blink: {\n transition_seconds: 1,\n duration: null,\n },\n },\n }\n },\n\n computed: {\n animationRunning() {\n return Object.keys(this.runningAnimations).length > 0\n },\n },\n\n methods: {\n toggleSelectAll() {\n const select = Object.values(this.selectedLights).filter((v) => v).length < Object.keys(this.lights).length\n Object.keys(this.lights).forEach((lightId) => {\n this.selectedLights[lightId] = select\n })\n },\n\n toggleAnimation() {\n const eventType = this.animationRunning ? 'stop' : 'start'\n const selectedLights = Object.entries(this.selectedLights).filter((light) => light[1]).map((light) => light[0])\n if (!selectedLights.length) {\n this.warn('No lights have been selected')\n return\n }\n\n this.$emit(eventType, {\n lights: selectedLights,\n animation: {\n ...this.animations[this.selectedAnimation],\n animation: this.selectedAnimation,\n },\n })\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$light-controls-bg: white;\n\n.animation-container {\n width: 100%;\n\n .animation-header,\n .animation {\n padding-bottom: 0.5em;\n margin-bottom: 0.5em;\n box-shadow: $border-shadow-bottom;\n }\n}\n\n.controls {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 2.25em;\n background: $light-controls-bg;\n padding: 0.5em 1em;\n border-radius: 1em;\n box-shadow: $plugin-panel-shadow;\n\n .selector {\n width: 100%;\n }\n\n .row {\n width: 100%;\n display: flex;\n align-items: center;\n padding: 0.5em 0;\n\n & > div:last-child {\n text-align: right;\n }\n }\n\n .control {\n padding-top: 0.25em;\n }\n\n .lights {\n padding-top: 0.5em;\n width: 100%;\n\n .row {\n display: flex;\n align-items: center;\n }\n\n label {\n width: 100%;\n }\n }\n}\n</style>\n","<template>\n <div class=\"range-wrapper\">\n <input class=\"slider\" type=\"range\" :value=\"v\" :min=\"range[0]\" :max=\"range[1]\" :step=\"step\"\n :disabled=\"disabled\" ref=\"ranges\"\n @input.stop=\"onUpdate\"\n @change.stop=\"onUpdate\"\n @mouseup.stop=\"onUpdate\"\n @mousedown.stop=\"onUpdate\"\n @touchstart.stop=\"onUpdate\"\n @touchend.stop=\"onUpdate\"\n @keyup.stop=\"onUpdate\"\n @keydown.stop=\"onUpdate\"\n v-for=\"(v, i) in value\" :key=\"i\">\n </div>\n</template>\n\n<script>\nexport default {\n name: \"RangeSlider\",\n emits: ['input', 'change', 'mouseup', 'mousedown', 'touchstart', 'touchend', 'keyup', 'keydown'],\n props: {\n disabled: {\n type: Boolean,\n default: false,\n },\n\n range: {\n type: Array,\n default: () => [0, 100],\n },\n\n step: {\n type: Number,\n default: 1,\n },\n\n value: {\n type: Array,\n default: () => [0, 100],\n },\n },\n\n methods: {\n onUpdate(event) {\n this.$emit(event.type, {\n ...event,\n target: {\n ...event.target,\n value: this.$refs.ranges.map((input) => parseFloat(input.value)).sort(),\n }\n })\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.range-wrapper {\n width: 100%;\n position: relative;\n\n @mixin runnable-track {\n width: 100%;\n height: 0.75em;\n cursor: pointer;\n animate: 0.2s;\n background: $slider-bg;\n border-radius: 0.5em;\n box-shadow: inset 1px 0px 3px 0 $slider-track-shadow;\n border: 0;\n }\n\n @mixin thumb {\n width: 1.25em;\n height: 1.25em;\n background: $slider-thumb-bg;\n position: relative;\n z-index: 2;\n border-radius: 50%;\n box-shadow: 1px 0px 2px 0 $slider-thumb-shadow;\n cursor: pointer;\n }\n\n input[type=range] {\n width: 100%;\n position: absolute;\n left: 0;\n bottom: 0;\n outline: none;\n @include appearance(none);\n\n &:focus, &:hover {\n outline: none;\n border: 0;\n }\n\n &::-webkit-slider-runnable-track {\n @include runnable-track;\n }\n\n &::-moz-range-track {\n @include runnable-track;\n }\n\n &::-ms-track {\n width: 100%;\n height: 0.75em;\n cursor: pointer;\n animate: 0.2s;\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-ms-fill-lower,\n &::-ms-fill-upper {\n background: $slider-progress-bg;\n border-radius: 1px;\n box-shadow: none;\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n @include thumb;\n @include appearance(none);\n margin-top: -0.25em;\n }\n\n &::-moz-range-thumb {\n @include thumb;\n }\n\n &::-ms-thumb {\n @include thumb;\n }\n }\n}\n</style>\n\n","import { render } from \"./RangeSlider.vue?vue&type=template&id=981c5de0&scoped=true\"\nimport script from \"./RangeSlider.vue?vue&type=script&lang=js\"\nexport * from \"./RangeSlider.vue?vue&type=script&lang=js\"\n\nimport \"./RangeSlider.vue?vue&type=style&index=0&id=981c5de0&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-981c5de0\"]])\n\nexport default __exports__","import { render } from \"./Animate.vue?vue&type=template&id=1739aaba&scoped=true\"\nimport script from \"./Animate.vue?vue&type=script&lang=js\"\nexport * from \"./Animate.vue?vue&type=script&lang=js\"\n\nimport \"./Animate.vue?vue&type=style&index=0&id=1739aaba&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1739aaba\"]])\n\nexport default __exports__","import { render } from \"./Group.vue?vue&type=template&id=4de1a560\"\nimport script from \"./Group.vue?vue&type=script&lang=js\"\nexport * from \"./Group.vue?vue&type=script&lang=js\"\n\nimport \"./Group.vue?vue&type=style&index=0&id=4de1a560&lang=scss\"\nimport \"./Group.vue?vue&type=style&index=1&id=4de1a560&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=781dd72c&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=781dd72c&lang=scss&scoped=true\"\nimport \"./Index.vue?vue&type=style&index=1&id=781dd72c&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-781dd72c\"]])\n\nexport default __exports__"],"names":["ColorConverter","constructor","ranges","this","hue","sat","bri","ct","attr","Object","keys","normalize","x","xRange","yRange","hslToRgb","h","s","l","a","Math","min","f","n","k","color","max","round","rgbToHsl","r","g","b","d","parseInt","xyToRgb","y","brightness","z","Y","toFixed","X","Z","red","green","blue","pow","isNaN","map","c","rgbToXY","parseFloat","rgbToBri","getRGB","rgb","getXY","xy","toRGB","console","debug","toXY","toHSL","hexToRgb","hex","slice","_","rgbToHex","toString","length","join","class","ref","withRange","withLabel","type","range","step","disabled","value","onUpdate","name","emits","props","Number","Boolean","default","Array","methods","event","update","target","$emit","$refs","sliderWidth","clientWidth","percent","innerWidth","thumb","style","left","transform","track","width","mounted","$watch","newValue","__exports__","render","onInput","checked","selectedGroup","groups","loadingGroups","colorConverter","$event","group","lights","displayedLights","scenes","scenesByGroup","animations","animationsByGroup","config","pluginName","String","required","data","loading","anyLightsOn","groupsSorted","key","id","state","any_on","components","ToggleSwitch","MenuPanel","computed","entries","sort","localeCompare","values","title","close","selectedView","lightsSorted","light","selectedLight","collapsed","scenesSorted","scene","selectedScene","onSceneSelected","expandToggle","on","stopPropagation","rgbColor","onColorSelect","Loading","Slider","avg","i","reduce","sum","obj","forEach","getColor","split","t","hsl","Controls","onSelect","animationRunning","toggleAnimation","selectedAnimation","color_transition","hue_range","sat_range","bri_range","hue_step","sat_step","bri_step","transition_seconds","duration","selectedLights","filter","v","toggleSelectAll","input","mixins","Utils","RangeSlider","runningAnimations","animation","lightId","blink","select","eventType","warn","Animate","Light","Scene","groupName","sceneId","Group","Groups","Panel","loadingLights","initialGroup","initialized","groupsByLight","groupId","self","initSelectedGroup","unwatch","newVal","refresh","onLightChange","plugin_name","light_id","onAnimationChange","subscribe","unmounted","unsubscribe"],"sourceRoot":""}