@spectrum-web-components/color-slider 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -85,21 +85,18 @@
85
85
  },
86
86
  {
87
87
  "kind": "field",
88
- "name": "value",
89
- "type": {
90
- "text": "number"
91
- },
92
- "privacy": "public",
93
- "attribute": "value"
88
+ "name": "colorController",
89
+ "privacy": "private",
90
+ "default": "new ColorController(this, {\n /* c8 ignore next 3 */\n applyColorToState: () => {\n this.sliderHandlePosition = 100 * (this.colorController.hue / 360);\n },\n extractColorFromState: (controller) => ({\n ...(controller.getColor('hsl') as HSL),\n h: this.value,\n }),\n maintains: 'saturation',\n })"
94
91
  },
95
92
  {
96
93
  "kind": "field",
97
- "name": "_value",
94
+ "name": "value",
98
95
  "type": {
99
96
  "text": "number"
100
97
  },
101
- "privacy": "private",
102
- "default": "0"
98
+ "privacy": "public",
99
+ "attribute": "value"
103
100
  },
104
101
  {
105
102
  "kind": "field",
@@ -121,35 +118,6 @@
121
118
  "privacy": "public",
122
119
  "attribute": "color"
123
120
  },
124
- {
125
- "kind": "field",
126
- "name": "_color",
127
- "privacy": "private",
128
- "default": "new TinyColor({ h: 0, s: 1, v: 1 })"
129
- },
130
- {
131
- "kind": "field",
132
- "name": "_previousColor",
133
- "privacy": "private",
134
- "default": "new TinyColor({ h: 0, s: 1, v: 1 })"
135
- },
136
- {
137
- "kind": "field",
138
- "name": "_saturation",
139
- "type": {
140
- "text": "number"
141
- },
142
- "privacy": "private"
143
- },
144
- {
145
- "kind": "field",
146
- "name": "_format",
147
- "type": {
148
- "text": "{ format: string; isString: boolean }"
149
- },
150
- "privacy": "private",
151
- "default": "{\n format: '',\n isString: false,\n }"
152
- },
153
121
  {
154
122
  "kind": "field",
155
123
  "name": "step",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/color-slider",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -63,8 +63,9 @@
63
63
  "dependencies": {
64
64
  "@ctrl/tinycolor": "^3.3.3",
65
65
  "@spectrum-web-components/base": "^0.7.0",
66
- "@spectrum-web-components/color-handle": "^0.4.0",
67
- "@spectrum-web-components/shared": "^0.15.0",
66
+ "@spectrum-web-components/color-handle": "^0.4.1",
67
+ "@spectrum-web-components/reactive-controllers": "^0.3.1",
68
+ "@spectrum-web-components/shared": "^0.15.1",
68
69
  "tslib": "^2.0.0"
69
70
  },
70
71
  "devDependencies": {
@@ -76,5 +77,5 @@
76
77
  "./sp-*.js",
77
78
  "./**/*.dev.js"
78
79
  ],
79
- "gitHead": "05c81318844160db3f8156144106e643507fef97"
80
+ "gitHead": "96da2eef637c5d50dd04a75d40a46353116787b4"
80
81
  }
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  import { ColorSlider } from "./src/ColorSlider.dev.js";
2
3
  customElements.define("sp-color-slider", ColorSlider);
3
4
  //# sourceMappingURL=sp-color-slider.dev.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["sp-color-slider.ts"],
4
4
  "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { ColorSlider } from './src/ColorSlider.dev.js'\n\ncustomElements.define('sp-color-slider', ColorSlider);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sp-color-slider': ColorSlider;\n }\n}\n"],
5
- "mappings": "AAYA;AAEA,eAAe,OAAO,mBAAmB,WAAW;",
5
+ "mappings": ";AAYA,SAAS,mBAAmB;AAE5B,eAAe,OAAO,mBAAmB,WAAW;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ColorSlider as e}from"./src/ColorSlider.js";customElements.define("sp-color-slider",e);
1
+ "use strict";import{ColorSlider as e}from"./src/ColorSlider.js";customElements.define("sp-color-slider",e);
2
2
  //# sourceMappingURL=sp-color-slider.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["sp-color-slider.ts"],
4
4
  "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { ColorSlider } from './src/ColorSlider.js';\n\ncustomElements.define('sp-color-slider', ColorSlider);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sp-color-slider': ColorSlider;\n }\n}\n"],
