@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
@@ -7,6 +7,11 @@ import { ColorTypes } from '../../utils/reactive-controllers/color-controller';
7
7
  * @slot gradient - a custom gradient visually outlining the available color values
8
8
  * @fires input - The value of the Color Area has changed.
9
9
  * @fires change - An alteration to the value of the Color Area has been committed by the user.
10
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-start - A
11
+ * pointer drag or held-key interaction starts, before its first value change.
12
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-end - The
13
+ * interaction ends after its last `input`/`change`, even when nothing changed.
14
+ * A cancelled pointer commits and ends the same way.
10
15
  */
11
16
  export declare class LuzmoColorArea extends LuzmoElement {
12
17
  static get styles(): CSSResultArray;
@@ -47,6 +52,7 @@ export declare class LuzmoColorArea extends LuzmoElement {
47
52
  * @property {string} options.manageAs - Specifies the color model to manage, in this case 'hsv'.
48
53
  */
49
54
  private colorController;
55
+ private readonly _interaction;
50
56
  get hue(): number;
51
57
  set hue(value: number);
52
58
  get value(): ColorTypes;
@@ -74,9 +80,18 @@ export declare class LuzmoColorArea extends LuzmoElement {
74
80
  private handleChange;
75
81
  private boundingClientRect;
76
82
  _pointerDown: boolean;
83
+ private _capturedPointer?;
77
84
  private handlePointerdown;
78
85
  private handlePointermove;
79
86
  private handlePointerup;
87
+ /** Commits the pointer interaction in progress, then ends it. */
88
+ private _finishPointer;
89
+ /**
90
+ * Finishes the pointer drag or held-key interaction in progress as if the
91
+ * user released it, so a host can settle the value before it removes or
92
+ * hides the area. Does nothing when no interaction is in progress.
93
+ */
94
+ endInteraction(): void;
80
95
  /**
81
96
  * Returns the value under the cursor
82
97
  * @param: PointerEvent on slider
@@ -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-area-D1fRozE0.cjs");exports.LuzmoColorArea=e.t;
18
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-area-CFBE-rG3.cjs");exports.LuzmoColorArea=e.t;
@@ -5,3 +5,4 @@ declare global {
5
5
  }
6
6
  }
7
7
  export { LuzmoColorArea } from './color-area';
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 LuzmoColorArea } from "../color-area-qlEAp8ZN.js";
19
+ export { t as LuzmoColorArea } from "../color-area-GGa8KJyd.js";
@@ -0,0 +1,80 @@
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
+ const e=require("./color-controller-BpdydwTO.cjs");require("./tokens.cjs");const t=require("./decorate-SO02l0A6.cjs"),n=require("./language-resolution-B7D3hQ6_.cjs"),r=require("./platform-BAjeJp2W.cjs");require("./color-handle-hJ7Kblh4.cjs");const i=require("./interaction-BjXWVy_C.cjs"),a=require("./streaming-listener-BzGZUHkj.cjs");let o=require("lit"),s=require("lit/decorators.js"),c=require("lit/directives/if-defined.js");var l=`@media (forced-colors:active){:host{--highcontrast-color-area-border-color-disabled:GrayText;--highcontrast-color-area-border-color:Canvas;--highcontrast-color-area-fill-color-disabled:Canvas}.gradient,:host([disabled]){forced-color-adjust:none}}:host{cursor:default;-webkit-user-select:none;user-select:none;min-inline-size:var(--luzmo-color-area-min-width,64px);min-block-size:var(--luzmo-color-area-min-height,64px);inline-size:var(--luzmo-color-area-width,192px);block-size:var(--luzmo-color-area-height,192px);box-sizing:border-box;border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));display:inline-block;position:relative;border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color,var(--luzmo-color-area-border-color,var(--luzmo-border-color)))!important}:host([focused]){z-index:1}:host([disabled]){pointer-events:none;background:var(--highcontrast-color-area-fill-color-disabled,var(--luzmo-color-area-disabled-background-color,var(--luzmo-dimmed-color)));border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color-disabled)!important}:host([disabled]) .gradient{display:none}.handle{transform:translate(calc(var(--luzmo-color-area-width,192px) - var(--luzmo-border-width)));inset-block-start:0}:host([dir=rtl]) .handle{inset-inline-end:0}.handle: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)){inset-inline-end:0}.gradient{border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}.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}:host{touch-action:none}:host:before{pointer-events:none}.gradient{overflow:hidden}.handle{transform:translate(var(--luzmo-color-area-default-width), 0)}::slotted(*){width:100%;height:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.slider[orient=vertical]{appearance:slider-vertical}.slider:focus{z-index:1}.fieldset{border:0;margin:0;padding:0}`,u=class extends t.n{constructor(...t){super(...t),this.disabled=!1,this.focused=!1,this.labelX=`saturation`,this.labelY=`luminosity`,this.isLTR=!0,this.languageResolver=new n.t(this),this.colorController=new e.t(this,{manageAs:`hsv`}),this._interaction=new i.t(this,{value:()=>[this.x,this.y],isEqual:(e,t)=>e[0]===t[0]&&e[1]===t[1]}),this.activeAxis=`x`,this.step=.01,this.altered=0,this.activeKeys=new Set,this._valueChanged=!1,this._pointerDown=!1,this.resizeRafId=0,this.handleResize=e=>{let t=e.at(-1);t&&(this.resizeRafId&&cancelAnimationFrame(this.resizeRafId),this.resizeRafId=requestAnimationFrame(()=>{this.resizeRafId=0,this.boundingClientRect=t.contentRect,this.requestUpdate()}))}}static get styles(){return[(0,o.unsafeCSS)(l)]}get hue(){return this.colorController.hue}set hue(e){this.colorController.hue=e}get value(){return this.colorController.colorValue}get color(){return this.colorController.colorValue}set color(e){this.colorController.color=e}get x(){return this.colorController.color.hsv.s/100}set x(e){if(e===this.x)return;let t=this.x;this.inputX?(this.inputX.value=e.toString(),this.colorController.color.set(`s`,this.inputX.valueAsNumber*100)):this.colorController.color.set(`s`,e*100),this.requestUpdate(`x`,t)}get y(){return this.colorController.color.hsv.v/100}set y(e){if(e===this.y)return;let t=this.y;this.inputY&&(this.inputY.value=e.toString(),this.colorController.color.set(`v`,this.inputY.valueAsNumber*100)),this.requestUpdate(`y`,t)}focus(e={}){super.focus(e),this.forwardFocus()}forwardFocus(){this.activeAxis===`x`?this.inputX.focus():this.inputY.focus()}handleFocus(){this.focused=!0,this._valueChanged=!1}handleBlur(){this.activeKeys.clear(),this._interaction.endKeyboard(),!this._pointerDown&&(this.altered=0,this.focused=!1,this._valueChanged=!1)}handleKeydown(e){let{code:t}=e;if(this.focused=!0,this.altered=[e.shiftKey,e.ctrlKey,e.altKey].filter(e=>!!e).length,t.search(`Arrow`)===0||t.search(`Page`)===0||t.search(`Home`)===0||t.search(`End`)===0){if(e.preventDefault(),this.disabled||!this._interaction.keyDown(t))return;if(this.disabled){this._interaction.end();return}this.activeKeys.add(t),this.handleKeypress()}}handleKeypress(){let e=0,t=0,n=Math.max(this.step,this.altered*5*this.step);this.activeKeys.forEach(r=>{switch(r){case`ArrowUp`:t=n;break;case`ArrowDown`:t=n*-1;break;case`ArrowLeft`:e=this.step*(this.isLTR?-1:1);break;case`ArrowRight`:e=this.step*(this.isLTR?1:-1);break;case`PageUp`:t=n*10;break;case`PageDown`:t=n*-10;break;case`Home`:e=n*(this.isLTR?-10:10);break;case`End`:e=n*(this.isLTR?10:-10)}}),e===0?t!==0&&(this.activeAxis=`y`,this.inputY.focus()):(this.activeAxis=`x`,this.inputX.focus()),this.x=Math.min(1,Math.max(this.x+e,0)),this.y=Math.min(1,Math.max(this.y+t,0)),this.colorController.savePreviousColor(),(e!==0||t!==0)&&(this._valueChanged=!0,this._interaction.commit(()=>this.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0})),()=>{this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0,cancelable:!0}))||this.colorController.restorePreviousColor()}))}handleKeyup(e){e.preventDefault();let{code:t}=e;this.activeKeys.delete(t),this._interaction.keyUp(t)}handleInput(e){let{valueAsNumber:t,name:n}=e.target;this[n]=t}handleChange(e){this.handleInput(e),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0,cancelable:!0}))}handlePointerdown(e){if(e.button!==0||!this._interaction.start(i.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){if(!this._pointerDown)return;let[t,n]=this.calculateHandlePosition(e);this._valueChanged=!1,this.x=t,this.y=n,this.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0,cancelable:!0}))}handlePointerup(e){e.preventDefault(),this._pointerDown&&this._finishPointer(()=>{this.inputX.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);let n=this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0,cancelable:!0}));e?.(),n||this.colorController.restorePreviousColor(),this._interaction.end()}endInteraction(){this._pointerDown?this._finishPointer():(this.activeKeys.clear(),this._interaction.end())}calculateHandlePosition(e){if(!this.boundingClientRect)return[this.x,this.y];let t=this.boundingClientRect,n=t.left,r=t.top,i=e.clientX,a=e.clientY,o=t.width,s=t.height,c=Math.max(0,Math.min(1,(i-n)/o)),l=Math.max(0,Math.min(1,(a-r)/s));return[this.isLTR?c:1-c,1-l]}handleAreaPointerdown(e){e.button===0&&(e.stopPropagation(),e.preventDefault(),this.handle.dispatchEvent(new PointerEvent(`pointerdown`,e)),this.handlePointermove(e))}render(){let{width:e=0,height:t=0}=this.boundingClientRect||{},n=r.t()||r.a(),i=`Color Picker`,s=(0,c.ifDefined)(n?void 0:`2d slider`),l=this.labelX,u=this.labelY,d=new Intl.NumberFormat(this.languageResolver.language,{style:`percent`,unitDisplay:`narrow`}).format(this.x),f=new Intl.NumberFormat(this.languageResolver.language,{style:`percent`,unitDisplay:`narrow`}).format(this.y),p={background:`linear-gradient(to top, black 0%, hsla(${this.hue}, 100%, 0.01%, 0) 100%),linear-gradient(to right, white 0%, hsla(${this.hue}, 100%, 0.01%, 0) 100%), hsl(${this.hue}, 100%, 50%);`};return o.html`
19
+ <div
20
+ @pointerdown=${this.handleAreaPointerdown}
21
+ class="gradient"
22
+ style="background: ${p.background}"
23
+ >
24
+ <slot name="gradient"></slot>
25
+ </div>
26
+
27
+ <luzmo-color-handle
28
+ tabindex=${(0,c.ifDefined)(this.focused?void 0:`0`)}
29
+ @focus=${this.forwardFocus}
30
+ ?focused=${this.focused}
31
+ class="handle"
32
+ color=${this.colorController.getHslString()}
33
+ ?disabled=${this.disabled}
34
+ style=${`transform: translate(${(this.isLTR?this.x:1-this.x)*e}px, ${t-this.y*t}px);`}
35
+ ${a.t({start:[`pointerdown`,this.handlePointerdown],streamInside:[`pointermove`,this.handlePointermove],end:[[`pointerup`,`pointercancel`,`pointerleave`,`lostpointercapture`],this.handlePointerup]})}
36
+ ></luzmo-color-handle>
37
+
38
+ <fieldset
39
+ class="fieldset"
40
+ aria-label=${(0,c.ifDefined)(n?i:void 0)}
41
+ >
42
+ <div role="presentation">
43
+ <input
44
+ type="range"
45
+ class="slider"
46
+ name="x"
47
+ aria-label=${n?l:`${l} ${i}`}
48
+ aria-roledescription=${s}
49
+ aria-orientation="horizontal"
50
+ aria-valuetext=${n?d:`${d}, ${l}${this._valueChanged?``:`, ${f}, ${u}`}`}
51
+ min="0"
52
+ max="1"
53
+ step=${this.step}
54
+ tabindex="-1"
55
+ .value=${String(this.x)}
56
+ @input=${this.handleInput}
57
+ @change=${this.handleChange}
58
+ />
59
+ </div>
60
+ <div role="presentation">
61
+ <input
62
+ type="range"
63
+ class="slider"
64
+ name="y"
65
+ aria-label=${n?u:`${u} ${i}`}
66
+ aria-roledescription=${s}
67
+ aria-orientation="vertical"
68
+ aria-valuetext=${n?f:`${f}, ${u}${this._valueChanged?``:`, ${d}, ${l}`}`}
69
+ orient="vertical"
70
+ min="0"
71
+ max="1"
72
+ step=${this.step}
73
+ tabindex="-1"
74
+ .value=${String(this.y)}
75
+ @input=${this.handleInput}
76
+ @change=${this.handleChange}
77
+ />
78
+ </div>
79
+ </fieldset>
80
+ `}firstUpdated(e){super.firstUpdated(e),this.boundingClientRect=this.getBoundingClientRect(),this.addEventListener(`focus`,this.handleFocus),this.addEventListener(`blur`,this.handleBlur),this.addEventListener(`keyup`,this.handleKeyup),this.addEventListener(`keydown`,this.handleKeydown)}updated(e){if(super.updated(e),this.x!==this.inputX.valueAsNumber&&this.colorController.color.set(`s`,this.inputX.valueAsNumber*100),this.y!==this.inputY.valueAsNumber&&this.colorController.color.set(`v`,(1-this.inputY.valueAsNumber)*100),e.has(`focused`)&&this.focused){let e=this.inputX.parentElement,t=this.inputY.parentElement;if(!e.shadowRoot&&!t.shadowRoot){e.attachShadow({mode:`open`}),t.attachShadow({mode:`open`});let n=`<div tabindex="-1"><slot></slot></div>`;e.shadowRoot.innerHTML=n,t.shadowRoot.innerHTML=n}}}connectedCallback(){super.connectedCallback(),!this.observer&&window.ResizeObserver&&(this.observer=new window.ResizeObserver(this.handleResize)),this.observer?.observe(this)}disconnectedCallback(){this._pointerDown=!1,this._capturedPointer=void 0,this.activeKeys.clear(),this.resizeRafId&&=(cancelAnimationFrame(this.resizeRafId),0),this.observer?.disconnect(),this.observer=void 0,super.disconnectedCallback()}};t.t([(0,s.property)({type:String,reflect:!0})],u.prototype,`dir`,void 0),t.t([(0,s.property)({type:Boolean,reflect:!0})],u.prototype,`disabled`,void 0),t.t([(0,s.property)({type:Boolean,reflect:!0})],u.prototype,`focused`,void 0),t.t([(0,s.property)({type:String,attribute:`label-x`})],u.prototype,`labelX`,void 0),t.t([(0,s.property)({type:String,attribute:`label-y`})],u.prototype,`labelY`,void 0),t.t([(0,s.property)({type:Boolean,attribute:`is-ltr`})],u.prototype,`isLTR`,void 0),t.t([(0,s.query)(`.handle`)],u.prototype,`handle`,void 0),t.t([(0,s.property)({type:Number})],u.prototype,`hue`,null),t.t([(0,s.property)({type:String})],u.prototype,`value`,null),t.t([(0,s.property)({type:String})],u.prototype,`color`,null),t.t([(0,s.property)({attribute:!1})],u.prototype,`activeAxis`,void 0),t.t([(0,s.property)({type:Number})],u.prototype,`x`,null),t.t([(0,s.property)({type:Number})],u.prototype,`y`,null),t.t([(0,s.property)({type:Number})],u.prototype,`step`,void 0),t.t([(0,s.query)(`[name="x"]`)],u.prototype,`inputX`,void 0),t.t([(0,s.query)(`[name="y"]`)],u.prototype,`inputY`,void 0),customElements.get(`luzmo-color-area`)||customElements.define(`luzmo-color-area`,u),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
@@ -19,16 +19,20 @@ import "./tokens.js";
19
19
  import { n as e, t } from "./decorate-CpKsOs9z.js";
20
20
  import { t as n } from "./language-resolution-7rc0khIK.js";
21
21
  import { a as r, t as i } from "./platform-CDW-WdXN.js";
22
- import "./color-handle-Dc0uLgkf.js";
23
- import { t as a } from "./color-controller-CauSxC_r.js";
24
- import { t as o } from "./streaming-listener-B6mDl4pZ.js";
25
- import { html as s, unsafeCSS as c } from "lit";
26
- import { property as l, query as u } from "lit/decorators.js";
27
- import { ifDefined as d } from "lit/directives/if-defined.js";
22
+ import "./color-handle-Ya92rdpA.js";
23
+ import { n as a, t as o } from "./interaction-BpCLJ1OV.js";
24
+ import { t as s } from "./color-controller-CauSxC_r.js";
25
+ import { t as c } from "./streaming-listener-DyS3scAi.js";
26
+ import { html as l, unsafeCSS as u } from "lit";
27
+ import { property as d, query as f } from "lit/decorators.js";
28
+ import { ifDefined as p } from "lit/directives/if-defined.js";
28
29
  // src/components/color-area/color-area.module.scss?inline
29
- var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-color-disabled:GrayText;--highcontrast-color-area-border-color:Canvas;--highcontrast-color-area-fill-color-disabled:Canvas}.gradient,:host([disabled]){forced-color-adjust:none}}:host{cursor:default;-webkit-user-select:none;user-select:none;min-inline-size:var(--luzmo-color-area-min-width,64px);min-block-size:var(--luzmo-color-area-min-height,64px);inline-size:var(--luzmo-color-area-width,192px);block-size:var(--luzmo-color-area-height,192px);box-sizing:border-box;border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));display:inline-block;position:relative;border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color,var(--luzmo-color-area-border-color,var(--luzmo-border-color)))!important}:host([focused]){z-index:1}:host([disabled]){pointer-events:none;background:var(--highcontrast-color-area-fill-color-disabled,var(--luzmo-color-area-disabled-background-color,var(--luzmo-dimmed-color)));border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color-disabled)!important}:host([disabled]) .gradient{display:none}.handle{transform:translate(calc(var(--luzmo-color-area-width,192px) - var(--luzmo-border-width)));inset-block-start:0}:host([dir=rtl]) .handle{inset-inline-end:0}.handle: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)){inset-inline-end:0}.gradient{border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}.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}:host{touch-action:none}:host:before{pointer-events:none}.gradient{overflow:hidden}.handle{transform:translate(var(--luzmo-color-area-default-width), 0)}::slotted(*){width:100%;height:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.slider[orient=vertical]{appearance:slider-vertical}.slider:focus{z-index:1}.fieldset{border:0;margin:0;padding:0}", p = class extends e {
30
+ var m = "@media (forced-colors:active){:host{--highcontrast-color-area-border-color-disabled:GrayText;--highcontrast-color-area-border-color:Canvas;--highcontrast-color-area-fill-color-disabled:Canvas}.gradient,:host([disabled]){forced-color-adjust:none}}:host{cursor:default;-webkit-user-select:none;user-select:none;min-inline-size:var(--luzmo-color-area-min-width,64px);min-block-size:var(--luzmo-color-area-min-height,64px);inline-size:var(--luzmo-color-area-width,192px);block-size:var(--luzmo-color-area-height,192px);box-sizing:border-box;border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));display:inline-block;position:relative;border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color,var(--luzmo-color-area-border-color,var(--luzmo-border-color)))!important}:host([focused]){z-index:1}:host([disabled]){pointer-events:none;background:var(--highcontrast-color-area-fill-color-disabled,var(--luzmo-color-area-disabled-background-color,var(--luzmo-dimmed-color)));border:var(--luzmo-color-area-border-width,var(--luzmo-border-width)) solid var(--highcontrast-color-area-border-color-disabled)!important}:host([disabled]) .gradient{display:none}.handle{transform:translate(calc(var(--luzmo-color-area-width,192px) - var(--luzmo-border-width)));inset-block-start:0}:host([dir=rtl]) .handle{inset-inline-end:0}.handle: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)){inset-inline-end:0}.gradient{border-radius:var(--luzmo-color-area-border-radius,var(--luzmo-border-radius-s));block-size:100%;inline-size:100%}.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}:host{touch-action:none}:host:before{pointer-events:none}.gradient{overflow:hidden}.handle{transform:translate(var(--luzmo-color-area-default-width), 0)}::slotted(*){width:100%;height:100%}:host([dir=rtl]) .gradient{transform:scaleX(-1)}.slider[orient=vertical]{appearance:slider-vertical}.slider:focus{z-index:1}.fieldset{border:0;margin:0;padding:0}", h = class extends e {
30
31
  constructor(...e) {
31
- super(...e), this.disabled = !1, this.focused = !1, this.labelX = "saturation", this.labelY = "luminosity", this.isLTR = !0, this.languageResolver = new n(this), this.colorController = new a(this, { manageAs: "hsv" }), this.activeAxis = "x", this.step = .01, this.altered = 0, this.activeKeys = /* @__PURE__ */ new Set(), this._valueChanged = !1, this._pointerDown = !1, this.resizeRafId = 0, this.handleResize = (e) => {
32
+ super(...e), this.disabled = !1, this.focused = !1, this.labelX = "saturation", this.labelY = "luminosity", this.isLTR = !0, this.languageResolver = new n(this), this.colorController = new s(this, { manageAs: "hsv" }), this._interaction = new o(this, {
33
+ value: () => [this.x, this.y],
34
+ isEqual: (e, t) => e[0] === t[0] && e[1] === t[1]
35
+ }), this.activeAxis = "x", this.step = .01, this.altered = 0, this.activeKeys = /* @__PURE__ */ new Set(), this._valueChanged = !1, this._pointerDown = !1, this.resizeRafId = 0, this.handleResize = (e) => {
32
36
  let t = e.at(-1);
33
37
  t && (this.resizeRafId && cancelAnimationFrame(this.resizeRafId), this.resizeRafId = requestAnimationFrame(() => {
34
38
  this.resizeRafId = 0, this.boundingClientRect = t.contentRect, this.requestUpdate();
@@ -36,7 +40,7 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
36
40
  };
37
41
  }
38
42
  static get styles() {
39
- return [c(f)];
43
+ return [u(m)];
40
44
  }
41
45
  get hue() {
42
46
  return this.colorController.hue;
@@ -79,15 +83,22 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
79
83
  this.focused = !0, this._valueChanged = !1;
80
84
  }
81
85
  handleBlur() {
82
- this._pointerDown || (this.altered = 0, this.focused = !1, this._valueChanged = !1);
86
+ this.activeKeys.clear(), this._interaction.endKeyboard(), !this._pointerDown && (this.altered = 0, this.focused = !1, this._valueChanged = !1);
83
87
  }
84
88
  handleKeydown(e) {
85
89
  let { code: t } = e;
86
- this.focused = !0, this.altered = [
90
+ if (this.focused = !0, this.altered = [
87
91
  e.shiftKey,
88
92
  e.ctrlKey,
89
93
  e.altKey
90
- ].filter((e) => !!e).length, (t.search("Arrow") === 0 || t.search("Page") === 0 || t.search("Home") === 0 || t.search("End") === 0) && (e.preventDefault(), this.activeKeys.add(t), this.handleKeypress());
94
+ ].filter((e) => !!e).length, t.search("Arrow") === 0 || t.search("Page") === 0 || t.search("Home") === 0 || t.search("End") === 0) {
95
+ if (e.preventDefault(), this.disabled || !this._interaction.keyDown(t)) return;
96
+ if (this.disabled) {
97
+ this._interaction.end();
98
+ return;
99
+ }
100
+ this.activeKeys.add(t), this.handleKeypress();
101
+ }
91
102
  }
92
103
  handleKeypress() {
93
104
  let e = 0, t = 0, n = Math.max(this.step, this.altered * 5 * this.step);
@@ -116,19 +127,21 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
116
127
  break;
117
128
  case "End": e = n * (this.isLTR ? 10 : -10);
118
129
  }
119
- }), e === 0 ? t !== 0 && (this.activeAxis = "y", this.inputY.focus()) : (this.activeAxis = "x", this.inputX.focus()), this.x = Math.min(1, Math.max(this.x + e, 0)), this.y = Math.min(1, Math.max(this.y + t, 0)), this.colorController.savePreviousColor(), (e !== 0 || t !== 0) && (this._valueChanged = !0, this.dispatchEvent(new Event("input", {
130
+ }), e === 0 ? t !== 0 && (this.activeAxis = "y", this.inputY.focus()) : (this.activeAxis = "x", this.inputX.focus()), this.x = Math.min(1, Math.max(this.x + e, 0)), this.y = Math.min(1, Math.max(this.y + t, 0)), this.colorController.savePreviousColor(), (e !== 0 || t !== 0) && (this._valueChanged = !0, this._interaction.commit(() => this.dispatchEvent(new Event("input", {
120
131
  bubbles: !0,
121
132
  composed: !0
122
- })), this.dispatchEvent(new Event("change", {
123
- bubbles: !0,
124
- composed: !0,
125
- cancelable: !0
126
- })) || this.colorController.restorePreviousColor());
133
+ })), () => {
134
+ this.dispatchEvent(new Event("change", {
135
+ bubbles: !0,
136
+ composed: !0,
137
+ cancelable: !0
138
+ })) || this.colorController.restorePreviousColor();
139
+ }));
127
140
  }
128
141
  handleKeyup(e) {
129
142
  e.preventDefault();
130
143
  let { code: t } = e;
131
- this.activeKeys.delete(t);
144
+ this.activeKeys.delete(t), this._interaction.keyUp(t);
132
145
  }
133
146
  handleInput(e) {
134
147
  let { valueAsNumber: t, name: n } = e.target;
@@ -142,9 +155,26 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
142
155
  }));
