@luzmo/lucero 2.5.2 → 2.6.0

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.
Files changed (71) hide show
  1. package/components/color-area/color-area.d.ts +15 -0
  2. package/components/color-area/index.cjs +1 -1
  3. package/components/color-area/index.d.ts +1 -0
  4. package/components/color-area/index.js +1 -1
  5. package/components/color-area-CFBE-rG3.cjs +80 -0
  6. package/components/{color-area-qlEAp8ZN.js → color-area-GGa8KJyd.js} +85 -44
  7. package/components/color-handle/index.cjs +1 -1
  8. package/components/color-handle/index.js +1 -1
  9. package/components/{color-handle-Dc0uLgkf.js → color-handle-Ya92rdpA.js} +5 -2
  10. package/components/{color-handle-BE0Z1gTU.cjs → color-handle-hJ7Kblh4.cjs} +1 -1
  11. package/components/color-menu/color-menu.d.ts +11 -0
  12. package/components/color-menu/index.cjs +1 -1
  13. package/components/color-menu/index.d.ts +1 -0
  14. package/components/color-menu/index.js +1 -1
  15. package/components/{color-menu-Cus3S-Re.cjs → color-menu-COhe5VUB.cjs} +1 -1
  16. package/components/{color-menu-BxFQnH79.js → color-menu-Ct3f01bI.js} +6 -3
  17. package/components/color-picker/color-picker.d.ts +13 -0
  18. package/components/color-picker/index.cjs +1 -1
  19. package/components/color-picker/index.d.ts +1 -0
  20. package/components/color-picker/index.js +1 -1
  21. package/components/{color-picker-orFSIqoZ.js → color-picker-DWERcNZi.js} +5 -2
  22. package/components/{color-picker-BTT1O-76.cjs → color-picker-ELa0yF2F.cjs} +1 -1
  23. package/components/color-slider/color-slider.d.ts +17 -0
  24. package/components/color-slider/index.cjs +1 -1
  25. package/components/color-slider/index.d.ts +1 -0
  26. package/components/color-slider/index.js +1 -1
  27. package/components/{color-slider-X1EArAnx.js → color-slider-DNd_ZrD6.js} +95 -56
  28. package/components/color-slider-IYBn2DL7.cjs +58 -0
  29. package/components/index.cjs +1 -1
  30. package/components/index.js +8 -8
  31. package/components/interaction-BjXWVy_C.cjs +18 -0
  32. package/components/interaction-BpCLJ1OV.js +83 -0
  33. package/components/number-field/index.cjs +1 -1
  34. package/components/number-field/index.js +1 -1
  35. package/components/number-field/number-field.d.ts +4 -0
  36. package/components/{number-field-Ceeli_mh.cjs → number-field-CV7g2Q20.cjs} +2 -2
  37. package/components/{number-field-D9UqpqpW.js → number-field-Crol6vc9.js} +15 -9
  38. package/components/slider/index.cjs +1 -1
  39. package/components/slider/index.d.ts +1 -0
  40. package/components/slider/index.js +1 -1
  41. package/components/slider/slider.d.ts +18 -0
  42. package/components/{slider-Ch7OgTdj.js → slider-BFTuAXK1.js} +167 -151
  43. package/components/slider-Ce6qgPZ4.cjs +136 -0
  44. package/components/{streaming-listener-Bfyk6Fsx.cjs → streaming-listener-BzGZUHkj.cjs} +1 -1
  45. package/components/{streaming-listener-B6mDl4pZ.js → streaming-listener-DyS3scAi.js} +1 -1
  46. package/components/utils.cjs +1 -1
  47. package/components/utils.js +1 -1
  48. package/custom-elements.json +1 -1
  49. package/package.json +1 -1
  50. package/standalone/chunks/color-area-D-AVcZza.js +66 -0
  51. package/standalone/chunks/{color-handle-BLQiuRSS.js → color-handle-DO7dxFGx.js} +1 -1
  52. package/standalone/chunks/{color-menu-BDZh85nX.js → color-menu-DIX2y9m_.js} +1 -1
  53. package/standalone/chunks/color-slider-MSADvkPC.js +50 -0
  54. package/standalone/chunks/interaction-BQyflxg-.js +2 -0
  55. package/standalone/chunks/{number-field-Dc4nBa6l.js → number-field-BoIKbmIv.js} +2 -2
  56. package/standalone/chunks/{streaming-listener-DbMoHlSj.js → streaming-listener-0FSzb9QY.js} +1 -1
  57. package/standalone/color-area.js +1 -1
  58. package/standalone/color-handle.js +1 -1
  59. package/standalone/color-menu.js +1 -1
  60. package/standalone/color-picker.js +1 -1
  61. package/standalone/color-slider.js +1 -1
  62. package/standalone/manifest.json +7 -6
  63. package/standalone/number-field.js +1 -1
  64. package/standalone/slider.js +11 -10
  65. package/standalone/utils.js +1 -1
  66. package/utils/reactive-controllers/interaction.d.ts +85 -0
  67. package/components/color-area-D1fRozE0.cjs +0 -80
  68. package/components/color-slider-9Ck28Qdk.cjs +0 -57
  69. package/components/slider-C1AdDTfB.cjs +0 -135
  70. package/standalone/chunks/color-area-BCI2oMGd.js +0 -66
  71. package/standalone/chunks/color-slider-Bipcekrc.js +0 -49