5
- "mappings": "AAYA,mDAEA,eAAe,OAAO,kBAAmB,CAAW",
6
- "names": []
5
+ "mappings": "aAYA,OAAS,eAAAA,MAAmB,uBAE5B,eAAe,OAAO,kBAAmBA,CAAW",
6
+ "names": ["ColorSlider"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
2
2
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
3
3
  import '@spectrum-web-components/color-handle/sp-color-handle.js';
4
- import { ColorValue } from '@spectrum-web-components/color-handle';
4
+ import { ColorValue } from '@spectrum-web-components/reactive-controllers/src/Color.js';
5
5
  /**
6
6
  * @element sp-color-slider
7
7
  * @slot gradient - a custom gradient visually outlining the available color values
@@ -15,16 +15,12 @@ export declare class ColorSlider extends Focusable {
15
15
  private handle;
16
16
  label: string;
17
17
  vertical: boolean;
18
+ private colorController;
18
19
  get value(): number;
19
20
  set value(hue: number);
20
- private _value;
21
21
  sliderHandlePosition: number;
22
22
  get color(): ColorValue;
23
23
  set color(color: ColorValue);
24
- private _color;
25
- private _previousColor;
26
- private _saturation;
27
- private _format;
28
24
  step: number;
29
25
  private get altered();
30
26
  private set altered(value);
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __decorateClass = (decorators, target, key, kind) => {
@@ -20,12 +21,10 @@ import {
20
21
  import { streamingListener } from "@spectrum-web-components/base/src/streaming-listener.js";
21
22
  import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
22
23
  import "@spectrum-web-components/color-handle/sp-color-handle.js";
23
- import styles from "./color-slider.css.js";
24
24
  import {
25
- extractHueAndSaturationRegExp,
26
- replaceHueAndSaturationRegExp
27
- } from "@spectrum-web-components/color-handle";
28
- import { TinyColor } from "@ctrl/tinycolor";
25
+ ColorController
26
+ } from "@spectrum-web-components/reactive-controllers/src/Color.js";
27
+ import styles from "./color-slider.css.js";
29
28
  export class ColorSlider extends Focusable {
30
29
  constructor() {
31
30
  super(...arguments);
@@ -33,14 +32,17 @@ export class ColorSlider extends Focusable {
33
32
  this.focused = false;
34
33
  this.label = "hue";
35
34
  this.vertical = false;
36
- this._value = 0;
35
+ this.colorController = new ColorController(this, {
36
+ applyColorToState: () => {
37
+ this.sliderHandlePosition = 100 * (this.colorController.hue / 360);
38
+ },
39
+ extractColorFromState: (controller) => ({
40
+ ...controller.getColor("hsl"),
41
+ h: this.value
42
+ }),
43
+ maintains: "saturation"
44
+ });
37
45
  this.sliderHandlePosition = 0;
38
- this._color = new TinyColor({ h: 0, s: 1, v: 1 });
39
- this._previousColor = new TinyColor({ h: 0, s: 1, v: 1 });
40
- this._format = {
41
- format: "",
42
- isString: false
43
- };
44
46
  this.step = 1;
45
47
  this._altered = 0;
46
48
  this._pointerDown = false;
@@ -49,90 +51,16 @@ export class ColorSlider extends Focusable {
49
51
  return [styles];
50
52
  }
51
53
  get value() {
52
- return this._value;
54
+ return this.colorController.hue;
53
55
  }
54
56
  set value(hue) {
55
- const value = Math.min(360, Math.max(0, hue));
56
- if (value === this.value) {
57
- return;
58
- }
59
- const oldValue = this.value;
60
- const { s, v } = this._color.toHsv();
61
- this._color = new TinyColor({ h: value, s, v });
62
- this._value = value;
63
- if (value !== this.sliderHandlePosition) {
64
- this.sliderHandlePosition = 100 * (value / 360);
65
- }
66
- this.requestUpdate("value", oldValue);
57
+ this.colorController.hue = hue;
67
58
  }
68
59
  get color() {
69
- switch (this._format.format) {
70
- case "rgb":
71
- return this._format.isString ? this._color.toRgbString() : this._color.toRgb();
72
- case "prgb":
73
- return this._format.isString ? this._color.toPercentageRgbString() : this._color.toPercentageRgb();
74
- case "hex":
75
- case "hex3":
76
- case "hex4":
77
- case "hex6":
78
- return this._format.isString ? this._color.toHexString() : this._color.toHex();
79
- case "hex8":
80
- return this._format.isString ? this._color.toHex8String() : this._color.toHex8();
81
- case "name":
82
- return this._color.toName() || this._color.toRgbString();
83
- case "hsl":
84
- if (this._format.isString) {
85
- const hslString = this._color.toHslString();
86
- return hslString.replace(replaceHueAndSaturationRegExp, `$1${this.value}$2${this._saturation}`);
87
- } else {
88
- const { s, l, a } = this._color.toHsl();
89
- return { h: this.value, s, l, a };
90
- }
91
- case "hsv":
92
- if (this._format.isString) {
93
- const hsvString = this._color.toHsvString();
94
- return hsvString.replace(replaceHueAndSaturationRegExp, `$1${this.value}$2${this._saturation}`);
95
- } else {
96
- const { s, v, a } = this._color.toHsv();
97
- return { h: this.value, s, v, a };
98
- }
99
- default:
100
- return "No color format applied.";
101
- }
60
+ return this.colorController.color;
102
61
  }
103
62
  set color(color) {
104
- if (color === this.color) {
105
- return;
106
- }
107
- const oldValue = this._color;
108
- this._color = new TinyColor(color);
109
- const format = this._color.format;
110
- let isString = typeof color === "string" || color instanceof String;
111
- if (format.startsWith("hex")) {
112
- isString = color.startsWith("#");
113
- }
114
- this._format = {
115
- format,
116
- isString
117
- };
118
- if (isString && format.startsWith("hs")) {
119
- const values = extractHueAndSaturationRegExp.exec(color);
120
- if (values !== null) {
121
- const [, h, s] = values;
122
- this.value = Number(h);
123
- this._saturation = Number(s);
124
- }
125
- } else if (!isString && format.startsWith("hs")) {
126
- const colorInput = this._color.originalInput;
127
- const colorValues = Object.values(colorInput);
128
- this.value = colorValues[0];
129
- this._saturation = colorValues[1];
130
- } else {
131
- const { h } = this._color.toHsv();
132
- this.value = h;
133
- }
134
- this._previousColor = oldValue;
135
- this.requestUpdate("color", oldValue);
63
+ this.colorController.color = color;
136
64
  }
137
65
  get altered() {
138
66
  return this._altered;
@@ -147,7 +75,9 @@ export class ColorSlider extends Focusable {
147
75
  handleKeydown(event) {
148
76
  const { key } = event;
149
77
  this.focused = true;
150
- this.altered = [event.shiftKey, event.ctrlKey, event.altKey].filter((key2) => !!key2).length;
78
+ this.altered = [event.shiftKey, event.ctrlKey, event.altKey].filter(
79
+ (key2) => !!key2
80
+ ).length;
151
81
  let delta = 0;
152
82
  switch (key) {
153
83
  case "ArrowUp":
@@ -166,32 +96,41 @@ export class ColorSlider extends Focusable {
166
96
  return;
167
97
  }
168
98
  event.preventDefault();
169
- this.sliderHandlePosition = Math.min(100, Math.max(0, this.sliderHandlePosition + delta));
99
+ this.sliderHandlePosition = Math.min(
100
+ 100,
101
+ Math.max(0, this.sliderHandlePosition + delta)
102
+ );
170
103
  this.value = 360 * (this.sliderHandlePosition / 100);
171
- this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });
104
+ this.colorController.applyColorFromState();
172
105
  if (delta != 0) {
173
- this.dispatchEvent(new Event("input", {
174
- bubbles: true,
175
- composed: true
176
- }));
177
- this.dispatchEvent(new Event("change", {
178
- bubbles: true,
179
- composed: true
180
- }));
106
+ this.dispatchEvent(
107
+ new Event("input", {
108
+ bubbles: true,
109
+ composed: true
110
+ })
111
+ );
112
+ this.dispatchEvent(
113
+ new Event("change", {
114
+ bubbles: true,
115
+ composed: true
116
+ })
117
+ );
181
118
  }
182
119
  }
183
120
  handleInput(event) {
184
121
  const { valueAsNumber } = event.target;
185
122
  this.value = valueAsNumber;
186
123
  this.sliderHandlePosition = 100 * (this.value / 360);
187
- this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });
124
+ this.colorController.applyColorFromState();
188
125
  }
189
126
  handleChange(event) {
190
127
  this.handleInput(event);
191
- this.dispatchEvent(new Event("change", {
192
- bubbles: true,
193
- composed: true
194
- }));
128
+ this.dispatchEvent(
129
+ new Event("change", {
130
+ bubbles: true,
131
+ composed: true
132
+ })
133
+ );
195
134
  }
196
135
  focus(focusOptions = {}) {
197
136
  super.focus(focusOptions);
@@ -217,7 +156,7 @@ export class ColorSlider extends Focusable {
217
156
  return;
218
157
  }
219
158
  this._pointerDown = true;
220
- this._previousColor = this._color.clone();
159
+ this.colorController.savePreviousColor();
221
160
  this.boundingClientRect = this.getBoundingClientRect();
222
161
  event.target.setPointerCapture(event.pointerId);
223
162
  if (event.pointerType === "mouse") {
@@ -227,23 +166,27 @@ export class ColorSlider extends Focusable {
227
166
  handlePointermove(event) {
228
167
  this.sliderHandlePosition = this.calculateHandlePosition(event);
229
168
  this.value = 360 * (this.sliderHandlePosition / 100);
230
- this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });
231
- this.dispatchEvent(new Event("input", {
232
- bubbles: true,
233
- composed: true,
234
- cancelable: true
235
- }));
169
+ this.colorController.applyColorFromState();
170
+ this.dispatchEvent(
171
+ new Event("input", {
172
+ bubbles: true,
173
+ composed: true,
174
+ cancelable: true
175
+ })
176
+ );
236
177
  }
237
178
  handlePointerup(event) {
238
179
  this._pointerDown = false;
239
180
  event.target.releasePointerCapture(event.pointerId);
240
- const applyDefault = this.dispatchEvent(new Event("change", {
241
- bubbles: true,
242
- composed: true,
243
- cancelable: true
244
- }));
181
+ const applyDefault = this.dispatchEvent(
182
+ new Event("change", {
183
+ bubbles: true,
184
+ composed: true,
185
+ cancelable: true
186
+ })
187
+ );
245
188
  if (!applyDefault) {
246
- this._color = this._previousColor;
189
+ this.colorController.restorePreviousColor();
247
190
  }
248
191
  this.focus();
249
192
  if (event.pointerType === "mouse") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["ColorSlider.ts"],
4
- "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport '@spectrum-web-components/color-handle/sp-color-handle.js';\nimport styles from './color-slider.css.js';\nimport {\n ColorHandle,\n ColorValue,\n extractHueAndSaturationRegExp,\n replaceHueAndSaturationRegExp,\n} from '@spectrum-web-components/color-handle';\nimport { TinyColor } from '@ctrl/tinycolor';\n\n/**\n * @element sp-color-slider\n * @slot gradient - a custom gradient visually outlining the available color values\n * @fires input - The value of the Color Slider has changed.\n * @fires change - An alteration to the value of the Color Slider has been committed by the user.\n */\nexport class ColorSlider extends Focusable {\n public static override get styles(): CSSResultArray {\n return [styles];\n }\n\n @property({ type: Boolean, reflect: true })\n public override disabled = false;\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.handle')\n private handle!: ColorHandle;\n\n @property({ type: String })\n public label = 'hue';\n\n @property({ type: Boolean, reflect: true })\n public vertical = false;\n\n @property({ type: Number })\n public get value(): number {\n return this._value;\n }\n\n public set value(hue: number) {\n const value = Math.min(360, Math.max(0, hue));\n if (value === this.value) {\n return;\n }\n const oldValue = this.value;\n const { s, v } = this._color.toHsv();\n this._color = new TinyColor({ h: value, s, v });\n this._value = value;\n\n if (value !== this.sliderHandlePosition) {\n this.sliderHandlePosition = 100 * (value / 360);\n }\n\n this.requestUpdate('value', oldValue);\n }\n\n private _value = 0;\n\n @property({ type: Number, reflect: true })\n public sliderHandlePosition = 0;\n\n @property({ type: String })\n public get color(): ColorValue {\n switch (this._format.format) {\n case 'rgb':\n return this._format.isString\n ? this._color.toRgbString()\n : this._color.toRgb();\n case 'prgb':\n return this._format.isString\n ? this._color.toPercentageRgbString()\n : this._color.toPercentageRgb();\n case 'hex':\n case 'hex3':\n case 'hex4':\n case 'hex6':\n return this._format.isString\n ? this._color.toHexString()\n : this._color.toHex();\n case 'hex8':\n return this._format.isString\n ? this._color.toHex8String()\n : this._color.toHex8();\n case 'name':\n return this._color.toName() || this._color.toRgbString();\n case 'hsl':\n if (this._format.isString) {\n const hslString = this._color.toHslString();\n return hslString.replace(\n replaceHueAndSaturationRegExp,\n `$1${this.value}$2${this._saturation}`\n );\n } else {\n const { s, l, a } = this._color.toHsl();\n return { h: this.value, s, l, a };\n }\n case 'hsv':\n if (this._format.isString) {\n const hsvString = this._color.toHsvString();\n return hsvString.replace(\n replaceHueAndSaturationRegExp,\n `$1${this.value}$2${this._saturation}`\n );\n } else {\n const { s, v, a } = this._color.toHsv();\n return { h: this.value, s, v, a };\n }\n default:\n return 'No color format applied.';\n }\n }\n\n public set color(color: ColorValue) {\n if (color === this.color) {\n return;\n }\n const oldValue = this._color;\n this._color = new TinyColor(color);\n const format = this._color.format;\n let isString = typeof color === 'string' || color instanceof String;\n\n if (format.startsWith('hex')) {\n isString = (color as string).startsWith('#');\n }\n\n this._format = {\n format,\n isString,\n };\n\n if (isString && format.startsWith('hs')) {\n const values = extractHueAndSaturationRegExp.exec(color as string);\n if (values !== null) {\n const [, h, s] = values;\n this.value = Number(h);\n this._saturation = Number(s);\n }\n } else if (!isString && format.startsWith('hs')) {\n const colorInput = this._color.originalInput;\n const colorValues = Object.values(colorInput);\n this.value = colorValues[0];\n this._saturation = colorValues[1];\n } else {\n const { h } = this._color.toHsv();\n this.value = h;\n }\n this._previousColor = oldValue;\n this.requestUpdate('color', oldValue);\n }\n\n private _color = new TinyColor({ h: 0, s: 1, v: 1 });\n\n private _previousColor = new TinyColor({ h: 0, s: 1, v: 1 });\n\n private _saturation!: number;\n\n private _format: { format: string; isString: boolean } = {\n format: '',\n isString: false,\n };\n\n @property({ type: Number })\n public step = 1;\n\n private get altered(): number {\n return this._altered;\n }\n\n private set altered(altered: number) {\n this._altered = altered;\n this.step = Math.max(1, this.altered * 10);\n }\n\n private _altered = 0;\n\n @query('input')\n public input!: HTMLInputElement;\n\n public override get focusElement(): HTMLInputElement {\n return this.input;\n }\n\n private handleKeydown(event: KeyboardEvent): void {\n const { key } = event;\n this.focused = true;\n this.altered = [event.shiftKey, event.ctrlKey, event.altKey].filter(\n (key) => !!key\n ).length;\n let delta = 0;\n switch (key) {\n case 'ArrowUp':\n delta = this.step;\n break;\n case 'ArrowDown':\n delta = -this.step;\n break;\n case 'ArrowLeft':\n delta = this.step * (this.isLTR ? -1 : 1);\n break;\n case 'ArrowRight':\n delta = this.step * (this.isLTR ? 1 : -1);\n break;\n default:\n return;\n }\n event.preventDefault();\n\n this.sliderHandlePosition = Math.min(\n 100,\n Math.max(0, this.sliderHandlePosition + delta)\n );\n this.value = 360 * (this.sliderHandlePosition / 100);\n this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });\n\n if (delta != 0) {\n this.dispatchEvent(\n new Event('input', {\n bubbles: true,\n composed: true,\n })\n );\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n private handleInput(event: Event & { target: HTMLInputElement }): void {\n const { valueAsNumber } = event.target;\n\n this.value = valueAsNumber;\n this.sliderHandlePosition = 100 * (this.value / 360);\n this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });\n }\n\n private handleChange(event: Event & { target: HTMLInputElement }): void {\n this.handleInput(event);\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n public override focus(focusOptions: FocusOptions = {}): void {\n super.focus(focusOptions);\n this.forwardFocus();\n }\n\n private forwardFocus(): void {\n this.focused = this.hasVisibleFocusInTree();\n this.input.focus();\n }\n\n private handleFocusin(): void {\n this.focused = true;\n }\n\n private handleFocusout(): void {\n if (this._pointerDown) {\n return;\n }\n this.altered = 0;\n this.focused = false;\n }\n\n private boundingClientRect!: DOMRect;\n private _pointerDown = false;\n\n private handlePointerdown(event: PointerEvent): void {\n if (event.button !== 0) {\n event.preventDefault();\n return;\n }\n this._pointerDown = true;\n this._previousColor = this._color.clone();\n this.boundingClientRect = this.getBoundingClientRect();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n if (event.pointerType === 'mouse') {\n this.focused = true;\n }\n }\n\n private handlePointermove(event: PointerEvent): void {\n this.sliderHandlePosition = this.calculateHandlePosition(event);\n this.value = 360 * (this.sliderHandlePosition / 100);\n\n this._color = new TinyColor({ ...this._color.toHsl(), h: this.value });\n\n this.dispatchEvent(\n new Event('input', {\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n }\n\n private handlePointerup(event: PointerEvent): void {\n this._pointerDown = false;\n (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n\n const applyDefault = this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n if (!applyDefault) {\n this._color = this._previousColor;\n }\n // Retain focus on input element after mouse up to enable keyboard interactions\n this.focus();\n if (event.pointerType === 'mouse') {\n this.focused = false;\n }\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(event: PointerEvent): number {\n /* c8 ignore next 3 */\n if (!this.boundingClientRect) {\n return this.sliderHandlePosition;\n }\n const rect = this.boundingClientRect;\n const minOffset = this.vertical ? rect.top : rect.left;\n const offset = this.vertical ? event.clientY : event.clientX;\n const size = this.vertical ? rect.height : rect.width;\n\n const percent = Math.max(0, Math.min(1, (offset - minOffset) / size));\n const sliderHandlePosition = 100 * percent;\n\n return sliderHandlePosition;\n }\n\n private handleGradientPointerdown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n this.handle.dispatchEvent(new PointerEvent('pointerdown', event));\n this.handlePointermove(event);\n }\n\n private get handlePositionStyles(): string {\n return `${this.vertical ? 'top' : 'left'}: ${\n this.sliderHandlePosition\n }%`;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div\n class=\"checkerboard\"\n role=\"presentation\"\n @pointerdown=${this.handleGradientPointerdown}\n >\n <div\n class=\"gradient\"\n role=\"presentation\"\n style=\"background: linear-gradient(to ${this.vertical\n ? 'bottom'\n : 'right'}, var(--sp-color-slider-gradient, var(--sp-color-slider-gradient-fallback)));\"\n >\n <slot name=\"gradient\"></slot>\n </div>\n </div>\n <sp-color-handle\n tabindex=${ifDefined(this.focused ? undefined : '0')}\n @focus=${this.forwardFocus}\n ?focused=${this.focused}\n class=\"handle\"\n color=\"hsl(${this.value}, 100%, 50%)\"\n ?disabled=${this.disabled}\n style=${this.handlePositionStyles}\n ${streamingListener({\n start: ['pointerdown', this.handlePointerdown],\n streamInside: ['pointermove', this.handlePointermove],\n end: [['pointerup', 'pointercancel'], this.handlePointerup],\n })}\n ></sp-color-handle>\n <input\n type=\"range\"\n class=\"slider\"\n min=\"0\"\n max=\"360\"\n step=${this.step}\n aria-label=${this.label}\n .value=${String(this.value)}\n @input=${this.handleInput}\n @change=${this.handleChange}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n this.boundingClientRect = this.getBoundingClientRect();\n this.addEventListener('focusin', this.handleFocusin);\n this.addEventListener('focusout', this.handleFocusout);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport { ifDefined } from '@spectrum-web-components/base/src/directives.js';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport type { ColorHandle } from '@spectrum-web-components/color-handle';\nimport '@spectrum-web-components/color-handle/sp-color-handle.js';\nimport {\n ColorController,\n ColorValue,\n HSL,\n} from '@spectrum-web-components/reactive-controllers/src/Color.js';\n\nimport styles from './color-slider.css.js';\n\n/**\n * @element sp-color-slider\n * @slot gradient - a custom gradient visually outlining the available color values\n * @fires input - The value of the Color Slider has changed.\n * @fires change - An alteration to the value of the Color Slider has been committed by the user.\n */\nexport class ColorSlider extends Focusable {\n public static override get styles(): CSSResultArray {\n return [styles];\n }\n\n @property({ type: Boolean, reflect: true })\n public override disabled = false;\n\n @property({ type: Boolean, reflect: true })\n public focused = false;\n\n @query('.handle')\n private handle!: ColorHandle;\n\n @property({ type: String })\n public label = 'hue';\n\n @property({ type: Boolean, reflect: true })\n public vertical = false;\n\n private colorController = new ColorController(this, {\n /* c8 ignore next 3 */\n applyColorToState: () => {\n this.sliderHandlePosition = 100 * (this.colorController.hue / 360);\n },\n extractColorFromState: (controller) => ({\n ...(controller.getColor('hsl') as HSL),\n h: this.value,\n }),\n maintains: 'saturation',\n });\n\n @property({ type: Number })\n public get value(): number {\n return this.colorController.hue;\n }\n\n public set value(hue: number) {\n this.colorController.hue = hue;\n }\n\n @property({ type: Number, reflect: true })\n public sliderHandlePosition = 0;\n\n @property({ type: String })\n public get color(): ColorValue {\n return this.colorController.color;\n }\n\n public set color(color: ColorValue) {\n this.colorController.color = color;\n }\n\n @property({ type: Number })\n public step = 1;\n\n private get altered(): number {\n return this._altered;\n }\n\n private set altered(altered: number) {\n this._altered = altered;\n this.step = Math.max(1, this.altered * 10);\n }\n\n private _altered = 0;\n\n @query('input')\n public input!: HTMLInputElement;\n\n public override get focusElement(): HTMLInputElement {\n return this.input;\n }\n\n private handleKeydown(event: KeyboardEvent): void {\n const { key } = event;\n this.focused = true;\n this.altered = [event.shiftKey, event.ctrlKey, event.altKey].filter(\n (key) => !!key\n ).length;\n let delta = 0;\n switch (key) {\n case 'ArrowUp':\n delta = this.step;\n break;\n case 'ArrowDown':\n delta = -this.step;\n break;\n case 'ArrowLeft':\n delta = this.step * (this.isLTR ? -1 : 1);\n break;\n case 'ArrowRight':\n delta = this.step * (this.isLTR ? 1 : -1);\n break;\n default:\n return;\n }\n event.preventDefault();\n\n this.sliderHandlePosition = Math.min(\n 100,\n Math.max(0, this.sliderHandlePosition + delta)\n );\n this.value = 360 * (this.sliderHandlePosition / 100);\n this.colorController.applyColorFromState();\n\n if (delta != 0) {\n this.dispatchEvent(\n new Event('input', {\n bubbles: true,\n composed: true,\n })\n );\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n private handleInput(event: Event & { target: HTMLInputElement }): void {\n const { valueAsNumber } = event.target;\n\n this.value = valueAsNumber;\n this.sliderHandlePosition = 100 * (this.value / 360);\n this.colorController.applyColorFromState();\n }\n\n private handleChange(event: Event & { target: HTMLInputElement }): void {\n this.handleInput(event);\n this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n public override focus(focusOptions: FocusOptions = {}): void {\n super.focus(focusOptions);\n this.forwardFocus();\n }\n\n private forwardFocus(): void {\n this.focused = this.hasVisibleFocusInTree();\n this.input.focus();\n }\n\n private handleFocusin(): void {\n this.focused = true;\n }\n\n private handleFocusout(): void {\n if (this._pointerDown) {\n return;\n }\n this.altered = 0;\n this.focused = false;\n }\n\n private boundingClientRect!: DOMRect;\n private _pointerDown = false;\n\n private handlePointerdown(event: PointerEvent): void {\n if (event.button !== 0) {\n event.preventDefault();\n return;\n }\n this._pointerDown = true;\n this.colorController.savePreviousColor();\n this.boundingClientRect = this.getBoundingClientRect();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n if (event.pointerType === 'mouse') {\n this.focused = true;\n }\n }\n\n private handlePointermove(event: PointerEvent): void {\n this.sliderHandlePosition = this.calculateHandlePosition(event);\n this.value = 360 * (this.sliderHandlePosition / 100);\n\n this.colorController.applyColorFromState();\n\n this.dispatchEvent(\n new Event('input', {\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n }\n\n private handlePointerup(event: PointerEvent): void {\n this._pointerDown = false;\n (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n\n const applyDefault = this.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n if (!applyDefault) {\n this.colorController.restorePreviousColor();\n }\n // Retain focus on input element after mouse up to enable keyboard interactions\n this.focus();\n if (event.pointerType === 'mouse') {\n this.focused = false;\n }\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(event: PointerEvent): number {\n /* c8 ignore next 3 */\n if (!this.boundingClientRect) {\n return this.sliderHandlePosition;\n }\n const rect = this.boundingClientRect;\n const minOffset = this.vertical ? rect.top : rect.left;\n const offset = this.vertical ? event.clientY : event.clientX;\n const size = this.vertical ? rect.height : rect.width;\n\n const percent = Math.max(0, Math.min(1, (offset - minOffset) / size));\n const sliderHandlePosition = 100 * percent;\n\n return sliderHandlePosition;\n }\n\n private handleGradientPointerdown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n this.handle.dispatchEvent(new PointerEvent('pointerdown', event));\n this.handlePointermove(event);\n }\n\n private get handlePositionStyles(): string {\n return `${this.vertical ? 'top' : 'left'}: ${\n this.sliderHandlePosition\n }%`;\n }\n\n protected override render(): TemplateResult {\n return html`\n <div\n class=\"checkerboard\"\n role=\"presentation\"\n @pointerdown=${this.handleGradientPointerdown}\n >\n <div\n class=\"gradient\"\n role=\"presentation\"\n style=\"background: linear-gradient(to ${this.vertical\n ? 'bottom'\n : 'right'}, var(--sp-color-slider-gradient, var(--sp-color-slider-gradient-fallback)));\"\n >\n <slot name=\"gradient\"></slot>\n </div>\n </div>\n <sp-color-handle\n tabindex=${ifDefined(this.focused ? undefined : '0')}\n @focus=${this.forwardFocus}\n ?focused=${this.focused}\n class=\"handle\"\n color=\"hsl(${this.value}, 100%, 50%)\"\n ?disabled=${this.disabled}\n style=${this.handlePositionStyles}\n ${streamingListener({\n start: ['pointerdown', this.handlePointerdown],\n streamInside: ['pointermove', this.handlePointermove],\n end: [['pointerup', 'pointercancel'], this.handlePointerup],\n })}\n ></sp-color-handle>\n <input\n type=\"range\"\n class=\"slider\"\n min=\"0\"\n max=\"360\"\n step=${this.step}\n aria-label=${this.label}\n .value=${String(this.value)}\n @input=${this.handleInput}\n @change=${this.handleChange}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n this.boundingClientRect = this.getBoundingClientRect();\n this.addEventListener('focusin', this.handleFocusin);\n this.addEventListener('focusout', this.handleFocusout);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;AAYA;AAAA,EAEI;AAAA,OAGG;AACP,SAAS,iBAAiB;AAC1B;AAAA,EACI;AAAA,EACA;AAAA,OACG;AACP,SAAS,yBAAyB;AAClC,SAAS,iBAAiB;AAE1B,OAAO;AACP;AAAA,EACI;AAAA,OAGG;AAEP,OAAO,YAAY;AAQZ,aAAM,oBAAoB,UAAU;AAAA,EAApC;AAAA;AAMH,SAAgB,WAAW;AAG3B,SAAO,UAAU;AAMjB,SAAO,QAAQ;AAGf,SAAO,WAAW;AAElB,SAAQ,kBAAkB,IAAI,gBAAgB,MAAM;AAAA,MAEhD,mBAAmB,MAAM;AACrB,aAAK,uBAAuB,OAAO,KAAK,gBAAgB,MAAM;AAAA,MAClE;AAAA,MACA,uBAAuB,CAAC,gBAAgB;AAAA,QACpC,GAAI,WAAW,SAAS,KAAK;AAAA,QAC7B,GAAG,KAAK;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,IACf,CAAC;AAYD,SAAO,uBAAuB;AAY9B,SAAO,OAAO;AAWd,SAAQ,WAAW;AAkGnB,SAAQ,eAAe;AAAA;AAAA,EAlKvB,WAA2B,SAAyB;AAChD,WAAO,CAAC,MAAM;AAAA,EAClB;AAAA,EA8BA,IAAW,QAAgB;AACvB,WAAO,KAAK,gBAAgB;AAAA,EAChC;AAAA,EAEA,IAAW,MAAM,KAAa;AAC1B,SAAK,gBAAgB,MAAM;AAAA,EAC/B;AAAA,EAMA,IAAW,QAAoB;AAC3B,WAAO,KAAK,gBAAgB;AAAA,EAChC;AAAA,EAEA,IAAW,MAAM,OAAmB;AAChC,SAAK,gBAAgB,QAAQ;AAAA,EACjC;AAAA,EAKA,IAAY,UAAkB;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAY,QAAQ,SAAiB;AACjC,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK,IAAI,GAAG,KAAK,UAAU,EAAE;AAAA,EAC7C;AAAA,EAOA,IAAoB,eAAiC;AACjD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,cAAc,OAA4B;AAC9C,UAAM,EAAE,IAAI,IAAI;AAChB,SAAK,UAAU;AACf,SAAK,UAAU,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,MAAM,EAAE;AAAA,MACzD,CAACA,SAAQ,CAAC,CAACA;AAAA,IACf,EAAE;AACF,QAAI,QAAQ;AACZ,YAAQ;AAAA,WACC;AACD,gBAAQ,KAAK;AACb;AAAA,WACC;AACD,gBAAQ,CAAC,KAAK;AACd;AAAA,WACC;AACD,gBAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK;AACvC;AAAA,WACC;AACD,gBAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACtC;AAAA;AAEA;AAAA;AAER,UAAM,eAAe;AAErB,SAAK,uBAAuB,KAAK;AAAA,MAC7B;AAAA,MACA,KAAK,IAAI,GAAG,KAAK,uBAAuB,KAAK;AAAA,IACjD;AACA,SAAK,QAAQ,OAAO,KAAK,uBAAuB;AAChD,SAAK,gBAAgB,oBAAoB;AAEzC,QAAI,SAAS,GAAG;AACZ,WAAK;AAAA,QACD,IAAI,MAAM,SAAS;AAAA,UACf,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AACA,WAAK;AAAA,QACD,IAAI,MAAM,UAAU;AAAA,UAChB,SAAS;AAAA,UACT,UAAU;AAAA,QACd,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,YAAY,OAAmD;AACnE,UAAM,EAAE,cAAc,IAAI,MAAM;AAEhC,SAAK,QAAQ;AACb,SAAK,uBAAuB,OAAO,KAAK,QAAQ;AAChD,SAAK,gBAAgB,oBAAoB;AAAA,EAC7C;AAAA,EAEQ,aAAa,OAAmD;AACpE,SAAK,YAAY,KAAK;AACtB,SAAK;AAAA,MACD,IAAI,MAAM,UAAU;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEgB,MAAM,eAA6B,CAAC,GAAS;AACzD,UAAM,MAAM,YAAY;AACxB,SAAK,aAAa;AAAA,EACtB;AAAA,EAEQ,eAAqB;AACzB,SAAK,UAAU,KAAK,sBAAsB;AAC1C,SAAK,MAAM,MAAM;AAAA,EACrB;AAAA,EAEQ,gBAAsB;AAC1B,SAAK,UAAU;AAAA,EACnB;AAAA,EAEQ,iBAAuB;AAC3B,QAAI,KAAK,cAAc;AACnB;AAAA,IACJ;AACA,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACnB;AAAA,EAKQ,kBAAkB,OAA2B;AACjD,QAAI,MAAM,WAAW,GAAG;AACpB,YAAM,eAAe;AACrB;AAAA,IACJ;AACA,SAAK,eAAe;AACpB,SAAK,gBAAgB,kBAAkB;AACvC,SAAK,qBAAqB,KAAK,sBAAsB;AACrD,IAAC,MAAM,OAAuB,kBAAkB,MAAM,SAAS;AAC/D,QAAI,MAAM,gBAAgB,SAAS;AAC/B,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EAEQ,kBAAkB,OAA2B;AACjD,SAAK,uBAAuB,KAAK,wBAAwB,KAAK;AAC9D,SAAK,QAAQ,OAAO,KAAK,uBAAuB;AAEhD,SAAK,gBAAgB,oBAAoB;AAEzC,SAAK;AAAA,MACD,IAAI,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,gBAAgB,OAA2B;AAC/C,SAAK,eAAe;AACpB,IAAC,MAAM,OAAuB,sBAAsB,MAAM,SAAS;AAEnE,UAAM,eAAe,KAAK;AAAA,MACtB,IAAI,MAAM,UAAU;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AACA,QAAI,CAAC,cAAc;AACf,WAAK,gBAAgB,qBAAqB;AAAA,IAC9C;AAEA,SAAK,MAAM;AACX,QAAI,MAAM,gBAAgB,SAAS;AAC/B,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EAOQ,wBAAwB,OAA6B;AAEzD,QAAI,CAAC,KAAK,oBAAoB;AAC1B,aAAO,KAAK;AAAA,IAChB;AACA,UAAM,OAAO,KAAK;AAClB,UAAM,YAAY,KAAK,WAAW,KAAK,MAAM,KAAK;AAClD,UAAM,SAAS,KAAK,WAAW,MAAM,UAAU,MAAM;AACrD,UAAM,OAAO,KAAK,WAAW,KAAK,SAAS,KAAK;AAEhD,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,aAAa,IAAI,CAAC;AACpE,UAAM,uBAAuB,MAAM;AAEnC,WAAO;AAAA,EACX;AAAA,EAEQ,0BAA0B,OAA2B;AACzD,QAAI,MAAM,WAAW,GAAG;AACpB;AAAA,IACJ;AACA,UAAM,gBAAgB;AACtB,UAAM,eAAe;AACrB,SAAK,OAAO,cAAc,IAAI,aAAa,eAAe,KAAK,CAAC;AAChE,SAAK,kBAAkB,KAAK;AAAA,EAChC;AAAA,EAEA,IAAY,uBAA+B;AACvC,WAAO,GAAG,KAAK,WAAW,QAAQ,WAC9B,KAAK;AAAA,EAEb;AAAA,EAEmB,SAAyB;AACxC,WAAO;AAAA;AAAA;AAAA;AAAA,+BAIgB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,4DAKwB,KAAK,WACvC,WACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAMC,UAAU,KAAK,UAAU,SAAY,GAAG;AAAA,yBAC1C,KAAK;AAAA,2BACH,KAAK;AAAA;AAAA,6BAEH,KAAK;AAAA,4BACN,KAAK;AAAA,wBACT,KAAK;AAAA,kBACX,kBAAkB;AAAA,MAChB,OAAO,CAAC,eAAe,KAAK,iBAAiB;AAAA,MAC7C,cAAc,CAAC,eAAe,KAAK,iBAAiB;AAAA,MACpD,KAAK,CAAC,CAAC,aAAa,eAAe,GAAG,KAAK,eAAe;AAAA,IAC9D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOM,KAAK;AAAA,6BACC,KAAK;AAAA,yBACT,OAAO,KAAK,KAAK;AAAA,yBACjB,KAAK;AAAA,0BACJ,KAAK;AAAA,2BACJ,KAAK;AAAA;AAAA;AAAA,EAG5B;AAAA,EAEmB,aAAa,SAA+B;AAC3D,UAAM,aAAa,OAAO;AAC1B,SAAK,qBAAqB,KAAK,sBAAsB;AACrD,SAAK,iBAAiB,WAAW,KAAK,aAAa;AACnD,SAAK,iBAAiB,YAAY,KAAK,cAAc;AAAA,EACzD;AACJ;AA1SoB;AAAA,EADf,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GALjC,YAMO;AAGT;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GARjC,YASF;AAGC;AAAA,EADP,MAAM,SAAS;AAAA,GAXP,YAYD;AAGD;AAAA,EADN,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAdjB,YAeF;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjBjC,YAkBF;AAeI;AAAA,EADV,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAhCjB,YAiCE;AASJ;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAzChC,YA0CF;AAGI;AAAA,EADV,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA5CjB,YA6CE;AASJ;AAAA,EADN,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GArDjB,YAsDF;AAcA;AAAA,EADN,MAAM,OAAO;AAAA,GAnEL,YAoEF;",
6
+ "names": ["key"]
7
7
  }
@@ -1,4 +1,4 @@
1
- var p=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var o=(h,t,e,i)=>{for(var s=i>1?void 0:i?v(t,e):t,r=h.length-1,n;r>=0;r--)(n=h[r])&&(s=(i?n(t,e,s):n(s))||s);return i&&s&&p(t,e,s),s};import{html as f}from"@spectrum-web-components/base";import{ifDefined as m}from"@spectrum-web-components/base/src/directives.js";import{property as a,query as c}from"@spectrum-web-components/base/src/decorators.js";import{streamingListener as g}from"@spectrum-web-components/base/src/streaming-listener.js";import{Focusable as b}from"@spectrum-web-components/shared/src/focusable.js";import"@spectrum-web-components/color-handle/sp-color-handle.js";import _ from"./color-slider.css.js";import{extractHueAndSaturationRegExp as P,replaceHueAndSaturationRegExp as d}from"@spectrum-web-components/color-handle";import{TinyColor as l}from"@ctrl/tinycolor";export class ColorSlider extends b{constructor(){super(...arguments);this.disabled=!1;this.focused=!1;this.label="hue";this.vertical=!1;this._value=0;this.sliderHandlePosition=0;this._color=new l({h:0,s:1,v:1});this._previousColor=new l({h:0,s:1,v:1});this._format={format:"",isString:!1};this.step=1;this._altered=0;this._pointerDown=!1}static get styles(){return[_]}get value(){return this._value}set value(t){const e=Math.min(360,Math.max(0,t));if(e===this.value)return;const i=this.value,{s,v:r}=this._color.toHsv();this._color=new l({h:e,s,v:r}),this._value=e,e!==this.sliderHandlePosition&&(this.sliderHandlePosition=100*(e/360)),this.requestUpdate("value",i)}get color(){switch(this._format.format){case"rgb":return this._format.isString?this._color.toRgbString():this._color.toRgb();case"prgb":return this._format.isString?this._color.toPercentageRgbString():this._color.toPercentageRgb();case"hex":case"hex3":case"hex4":case"hex6":return this._format.isString?this._color.toHexString():this._color.toHex();case"hex8":return this._format.isString?this._color.toHex8String():this._color.toHex8();case"name":return this._color.toName()||this._color.toRgbString();case"hsl":if(this._format.isString)return this._color.toHslString().replace(d,`$1${this.value}$2${this._saturation}`);{const{s:t,l:e,a:i}=this._color.toHsl();return{h:this.value,s:t,l:e,a:i}}case"hsv":if(this._format.isString)return this._color.toHsvString().replace(d,`$1${this.value}$2${this._saturation}`);{const{s:t,v:e,a:i}=this._color.toHsv();return{h:this.value,s:t,v:e,a:i}}default:return"No color format applied."}}set color(t){if(t===this.color)return;const e=this._color;this._color=new l(t);const i=this._color.format;let s=typeof t=="string"||t instanceof String;if(i.startsWith("hex")&&(s=t.startsWith("#")),this._format={format:i,isString:s},s&&i.startsWith("hs")){const r=P.exec(t);if(r!==null){const[,n,u]=r;this.value=Number(n),this._saturation=Number(u)}}else if(!s&&i.startsWith("hs")){const r=this._color.originalInput,n=Object.values(r);this.value=n[0],this._saturation=n[1]}else{const{h:r}=this._color.toHsv();this.value=r}this._previousColor=e,this.requestUpdate("color",e)}get altered(){return this._altered}set altered(t){this._altered=t,this.step=Math.max(1,this.altered*10)}get focusElement(){return this.input}handleKeydown(t){const{key:e}=t;this.focused=!0,this.altered=[t.shiftKey,t.ctrlKey,t.altKey].filter(s=>!!s).length;let i=0;switch(e){case"ArrowUp":i=this.step;break;case"ArrowDown":i=-this.step;break;case"ArrowLeft":i=this.step*(this.isLTR?-1:1);break;case"ArrowRight":i=this.step*(this.isLTR?1:-1);break;default:return}t.preventDefault(),this.sliderHandlePosition=Math.min(100,Math.max(0,this.sliderHandlePosition+i)),this.value=360*(this.sliderHandlePosition/100),this._color=new l({...this._color.toHsl(),h:this.value}),i!=0&&(this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0})),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0})))}handleInput(t){const{valueAsNumber:e}=t.target;this.value=e,this.sliderHandlePosition=100*(this.value/360),this._color=new l({...this._color.toHsl(),h:this.value})}handleChange(t){this.handleInput(t),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}focus(t={}){super.focus(t),this.forwardFocus()}forwardFocus(){this.focused=this.hasVisibleFocusInTree(),this.input.focus()}handleFocusin(){this.focused=!0}handleFocusout(){this._pointerDown||(this.altered=0,this.focused=!1)}handlePointerdown(t){if(t.button!==0){t.preventDefault();return}this._pointerDown=!0,this._previousColor=this._color.clone(),this.boundingClientRect=this.getBoundingClientRect(),t.target.setPointerCapture(t.pointerId),t.pointerType==="mouse"&&(this.focused=!0)}handlePointermove(t){this.sliderHandlePosition=this.calculateHandlePosition(t),this.value=360*(this.sliderHandlePosition/100),this._color=new l({...this._color.toHsl(),h:this.value}),this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0,cancelable:!0}))}handlePointerup(t){this._pointerDown=!1,t.target.releasePointerCapture(t.pointerId),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0,cancelable:!0}))||(this._color=this._previousColor),this.focus(),t.pointerType==="mouse"&&(this.focused=!1)}calculateHandlePosition(t){if(!this.boundingClientRect)return this.sliderHandlePosition;const e=this.boundingClientRect,i=this.vertical?e.top:e.left,s=this.vertical?t.clientY:t.clientX,r=this.vertical?e.height:e.width,n=Math.max(0,Math.min(1,(s-i)/r));return 100*n}handleGradientPointerdown(t){t.button===0&&(t.stopPropagation(),t.preventDefault(),this.handle.dispatchEvent(new PointerEvent("pointerdown",t)),this.handlePointermove(t))}get handlePositionStyles(){return`${this.vertical?"top":"left"}: ${this.sliderHandlePosition}%`}render(){return f`
1
+ "use strict";var h=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var r=(a,n,e,i)=>{for(var t=i>1?void 0:i?p(n,e):n,s=a.length-1,l;s>=0;s--)(l=a[s])&&(t=(i?l(n,e,t):l(t))||t);return i&&t&&h(n,e,t),t};import{html as c}from"@spectrum-web-components/base";import{ifDefined as v}from"@spectrum-web-components/base/src/directives.js";import{property as o,query as u}from"@spectrum-web-components/base/src/decorators.js";import{streamingListener as f}from"@spectrum-web-components/base/src/streaming-listener.js";import{Focusable as b}from"@spectrum-web-components/shared/src/focusable.js";import"@spectrum-web-components/color-handle/sp-color-handle.js";import{ColorController as m}from"@spectrum-web-components/reactive-controllers/src/Color.js";import g from"./color-slider.css.js";export class ColorSlider extends b{constructor(){super(...arguments);this.disabled=!1;this.focused=!1;this.label="hue";this.vertical=!1;this.colorController=new m(this,{applyColorToState:()=>{this.sliderHandlePosition=100*(this.colorController.hue/360)},extractColorFromState:e=>({...e.getColor("hsl"),h:this.value}),maintains:"saturation"});this.sliderHandlePosition=0;this.step=1;this._altered=0;this._pointerDown=!1}static get styles(){return[g]}get value(){return this.colorController.hue}set value(e){this.colorController.hue=e}get color(){return this.colorController.color}set color(e){this.colorController.color=e}get altered(){return this._altered}set altered(e){this._altered=e,this.step=Math.max(1,this.altered*10)}get focusElement(){return this.input}handleKeydown(e){const{key:i}=e;this.focused=!0,this.altered=[e.shiftKey,e.ctrlKey,e.altKey].filter(s=>!!s).length;let t=0;switch(i){case"ArrowUp":t=this.step;break;case"ArrowDown":t=-this.step;break;case"ArrowLeft":t=this.step*(this.isLTR?-1:1);break;case"ArrowRight":t=this.step*(this.isLTR?1:-1);break;default:return}e.preventDefault(),this.sliderHandlePosition=Math.min(100,Math.max(0,this.sliderHandlePosition+t)),this.value=360*(this.sliderHandlePosition/100),this.colorController.applyColorFromState(),t!=0&&(this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0})),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0})))}handleInput(e){const{valueAsNumber:i}=e.target;this.value=i,this.sliderHandlePosition=100*(this.value/360),this.colorController.applyColorFromState()}handleChange(e){this.handleInput(e),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}focus(e={}){super.focus(e),this.forwardFocus()}forwardFocus(){this.focused=this.hasVisibleFocusInTree(),this.input.focus()}handleFocusin(){this.focused=!0}handleFocusout(){this._pointerDown||(this.altered=0,this.focused=!1)}handlePointerdown(e){if(e.button!==0){e.preventDefault();return}this._pointerDown=!0,this.colorController.savePreviousColor(),this.boundingClientRect=this.getBoundingClientRect(),e.target.setPointerCapture(e.pointerId),e.pointerType==="mouse"&&(this.focused=!0)}handlePointermove(e){this.sliderHandlePosition=this.calculateHandlePosition(e),this.value=360*(this.sliderHandlePosition/100),this.colorController.applyColorFromState(),this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0,cancelable:!0}))}handlePointerup(e){this._pointerDown=!1,e.target.releasePointerCapture(e.pointerId),this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0,cancelable:!0}))||this.colorController.restorePreviousColor(),this.focus(),e.pointerType==="mouse"&&(this.focused=!1)}calculateHandlePosition(e){if(!this.boundingClientRect)return this.sliderHandlePosition;const i=this.boundingClientRect,t=this.vertical?i.top:i.left,s=this.vertical?e.clientY:e.clientX,l=this.vertical?i.height:i.width,d=Math.max(0,Math.min(1,(s-t)/l));return 100*d}handleGradientPointerdown(e){e.button===0&&(e.stopPropagation(),e.preventDefault(),this.handle.dispatchEvent(new PointerEvent("pointerdown",e)),this.handlePointermove(e))}get handlePositionStyles(){return`${this.vertical?"top":"left"}: ${this.sliderHandlePosition}%`}render(){return c`
2
2
  <div
3
3
  class="checkerboard"
4
4
  role="presentation"
@@ -13,14 +13,14 @@ var p=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var o=(h,t,e,i
13
13
  </div>
14
14
  </div>
15
15
  <sp-color-handle
16
- tabindex=${m(this.focused?void 0:"0")}
16
+ tabindex=${v(this.focused?void 0:"0")}
17
17
  @focus=${this.forwardFocus}
18
18
  ?focused=${this.focused}
19
19
  class="handle"
20
20
  color="hsl(${this.value}, 100%, 50%)"
21
21
  ?disabled=${this.disabled}
22
22
  style=${this.handlePositionStyles}
23
- ${g({start:["pointerdown",this.handlePointerdown],streamInside:["pointermove",this.handlePointermove],end:[["pointerup","pointercancel"],this.handlePointerup]})}
23
+ ${f({start:["pointerdown",this.handlePointerdown],streamInside:["pointermove",this.handlePointermove],end:[["pointerup","pointercancel"],this.handlePointerup]})}
24
24
  ></sp-color-handle>
25
25
  <input
26
26
  type="range"
@@ -34,5 +34,5 @@ var p=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var o=(h,t,e,i
34
34
  @change=${this.handleChange}
35
35
  @keydown=${this.handleKeydown}
36
36
  />
37
- `}firstUpdated(t){super.firstUpdated(t),this.boundingClientRect=this.getBoundingClientRect(),this.addEventListener("focusin",this.handleFocusin),this.addEventListener("focusout",this.handleFocusout)}}o([a({type:Boolean,reflect:!0})],ColorSlider.prototype,"disabled",2),o([a({type:Boolean,reflect:!0})],ColorSlider.prototype,"focused",2),o([c(".handle")],ColorSlider.prototype,"handle",2),o([a({type:String})],ColorSlider.prototype,"label",2),o([a({type:Boolean,reflect:!0})],ColorSlider.prototype,"vertical",2),o([a({type:Number})],ColorSlider.prototype,"value",1),o([a({type:Number,reflect:!0})],ColorSlider.prototype,"sliderHandlePosition",2),o([a({type:String})],ColorSlider.prototype,"color",1),o([a({type:Number})],ColorSlider.prototype,"step",2),o([c("input")],ColorSlider.prototype,"input",2);
37
+ `}firstUpdated(e){super.firstUpdated(e),this.boundingClientRect=this.getBoundingClientRect(),this.addEventListener("focusin",this.handleFocusin),this.addEventListener("focusout",this.handleFocusout)}}r([o({type:Boolean,reflect:!0})],ColorSlider.prototype,"disabled",2),r([o({type:Boolean,reflect:!0})],ColorSlider.prototype,"focused",2),r([u(".handle")],ColorSlider.prototype,"handle",2),r([o({type:String})],ColorSlider.prototype,"label",2),r([o({type:Boolean,reflect:!0})],ColorSlider.prototype,"vertical",2),r([o({type:Number})],ColorSlider.prototype,"value",1),r([o({type:Number,reflect:!0})],ColorSlider.prototype,"sliderHandlePosition",2),r([o({type:String})],ColorSlider.prototype,"color",1),r([o({type:Number})],ColorSlider.prototype,"step",2),r([u("input")],ColorSlider.prototype,"input",2);
38
38
  //# sourceMappingURL=ColorSlider.js.map