143
156
  }
144
157
  handlePointerdown(e) {
145
- 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();
158
+ if (e.button !== 0 || !this._interaction.start(a(e))) {
159
+ e.preventDefault();
160
+ return;
161
+ }
162
+ if (this.disabled) {
163
+ this._interaction.end(), e.preventDefault();
164
+ return;
165
+ }
166
+ this._pointerDown = !0, this.colorController.savePreviousColor(), this.boundingClientRect = this.getBoundingClientRect();
167
+ let t = e.target;
168
+ try {
169
+ t.setPointerCapture(e.pointerId), this._capturedPointer = {
170
+ target: t,
171
+ pointerId: e.pointerId
172
+ };
173
+ } catch {}
174
+ e.pointerType === "mouse" && (this.focused = !0);
146
175
  }
147
176
  handlePointermove(e) {
177
+ if (!this._pointerDown) return;
148
178
  let [t, n] = this.calculateHandlePosition(e);
149
179
  this._valueChanged = !1, this.x = t, this.y = n, this.dispatchEvent(new Event("input", {
150
180
  bubbles: !0,
@@ -153,13 +183,23 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
153
183
  }));
154
184
  }
155
185
  handlePointerup(e) {
156
- e.preventDefault(), this._pointerDown = !1, e.target.releasePointerCapture(e.pointerId);
157
- let t = this.dispatchEvent(new Event("change", {
186
+ e.preventDefault(), this._pointerDown && this._finishPointer(() => {
187
+ this.inputX.focus(), e.pointerType === "mouse" && (this.focused = !1);
188
+ });
189
+ }
190
+ _finishPointer(e) {
191
+ this._pointerDown = !1;
192
+ let t = this._capturedPointer;
193
+ this._capturedPointer = void 0, t?.target.hasPointerCapture(t.pointerId) && t.target.releasePointerCapture(t.pointerId);
194
+ let n = this.dispatchEvent(new Event("change", {
158
195
  bubbles: !0,
159
196
  composed: !0,
160
197
  cancelable: !0
161
198
  }));
162
- this.inputX.focus(), e.pointerType === "mouse" && (this.focused = !1), t || this.colorController.restorePreviousColor();
199
+ e?.(), n || this.colorController.restorePreviousColor(), this._interaction.end();
200
+ }
201
+ endInteraction() {
202
+ this._pointerDown ? this._finishPointer() : (this.activeKeys.clear(), this._interaction.end());
163
203
  }
164
204
  calculateHandlePosition(e) {
165
205
  /* c8 ignore next 3 */
@@ -171,14 +211,14 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
171
211
  e.button === 0 && (e.stopPropagation(), e.preventDefault(), this.handle.dispatchEvent(new PointerEvent("pointerdown", e)), this.handlePointermove(e));
172
212
  }
173
213
  render() {
174
- let { width: e = 0, height: t = 0 } = this.boundingClientRect || {}, n = i() || r(), a = "Color Picker", c = d(n ? void 0 : "2d slider"), l = this.labelX, u = this.labelY, f = new Intl.NumberFormat(this.languageResolver.language, {
214
+ let { width: e = 0, height: t = 0 } = this.boundingClientRect || {}, n = i() || r(), a = "Color Picker", o = p(n ? void 0 : "2d slider"), s = this.labelX, u = this.labelY, d = new Intl.NumberFormat(this.languageResolver.language, {
175
215
  style: "percent",
176
216
  unitDisplay: "narrow"
177
- }).format(this.x), p = new Intl.NumberFormat(this.languageResolver.language, {
217
+ }).format(this.x), f = new Intl.NumberFormat(this.languageResolver.language, {
178
218
  style: "percent",
179
219
  unitDisplay: "narrow"
180
220
  }).format(this.y), m = { background: `linear-gradient(to top, black 0%, hsla(${this.hue}, 100%, 0.01%, 0) 100%),linear-gradient(to right, white 0%, hsla(${this.hue}, 100%, 0.01%, 0) 100%), hsl(${this.hue}, 100%, 50%);` };
181
- return s`
221
+ return l`
182
222
  <div
183
223
  @pointerdown=${this.handleAreaPointerdown}
184
224
  class="gradient"
@@ -188,37 +228,38 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
188
228
  </div>
189
229
 
190
230
  <luzmo-color-handle
191
- tabindex=${d(this.focused ? void 0 : "0")}
231
+ tabindex=${p(this.focused ? void 0 : "0")}
192
232
  @focus=${this.forwardFocus}
193
233
  ?focused=${this.focused}
194
234
  class="handle"
195
235
  color=${this.colorController.getHslString()}
196
236
  ?disabled=${this.disabled}
197
237
  style=${`transform: translate(${(this.isLTR ? this.x : 1 - this.x) * e}px, ${t - this.y * t}px);`}
198
- ${o({
238
+ ${c({
199
239
  start: ["pointerdown", this.handlePointerdown],
200
240
  streamInside: ["pointermove", this.handlePointermove],
201
241
  end: [[
202
242
  "pointerup",
203
243
  "pointercancel",
204
- "pointerleave"
244
+ "pointerleave",
245
+ "lostpointercapture"
205
246
  ], this.handlePointerup]
206
247
  })}
207
248
  ></luzmo-color-handle>
208
249
 
209
250
  <fieldset
210
251
  class="fieldset"
211
- aria-label=${d(n ? a : void 0)}
252
+ aria-label=${p(n ? a : void 0)}
212
253
  >
213
254
  <div role="presentation">
214
255
  <input
215
256
  type="range"
216
257
  class="slider"
217
258
  name="x"
218
- aria-label=${n ? l : `${l} ${a}`}
219
- aria-roledescription=${c}
259
+ aria-label=${n ? s : `${s} ${a}`}
260
+ aria-roledescription=${o}
220
261
  aria-orientation="horizontal"
221
- aria-valuetext=${n ? f : `${f}, ${l}${this._valueChanged ? "" : `, ${p}, ${u}`}`}
262
+ aria-valuetext=${n ? d : `${d}, ${s}${this._valueChanged ? "" : `, ${f}, ${u}`}`}
222
263
  min="0"
223
264
  max="1"
224
265
  step=${this.step}
@@ -234,9 +275,9 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
234
275
  class="slider"
235
276
  name="y"
236
277
  aria-label=${n ? u : `${u} ${a}`}
237
- aria-roledescription=${c}
278
+ aria-roledescription=${o}
238
279
  aria-orientation="vertical"
239
- aria-valuetext=${n ? p : `${p}, ${u}${this._valueChanged ? "" : `, ${f}, ${l}`}`}
280
+ aria-valuetext=${n ? f : `${f}, ${u}${this._valueChanged ? "" : `, ${d}, ${s}`}`}
240
281
  orient="vertical"
241
282
  min="0"
242
283
  max="1"
@@ -267,27 +308,27 @@ var f = "@media (forced-colors:active){:host{--highcontrast-color-area-border-co
267
308
  super.connectedCallback(), !this.observer && window.ResizeObserver && (this.observer = new window.ResizeObserver(this.handleResize)), this.observer?.observe(this);
268
309
  }
269
310
  disconnectedCallback() {
270
- this.resizeRafId &&= (cancelAnimationFrame(this.resizeRafId), 0), this.observer?.disconnect(), this.observer = void 0, super.disconnectedCallback();
311
+ this._pointerDown = !1, this._capturedPointer = void 0, this.activeKeys.clear(), this.resizeRafId &&= (cancelAnimationFrame(this.resizeRafId), 0), this.observer?.disconnect(), this.observer = void 0, super.disconnectedCallback();
271
312
  }
272
313
  };
273
314
  // src/components/color-area/index.ts
274
- t([l({
315
+ t([d({
275
316
  type: String,
276
317
  reflect: !0
277
- })], p.prototype, "dir", void 0), t([l({
318
+ })], h.prototype, "dir", void 0), t([d({
278
319
  type: Boolean,
279
320
  reflect: !0
280
- })], p.prototype, "disabled", void 0), t([l({
321
+ })], h.prototype, "disabled", void 0), t([d({
281
322
  type: Boolean,
282
323
  reflect: !0
283
- })], p.prototype, "focused", void 0), t([l({
324
+ })], h.prototype, "focused", void 0), t([d({
284
325
  type: String,
285
326
  attribute: "label-x"
286
- })], p.prototype, "labelX", void 0), t([l({
327
+ })], h.prototype, "labelX", void 0), t([d({
287
328
  type: String,
288
329
  attribute: "label-y"
289
- })], p.prototype, "labelY", void 0), t([l({
330
+ })], h.prototype, "labelY", void 0), t([d({
290
331
  type: Boolean,
291
332
  attribute: "is-ltr"
292
- })], p.prototype, "isLTR", void 0), t([u(".handle")], p.prototype, "handle", void 0), t([l({ type: Number })], p.prototype, "hue", null), t([l({ type: String })], p.prototype, "value", null), t([l({ type: String })], p.prototype, "color", null), t([l({ attribute: !1 })], p.prototype, "activeAxis", void 0), t([l({ type: Number })], p.prototype, "x", null), t([l({ type: Number })], p.prototype, "y", null), t([l({ type: Number })], p.prototype, "step", void 0), t([u("[name=\"x\"]")], p.prototype, "inputX", void 0), t([u("[name=\"y\"]")], p.prototype, "inputY", void 0), customElements.get("luzmo-color-area") || customElements.define("luzmo-color-area", p);
293
- export { p as t };
333
+ })], h.prototype, "isLTR", void 0), t([f(".handle")], h.prototype, "handle", void 0), t([d({ type: Number })], h.prototype, "hue", null), t([d({ type: String })], h.prototype, "value", null), t([d({ type: String })], h.prototype, "color", null), t([d({ attribute: !1 })], h.prototype, "activeAxis", void 0), t([d({ type: Number })], h.prototype, "x", null), t([d({ type: Number })], h.prototype, "y", null), t([d({ type: Number })], h.prototype, "step", void 0), t([f("[name=\"x\"]")], h.prototype, "inputX", void 0), t([f("[name=\"y\"]")], h.prototype, "inputY", void 0), customElements.get("luzmo-color-area") || customElements.define("luzmo-color-area", h);
334
+ export { h as t };
@@ -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-handle-BE0Z1gTU.cjs");exports.LuzmoColorHandle=e.t;
18
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-handle-hJ7Kblh4.cjs");exports.LuzmoColorHandle=e.t;
@@ -16,4 +16,4 @@
16
16
  * SOFTWARE.
17
17
  * */
18
18
  import "../tokens.js";
19
- export { t as LuzmoColorHandle } from "../color-handle-Dc0uLgkf.js";
19
+ export { t as LuzmoColorHandle } from "../color-handle-Ya92rdpA.js";
@@ -29,10 +29,13 @@ var a = ":host{touch-action:none;transition:inline-size var(--luzmo-color-handle
29
29
  this.styles = r(a);
30
30
  }
31
31
  handlePointerdown(e) {
32
- e.pointerType === "touch" && (this.open = !0), this.setPointerCapture(e.pointerId);
32
+ e.pointerType === "touch" && (this.open = !0);
33
+ try {
34
+ this.setPointerCapture(e.pointerId);
35
+ } catch {}
33
36
  }
34
37
  handlePointerup(e) {
35
- this.open = !1, this.releasePointerCapture(e.pointerId);
38
+ this.open = !1, this.hasPointerCapture(e.pointerId) && this.releasePointerCapture(e.pointerId);
36
39
  }
37
40
  render() {
38
41
  return n`
@@ -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");require("./color-loupe-2X1bCYU9.cjs");let t=require("lit"),n=require("lit/decorators.js");var r=`:host{touch-action:none;transition:inline-size var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), block-size var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), border-width var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), margin-inline var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), margin-block var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out);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);background-position:50%}:host(:focus){outline:none}:host{z-index:1;box-sizing:border-box;inline-size:var(--luzmo-color-handle-size,16px);block-size:var(--luzmo-color-handle-size,16px);margin-inline:calc(var(--luzmo-color-handle-size,16px) / 2 * -1);margin-block:calc(var(--luzmo-color-handle-size,16px) / 2 * -1);box-shadow:0 0 0 var(--luzmo-color-handle-outer-border-width,1px) var(--luzmo-color-handle-outer-border-color,#0000006b);transition:all var(--luzmo-color-handle-animation-duration,0) var(--luzmo-color-handle-animation-easing,ease-in-out);border-width:var(--luzmo-color-handle-border-width,2px)!important;border-color:var(--luzmo-color-handle-border-color,#fff)!important;border-style:solid!important}:host,:host:after{border-radius:100%;display:block;position:absolute}:host:after{content:"";inset-inline:calc(50% - var(--luzmo-color-handle-hitarea-size,24px) / 2);inset-block:calc(50% - var(--luzmo-color-handle-hitarea-size,24px) / 2);inline-size:var(--luzmo-color-handle-hitarea-size,24px);block-size:var(--luzmo-color-handle-hitarea-size,24px);border-radius:var(--luzmo-color-handle-hitarea-border-radius,100%)}:host([focused]),:host(:focus-visible){inline-size:var(--luzmo-color-handle-focused-size,32px);block-size:var(--luzmo-color-handle-focused-size,32px);margin-inline:calc(var(--luzmo-color-handle-size,16px) * -1);margin-block:calc(var(--luzmo-color-handle-size,16px) * -1);outline:none}:host([disabled]){pointer-events:none;background:var(--highcontrast-color-handle-fill-color-disabled,var(--luzmo-color-handle-fill-color-disabled,var(--luzmo-font-color-disabled)));box-shadow:none;border-color:var(--highcontrast-color-handle-border-color-disabled,var(--luzmo-color-handle-border-color-disabled,var(--luzmo-font-color-disabled)))!important}:host([disabled]) .inner{display:none}.inner{block-size:100%;inline-size:100%;box-shadow:inset 0 0 0 var(--luzmo-color-handle-inner-border-width,var(--luzmo-border-width)) var(--luzmo-color-handle-inner-border-color,#0000006b);background-color:var(--luzmo-picked-color);border-radius:100%}@media (forced-colors:active){:host{forced-color-adjust:none}:host([disabled]){--highcontrast-color-handle-border-color-disabled:GrayText;--highcontrast-color-handle-fill-color-disabled:Canvas}}`,i=class extends e.n{constructor(...e){super(...e),this.disabled=!1,this.focused=!1,this.open=!1,this.color=`rgba(255, 0, 0, 0.5)`}static{this.styles=(0,t.unsafeCSS)(r)}handlePointerdown(e){e.pointerType===`touch`&&(this.open=!0),this.setPointerCapture(e.pointerId)}handlePointerup(e){this.open=!1,this.releasePointerCapture(e.pointerId)}render(){return t.html`
18
+ require("./tokens.cjs");const e=require("./decorate-SO02l0A6.cjs");require("./color-loupe-2X1bCYU9.cjs");let t=require("lit"),n=require("lit/decorators.js");var r=`:host{touch-action:none;transition:inline-size var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), block-size var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), border-width var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), margin-inline var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out), margin-block var(--luzmo-color-handle-animation-duration,.13s) var(--luzmo-color-handle-animation-easing,ease-in-out);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);background-position:50%}:host(:focus){outline:none}:host{z-index:1;box-sizing:border-box;inline-size:var(--luzmo-color-handle-size,16px);block-size:var(--luzmo-color-handle-size,16px);margin-inline:calc(var(--luzmo-color-handle-size,16px) / 2 * -1);margin-block:calc(var(--luzmo-color-handle-size,16px) / 2 * -1);box-shadow:0 0 0 var(--luzmo-color-handle-outer-border-width,1px) var(--luzmo-color-handle-outer-border-color,#0000006b);transition:all var(--luzmo-color-handle-animation-duration,0) var(--luzmo-color-handle-animation-easing,ease-in-out);border-width:var(--luzmo-color-handle-border-width,2px)!important;border-color:var(--luzmo-color-handle-border-color,#fff)!important;border-style:solid!important}:host,:host:after{border-radius:100%;display:block;position:absolute}:host:after{content:"";inset-inline:calc(50% - var(--luzmo-color-handle-hitarea-size,24px) / 2);inset-block:calc(50% - var(--luzmo-color-handle-hitarea-size,24px) / 2);inline-size:var(--luzmo-color-handle-hitarea-size,24px);block-size:var(--luzmo-color-handle-hitarea-size,24px);border-radius:var(--luzmo-color-handle-hitarea-border-radius,100%)}:host([focused]),:host(:focus-visible){inline-size:var(--luzmo-color-handle-focused-size,32px);block-size:var(--luzmo-color-handle-focused-size,32px);margin-inline:calc(var(--luzmo-color-handle-size,16px) * -1);margin-block:calc(var(--luzmo-color-handle-size,16px) * -1);outline:none}:host([disabled]){pointer-events:none;background:var(--highcontrast-color-handle-fill-color-disabled,var(--luzmo-color-handle-fill-color-disabled,var(--luzmo-font-color-disabled)));box-shadow:none;border-color:var(--highcontrast-color-handle-border-color-disabled,var(--luzmo-color-handle-border-color-disabled,var(--luzmo-font-color-disabled)))!important}:host([disabled]) .inner{display:none}.inner{block-size:100%;inline-size:100%;box-shadow:inset 0 0 0 var(--luzmo-color-handle-inner-border-width,var(--luzmo-border-width)) var(--luzmo-color-handle-inner-border-color,#0000006b);background-color:var(--luzmo-picked-color);border-radius:100%}@media (forced-colors:active){:host{forced-color-adjust:none}:host([disabled]){--highcontrast-color-handle-border-color-disabled:GrayText;--highcontrast-color-handle-fill-color-disabled:Canvas}}`,i=class extends e.n{constructor(...e){super(...e),this.disabled=!1,this.focused=!1,this.open=!1,this.color=`rgba(255, 0, 0, 0.5)`}static{this.styles=(0,t.unsafeCSS)(r)}handlePointerdown(e){e.pointerType===`touch`&&(this.open=!0);try{this.setPointerCapture(e.pointerId)}catch{}}handlePointerup(e){this.open=!1,this.hasPointerCapture(e.pointerId)&&this.releasePointerCapture(e.pointerId)}render(){return t.html`
19
19
  <div class="inner" style="background-color: ${this.color}"></div>
20
20
  <luzmo-color-loupe
21
21
  color=${this.color}
@@ -16,6 +16,12 @@ declare const LuzmoColorMenu_base: typeof Focusable & {
16
16
  /**
17
17
  * @element luzmo-color-menu
18
18
  * @fires change - An alteration to the value of the Color Menu has been committed by the user.
19
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-start - Bubbles
20
+ * up from the color area or a color slider when a pointer drag or held-key
21
+ * interaction starts. The menu forwards it unchanged and adds none of its own.
22
+ * @fires {CustomEvent<InteractionEventDetail>} luzmo-interaction-end - Bubbles
23
+ * up from the same control when that interaction ends. Swatch picks and typed
24
+ * values are single `change` events without an interaction.
19
25
  */
20
26
  export declare class LuzmoColorMenu extends LuzmoColorMenu_base {
21
27
  static styles: import("lit").CSSResult;
@@ -43,6 +49,11 @@ export declare class LuzmoColorMenu extends LuzmoColorMenu_base {
43
49
  private _format;
44
50
  setColor(event: CustomEvent): void;
45
51
  private handleAreaChange;
52
+ /**
53
+ * Finishes a drag or held-key interaction in progress on the color area or a
54
+ * color slider as if the user released it. Does nothing otherwise.
55
+ */
56
+ endInteraction(): void;
46
57
  get focusElement(): HTMLElement;
47
58
  private handleHueSliderChange;
48
59
  private handleOpacitySliderChange;
@@ -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-menu-Cus3S-Re.cjs");exports.LuzmoColorMenu=e.t;
18
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../tokens.cjs");const e=require("../color-menu-COhe5VUB.cjs");exports.LuzmoColorMenu=e.t;
@@ -5,3 +5,4 @@ declare global {
5
5
  }
6
6
  }
7
7
  export { LuzmoColorMenu } from './color-menu';
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 LuzmoColorMenu } from "../color-menu-BxFQnH79.js";
19
+ export { t as LuzmoColorMenu } from "../color-menu-Ct3f01bI.js";
@@ -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"),n=require("./focusable-BIHTrJd6.cjs");require("./popover-CFzz83f8.cjs"),require("./color-handle-BE0Z1gTU.cjs"),require("./color-area-D1fRozE0.cjs"),require("./color-field-CN8shDl_.cjs"),require("./color-slider-9Ck28Qdk.cjs"),require("./divider-fWGUxO6A.cjs"),require("./swatch-DiNMN-SZ.cjs");let r=require("lit"),i=require("lit/decorators.js"),a=require("@luzmo/icons"),o=require("@ctrl/tinycolor");var s=`:host{width:var(--luzmo-color-menu-width,var(--color-menu-width))}.hue-opacity-text-swatches-container{gap:var(--luzmo-color-menu-color-controls-vertical-gap,var(--color-menu-color-controls-vertical-gap));padding:var(--luzmo-color-menu-hue-opacity-text-swatches-vertical-padding,var(--color-menu-hue-opacity-text-swatches-vertical-padding)) var(--luzmo-color-menu-hue-opacity-text-swatches-horizontal-padding,var(--color-menu-hue-opacity-text-swatches-horizontal-padding));flex-direction:column;display:flex}.swatch-sliders-container{gap:var(--luzmo-color-menu-swatch-to-sliders-space,var(--color-menu-swatch-to-sliders-space));display:flex}.swatch-example-container{align-items:center;display:flex}.field-container{align-items:center;gap:var(--luzmo-color-menu-format-field-to-format-space,var(--color-menu-format-field-to-format-space));display:flex}.format-container{text-transform:uppercase;height:var(--luzmo-color-menu-format-height,var(--color-menu-format-height));cursor:pointer;font-size:var(--luzmo-color-menu-format-font-size,var(--color-menu-format-font-size));color:var(--luzmo-color-menu-format-font-color,var(--color-menu-format-font-color));align-items:center;gap:var(--luzmo-color-menu-format-name-to-icon,var(--color-menu-format-name-to-icon-space));padding:0 var(--luzmo-color-menu-format-horizontal-padding,var(--color-menu-format-horizontal-padding));background:0 0;border:none;outline:none;display:flex;position:relative}.format-container:hover{color:var(--luzmo-color-menu-format-font-color-hover,var(--color-menu-format-font-color-hover))}.format-container:focus-visible{outline:none}.format-container:focus-visible:after{content:"";box-sizing:border-box;border:var(--luzmo-color-menu-format-indicator-width,var(--luzmo-indicator-width)) solid var(--luzmo-color-menu-format-indicator-color,var(--luzmo-indicator-color));border-radius:var(--luzmo-color-menu-format-label-indicator-border-radius,var(--luzmo-border-radius-s));width:100%;height:100%;position:absolute;top:0;left:0}.format-container:focus-visible,.format-container:active{color:var(--luzmo-color-menu-format-font-color-down,var(--color-menu-format-font-color-down))}.format-container .format-label{-webkit-user-select:none;user-select:none}.format-container .angle-icon{height:calc(var(--color-menu-format-font-size) / 1.5);align-items:center;display:flex}.slider-container{justify-content:center;gap:var(--luzmo-color-menu-slider-gap,var(--color-menu-slider-gap));flex-direction:column;display:flex}luzmo-color-area{width:100%;height:var(--luzmo-color-menu-height,var(--color-menu-height))}luzmo-color-slider{width:100%}luzmo-divider{margin:var(--luzmo-spacing-5) à}.swatches-container{gap:var(--luzmo-color-menu-swatches-gap,var(--color-menu-swatches-gap));grid-template-columns:repeat(6,1fr);display:grid}.swatches-container luzmo-swatch{cursor:pointer}.swatches-container .swatch-choice{justify-content:center;align-items:center;display:flex}:host{--luzmo-text-field-icon-size-valid:0px;--luzmo-text-field-icon-spacing-inline-end-valid:1px;--luzmo-text-field-text-align:center;--color-menu-width:290px;--luzmo-text-field-width:220px;--luzmo-color-slider-control-track-width:8px;--color-menu-height:140px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-5);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-5);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-5);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height);--color-menu-format-font-size:var(--luzmo-font-size-s);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-2);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-3);--color-menu-format-font-color:var(--luzmo-font-color);--color-menu-format-font-color-hover:var(--luzmo-font-color-hover);--color-menu-format-font-color-down:var(--luzmo-font-color-down);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host .swatches-container{--luzmo-swatch-size:22px}:host([size=s]){--color-menu-width:260px;--luzmo-text-field-width:200px;--luzmo-color-slider-control-track-width:8px;--color-menu-hue-opacity-text-swatches-horizontal-padding:var(--luzmo-spacing-5);--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-4);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-4);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-4);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height-s);--color-menu-format-font-size:var(--luzmo-font-size-xs);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-2);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-2);--color-menu-swatches-gap:var(--luzmo-spacing-3)}:host([size=s]) .swatches-container{--luzmo-swatch-size:20px}:host([size=l]){--color-menu-width:350px;--luzmo-text-field-width:240px;--luzmo-color-slider-control-track-width:16px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-5);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-5);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-5);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-format-height:var(--luzmo-component-height-l);--color-menu-format-font-size:var(--luzmo-font-size);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-3);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-4);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host([size=l]) .swatches-container{--luzmo-swatch-size:24px}:host([size=l]) .swatch-example-container{--luzmo-swatch-size:56px}:host([size=xl]){--color-menu-width:380px;--luzmo-text-field-width:280px;--luzmo-color-slider-control-track-width:16px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-hue-opacity-text-swatches-vertical-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-color-controls-vertical-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-swatch-to-sliders-space:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height-xl);--color-menu-format-font-size:var(--luzmo-font-size-l);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-3);--color-menu-format-field-to-format-space:var(--luzmo-spacing-3);--color-menu-format-horizontal-padding:var(--luzmo-spacing-4);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host([size=xl]) .swatches-container{--luzmo-swatch-size:26px}:host([size=xl]) .swatch-example-container{--luzmo-swatch-size:64px}`,c=class extends t.n(n.t){constructor(...e){super(...e),this.color=`rgb(255, 0, 0)`,this.noAlphaChannel=!1,this._alpha=1,this._rgbColor=`rgb(255, 0, 0)`,this._rgbaColor=`rgb(255, 0, 0, 1)`,this._previousColor=`rgb(255, 0, 0)`}static{this.styles=(0,r.unsafeCSS)(s)}setColor(e){let t=new o.TinyColor(e?.target?.color);this._format=t.format===`name`?`rgb`:t.format,this._rgbaColor=t.toRgbString(),this._alpha=this.noAlphaChannel?1:t.getAlpha(),this._rgbColor=t.setAlpha(1).toRgbString(),this.hueSliderElement.color=this._rgbColor,this.areaElement.color=this._rgbColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this.colorFieldElement.value=this.formatTextField(t),this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleAreaChange(e){e.stopPropagation(),e.preventDefault(),this._rgbColor=this.areaElement.color;let t=new o.TinyColor(this._rgbColor);this._rgbaColor=t.setAlpha(this._alpha).toRgbString(),this.colorFieldElement.value=this._rgbaColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.colorFieldElement.value=this.formatTextField(t),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}get focusElement(){return this.areaElement||this.colorFieldElement||this}handleHueSliderChange(e){e.stopPropagation(),e.preventDefault();let t=new o.TinyColor(this._rgbColor).toHsl();t.h=this.hueSliderElement.value;let n=new o.TinyColor(t);this._rgbColor=n.toRgbString(),this._rgbaColor=n.setAlpha(this._alpha).toRgbString(),this.areaElement.color=`hsla(${t.h}, ${t.s*100}%, ${t.l*100}%, ${t.a})`,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.colorFieldElement.value=this.formatTextField(n),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleOpacitySliderChange(e){e.stopPropagation(),e.preventDefault(),this._alpha=this.opacitySliderElement.sliderHandlePosition/100;let t=new o.TinyColor(this._rgbColor).setAlpha(this._alpha);this._rgbaColor=t.toRgbString(),this.colorFieldElement.value=this.formatTextField(t),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleFieldChange(e){if(e.stopPropagation(),e.preventDefault(),this.colorFieldElement.checkValidity()){let e=new o.TinyColor(this.colorFieldElement.value);this._format=e.format,this._rgbaColor=e.toRgbString(),this._alpha=e.getAlpha(),this._rgbColor=e.setAlpha(1).toRgbString(),this.noAlphaChannel&&(this._rgbaColor=this._rgbColor,this._alpha=1),this.hueSliderElement.color=this._rgbColor,this.areaElement.color=this._rgbColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}}formatTextField(e){return this._format===`hsl`?e.toHslString():this._format===`hex`?this.noAlphaChannel?e.toHexString():e.toHex8String():(this._format===`name`&&(this._format=`rgb`),e.toRgbString())}cycleFormat(){let e=[`rgb`,`hsl`,`hex`];this._format=e[(e.indexOf(this._format)+1)%e.length];let t=new o.TinyColor(this.color),n=this.formatTextField(t);this.colorFieldElement.value=n}updated(e){if(e.has(`color`)&&this.color!==this._previousColor){this._previousColor=this.color;let e=new o.TinyColor(this.color);this._alpha=e.getAlpha(),this._rgbColor=e.setAlpha(1).toRgbString(),this._rgbaColor=e.setAlpha(this._alpha).toRgbString(),this.areaElement.color=this._rgbColor,this.hueSliderElement.color=this._rgbColor,this.colorFieldElement.value=this._rgbaColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this._format=`rgb`}e.has(`noAlphaChannel`)&&!this.noAlphaChannel&&(this.opacitySliderElement.color=this._rgbaColor)}renderOpacitySlider(){return r.html`
18
+ require("./tokens.cjs");const e=require("./decorate-SO02l0A6.cjs"),t=require("./sized-mixin-CSajkMro.cjs"),n=require("./focusable-BIHTrJd6.cjs");require("./popover-CFzz83f8.cjs"),require("./color-handle-hJ7Kblh4.cjs"),require("./color-area-CFBE-rG3.cjs"),require("./color-field-CN8shDl_.cjs"),require("./color-slider-IYBn2DL7.cjs"),require("./divider-fWGUxO6A.cjs"),require("./swatch-DiNMN-SZ.cjs");let r=require("lit"),i=require("lit/decorators.js"),a=require("@luzmo/icons"),o=require("@ctrl/tinycolor");var s=`:host{width:var(--luzmo-color-menu-width,var(--color-menu-width))}.hue-opacity-text-swatches-container{gap:var(--luzmo-color-menu-color-controls-vertical-gap,var(--color-menu-color-controls-vertical-gap));padding:var(--luzmo-color-menu-hue-opacity-text-swatches-vertical-padding,var(--color-menu-hue-opacity-text-swatches-vertical-padding)) var(--luzmo-color-menu-hue-opacity-text-swatches-horizontal-padding,var(--color-menu-hue-opacity-text-swatches-horizontal-padding));flex-direction:column;display:flex}.swatch-sliders-container{gap:var(--luzmo-color-menu-swatch-to-sliders-space,var(--color-menu-swatch-to-sliders-space));display:flex}.swatch-example-container{align-items:center;display:flex}.field-container{align-items:center;gap:var(--luzmo-color-menu-format-field-to-format-space,var(--color-menu-format-field-to-format-space));display:flex}.format-container{text-transform:uppercase;height:var(--luzmo-color-menu-format-height,var(--color-menu-format-height));cursor:pointer;font-size:var(--luzmo-color-menu-format-font-size,var(--color-menu-format-font-size));color:var(--luzmo-color-menu-format-font-color,var(--color-menu-format-font-color));align-items:center;gap:var(--luzmo-color-menu-format-name-to-icon,var(--color-menu-format-name-to-icon-space));padding:0 var(--luzmo-color-menu-format-horizontal-padding,var(--color-menu-format-horizontal-padding));background:0 0;border:none;outline:none;display:flex;position:relative}.format-container:hover{color:var(--luzmo-color-menu-format-font-color-hover,var(--color-menu-format-font-color-hover))}.format-container:focus-visible{outline:none}.format-container:focus-visible:after{content:"";box-sizing:border-box;border:var(--luzmo-color-menu-format-indicator-width,var(--luzmo-indicator-width)) solid var(--luzmo-color-menu-format-indicator-color,var(--luzmo-indicator-color));border-radius:var(--luzmo-color-menu-format-label-indicator-border-radius,var(--luzmo-border-radius-s));width:100%;height:100%;position:absolute;top:0;left:0}.format-container:focus-visible,.format-container:active{color:var(--luzmo-color-menu-format-font-color-down,var(--color-menu-format-font-color-down))}.format-container .format-label{-webkit-user-select:none;user-select:none}.format-container .angle-icon{height:calc(var(--color-menu-format-font-size) / 1.5);align-items:center;display:flex}.slider-container{justify-content:center;gap:var(--luzmo-color-menu-slider-gap,var(--color-menu-slider-gap));flex-direction:column;display:flex}luzmo-color-area{width:100%;height:var(--luzmo-color-menu-height,var(--color-menu-height))}luzmo-color-slider{width:100%}luzmo-divider{margin:var(--luzmo-spacing-5) à}.swatches-container{gap:var(--luzmo-color-menu-swatches-gap,var(--color-menu-swatches-gap));grid-template-columns:repeat(6,1fr);display:grid}.swatches-container luzmo-swatch{cursor:pointer}.swatches-container .swatch-choice{justify-content:center;align-items:center;display:flex}:host{--luzmo-text-field-icon-size-valid:0px;--luzmo-text-field-icon-spacing-inline-end-valid:1px;--luzmo-text-field-text-align:center;--color-menu-width:290px;--luzmo-text-field-width:220px;--luzmo-color-slider-control-track-width:8px;--color-menu-height:140px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-5);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-5);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-5);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height);--color-menu-format-font-size:var(--luzmo-font-size-s);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-2);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-3);--color-menu-format-font-color:var(--luzmo-font-color);--color-menu-format-font-color-hover:var(--luzmo-font-color-hover);--color-menu-format-font-color-down:var(--luzmo-font-color-down);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host .swatches-container{--luzmo-swatch-size:22px}:host([size=s]){--color-menu-width:260px;--luzmo-text-field-width:200px;--luzmo-color-slider-control-track-width:8px;--color-menu-hue-opacity-text-swatches-horizontal-padding:var(--luzmo-spacing-5);--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-4);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-4);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-4);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height-s);--color-menu-format-font-size:var(--luzmo-font-size-xs);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-2);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-2);--color-menu-swatches-gap:var(--luzmo-spacing-3)}:host([size=s]) .swatches-container{--luzmo-swatch-size:20px}:host([size=l]){--color-menu-width:350px;--luzmo-text-field-width:240px;--luzmo-color-slider-control-track-width:16px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-hue-opacity-text-swatches-vertical-padding:var(--luzmo-spacing-5);--color-menu-color-controls-vertical-gap:var(--luzmo-spacing-5);--color-menu-swatch-to-sliders-space:var(--luzmo-spacing-5);--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-format-height:var(--luzmo-component-height-l);--color-menu-format-font-size:var(--luzmo-font-size);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-3);--color-menu-format-field-to-format-space:var(--luzmo-spacing-2);--color-menu-format-horizontal-padding:var(--luzmo-spacing-4);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host([size=l]) .swatches-container{--luzmo-swatch-size:24px}:host([size=l]) .swatch-example-container{--luzmo-swatch-size:56px}:host([size=xl]){--color-menu-width:380px;--luzmo-text-field-width:280px;--luzmo-color-slider-control-track-width:16px;--color-menu-hue-opacity-text-swatches-horizontal-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-2));--color-menu-hue-opacity-text-swatches-vertical-padding:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-color-controls-vertical-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-swatch-to-sliders-space:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-slider-gap:calc(var(--luzmo-spacing-5) + var(--luzmo-spacing-1));--color-menu-format-height:var(--luzmo-component-height-xl);--color-menu-format-font-size:var(--luzmo-font-size-l);--color-menu-format-name-to-icon-space:var(--luzmo-spacing-3);--color-menu-format-field-to-format-space:var(--luzmo-spacing-3);--color-menu-format-horizontal-padding:var(--luzmo-spacing-4);--color-menu-swatches-gap:var(--luzmo-spacing-4)}:host([size=xl]) .swatches-container{--luzmo-swatch-size:26px}:host([size=xl]) .swatch-example-container{--luzmo-swatch-size:64px}`,c=class extends t.n(n.t){constructor(...e){super(...e),this.color=`rgb(255, 0, 0)`,this.noAlphaChannel=!1,this._alpha=1,this._rgbColor=`rgb(255, 0, 0)`,this._rgbaColor=`rgb(255, 0, 0, 1)`,this._previousColor=`rgb(255, 0, 0)`}static{this.styles=(0,r.unsafeCSS)(s)}setColor(e){let t=new o.TinyColor(e?.target?.color);this._format=t.format===`name`?`rgb`:t.format,this._rgbaColor=t.toRgbString(),this._alpha=this.noAlphaChannel?1:t.getAlpha(),this._rgbColor=t.setAlpha(1).toRgbString(),this.hueSliderElement.color=this._rgbColor,this.areaElement.color=this._rgbColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this.colorFieldElement.value=this.formatTextField(t),this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleAreaChange(e){e.stopPropagation(),e.preventDefault(),this._rgbColor=this.areaElement.color;let t=new o.TinyColor(this._rgbColor);this._rgbaColor=t.setAlpha(this._alpha).toRgbString(),this.colorFieldElement.value=this._rgbaColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.colorFieldElement.value=this.formatTextField(t),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}endInteraction(){this.areaElement?.endInteraction(),this.hueSliderElement?.endInteraction(),this.opacitySliderElement?.endInteraction()}get focusElement(){return this.areaElement||this.colorFieldElement||this}handleHueSliderChange(e){e.stopPropagation(),e.preventDefault();let t=new o.TinyColor(this._rgbColor).toHsl();t.h=this.hueSliderElement.value;let n=new o.TinyColor(t);this._rgbColor=n.toRgbString(),this._rgbaColor=n.setAlpha(this._alpha).toRgbString(),this.areaElement.color=`hsla(${t.h}, ${t.s*100}%, ${t.l*100}%, ${t.a})`,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.colorFieldElement.value=this.formatTextField(n),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleOpacitySliderChange(e){e.stopPropagation(),e.preventDefault(),this._alpha=this.opacitySliderElement.sliderHandlePosition/100;let t=new o.TinyColor(this._rgbColor).setAlpha(this._alpha);this._rgbaColor=t.toRgbString(),this.colorFieldElement.value=this.formatTextField(t),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}handleFieldChange(e){if(e.stopPropagation(),e.preventDefault(),this.colorFieldElement.checkValidity()){let e=new o.TinyColor(this.colorFieldElement.value);this._format=e.format,this._rgbaColor=e.toRgbString(),this._alpha=e.getAlpha(),this._rgbColor=e.setAlpha(1).toRgbString(),this.noAlphaChannel&&(this._rgbaColor=this._rgbColor,this._alpha=1),this.hueSliderElement.color=this._rgbColor,this.areaElement.color=this._rgbColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this._previousColor=this._rgbaColor,this.color=this._rgbaColor,this.dispatchEvent(new CustomEvent(`change`,{detail:this.color}))}}formatTextField(e){return this._format===`hsl`?e.toHslString():this._format===`hex`?this.noAlphaChannel?e.toHexString():e.toHex8String():(this._format===`name`&&(this._format=`rgb`),e.toRgbString())}cycleFormat(){let e=[`rgb`,`hsl`,`hex`];this._format=e[(e.indexOf(this._format)+1)%e.length];let t=new o.TinyColor(this.color),n=this.formatTextField(t);this.colorFieldElement.value=n}updated(e){if(e.has(`color`)&&this.color!==this._previousColor){this._previousColor=this.color;let e=new o.TinyColor(this.color);this._alpha=e.getAlpha(),this._rgbColor=e.setAlpha(1).toRgbString(),this._rgbaColor=e.setAlpha(this._alpha).toRgbString(),this.areaElement.color=this._rgbColor,this.hueSliderElement.color=this._rgbColor,this.colorFieldElement.value=this._rgbaColor,this.noAlphaChannel||(this.opacitySliderElement.color=this._rgbaColor),this.swatchElement.color=this._rgbaColor,this._format=`rgb`}e.has(`noAlphaChannel`)&&!this.noAlphaChannel&&(this.opacitySliderElement.color=this._rgbaColor)}renderOpacitySlider(){return r.html`
19
19
  <luzmo-color-slider
20
20
  id="luzmo-opacity-slider"
21
21
  label="Opacity"
@@ -20,10 +20,10 @@ import { t as e } from "./decorate-CpKsOs9z.js";
20
20
  import { n as t } from "./sized-mixin-BmxIAuoH.js";
21
21
  import { t as n } from "./focusable-xjv79E40.js";
22
22
  import "./popover-CWrRLzOL.js";
23
- import "./color-handle-Dc0uLgkf.js";
24
- import "./color-area-qlEAp8ZN.js";
23
+ import "./color-handle-Ya92rdpA.js";
24
+ import "./color-area-GGa8KJyd.js";
25
25
  import "./color-field-CVyDNZ4b.js";
26
- import "./color-slider-X1EArAnx.js";
26
+ import "./color-slider-DNd_ZrD6.js";
27
27
  import "./divider-Bt0NIqfu.js";
28
28
  import "./swatch-BBVsuSAV.js";
29
29
  import { html as r, unsafeCSS as i } from "lit";
@@ -47,6 +47,9 @@ var f = ":host{width:var(--luzmo-color-menu-width,var(--color-menu-width))}.hue-
47
47
  let t = new d(this._rgbColor);
48
48
  this._rgbaColor = t.setAlpha(this._alpha).toRgbString(), this.colorFieldElement.value = this._rgbaColor, this.noAlphaChannel || (this.opacitySliderElement.color = this._rgbaColor), this.colorFieldElement.value = this.formatTextField(t), this.swatchElement.color = this._rgbaColor, this._previousColor = this._rgbaColor, this.color = this._rgbaColor, this.dispatchEvent(new CustomEvent("change", { detail: this.color }));
49
49
  }
50
+ endInteraction() {
51
+ this.areaElement?.endInteraction(), this.hueSliderElement?.endInteraction(), this.opacitySliderElement?.endInteraction();
52
+ }
50
53
  get focusElement() {
51
54
  return this.areaElement || this.colorFieldElement || this;
52
55
  }