@@ -15,6 +15,13 @@ declare const LuzmoColorPicker_base: typeof LuzmoElement & {
15
15
  * @element luzmo-color-picker
16
16
  * @fires input - The value of the Color Picker has changed.
17
17
  * @fires change - An alteration to the value of the Color Picker has been committed by the user.
18
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-start - Bubbles
19
+ * up from the menu's color area or color sliders when a pointer drag or
20
+ * held-key interaction starts, before the first `change` it causes.
21
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-end - Bubbles
22
+ * up when that interaction ends, after its last `change`. Closing the popover
23
+ * ends an interaction in progress. Swatch picks and typed values are single
24
+ * `change` events without an interaction.
18
25
  */
19
26
  export declare class LuzmoColorPicker extends LuzmoColorPicker_base {
20
27
  static styles: import("lit").CSSResult;
@@ -58,6 +65,12 @@ export declare class LuzmoColorPicker extends LuzmoColorPicker_base {
58
65
  private overlayElement;
59
66
  private _renderMenu;
60
67
  private overlayCloseEvent;
68
+ /**
69
+ * Finishes a drag or held-key interaction in progress inside the open menu
70
+ * as if the user released it, so a host can settle the color before it
71
+ * removes or hides the picker. Does nothing otherwise.
72
+ */
73
+ endInteraction(): void;
61
74
  private overlayOpenEvent;
62
75
  private handleColorChange;
63
76
  protected firstUpdated(): void;
@@ -15,4 +15,4 @@
15
15
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16
16
  * SOFTWARE.
17
17
  * */
18
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-picker-BTT1O-76.cjs");exports.LuzmoColorPicker=e.t;
18
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-picker-ELa0yF2F.cjs");exports.LuzmoColorPicker=e.t;
@@ -5,3 +5,4 @@ declare global {
5
5
  }
6
6
  }
7
7
  export { LuzmoColorPicker } from './color-picker';
8
+ export type { InteractionEventDetail, InteractionSource } from '../../utils/reactive-controllers/interaction';
@@ -16,4 +16,4 @@
16
16
  * SOFTWARE.
17
17
  * */
18
18
  import "../tokens.js";
19
- export { t as LuzmoColorPicker } from "../color-picker-orFSIqoZ.js";
19
+ export { t as LuzmoColorPicker } from "../color-picker-DWERcNZi.js";
@@ -22,7 +22,7 @@ import "./popover-CWrRLzOL.js";
22
22
  import { n as r } from "./slottable-request-event-24jJOhbh.js";
23
23
  import "./overlay-D_Xfq92b.js";
24
24
  import "./swatch-BBVsuSAV.js";
25
- import "./color-menu-BxFQnH79.js";
25
+ import "./color-menu-Ct3f01bI.js";
26
26
  import { html as i, unsafeCSS as a } from "lit";
27
27
  import { property as o, query as s, state as c } from "lit/decorators.js";
28
28
  // src/components/color-picker/color-picker.module.scss?inline
@@ -34,7 +34,10 @@ var l = "luzmo-popover{margin-left:var(--luzmo-color-picker-popover-horizontal-g
34
34
  this.styles = a(l);
35
35
  }
36
36
  overlayCloseEvent() {
37
- this.open = !1;
37
+ this.endInteraction(), this.open = !1;
38
+ }
39
+ endInteraction() {
40
+ this.menuElement?.endInteraction();
38
41
  }
39
42
  overlayOpenEvent() {
40
43
  this.open = !0;
@@ -15,7 +15,7 @@
15
15
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16
16
  * SOFTWARE.
17
17
  * */
18
- require("./tokens.cjs");const e=require("./decorate-SO02l0A6.cjs"),t=require("./sized-mixin-CSajkMro.cjs");require("./popover-CFzz83f8.cjs");const n=require("./slottable-request-event-C6eb7Ch3.cjs");require("./overlay-DAOyrYJL.cjs"),require("./swatch-DiNMN-SZ.cjs"),require("./color-menu-Cus3S-Re.cjs");let r=require("lit"),i=require("lit/decorators.js");var a=`luzmo-popover{margin-left:var(--luzmo-color-picker-popover-horizontal-gap,var(--color-picker-popover-horizontal-gap));margin-right:var(--luzmo-color-picker-popover-horizontal-gap,var(--color-picker-popover-horizontal-gap))}luzmo-swatch{cursor:pointer}:host([read-only]) luzmo-swatch{cursor:default;pointer-events:none}:host{--luzmo-popover-content-area-spacing-vertical:0;--color-picker-popover-horizontal-gap:var(--luzmo-spacing-4)}:host([size=s]){--color-picker-popover-horizontal-gap:var(--luzmo-spacing-3)}:host([size=l]),:host([size=xl]){--color-picker-popover-horizontal-gap:var(--luzmo-spacing-5)}`,o=class extends t.n(e.n){constructor(...e){super(...e),this.color=`rgb(255, 0, 0)`,this.open=!1,this.disabled=!1,this.readOnly=!1,this.placement=`left-start`,this.rounding=`full`,this.swatches=[],this.noAlphaChannel=!1,this._renderMenu=!1}static{this.styles=(0,r.unsafeCSS)(a)}overlayCloseEvent(){this.open=!1}overlayOpenEvent(){this.open=!0}handleColorChange(){let e=this.menuElement.color;this.color=typeof e==`string`?e:String(e),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}firstUpdated(){this.overlayElement.addEventListener(`slottable-request`,e=>{this._renderMenu=e.data!==n.n})}updated(e){e.has(`open`)&&this.open===!0&&(this._renderMenu=!0)}renderColorMenu(){return r.html`
18
+ require("./tokens.cjs");const e=require("./decorate-SO02l0A6.cjs"),t=require("./sized-mixin-CSajkMro.cjs");require("./popover-CFzz83f8.cjs");const n=require("./slottable-request-event-C6eb7Ch3.cjs");require("./overlay-DAOyrYJL.cjs"),require("./swatch-DiNMN-SZ.cjs"),require("./color-menu-COhe5VUB.cjs");let r=require("lit"),i=require("lit/decorators.js");var a=`luzmo-popover{margin-left:var(--luzmo-color-picker-popover-horizontal-gap,var(--color-picker-popover-horizontal-gap));margin-right:var(--luzmo-color-picker-popover-horizontal-gap,var(--color-picker-popover-horizontal-gap))}luzmo-swatch{cursor:pointer}:host([read-only]) luzmo-swatch{cursor:default;pointer-events:none}:host{--luzmo-popover-content-area-spacing-vertical:0;--color-picker-popover-horizontal-gap:var(--luzmo-spacing-4)}:host([size=s]){--color-picker-popover-horizontal-gap:var(--luzmo-spacing-3)}:host([size=l]),:host([size=xl]){--color-picker-popover-horizontal-gap:var(--luzmo-spacing-5)}`,o=class extends t.n(e.n){constructor(...e){super(...e),this.color=`rgb(255, 0, 0)`,this.open=!1,this.disabled=!1,this.readOnly=!1,this.placement=`left-start`,this.rounding=`full`,this.swatches=[],this.noAlphaChannel=!1,this._renderMenu=!1}static{this.styles=(0,r.unsafeCSS)(a)}overlayCloseEvent(){this.endInteraction(),this.open=!1}endInteraction(){this.menuElement?.endInteraction()}overlayOpenEvent(){this.open=!0}handleColorChange(){let e=this.menuElement.color;this.color=typeof e==`string`?e:String(e),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}firstUpdated(){this.overlayElement.addEventListener(`slottable-request`,e=>{this._renderMenu=e.data!==n.n})}updated(e){e.has(`open`)&&this.open===!0&&(this._renderMenu=!0)}renderColorMenu(){return r.html`
19
19
  <luzmo-color-menu
20
20
  .size=${this.size}
21
21
  .color=${this.color}
@@ -6,6 +6,11 @@ import { ColorValue } from '../../utils/reactive-controllers/color';
6
6
  * @element luzmo-color-slider
7
7
  * @fires input - The value of the Color Slider has changed.
8
8
  * @fires change - An alteration to the value of the Color Slider has been committed by the user.
9
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-start - A
10
+ * pointer drag or held-key interaction starts, before its first value change.
11
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-end - The
12
+ * interaction ends after its last `input`/`change`, even when nothing changed.
13
+ * A cancelled pointer commits and ends the same way.
9
14
  */
10
15
  export declare class LuzmoColorSlider extends Focusable {
11
16
  static get styles(): CSSResultArray;
@@ -18,6 +23,7 @@ export declare class LuzmoColorSlider extends Focusable {
18
23
  vertical: boolean;
19
24
  private languageResolver;
20
25
  private colorController;
26
+ private readonly _interaction;
21
27
  get value(): number;
22
28
  set value(value: number);
23
29
  sliderHandlePosition: number;
@@ -31,6 +37,7 @@ export declare class LuzmoColorSlider extends Focusable {
31
37
  input: HTMLInputElement;
32
38
  get focusElement(): HTMLInputElement;
33
39
  private handleKeydown;
40
+ private handleKeyup;
34
41
  private handleInput;
35
42
  private handleChange;
36
43
  focus(focusOptions?: FocusOptions): void;
@@ -39,9 +46,18 @@ export declare class LuzmoColorSlider extends Focusable {
39
46
  private handleBlur;
40
47
  private boundingClientRect;
41
48
  private _pointerDown;
49
+ private _capturedPointer?;
42
50
  private handlePointerdown;
43
51
  private handlePointermove;
44
52
  private handlePointerup;
53
+ /** Commits the pointer interaction in progress, then ends it. */
54
+ private _finishPointer;
55
+ /**
56
+ * Finishes the pointer drag or held-key interaction in progress as if the
57
+ * user released it, so a host can settle the value before it removes or
58
+ * hides the slider. Does nothing when no interaction is in progress.
59
+ */
60
+ endInteraction(): void;
45
61
  /**
46
62
  * Returns the value under the cursor
47
63
  * @param: PointerEvent on slider
@@ -52,6 +68,7 @@ export declare class LuzmoColorSlider extends Focusable {
52
68
  private get handlePositionStyles();
53
69
  private get getColorSliderStyle();
54
70
  protected render(): TemplateResult;
71
+ disconnectedCallback(): void;
55
72
  protected firstUpdated(changed: PropertyValues): void;
56
73
  protected updated(changedProperties: PropertyValues): void;
57
74
  }
@@ -15,4 +15,4 @@
15
15
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16
16
  * SOFTWARE.
17
17
  * */
18
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-slider-9Ck28Qdk.cjs");exports.LuzmoColorSlider=e.t;
18
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-slider-IYBn2DL7.cjs");exports.LuzmoColorSlider=e.t;
@@ -5,3 +5,4 @@ declare global {
5
5
  }
6
6
  }
7
7
  export { LuzmoColorSlider } from './color-slider';
8
+ export type { InteractionEventDetail, InteractionSource } from '../../utils/reactive-controllers/interaction';
@@ -16,4 +16,4 @@
16
16
  * SOFTWARE.
17
17
  * */
18
18
  import "../tokens.js";
19
- export { t as LuzmoColorSlider } from "../color-slider-X1EArAnx.js";
19
+ export { t as LuzmoColorSlider } from "../color-slider-DNd_ZrD6.js";
@@ -19,22 +19,23 @@ import "./tokens.js";
19
19
  import { t as e } from "./decorate-CpKsOs9z.js";
20
20
  import { t } from "./focusable-xjv79E40.js";
21
21
  import { t as n } from "./language-resolution-7rc0khIK.js";
22
- import "./color-handle-Dc0uLgkf.js";
23
- import { t as r } from "./streaming-listener-B6mDl4pZ.js";
24
- import { html as i, unsafeCSS as a } from "lit";
25
- import { property as o, query as s } from "lit/decorators.js";
26
- import { ifDefined as c } from "lit/directives/if-defined.js";
27
- import { styleMap as l } from "lit/directives/style-map.js";
28
- import { TinyColor as u } from "@ctrl/tinycolor";
22
+ import "./color-handle-Ya92rdpA.js";
23
+ import { n as r, t as i } from "./interaction-BpCLJ1OV.js";
24
+ import { t as a } from "./streaming-listener-DyS3scAi.js";
25
+ import { html as o, unsafeCSS as s } from "lit";
26
+ import { property as c, query as l } from "lit/decorators.js";
27
+ import { ifDefined as u } from "lit/directives/if-defined.js";
28
+ import { styleMap as d } from "lit/directives/style-map.js";
29
+ import { TinyColor as f } from "@ctrl/tinycolor";
29
30
  // src/utils/reactive-controllers/color.ts
30
- var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\d{1,3}\.?\d*?(,?\s?)\d{1,3}/, p = /(^hs[v|l]a?\()\d{1,3}/, m = (e, t) => t ? e.toHexString() : e.toHex(), h = class {
31
+ var p = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, m = /(^hs[v|l]a?\s?\()\d{1,3}\.?\d*?(,?\s?)\d{1,3}/, h = /(^hs[v|l]a?\()\d{1,3}/, g = (e, t) => t ? e.toHexString() : e.toHex(), _ = class {
31
32
  setColorProcess(e, t, n, r) {
32
33
  this.maintains === "hue" ? this.setColorMaintainHue(e, t, n, r) : this.maintains === "saturation" && this.setColorMaintainSaturation(e, t, n, r);
33
34
  }
34
35
  setColorMaintainHue(e, t, n, r) {
35
36
  let { h: i, s: a, v: o, a: s } = this._color.toHsv(), c;
36
37
  if (r && n.startsWith("hs")) {
37
- let e = d.exec(t);
38
+ let e = p.exec(t);
38
39
  if (e !== null) {
39
40
  let [, t] = e;
40
41
  c = Number(t);
@@ -53,7 +54,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
53
54
  setColorMaintainSaturation(e, t, n, r) {
54
55
  let { a: i } = this._color.toHsv();
55
56
  if (r && n.startsWith("hs")) {
56
- let e = d.exec(t);
57
+ let e = p.exec(t);
57
58
  if (e !== null) {
58
59
  let [, t, n] = e;
59
60
  this.hue = Number(t), this.saturation = Number(n);
@@ -75,7 +76,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
75
76
  name: (e) => e.toName() || e.toRgbString(),
76
77
  hsl: (e, t) => {
77
78
  if (this.maintains === "hue") {
78
- if (t) return e.toHslString().replace(p, `$1${this.hue}`);
79
+ if (t) return e.toHslString().replace(h, `$1${this.hue}`);
79
80
  let { s: n, l: r, a: i } = e.toHsl();
80
81
  return {
81
82
  h: this.hue,
@@ -84,7 +85,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
84
85
  a: i
85
86
  };
86
87
  }
87
- if (t) return e.toHslString().replace(f, `$1${this.hue}$2${this.saturation}`);
88
+ if (t) return e.toHslString().replace(m, `$1${this.hue}$2${this.saturation}`);
88
89
  let { s: n, l: r, a: i } = e.toHsl();
89
90
  return {
90
91
  h: this.hue,
@@ -95,7 +96,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
95
96
  },
96
97
  hsv: (e, t) => {
97
98
  if (this.maintains === "hue") {
98
- if (t) return e.toHsvString().replace(p, `$1${this.hue}`);
99
+ if (t) return e.toHsvString().replace(h, `$1${this.hue}`);
99
100
  let { s: n, v: r, a: i } = e.toHsv();
100
101
  return {
101
102
  h: this.hue,
@@ -104,7 +105,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
104
105
  a: i
105
106
  };
106
107
  }
107
- if (t) return e.toHsvString().replace(f, `$1${this.hue}$2${this.saturation}`);
108
+ if (t) return e.toHsvString().replace(m, `$1${this.hue}$2${this.saturation}`);
108
109
  let { s: n, v: r, a: i } = e.toHsv();
109
110
  return {
110
111
  h: this.hue,
@@ -113,15 +114,15 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
113
114
  a: i
114
115
  };
115
116
  },
116
- hex: m,
117
- hex3: m,
118
- hex4: m,
119
- hex6: m
120
- }, this._color = new u({
117
+ hex: g,
118
+ hex3: g,
119
+ hex4: g,
120
+ hex6: g
121
+ }, this._color = new f({
121
122
  h: 0,
122
123
  s: 1,
123
124
  v: 1
124
- }), this._previousColor = new u({
125
+ }), this._previousColor = new f({
125
126
  h: 0,
126
127
  s: 1,
127
128
  v: 1
@@ -131,7 +132,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
131
132
  }, this.host = e, this.applyColorToState = t, this.extractColorFromState = n, this.maintains = r || this.maintains;
132
133
  }
133
134
  applyColorFromState() {
134
- this._color = new u(this.extractColorFromState(this));
135
+ this._color = new f(this.extractColorFromState(this));
135
136
  }
136
137
  get hue() {
137
138
  return this._hue;
@@ -140,7 +141,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
140
141
  let t = Math.min(360, Math.max(0, e));
141
142
  if (t === this.hue) return;
142
143
  let n = this.hue, { s: r, v: i, a } = this._color.toHsv();
143
- this._color = new u({
144
+ this._color = new f({
144
145
  h: t,
145
146
  s: r,
146
147
  v: i,
@@ -154,7 +155,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
154
155
  let t = Math.min(1, Math.max(0, e));
155
156
  if (t === this.opacity) return;
156
157
  let n = this.opacity, { h: r, s: i, v: a } = this._color.toHsv();
157
- this._color = new u({
158
+ this._color = new f({
158
159
  h: r,
159
160
  s: i,
160
161
  v: a,
@@ -172,7 +173,7 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
172
173
  /* c8 ignore next 3 */
173
174
  if (e === this.color) return;
174
175
  let t = this._color;
175
- this._color = new u(e);
176
+ this._color = new f(e);
176
177
  let n = this._color.format, r = typeof e == "string" || e instanceof String;
177
178
  n.startsWith("hex") && (r = e.startsWith("#")), this._format = {
178
179
  format: n,
@@ -196,13 +197,13 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
196
197
  restorePreviousColor() {
197
198
  this.setColor(this._previousColor);
198
199
  }
199
- }, g = ".opacity-checkerboard{background:repeating-conic-gradient(var(--luzmo-color-loupe-checkerboard-light,#fff) 0 25%, var(--luzmo-color-loupe-checkerboard-dark,#e6e6e6) 0 50%) var(--luzmo-color-loupe-checkerboard-position,left top)/calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2) calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2);block-size:100%;inline-size:100%;position:absolute}:host{--luzmo-color-slider-gradient-fallback:red 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%;touch-action:none}:host([vertical]) .handle{inset-block-start:unset;inset-block-end:0}:host([vertical]) .slider{appearance:slider-vertical}:host(:focus){outline:none}.gradient{overflow:hidden}::slotted(*){width:100%;height:100%}@media (forced-colors:active){:host{--highcontrast-color-slider-border-color:CanvasText;--highcontrast-color-slider-border-color-disabled:GrayText;--highcontrast-color-slider-background-color-disabled:Canvas;forced-color-adjust:none}}:host{--luzmo-color-handle-hitarea-border-radius:var(--luzmo-color-slider-handle-hitarea-border-radius,0px);min-inline-size:var(--luzmo-color-slider-minimum-length,80px);inline-size:var(--luzmo-color-slider-length,192px);block-size:var(--luzmo-color-slider-control-track-width,24px);-webkit-user-select:none;user-select:none;cursor:default;display:block;position:relative}:host([focused]){z-index:2}:host([disabled]){pointer-events:none}:host([disabled]) .gradient{display:none}:host([vertical]){min-block-size:var(--luzmo-color-slider-vertical-minimum-height,var(--luzmo-color-slider-minimum-length,80px));block-size:var(--luzmo-color-slider-vertical-height,var(--luzmo-color-slider-length,192px));min-inline-size:0;inline-size:var(--luzmo-color-slider-vertical-control-track-width,var(--luzmo-color-slider-control-track-height,24px));display:inline-block}:host([vertical]) .handle{inset-inline-start:50%}.handle{inset-block-start:50%;inset-inline-start:0}.checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color,var(--luzmo-color-slider-border-color,var(--luzmo-border-color)))}.checkerboard:before{content:\"\";z-index:1;box-shadow:inset 0 0 0 var(--luzmo-color-slider-border-width,var(--luzmo-border-width)) var(--luzmo-color-slider-border-color-local);border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));position:absolute;inset:0}:host([disabled]) .checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color-disabled,var(--luzmo-color-slider-border-color-disabled,var(--luzmo-dimmed-color)));background:var(--highcontrast-color-slider-background-color-disabled,var(--luzmo-color-slider-background-color-disabled,var(--luzmo-dimmed-color)))}.checkerboard,.gradient{border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.gradient:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){transform:scaleX(-1)}.slider{opacity:0;z-index:0;pointer-events:none;block-size:100%;inline-size:100%;margin:0;position:absolute;inset-block-start:0;inset-inline-start:0}", _ = class extends t {
200
+ }, v = ".opacity-checkerboard{background:repeating-conic-gradient(var(--luzmo-color-loupe-checkerboard-light,#fff) 0 25%, var(--luzmo-color-loupe-checkerboard-dark,#e6e6e6) 0 50%) var(--luzmo-color-loupe-checkerboard-position,left top)/calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2) calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2);block-size:100%;inline-size:100%;position:absolute}:host{--luzmo-color-slider-gradient-fallback:red 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%;touch-action:none}:host([vertical]) .handle{inset-block-start:unset;inset-block-end:0}:host([vertical]) .slider{appearance:slider-vertical}:host(:focus){outline:none}.gradient{overflow:hidden}::slotted(*){width:100%;height:100%}@media (forced-colors:active){:host{--highcontrast-color-slider-border-color:CanvasText;--highcontrast-color-slider-border-color-disabled:GrayText;--highcontrast-color-slider-background-color-disabled:Canvas;forced-color-adjust:none}}:host{--luzmo-color-handle-hitarea-border-radius:var(--luzmo-color-slider-handle-hitarea-border-radius,0px);min-inline-size:var(--luzmo-color-slider-minimum-length,80px);inline-size:var(--luzmo-color-slider-length,192px);block-size:var(--luzmo-color-slider-control-track-width,24px);-webkit-user-select:none;user-select:none;cursor:default;display:block;position:relative}:host([focused]){z-index:2}:host([disabled]){pointer-events:none}:host([disabled]) .gradient{display:none}:host([vertical]){min-block-size:var(--luzmo-color-slider-vertical-minimum-height,var(--luzmo-color-slider-minimum-length,80px));block-size:var(--luzmo-color-slider-vertical-height,var(--luzmo-color-slider-length,192px));min-inline-size:0;inline-size:var(--luzmo-color-slider-vertical-control-track-width,var(--luzmo-color-slider-control-track-height,24px));display:inline-block}:host([vertical]) .handle{inset-inline-start:50%}.handle{inset-block-start:50%;inset-inline-start:0}.checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color,var(--luzmo-color-slider-border-color,var(--luzmo-border-color)))}.checkerboard:before{content:\"\";z-index:1;box-shadow:inset 0 0 0 var(--luzmo-color-slider-border-width,var(--luzmo-border-width)) var(--luzmo-color-slider-border-color-local);border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));position:absolute;inset:0}:host([disabled]) .checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color-disabled,var(--luzmo-color-slider-border-color-disabled,var(--luzmo-dimmed-color)));background:var(--highcontrast-color-slider-background-color-disabled,var(--luzmo-color-slider-background-color-disabled,var(--luzmo-dimmed-color)))}.checkerboard,.gradient{border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.gradient:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){transform:scaleX(-1)}.slider{opacity:0;z-index:0;pointer-events:none;block-size:100%;inline-size:100%;margin:0;position:absolute;inset-block-start:0;inset-inline-start:0}", y = class extends t {
200
201
  constructor(...e) {
201
- super(...e), this.disabled = !1, this.focused = !1, this.label = "hue", this.vertical = !1, this.languageResolver = new n(this), this.colorController = new h(this, {
202
+ super(...e), this.disabled = !1, this.focused = !1, this.label = "hue", this.vertical = !1, this.languageResolver = new n(this), this.colorController = new _(this, {
202
203
  /* c8 ignore next 3 */
203
204
  applyColorToState: () => {
204
205
  if (this.mode === "opacity") {
205
- let e = new u(this.colorController.color);
206
+ let e = new f(this.colorController.color);
206
207
  this.sliderHandlePosition = 100 * e.getAlpha();
207
208
  } else this.sliderHandlePosition = 100 * (this.colorController.hue / 360);
208
209
  },
@@ -214,10 +215,10 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
214
215
  h: this.value
215
216
  },
216
217
  maintains: "saturation"
217
- }), this.sliderHandlePosition = 0, this.step = 1, this.isLTR = !0, this._altered = 0, this._pointerDown = !1;
218
+ }), this._interaction = new i(this, { value: () => this.value }), this.sliderHandlePosition = 0, this.step = 1, this.isLTR = !0, this._altered = 0, this._pointerDown = !1;
218
219
  }
219
220
  static get styles() {
220
- return [a(g)];
221
+ return [s(v)];
221
222
  }
222
223
  get value() {
223
224
  return this.mode === "opacity" ? this.colorController.opacity : this.colorController.hue;
@@ -263,16 +264,23 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
263
264
  break;
264
265
  default: return;
265
266
  }
266
- e.preventDefault();
267
+ if (e.preventDefault(), this.disabled || !this._interaction.keyDown(t)) return;
268
+ if (this.disabled) {
269
+ this._interaction.end();
270
+ return;
271
+ }
267
272
  let r = 100 / (this.mode === "opacity" ? 100 : 360);
268
- this.sliderHandlePosition = Math.min(100, Math.max(0, this.sliderHandlePosition + n * r)), this.value = this.mode === "opacity" ? Math.min(1, Math.max(0, this.value + n / 100)) : Math.min(360, Math.max(0, this.value + n)), this.colorController.applyColorFromState(), n !== 0 && (this.dispatchEvent(new Event("input", {
273
+ this.sliderHandlePosition = Math.min(100, Math.max(0, this.sliderHandlePosition + n * r)), this.value = this.mode === "opacity" ? Math.min(1, Math.max(0, this.value + n / 100)) : Math.min(360, Math.max(0, this.value + n)), this.colorController.applyColorFromState(), n !== 0 && this._interaction.commit(() => this.dispatchEvent(new Event("input", {
269
274
  bubbles: !0,
270
275
  composed: !0
271
- })), this.dispatchEvent(new Event("change", {
276
+ })), () => this.dispatchEvent(new Event("change", {
272
277
  bubbles: !0,
273
278
  composed: !0
274
279
  })));
275
280
  }
281
+ handleKeyup(e) {
282
+ this._interaction.keyUp(e.key);
283
+ }
276
284
  handleInput(e) {
277
285
  let { valueAsNumber: t } = e.target;
278
286
  this.value = t, this.sliderHandlePosition = 100 * (this.mode === "opacity" ? this.value : this.value / 360), this.colorController.applyColorFromState();
@@ -293,24 +301,50 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
293
301
  this.focused = !0;
294
302
  }
295
303
  handleBlur() {
296
- this._pointerDown || (this.altered = 0, this.focused = !1);
304
+ this._interaction.endKeyboard(), !this._pointerDown && (this.altered = 0, this.focused = !1);
297
305
  }
298
306
  handlePointerdown(e) {
299
- e.button === 0 ? (this._pointerDown = !0, this.colorController.savePreviousColor(), this.boundingClientRect = this.getBoundingClientRect(), e.target.setPointerCapture(e.pointerId), e.pointerType === "mouse" && (this.focused = !0)) : e.preventDefault();
307
+ if (e.button !== 0 || !this._interaction.start(r(e))) {
308
+ e.preventDefault();
309
+ return;
310
+ }
311
+ if (this.disabled) {
312
+ this._interaction.end(), e.preventDefault();
313
+ return;
314
+ }
315
+ this._pointerDown = !0, this.colorController.savePreviousColor(), this.boundingClientRect = this.getBoundingClientRect();
316
+ let t = e.target;
317
+ try {
318
+ t.setPointerCapture(e.pointerId), this._capturedPointer = {
319
+ target: t,
320
+ pointerId: e.pointerId
321
+ };
322
+ } catch {}
323
+ e.pointerType === "mouse" && (this.focused = !0);
300
324
  }
301
325
  handlePointermove(e) {
302
- this.sliderHandlePosition = this.calculateHandlePosition(e), this.value = (this.mode === "opacity" ? 1 : 360) * (this.sliderHandlePosition / 100), this.colorController.applyColorFromState(), this.dispatchEvent(new Event("input", {
326
+ this._pointerDown && (this.sliderHandlePosition = this.calculateHandlePosition(e), this.value = (this.mode === "opacity" ? 1 : 360) * (this.sliderHandlePosition / 100), this.colorController.applyColorFromState(), this.dispatchEvent(new Event("input", {
303
327
  bubbles: !0,
304
328
  composed: !0,
305
329
  cancelable: !0
306
- }));
330
+ })));
307
331
  }
308
332
  handlePointerup(e) {
309
- this._pointerDown = !1, e.target.releasePointerCapture(e.pointerId), this.dispatchEvent(new Event("change", {
333
+ this._pointerDown && this._finishPointer(() => {
334
+ this.focus(), e.pointerType === "mouse" && (this.focused = !1);
335
+ });
336
+ }
337
+ _finishPointer(e) {
338
+ this._pointerDown = !1;
339
+ let t = this._capturedPointer;
340
+ this._capturedPointer = void 0, t?.target.hasPointerCapture(t.pointerId) && t.target.releasePointerCapture(t.pointerId), this.dispatchEvent(new Event("change", {
310
341
  bubbles: !0,
311
342
  composed: !0,
312
343
  cancelable: !0
313
- })) || this.colorController.restorePreviousColor(), this.focus(), e.pointerType === "mouse" && (this.focused = !1);
344
+ })) || this.colorController.restorePreviousColor(), e?.(), this._interaction.end();
345
+ }
346
+ endInteraction() {
347
+ this._pointerDown ? this._finishPointer() : this._interaction.end();
314
348
  }
315
349
  calculateHandlePosition(e) {
316
350
  /* c8 ignore next 3 */
@@ -326,10 +360,10 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
326
360
  }
327
361
  get getColorSliderStyle() {
328
362
  let e = this.vertical ? "top" : "right";
329
- return this.mode === "opacity" ? { background: `linear-gradient(to ${e}, transparent, ${new u(this.colorController.color).setAlpha(1).toRgbString()})` } : { background: `linear-gradient(to ${e}, var(--luzmo-color-slider-gradient, var(--luzmo-color-slider-gradient-fallback)))` };
363
+ return this.mode === "opacity" ? { background: `linear-gradient(to ${e}, transparent, ${new f(this.colorController.color).setAlpha(1).toRgbString()})` } : { background: `linear-gradient(to ${e}, var(--luzmo-color-slider-gradient, var(--luzmo-color-slider-gradient-fallback)))` };
330
364
  }
331
365
  render() {
332
- return i`
366
+ return o`
333
367
  <div
334
368
  class="opacity-checkerboard checkerboard"
335
369
  role="presentation"
@@ -338,26 +372,27 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
338
372
  <div
339
373
  class="gradient"
340
374
  role="presentation"
341
- style=${l(this.getColorSliderStyle)}
375
+ style=${d(this.getColorSliderStyle)}
342
376
  >
343
377
  <slot name="gradient"></slot>
344
378
  </div>
345
379
  </div>
346
380
  <luzmo-color-handle
347
- tabindex=${c(this.focused ? void 0 : "0")}
381
+ tabindex=${u(this.focused ? void 0 : "0")}
348
382
  @focus=${this.forwardFocus}
349
383
  ?focused=${this.focused}
350
384
  class="handle"
351
385
  color=${this.mode === "opacity" ? this.color : "hsl(" + this.value + ", 100%, 50%)"}
352
386
  ?disabled=${this.disabled}
353
387
  style=${this.handlePositionStyles}
354
- ${r({
388
+ ${a({
355
389
  start: ["pointerdown", this.handlePointerdown],
356
390
  streamInside: ["pointermove", this.handlePointermove],
357
391
  end: [[
358
392
  "pointerup",
359
393
  "pointercancel",
360
- "pointerleave"
394
+ "pointerleave",
395
+ "lostpointercapture"
361
396
  ], this.handlePointerup]
362
397
  })}
363
398
  ></luzmo-color-handle>
@@ -366,8 +401,8 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
366
401
  class="slider"
367
402
  min="0"
368
403
  max=${this.mode === "opacity" ? "100" : "360"}
369
- aria-orientation=${c(this.vertical ? "vertical" : void 0)}
370
- orient=${c(this.vertical ? "vertical" : void 0)}
404
+ aria-orientation=${u(this.vertical ? "vertical" : void 0)}
405
+ orient=${u(this.vertical ? "vertical" : void 0)}
371
406
  step=${this.step}
372
407
  aria-label=${this.label}
373
408
  .value=${String(this.mode === "opacity" ? this.value * 100 : this.value)}
@@ -381,37 +416,41 @@ var d = /^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/, f = /(^hs[v|l]a?\s?\()\
381
416
  @input=${this.handleInput}
382
417
  @change=${this.handleChange}
383
418
  @keydown=${this.handleKeydown}
419
+ @keyup=${this.handleKeyup}
384
420
  />
385
421
  `;
386
422
  }
423
+ disconnectedCallback() {
424
+ this._pointerDown = !1, this._capturedPointer = void 0, super.disconnectedCallback();
425
+ }
387
426
  firstUpdated(e) {
388
427
  super.firstUpdated(e), this.boundingClientRect = this.getBoundingClientRect(), this.addEventListener("focus", this.handleFocus), this.addEventListener("blur", this.handleBlur);
389
428
  }
390
429
  updated(e) {
391
- e.has("mode") && (this.handle.style.insetInlineStart = "", this.handle.style.insetBlockEnd = "", this.mode === "opacity" && (this.colorController.color = new u(this.colorController.color).toRgbString(), this.handle.style.insetInlineStart = 100 * this.colorController.opacity + "%"));
430
+ e.has("mode") && (this.handle.style.insetInlineStart = "", this.handle.style.insetBlockEnd = "", this.mode === "opacity" && (this.colorController.color = new f(this.colorController.color).toRgbString(), this.handle.style.insetInlineStart = 100 * this.colorController.opacity + "%"));
392
431
  }
393
432
  };
394
433
  // src/components/color-slider/index.ts
395
- e([o({
434
+ e([c({
396
435
  type: String,
397
436
  reflect: !0
398
- })], _.prototype, "dir", void 0), e([o({
437
+ })], y.prototype, "dir", void 0), e([c({
399
438
  type: String,
400
439
  reflect: !0
401
- })], _.prototype, "mode", void 0), e([o({
440
+ })], y.prototype, "mode", void 0), e([c({
402
441
  type: Boolean,
403
442
  reflect: !0
404
- })], _.prototype, "disabled", void 0), e([o({
443
+ })], y.prototype, "disabled", void 0), e([c({
405
444
  type: Boolean,
406
445
  reflect: !0
407
- })], _.prototype, "focused", void 0), e([s(".handle")], _.prototype, "handle", void 0), e([o({ type: String })], _.prototype, "label", void 0), e([o({
446
+ })], y.prototype, "focused", void 0), e([l(".handle")], y.prototype, "handle", void 0), e([c({ type: String })], y.prototype, "label", void 0), e([c({
408
447
  type: Boolean,
409
448
  reflect: !0
410
- })], _.prototype, "vertical", void 0), e([o({ type: Number })], _.prototype, "value", null), e([o({
449
+ })], y.prototype, "vertical", void 0), e([c({ type: Number })], y.prototype, "value", null), e([c({
411
450
  type: Number,
412
451
  reflect: !0
413
- })], _.prototype, "sliderHandlePosition", void 0), e([o({ type: String })], _.prototype, "color", null), e([o({ type: Number })], _.prototype, "step", void 0), e([o({
452
+ })], y.prototype, "sliderHandlePosition", void 0), e([c({ type: String })], y.prototype, "color", null), e([c({ type: Number })], y.prototype, "step", void 0), e([c({
414
453
  type: Boolean,
415
454
  attribute: "is-ltr"
416
- })], _.prototype, "isLTR", void 0), e([s("input")], _.prototype, "input", void 0), customElements.get("luzmo-color-slider") || customElements.define("luzmo-color-slider", _);
417
- export { _ as t };
455
+ })], y.prototype, "isLTR", void 0), e([l("input")], y.prototype, "input", void 0), customElements.get("luzmo-color-slider") || customElements.define("luzmo-color-slider", y);
456
+ export { y as t };
@@ -0,0 +1,58 @@
1
+ /*! * Lucero - The design system for Luzmo.
2
+ *
3
+ * Copyright © 2026 Luzmo
4
+ * All rights reserved.
5
+ * Lucero (“Luzmo Design System”) must be used according to the Luzmo Terms of Service.
6
+ * This license allows users with a current active Luzmo account to use Lucero.
7
+ * This license terminates automatically if a user no longer has an active Luzmo account.
8
+ * Please view the Luzmo Terms of Service at: https://www.luzmo.com/information-pages/terms-of-use.
9
+ *
10
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16
+ * SOFTWARE.
17
+ * */
18
+ require("./tokens.cjs");const e=require("./decorate-SO02l0A6.cjs"),t=require("./focusable-BIHTrJd6.cjs"),n=require("./language-resolution-B7D3hQ6_.cjs");require("./color-handle-hJ7Kblh4.cjs");const r=require("./interaction-BjXWVy_C.cjs"),i=require("./streaming-listener-BzGZUHkj.cjs");let a=require("lit"),o=require("lit/decorators.js"),s=require("lit/directives/if-defined.js"),c=require("lit/directives/style-map.js"),l=require("@ctrl/tinycolor");var u=/^hs[v|l]a?\s?\((\d{1,3}\.?\d*?),?\s?(\d{1,3})/,d=/(^hs[v|l]a?\s?\()\d{1,3}\.?\d*?(,?\s?)\d{1,3}/,f=/(^hs[v|l]a?\()\d{1,3}/,p=(e,t)=>t?e.toHexString():e.toHex(),m=class{setColorProcess(e,t,n,r){this.maintains===`hue`?this.setColorMaintainHue(e,t,n,r):this.maintains===`saturation`&&this.setColorMaintainSaturation(e,t,n,r)}setColorMaintainHue(e,t,n,r){let{h:i,s:a,v:o,a:s}=this._color.toHsv(),c;if(r&&n.startsWith(`hs`)){let e=u.exec(t);if(e!==null){let[,t]=e;c=Number(t)}}else if(!r&&n.startsWith(`hs`)){let t=e.originalInput;c=Object.values(t)[0]}this.hue=c||i,this.opacity=s??1,this.applyColorToState({h:i,s:a,v:o,a:s})}setColorMaintainSaturation(e,t,n,r){let{a:i}=this._color.toHsv();if(r&&n.startsWith(`hs`)){let e=u.exec(t);if(e!==null){let[,t,n]=e;this.hue=Number(t),this.saturation=Number(n)}}else if(!r&&n.startsWith(`hs`)){let t=e.originalInput,n=Object.values(t);this.hue=n[0],this.saturation=n[1]}else{let{h:t}=e.toHsv();this.hue=t}this.opacity=i??1,this.applyColorToState(e.toHsv())}constructor(e,{applyColorToState:t,extractColorFromState:n,maintains:r}){this.maintains=`hue`,this._hue=0,this._opacity=1,this.getColorProcesses={rgb:(e,t)=>t?e.toRgbString():e.toRgb(),prgb:(e,t)=>t?e.toPercentageRgbString():e.toPercentageRgb(),hex8:(e,t)=>t?e.toHex8String():e.toHex8(),name:e=>e.toName()||e.toRgbString(),hsl:(e,t)=>{if(this.maintains===`hue`){if(t)return e.toHslString().replace(f,`$1${this.hue}`);let{s:n,l:r,a:i}=e.toHsl();return{h:this.hue,s:n,l:r,a:i}}if(t)return e.toHslString().replace(d,`$1${this.hue}$2${this.saturation}`);let{s:n,l:r,a:i}=e.toHsl();return{h:this.hue,s:n,l:r,a:i}},hsv:(e,t)=>{if(this.maintains===`hue`){if(t)return e.toHsvString().replace(f,`$1${this.hue}`);let{s:n,v:r,a:i}=e.toHsv();return{h:this.hue,s:n,v:r,a:i}}if(t)return e.toHsvString().replace(d,`$1${this.hue}$2${this.saturation}`);let{s:n,v:r,a:i}=e.toHsv();return{h:this.hue,s:n,v:r,a:i}},hex:p,hex3:p,hex4:p,hex6:p},this._color=new l.TinyColor({h:0,s:1,v:1}),this._previousColor=new l.TinyColor({h:0,s:1,v:1}),this._format={format:``,isString:!1},this.host=e,this.applyColorToState=t,this.extractColorFromState=n,this.maintains=r||this.maintains}applyColorFromState(){this._color=new l.TinyColor(this.extractColorFromState(this))}get hue(){return this._hue}set hue(e){let t=Math.min(360,Math.max(0,e));if(t===this.hue)return;let n=this.hue,{s:r,v:i,a}=this._color.toHsv();this._color=new l.TinyColor({h:t,s:r,v:i,a}),this._hue=t,this.host.requestUpdate(`hue`,n)}get opacity(){return this._opacity}set opacity(e){let t=Math.min(1,Math.max(0,e));if(t===this.opacity)return;let n=this.opacity,{h:r,s:i,v:a}=this._color.toHsv();this._color=new l.TinyColor({h:r,s:i,v:a,a:t}),this._opacity=t,this.host.requestUpdate(`opacity`,n)}get value(){return this.color}get color(){return this.getColorProcesses[this._format.format||`hex`](this._color,this._format.isString)}set color(e){if(e===this.color)return;let t=this._color;this._color=new l.TinyColor(e);let n=this._color.format,r=typeof e==`string`||e instanceof String;n.startsWith(`hex`)&&(r=e.startsWith(`#`)),this._format={format:n,isString:r},this.setColorProcess(this._color,e,n,r),this.host.requestUpdate(`color`,t)}getColor(e){return this._color[{hsl:`toHsl`}[e]]()}setColor(e){this._color=e;let t=typeof this._color.originalInput==`string`||this._color.originalInput instanceof String;this.setColorProcess(this._color,e,this._color.format,t)}getHslString(){return this._color.toHslString()}savePreviousColor(){this._previousColor=this._color.clone()}restorePreviousColor(){this.setColor(this._previousColor)}},h=`.opacity-checkerboard{background:repeating-conic-gradient(var(--luzmo-color-loupe-checkerboard-light,#fff) 0 25%, var(--luzmo-color-loupe-checkerboard-dark,#e6e6e6) 0 50%) var(--luzmo-color-loupe-checkerboard-position,left top)/calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2) calc(var(--luzmo-color-loupe-checkerboard-size,8px) * 2);block-size:100%;inline-size:100%;position:absolute}:host{--luzmo-color-slider-gradient-fallback:red 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%;touch-action:none}:host([vertical]) .handle{inset-block-start:unset;inset-block-end:0}:host([vertical]) .slider{appearance:slider-vertical}:host(:focus){outline:none}.gradient{overflow:hidden}::slotted(*){width:100%;height:100%}@media (forced-colors:active){:host{--highcontrast-color-slider-border-color:CanvasText;--highcontrast-color-slider-border-color-disabled:GrayText;--highcontrast-color-slider-background-color-disabled:Canvas;forced-color-adjust:none}}:host{--luzmo-color-handle-hitarea-border-radius:var(--luzmo-color-slider-handle-hitarea-border-radius,0px);min-inline-size:var(--luzmo-color-slider-minimum-length,80px);inline-size:var(--luzmo-color-slider-length,192px);block-size:var(--luzmo-color-slider-control-track-width,24px);-webkit-user-select:none;user-select:none;cursor:default;display:block;position:relative}:host([focused]){z-index:2}:host([disabled]){pointer-events:none}:host([disabled]) .gradient{display:none}:host([vertical]){min-block-size:var(--luzmo-color-slider-vertical-minimum-height,var(--luzmo-color-slider-minimum-length,80px));block-size:var(--luzmo-color-slider-vertical-height,var(--luzmo-color-slider-length,192px));min-inline-size:0;inline-size:var(--luzmo-color-slider-vertical-control-track-width,var(--luzmo-color-slider-control-track-height,24px));display:inline-block}:host([vertical]) .handle{inset-inline-start:50%}.handle{inset-block-start:50%;inset-inline-start:0}.checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color,var(--luzmo-color-slider-border-color,var(--luzmo-border-color)))}.checkerboard:before{content:"";z-index:1;box-shadow:inset 0 0 0 var(--luzmo-color-slider-border-width,var(--luzmo-border-width)) var(--luzmo-color-slider-border-color-local);border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));position:absolute;inset:0}:host([disabled]) .checkerboard{--luzmo-color-slider-border-color-local:var(--highcontrast-color-slider-border-color-disabled,var(--luzmo-color-slider-border-color-disabled,var(--luzmo-dimmed-color)));background:var(--highcontrast-color-slider-background-color-disabled,var(--luzmo-color-slider-background-color-disabled,var(--luzmo-dimmed-color)))}.checkerboard,.gradient{border-radius:var(--luzmo-color-slider-border-rounding,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.gradient:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){transform:scaleX(-1)}.slider{opacity:0;z-index:0;pointer-events:none;block-size:100%;inline-size:100%;margin:0;position:absolute;inset-block-start:0;inset-inline-start:0}`,g=class extends t.t{constructor(...e){super(...e),this.disabled=!1,this.focused=!1,this.label=`hue`,this.vertical=!1,this.languageResolver=new n.t(this),this.colorController=new m(this,{applyColorToState:()=>{if(this.mode===`opacity`){let e=new l.TinyColor(this.colorController.color);this.sliderHandlePosition=100*e.getAlpha()}else this.sliderHandlePosition=100*(this.colorController.hue/360)},extractColorFromState:e=>this.mode===`opacity`?{...e.getColor(`hsl`),a:this.value}:{...e.getColor(`hsl`),h:this.value},maintains:`saturation`}),this._interaction=new r.t(this,{value:()=>this.value}),this.sliderHandlePosition=0,this.step=1,this.isLTR=!0,this._altered=0,this._pointerDown=!1}static get styles(){return[(0,a.unsafeCSS)(h)]}get value(){return this.mode===`opacity`?this.colorController.opacity:this.colorController.hue}set value(e){this.mode===`opacity`?this.colorController.opacity=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){let{key:t}=e;this.focused=!0,this.altered=[e.shiftKey,e.ctrlKey,e.altKey].filter(e=>!!e).length;let n=0;switch(t){case`ArrowUp`:n=this.step;break;case`ArrowDown`:n=-this.step;break;case`ArrowLeft`:n=this.step*(this.isLTR?-1:1);break;case`ArrowRight`:n=this.step*(this.isLTR?1:-1);break;default:return}if(e.preventDefault(),this.disabled||!this._interaction.keyDown(t))return;if(this.disabled){this._interaction.end();return}let r=100/(this.mode===`opacity`?100:360);this.sliderHandlePosition=Math.min(100,Math.max(0,this.sliderHandlePosition+n*r)),this.value=this.mode===`opacity`?Math.min(1,Math.max(0,this.value+n/100)):Math.min(360,Math.max(0,this.value+n)),this.colorController.applyColorFromState(),n!==0&&this._interaction.commit(()=>this.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0})),()=>this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0})))}handleKeyup(e){this._interaction.keyUp(e.key)}handleInput(e){let{valueAsNumber:t}=e.target;this.value=t,this.sliderHandlePosition=100*(this.mode===`opacity`?this.value: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.input.focus()}handleFocus(){this.focused=!0}handleBlur(){this._interaction.endKeyboard(),!this._pointerDown&&(this.altered=0,this.focused=!1)}handlePointerdown(e){if(e.button!==0||!this._interaction.start(r.n(e))){e.preventDefault();return}if(this.disabled){this._interaction.end(),e.preventDefault();return}this._pointerDown=!0,this.colorController.savePreviousColor(),this.boundingClientRect=this.getBoundingClientRect();let t=e.target;try{t.setPointerCapture(e.pointerId),this._capturedPointer={target:t,pointerId:e.pointerId}}catch{}e.pointerType===`mouse`&&(this.focused=!0)}handlePointermove(e){this._pointerDown&&(this.sliderHandlePosition=this.calculateHandlePosition(e),this.value=(this.mode===`opacity`?1:360)*(this.sliderHandlePosition/100),this.colorController.applyColorFromState(),this.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0,cancelable:!0})))}handlePointerup(e){this._pointerDown&&this._finishPointer(()=>{this.focus(),e.pointerType===`mouse`&&(this.focused=!1)})}_finishPointer(e){this._pointerDown=!1;let t=this._capturedPointer;this._capturedPointer=void 0,t?.target.hasPointerCapture(t.pointerId)&&t.target.releasePointerCapture(t.pointerId),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0,cancelable:!0}))||this.colorController.restorePreviousColor(),e?.(),this._interaction.end()}endInteraction(){this._pointerDown?this._finishPointer():this._interaction.end()}calculateHandlePosition(e){if(!this.boundingClientRect)return this.sliderHandlePosition;let t=this.boundingClientRect,n=this.vertical?t.top:t.left,r=this.vertical?e.clientY:e.clientX,i=this.vertical?t.height:t.width,a=Math.max(0,Math.min(1,(r-n)/i));return this.vertical||!this.isLTR?100-100*a:100*a}handleGradientPointerdown(e){e.button===0&&(e.stopPropagation(),e.preventDefault(),this.handle.dispatchEvent(new PointerEvent(`pointerdown`,e)),this.handlePointermove(e))}get handlePositionStyles(){return`${this.vertical?`inset-block-end`:`inset-inline-start`}: ${this.sliderHandlePosition}%`}get getColorSliderStyle(){let e=this.vertical?`top`:`right`;return this.mode===`opacity`?{background:`linear-gradient(to ${e}, transparent, ${new l.TinyColor(this.colorController.color).setAlpha(1).toRgbString()})`}:{background:`linear-gradient(to ${e}, var(--luzmo-color-slider-gradient, var(--luzmo-color-slider-gradient-fallback)))`}}render(){return a.html`
19
+ <div
20
+ class="opacity-checkerboard checkerboard"
21
+ role="presentation"
22
+ @pointerdown=${this.handleGradientPointerdown}
23
+ >
24
+ <div
25
+ class="gradient"
26
+ role="presentation"
27
+ style=${(0,c.styleMap)(this.getColorSliderStyle)}
28
+ >
29
+ <slot name="gradient"></slot>
30
+ </div>
31
+ </div>
32
+ <luzmo-color-handle
33
+ tabindex=${(0,s.ifDefined)(this.focused?void 0:`0`)}
34
+ @focus=${this.forwardFocus}
35
+ ?focused=${this.focused}
36
+ class="handle"
37
+ color=${this.mode===`opacity`?this.color:`hsl(`+this.value+`, 100%, 50%)`}
38
+ ?disabled=${this.disabled}
39
+ style=${this.handlePositionStyles}
40
+ ${i.t({start:[`pointerdown`,this.handlePointerdown],streamInside:[`pointermove`,this.handlePointermove],end:[[`pointerup`,`pointercancel`,`pointerleave`,`lostpointercapture`],this.handlePointerup]})}
41
+ ></luzmo-color-handle>
42
+ <input
43
+ type="range"
44
+ class="slider"
45
+ min="0"
46
+ max=${this.mode===`opacity`?`100`:`360`}
47
+ aria-orientation=${(0,s.ifDefined)(this.vertical?`vertical`:void 0)}
48
+ orient=${(0,s.ifDefined)(this.vertical?`vertical`:void 0)}
49
+ step=${this.step}
50
+ aria-label=${this.label}
51
+ .value=${String(this.mode===`opacity`?this.value*100:this.value)}
52
+ aria-valuetext=${`${new Intl.NumberFormat(this.languageResolver.language,{maximumFractionDigits:0,minimumIntegerDigits:1,style:`unit`,unit:this.mode===`opacity`?`percent`:`degree`,unitDisplay:`narrow`}).format(this.mode===`opacity`?this.value*100:this.value)}`}
53
+ @input=${this.handleInput}
54
+ @change=${this.handleChange}
55
+ @keydown=${this.handleKeydown}
56
+ @keyup=${this.handleKeyup}
57
+ />
58
+ `}disconnectedCallback(){this._pointerDown=!1,this._capturedPointer=void 0,super.disconnectedCallback()}firstUpdated(e){super.firstUpdated(e),this.boundingClientRect=this.getBoundingClientRect(),this.addEventListener(`focus`,this.handleFocus),this.addEventListener(`blur`,this.handleBlur)}updated(e){e.has(`mode`)&&(this.handle.style.insetInlineStart=``,this.handle.style.insetBlockEnd=``,this.mode===`opacity`&&(this.colorController.color=new l.TinyColor(this.colorController.color).toRgbString(),this.handle.style.insetInlineStart=100*this.colorController.opacity+`%`))}};e.t([(0,o.property)({type:String,reflect:!0})],g.prototype,`dir`,void 0),e.t([(0,o.property)({type:String,reflect:!0})],g.prototype,`mode`,void 0),e.t([(0,o.property)({type:Boolean,reflect:!0})],g.prototype,`disabled`,void 0),e.t([(0,o.property)({type:Boolean,reflect:!0})],g.prototype,`focused`,void 0),e.t([(0,o.query)(`.handle`)],g.prototype,`handle`,void 0),e.t([(0,o.property)({type:String})],g.prototype,`label`,void 0),e.t([(0,o.property)({type:Boolean,reflect:!0})],g.prototype,`vertical`,void 0),e.t([(0,o.property)({type:Number})],g.prototype,`value`,null),e.t([(0,o.property)({type:Number,reflect:!0})],g.prototype,`sliderHandlePosition`,void 0),e.t([(0,o.property)({type:String})],g.prototype,`color`,null),e.t([(0,o.property)({type:Number})],g.prototype,`step`,void 0),e.t([(0,o.property)({type:Boolean,attribute:`is-ltr`})],g.prototype,`isLTR`,void 0),e.t([(0,o.query)(`input`)],g.prototype,`input`,void 0),customElements.get(`luzmo-color-slider`)||customElements.define(`luzmo-color-slider`,g),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return g}});