Mercurial > code > home > repos > light9
annotate web/light9-color-picker.ts @ 2376:4556eebe5d73
topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
author | drewp@bigasterisk.com |
---|---|
date | Sun, 12 May 2024 19:02:10 -0700 |
parents | light9/web/light9-color-picker.ts@18d6bdd422f2 |
children |
rev | line source |
---|---|
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
1 import debug from "debug"; |
2242 | 2 import { css, html, LitElement, PropertyValueMap } from "lit"; |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
3 import { customElement, property, queryAsync, state } from "lit/decorators.js"; |
2242 | 4 import color from "onecolor"; |
5 import { ClientCoord, pickerFloat } from "./floating_color_picker"; | |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
6 export { Slider } from "@material/mwc-slider"; |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
7 |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
8 const log = debug("control.color"); |
2242 | 9 type int8 = number; |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
10 |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
11 @customElement("light9-color-picker") |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
12 export class Light9ColorPicker extends LitElement { |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
13 static styles = [ |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
14 css` |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
15 :host { |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
16 position: relative; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
17 display: flex; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
18 align-items: center; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
19 flex-wrap: wrap; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
20 user-select: none; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
21 } |
1609
0bb3051fd6fd
move colorpick to its own file
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
23 #swatch { |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
24 display: inline-block; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
25 width: 50px; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
26 height: 30px; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
27 margin-right: 3px; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
28 border: 1px solid #333; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
29 } |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
30 |
2242 | 31 mwc-slider { |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
32 width: 160px; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
33 } |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
34 |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
35 #vee { |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
36 display: flex; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
37 align-items: center; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
38 } |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
39 `, |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
40 ]; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
41 render() { |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
42 return html` |
2242 | 43 <div id="swatch" style="background-color: ${this.color}; border-color: ${this.hueSatColor}" @mousedown=${this.startFloatingPick}></div> |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
44 <span id="vee"> V: <mwc-slider id="value" .value=${this.value} step="1" min="0" max="255" @input=${this.onVSliderChange}></mwc-slider> </span> |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
45 `; |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
46 } |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
47 |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
48 // Selected color. Read/write. Equal to value*hueSatColor. Never null. |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
49 @property() color: string = "#000"; |
2242 | 50 |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
51 @state() hueSatColor: string = "#fff"; // always full value |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
52 @state() value: int8 = 0; |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
53 |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
54 @queryAsync("#swatch") swatchEl!: Promise<HTMLElement>; |
2242 | 55 |
56 connectedCallback(): void { | |
57 super.connectedCallback(); | |
58 pickerFloat.pageInit(); | |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
59 } |
2242 | 60 update(changedProperties: PropertyValueMap<this>) { |
2246
5c269c03863d
WIP device settings page can now load and save ok. Omitted GraphToControls for now
drewp@bigasterisk.com
parents:
2243
diff
changeset
|
61 super.update(changedProperties); |
2242 | 62 if (changedProperties.has("color")) { |
63 this.setColor(this.color); | |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
64 } |
2242 | 65 if (changedProperties.has("value") || changedProperties.has("hueSatColor")) { |
2265 | 66 this.updateColorFromHSV(); |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
67 |
2246
5c269c03863d
WIP device settings page can now load and save ok. Omitted GraphToControls for now
drewp@bigasterisk.com
parents:
2243
diff
changeset
|
68 this.dispatchEvent(new CustomEvent("input", { detail: { value: this.color } })); |
5c269c03863d
WIP device settings page can now load and save ok. Omitted GraphToControls for now
drewp@bigasterisk.com
parents:
2243
diff
changeset
|
69 |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
70 this.swatchEl.then((sw) => { |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
71 sw.style.borderColor = this.hueSatColor; |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
72 }); |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
73 } |
2242 | 74 } |
75 | |
2265 | 76 private updateColorFromHSV() { |
77 this.color = color(this.hueSatColor) | |
78 .value(this.value / 255) | |
79 .hex(); | |
80 } | |
81 | |
2242 | 82 private onVSliderChange(ev: CustomEvent) { |
83 this.value = ev.detail.value; | |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
84 } |
2242 | 85 |
86 // for outside users of the component | |
87 setColor(col: string) { | |
2243
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
88 if (col === null) throw new Error("col===null"); |
ba9aca728d65
fix v slider update; 'color' input attribute; clean up logs
drewp@bigasterisk.com
parents:
2242
diff
changeset
|
89 if (typeof col !== "string") throw new Error("typeof col=" + typeof col); |
2242 | 90 this.value = color(col).value() * 255; |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
91 |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
92 // don't update this if only the value changed, or we desaturate |
2242 | 93 this.hueSatColor = color(col).value(1).hex(); |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
94 } |
2242 | 95 |
96 private startFloatingPick(ev: MouseEvent) { | |
97 if (this.value < (20 as int8)) { | |
98 log("boost"); | |
99 this.value = 255 as int8; | |
2265 | 100 this.updateColorFromHSV(); |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
101 } |
2242 | 102 pickerFloat.startPick(new ClientCoord(ev.clientX, ev.clientY), this.color, (hsc: string) => { |
103 this.hueSatColor = hsc; | |
104 }); | |
2240
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
105 } |
650375a47213
start color-picker port from polymer to lit
drewp@bigasterisk.com
parents:
1991
diff
changeset
|
106 } |