@ixfx/components 0.10.1 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.d.ts +173 -20
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +1847 -123
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +1 -1
- package/dist/ac-text.js +1 -1
- package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -2
- package/dist/{ac-token-TCLAZeVg.d.ts.map → ac-token--_vCHXWw.d.ts.map} +1 -1
- package/dist/ac-token.d.ts +1 -1
- package/dist/ac-token.js +2 -2
- package/dist/button.d.ts +1 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/{colour-picker-R73i0QTP.js → colour-picker-WDrPuqoO.js} +2 -2
- package/dist/{colour-picker-R73i0QTP.js.map → colour-picker-WDrPuqoO.js.map} +1 -1
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/crumbs.js +2 -2
- package/dist/{data-grid-BT1d_nlu.d.ts → data-grid-pv6eaJCZ.d.ts} +4 -3
- package/dist/data-grid-pv6eaJCZ.d.ts.map +1 -0
- package/dist/data-grid.d.ts +1 -1
- package/dist/data-grid.js +27 -9
- package/dist/data-grid.js.map +1 -1
- package/dist/defaults-kVl1t2tT.js +59 -0
- package/dist/defaults-kVl1t2tT.js.map +1 -0
- package/dist/{detail-list-BCaIN7nx.d.ts → detail-list-BA3RVVCB.d.ts} +4 -4
- package/dist/{detail-list-BCaIN7nx.d.ts.map → detail-list-BA3RVVCB.d.ts.map} +1 -1
- package/dist/detail-list.d.ts +2 -2
- package/dist/detail-list.js +3 -3
- package/dist/{grid-list-DLfw5HI4.js → grid-list-CIc4jo-x.js} +25 -3
- package/dist/grid-list-CIc4jo-x.js.map +1 -0
- package/dist/{grid-list-CiwlNE4c.d.ts → grid-list-DWXJoRnK.d.ts} +2 -2
- package/dist/{grid-list-CiwlNE4c.d.ts.map → grid-list-DWXJoRnK.d.ts.map} +1 -1
- package/dist/grid-list.d.ts +1 -1
- package/dist/grid-list.js +1 -1
- package/dist/{grouped-item-lister-CEZ72VOs.d.ts → grouped-item-lister-fdZHVxFM.d.ts} +2 -2
- package/dist/{grouped-item-lister-CEZ72VOs.d.ts.map → grouped-item-lister-fdZHVxFM.d.ts.map} +1 -1
- package/dist/grouped-item-lister.d.ts +1 -1
- package/dist/handle-DAXs7kbJ.js +656 -0
- package/dist/handle-DAXs7kbJ.js.map +1 -0
- package/dist/{icon-BCJJYEpm.js → icon-1gpwtPx8.js} +10 -1
- package/dist/icon-1gpwtPx8.js.map +1 -0
- package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -2
- package/dist/icon-CDGprSdE.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +2 -2
- package/dist/{incr-search-C05WjbZh.js → incr-search-D91M4Ozq.js} +5 -4
- package/dist/incr-search-D91M4Ozq.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-C59-JEPl.d.ts → index-9AhaHIT2.d.ts} +3 -3
- package/dist/{index-C59-JEPl.d.ts.map → index-9AhaHIT2.d.ts.map} +1 -1
- package/dist/index-CYndvTWH.d.ts +38 -0
- package/dist/index-CYndvTWH.d.ts.map +1 -0
- package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -2
- package/dist/{index-BUB5SICW.d.ts.map → index-CoqtMSd9.d.ts.map} +1 -1
- package/dist/{index-DPFrRhKL.d.ts → index-CsaQwNkz.d.ts} +2 -1
- package/dist/index-CsaQwNkz.d.ts.map +1 -0
- package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -2
- package/dist/{index-CJ5fshD3.d.ts.map → index-UvnoZUAo.d.ts.map} +1 -1
- package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -2
- package/dist/{index-BOUaDIW-.d.ts.map → index-tq6f8007.d.ts.map} +1 -1
- package/dist/index.d.ts +169 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1053 -18
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -2
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts.map → labelled-input-base-DiTme1JO.d.ts.map} +1 -1
- package/dist/labelled-radial-input.d.ts +2 -2
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-slider-input.d.ts +1 -1
- package/dist/{menu-C8a-84S5.js → menu-B2Qv3Oiz.js} +6 -5
- package/dist/menu-B2Qv3Oiz.js.map +1 -0
- package/dist/{menu-item-ZmkXNjek.d.ts → menu-item-CZi9vy5O.d.ts} +2 -2
- package/dist/{menu-item-ZmkXNjek.d.ts.map → menu-item-CZi9vy5O.d.ts.map} +1 -1
- package/dist/{menu-item-DzizkMH-.js → menu-item-Woc8jJc1.js} +4 -4
- package/dist/menu-item-Woc8jJc1.js.map +1 -0
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +1 -1
- package/dist/miller.js +1 -1
- package/dist/narrowed-text.js +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/{scroll-fade-CAs1EabA.js → scroll-fade-BrNUIYnm.js} +16 -3
- package/dist/scroll-fade-BrNUIYnm.js.map +1 -0
- package/dist/select-horiz.js +1 -1
- package/dist/{split-layout-3yBOEVZW.js → split-layout-BJEU1W0d.js} +2 -2
- package/dist/{split-layout-3yBOEVZW.js.map → split-layout-BJEU1W0d.js.map} +1 -1
- package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -2
- package/dist/{split-layout-C5SYbDrq.d.ts.map → split-layout-JK3xWVX2.d.ts.map} +1 -1
- package/dist/split-layout.d.ts +1 -1
- package/dist/split-layout.js +1 -1
- package/dist/{tab-list-DbMIL520.d.ts → tab-list-CGyPt07Z.d.ts} +2 -2
- package/dist/{tab-list-DbMIL520.d.ts.map → tab-list-CGyPt07Z.d.ts.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +1 -1
- package/dist/{timeline-CFlBFFGZ.js → timeline-BP1Ux2EV.js} +2 -2
- package/dist/{timeline-CFlBFFGZ.js.map → timeline-BP1Ux2EV.js.map} +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -2
- package/dist/{titlebar-B5zSTZnF.d.ts.map → titlebar-Tqu-VvMU.d.ts.map} +1 -1
- package/dist/titlebar.d.ts +1 -1
- package/dist/titlebar.js +1 -1
- package/dist/{tree-BuzWn18_.js → tree-Bm2TzTfe.js} +233 -14
- package/dist/tree-Bm2TzTfe.js.map +1 -0
- package/dist/tree.d.ts +13 -1
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/{vertical-list-BLvJ4-Zf.d.ts → vertical-list-BWLqy3PJ.d.ts} +2 -2
- package/dist/{vertical-list-BLvJ4-Zf.d.ts.map → vertical-list-BWLqy3PJ.d.ts.map} +1 -1
- package/dist/vertical-list.d.ts +1 -1
- package/dist/vertical-list.js +1 -1
- package/docs-user/README.md +1 -0
- package/docs-user/icons.md +24 -10
- package/docs-user/index.json +8 -3
- package/docs-user/llms.txt +2 -1
- package/docs-user/multicol-list.md +128 -0
- package/docs-user/tree.md +12 -0
- package/docs-user/vertical-list.md +65 -9
- package/llms.txt +2 -1
- package/package.json +1 -1
- package/dist/data-grid-BT1d_nlu.d.ts.map +0 -1
- package/dist/defaults-BJwDsMH4.js +0 -86
- package/dist/defaults-BJwDsMH4.js.map +0 -1
- package/dist/grid-list-DLfw5HI4.js.map +0 -1
- package/dist/handle-BPOxBOKf.js +0 -219
- package/dist/handle-BPOxBOKf.js.map +0 -1
- package/dist/icon-BCJJYEpm.js.map +0 -1
- package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
- package/dist/incr-search-C05WjbZh.js.map +0 -1
- package/dist/index-DPFrRhKL.d.ts.map +0 -1
- package/dist/index-DsjpDksO.d.ts +0 -47
- package/dist/index-DsjpDksO.d.ts.map +0 -1
- package/dist/menu-C8a-84S5.js.map +0 -1
- package/dist/menu-item-DzizkMH-.js.map +0 -1
- package/dist/scroll-fade-CAs1EabA.js.map +0 -1
- package/dist/tree-BuzWn18_.js.map +0 -1
package/dist/ac-text.d.ts
CHANGED
package/dist/ac-text.js
CHANGED
|
@@ -4,7 +4,7 @@ import { n as tickledStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
|
4
4
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
5
5
|
import { t as popupSurfaceStyles } from "./popup-D80sj2QC.js";
|
|
6
6
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
7
|
-
import "./icon-
|
|
7
|
+
import "./icon-1gpwtPx8.js";
|
|
8
8
|
import { LitElement, css, html, nothing } from "lit";
|
|
9
9
|
import { property, state } from "lit/decorators.js";
|
|
10
10
|
//#region src/ac-text/ac-text.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./icon-
|
|
1
|
+
import "./icon-CDGprSdE.js";
|
|
2
2
|
import { r as IDataProvider } from "./data-provider-BAn_-oR1.js";
|
|
3
3
|
import { LitElement, PropertyValues } from "lit";
|
|
4
4
|
//#region src/ac-token/types.d.ts
|
|
@@ -104,4 +104,4 @@ interface AcTokenElement {
|
|
|
104
104
|
}
|
|
105
105
|
//#endregion
|
|
106
106
|
export { AcTokenItem as a, AcTokenizerFn as c, AcTokenElementEventMap as i, AcTokensChangeDetail as l, AcTokenAddDetail as n, AcTokenRemoveDetail as o, AcTokenAddEvent as r, AcTokenRemoveEvent as s, AcTokenElement as t, AcTokensChangeEvent as u };
|
|
107
|
-
//# sourceMappingURL=ac-token
|
|
107
|
+
//# sourceMappingURL=ac-token--_vCHXWw.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ac-token
|
|
1
|
+
{"version":3,"file":"ac-token--_vCHXWw.d.ts","names":[],"sources":["../src/ac-token/types.ts","../src/ac-token/ac-token.ts"],"mappings":";;;;KAAY;WACD;WACA;WACA;WACA;WACA;WACA,YAAY;;KAGX,iBAAiB;KAEjB;WACD,iBAAiB;;KAEhB,sBAAsB,YAAY;KAElC;WACD,MAAM;WACN;;KAEC,kBAAkB,YAAY;KAE9B;WACD,MAAM;WACN;;KAEC,qBAAqB,YAAY;UAE5B;EACf,mBAAmB;EACnB,gBAAgB;EAChB,mBAAmB;;;;;;;;;;;;;;;;;;;;cCgDR,uBAAuB;;;EAGlC,oBAAoB,sBAAsB;;EAI1C,WAAW;;EAIX;;EAIA;;EAIA;;;;;EAOA;;;;;;EAQA;UAEiB;UACA;UACA;UACA;UAET;;MAqBJ,mBAAmB;MAInB,OAAO,gBAAgB;;;;;;;EAW3B,UAAU,gBAAgB;;MAKtB;EAMK;EAKA;YASU,QAAQ,cAAc;YA6btB,wBAAM;SA+BT,sBAAM;;QAkLhB;YACI;IACR,iBAAiB;;;UAIJ;EACf,oBAAoB,gBAAgB,wBAClC,MAAM,GACN,WAAW,MAAM,gBAAgB,OAAO,uBAAuB,aAC/D,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
|
package/dist/ac-token.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as AcTokenItem, c as AcTokenizerFn, i as AcTokenElementEventMap, l as AcTokensChangeDetail, n as AcTokenAddDetail, o as AcTokenRemoveDetail, r as AcTokenAddEvent, s as AcTokenRemoveEvent, t as AcTokenElement, u as AcTokensChangeEvent } from "./ac-token
|
|
1
|
+
import { a as AcTokenItem, c as AcTokenizerFn, i as AcTokenElementEventMap, l as AcTokensChangeDetail, n as AcTokenAddDetail, o as AcTokenRemoveDetail, r as AcTokenAddEvent, s as AcTokenRemoveEvent, t as AcTokenElement, u as AcTokensChangeEvent } from "./ac-token--_vCHXWw.js";
|
|
2
2
|
export { type AcTokenAddDetail, type AcTokenAddEvent, AcTokenElement, type AcTokenElementEventMap, type AcTokenItem, type AcTokenRemoveDetail, type AcTokenRemoveEvent, type AcTokenizerFn, type AcTokensChangeDetail, type AcTokensChangeEvent };
|
package/dist/ac-token.js
CHANGED
|
@@ -2,9 +2,9 @@ import { t as TickledController } from "./tickled-controller-Dh1Uh_vG.js";
|
|
|
2
2
|
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
3
3
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
4
4
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
|
-
import "./icon-
|
|
5
|
+
import "./icon-1gpwtPx8.js";
|
|
6
6
|
import { t as DataController } from "./data-controller-DOlmqNKb.js";
|
|
7
|
-
import { m as createAcCompletionProvider } from "./incr-search-
|
|
7
|
+
import { m as createAcCompletionProvider } from "./incr-search-D91M4Ozq.js";
|
|
8
8
|
import { LitElement, css, html, nothing } from "lit";
|
|
9
9
|
import { property, state } from "lit/decorators.js";
|
|
10
10
|
//#region src/ac-token/ac-token.ts
|
package/dist/button.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ declare class ButtonElement extends LitElement {
|
|
|
7
7
|
hideLabel: boolean;
|
|
8
8
|
hasIcon: boolean;
|
|
9
9
|
subtle: boolean;
|
|
10
|
-
protected _renderIcon(): import("lit").TemplateResult<1
|
|
10
|
+
protected _renderIcon(): typeof nothing | import("lit").TemplateResult<1>;
|
|
11
11
|
protected render(): import("lit").TemplateResult<1>;
|
|
12
12
|
static styles: import("lit").CSSResult[];
|
|
13
13
|
}
|
package/dist/button.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","names":[],"sources":["../src/button/button.ts"],"mappings":";;cASa,sBAAsB;EAEjC;EAGA;EAGA;EAGA;EAGA;EAGA;YAEU,
|
|
1
|
+
{"version":3,"file":"button.d.ts","names":[],"sources":["../src/button/button.ts"],"mappings":";;cASa,sBAAsB;EAEjC;EAGA;EAGA;EAGA;EAGA;EAGA;YAEU,sBAAW,wBAAA;YAcX,wBAAM;SAQT,sBAAM;;QAMP;YACI;IACR,eAAe"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
2
2
|
import { t as popupSurfaceStyles } from "./popup-D80sj2QC.js";
|
|
3
3
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
4
|
-
import { n as ICON_CHECK } from "./defaults-
|
|
4
|
+
import { n as ICON_CHECK } from "./defaults-kVl1t2tT.js";
|
|
5
5
|
import "./labelled-range-input.js";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { property, query, state } from "lit/decorators.js";
|
|
@@ -933,4 +933,4 @@ ColourPickerPopup = __decorate([safeCustomElement(`ixfx-colour-picker-popup`)],
|
|
|
933
933
|
//#endregion
|
|
934
934
|
export { ColourPicker as n, ColourPickerPopup as t };
|
|
935
935
|
|
|
936
|
-
//# sourceMappingURL=colour-picker-
|
|
936
|
+
//# sourceMappingURL=colour-picker-WDrPuqoO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colour-picker-R73i0QTP.js","names":["customElement","customElement"],"sources":["../src/colour-picker/util.ts","../src/colour-picker/colour-picker.ts","../src/colour-picker/colour-picker-popup.ts"],"sourcesContent":["import type { Range, SliderType } from \"./types\";\n\nexport const MAX_CHROMA = 0.4;\nexport const RANGE_LIMITS: Record<SliderType, Range> = {\n l: [0, 1],\n c: [0, MAX_CHROMA],\n h: [0, 360],\n a: [0, 1],\n} as const;\nexport const DEFAULT_RANGES: Record<SliderType, Range> = {\n l: RANGE_LIMITS.l,\n c: RANGE_LIMITS.c,\n h: RANGE_LIMITS.h,\n a: RANGE_LIMITS.a,\n} as const;\n\nexport function rangeSpan([min, max]: Range): number {\n return Math.max(max - min, 0);\n}\n\nexport function cloneRange(range: Range): Range {\n return [range[0], range[1]] as Range;\n}\n\n/**\n * Convert OKLCH to a CSS string\n */\nexport function oklchToCss(l: number, c: number, h: number, a: number = 1): string {\n if (a < 1) {\n return `oklch(${l} ${c} ${h} / ${a})`;\n }\n return `oklch(${l} ${c} ${h})`;\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * <ixfx-colour-picker> — OKLCH colour picker using CSS-gradient-rendered sliders.\n *\n * Properties:\n * l — lightness 0..1\n * c — chroma 0..0.4\n * h — hue 0..360\n *\n * Getters:\n * value — current color as CSS string e.g. \"oklch(0.7 0.15 180)\"\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set colour from any\n * ixfx-compatible format; also resets double-click defaults for all sliders.\n *\n * Events:\n * input — CustomEvent { detail: { l, c, h } }\n *\n * Double-click any slider label to reset that channel to the last\n * programmatically set value (not the user-dialled value).\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPickerEventDetail, Range, RangeInput } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { DEFAULT_RANGES, oklchToCss } from './util.js';\nimport '../labelled-range-input/index.js';\n\ntype ChannelSlider = `l` | `c` | `h` | `a`;\n\n@customElement(`ixfx-colour-picker`)\nexport class ColourPicker extends LitElement {\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `hide-preview`, reflect: true }) hidePreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal`, reflect: true }) horizontal = false;\n @property({ type: Boolean, attribute: `sliders-vertical`, reflect: true }) slidersVertical = false;\n @property({ type: Boolean, attribute: `hide-tooltips`, reflect: true }) hideTooltips = false;\n\n @property({ type: String, attribute: `value` })\n private _valueAttr: string | null = null;\n\n @property({ type: String, attribute: `range-l` }) rangeLAttr: string | null = null;\n @property({ type: String, attribute: `range-c` }) rangeCAttr: string | null = null;\n @property({ type: String, attribute: `range-h` }) rangeHAttr: string | null = null;\n @property({ type: String, attribute: `range-a` }) rangeAAttr: string | null = null;\n\n private _ranges: Record<ChannelSlider, Range> = {\n l: DEFAULT_RANGES.l,\n c: DEFAULT_RANGES.c,\n h: DEFAULT_RANGES.h,\n a: DEFAULT_RANGES.a,\n };\n\n @query(`#slider-l`) _sliderL!: HTMLElement;\n @query(`#slider-c`) _sliderC!: HTMLElement;\n @query(`#slider-h`) _sliderH!: HTMLElement;\n @query(`#slider-a`) _sliderA!: HTMLElement;\n @query(`.preview`) _previewEl!: HTMLElement;\n\n // Last programmatically-set values — used as double-click reset targets.\n // Initialised to the component's own defaults.\n private _defaultL = this.l;\n private _defaultC = this.c;\n private _defaultH = this.h;\n private _defaultA = this.a;\n\n // Keys are added synchronously in input handlers and cleared only inside\n // updated() (which runs asynchronously). This means updated() can reliably\n // tell whether a property change was user-initiated or programmatic.\n private readonly _userInitiated = new Set<string>();\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n set value(colourString: string) {\n const c = Colour.convert(colourString, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n this._valueAttr = colourString;\n }\n\n /**\n * Set the colour from any ixfx-compatible format (CSS string, OkLch object,\n * HSL object, etc.). Also updates the double-click reset defaults for all\n * sliders.\n */\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n // No _userInitiated keys added → updated() will set _defaultL/C/H/A. ✓\n }\n\n get rangeL(): Range {\n return [this._ranges.l[0], this._ranges.l[1]];\n }\n\n set rangeL(range: RangeInput) {\n this._applyRangeInput(`l`, range);\n }\n\n get rangeC(): Range {\n return [this._ranges.c[0], this._ranges.c[1]];\n }\n\n set rangeC(range: RangeInput) {\n this._applyRangeInput(`c`, range);\n }\n\n get rangeH(): Range {\n return [this._ranges.h[0], this._ranges.h[1]];\n }\n\n set rangeH(range: RangeInput) {\n this._applyRangeInput(`h`, range);\n }\n\n get rangeA(): Range {\n return [this._ranges.a[0], this._ranges.a[1]];\n }\n\n set rangeA(range: RangeInput) {\n this._applyRangeInput(`a`, range);\n }\n\n setRangeL(range: RangeInput): void {\n this.rangeL = range;\n }\n\n setRangeC(range: RangeInput): void {\n this.rangeC = range;\n }\n\n setRangeH(range: RangeInput): void {\n this.rangeH = range;\n }\n\n setRangeA(range: RangeInput): void {\n this.rangeA = range;\n }\n\n override willUpdate(changedProperties: PropertyValues): void {\n if (changedProperties.has(`rangeLAttr`))\n this._setRangeFromAttribute(`l`, this.rangeLAttr);\n if (changedProperties.has(`rangeCAttr`))\n this._setRangeFromAttribute(`c`, this.rangeCAttr);\n if (changedProperties.has(`rangeHAttr`))\n this._setRangeFromAttribute(`h`, this.rangeHAttr);\n if (changedProperties.has(`rangeAAttr`))\n this._setRangeFromAttribute(`a`, this.rangeAAttr);\n super.willUpdate(changedProperties);\n }\n\n private _applyRangeInput(channel: ChannelSlider, input: RangeInput): void {\n const normalized = this._coerceRangeInput(channel, input);\n if (!normalized)\n return;\n this._setRange(channel, normalized);\n }\n\n private _coerceRangeInput(channel: ChannelSlider, input: RangeInput): Range | null {\n if (!Array.isArray(input) || input.length < 2)\n return null;\n const [start, end] = input;\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _setRangeFromAttribute(channel: ChannelSlider, value: string | null): void {\n if (value === null) {\n this._setRange(channel, DEFAULT_RANGES[channel]);\n return;\n }\n const parsed = this._parseRangeString(channel, value);\n if (parsed)\n this._setRange(channel, parsed);\n }\n\n private _setRange(channel: ChannelSlider, range: Range): void {\n const normalized = this._normalizeRange(channel, range);\n const currentRange = this._ranges[channel];\n if (currentRange[0] === normalized[0] && currentRange[1] === normalized[1])\n return;\n\n this._ranges = { ...this._ranges, [channel]: normalized };\n\n switch (channel) {\n case `l`:\n this.l = this._clampToRange(`l`, this.l);\n break;\n case `c`:\n this.c = this._clampToRange(`c`, this.c);\n break;\n case `h`:\n this.h = this._clampToRange(`h`, this.h);\n break;\n case `a`:\n this.a = this._clampToRange(`a`, this.a);\n break;\n }\n\n this.requestUpdate();\n }\n\n private _getRange(channel: ChannelSlider): Range {\n return this._ranges[channel] ?? DEFAULT_RANGES[channel];\n }\n\n private _parseRangeString(channel: ChannelSlider, value: string): Range | null {\n const cleaned = value.trim();\n const parts = cleaned.split(`-`, 2);\n if (parts.length !== 2)\n return null;\n const start = Number(parts[0]!.trim());\n const end = Number(parts[1]!.trim());\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _normalizeRange(channel: ChannelSlider, range: Range): Range {\n const limits = DEFAULT_RANGES[channel];\n const [rawMin, rawMax] = range;\n const minVal = Math.min(Math.min(rawMin, rawMax), limits[1]);\n const maxVal = Math.max(Math.max(rawMin, rawMax), limits[0]);\n return [\n Math.max(minVal, limits[0]),\n Math.min(maxVal, limits[1]),\n ];\n }\n\n private _clampToRange(channel: ChannelSlider, value: number): number {\n const [min, max] = this._getRange(channel);\n return Math.min(Math.max(value, min), max);\n }\n\n override render() {\n const makeSlider = (channel: `l` | `c` | `h` | `a`, label: string, min: number, max: number, step: number, isHidden: boolean, formatter?: (value: string) => string) => {\n if (isHidden)\n return nothing;\n return html`\n <ixfx-labelled-range-input\n id=\"slider-${channel}\"\n label=\"${label}\"\n min=${min}\n max=${max}\n mini-width-threshold=200\n .value=${this[channel]}\n step=${step}\n .orientation=${this.slidersVertical ? `vertical` : `horizontal`}\n .formatter=${formatter}\n ?no-tooltip=${this.hideTooltips}\n .displayTextLogic=${this.hideTooltips ? `show` : `transient`}\n @input=${(e: Event) => this._onInput(e, channel)}\n @change=${(e: Event) => this._onChange(e, channel)}\n ></ixfx-labelled-range-input>\n `;\n };\n\n return html`\n <div class=\"picker\" ?horizontal=${this.horizontal}>\n <div class=\"preview\" ?hidden=${this.hidePreview}></div>\n <div class=\"sliders\">\n ${makeSlider(`h`, `Hue`, ...this._getRange(`h`), 1, this.hideH, v => `${Math.round(Number(v))}°`)}\n ${makeSlider(`l`, `Lightness`, ...this._getRange(`l`), 0.01, this.hideL, v => `${Math.round(Number(v) * 100)}%`)}\n ${makeSlider(`c`, `Chroma`, ...this._getRange(`c`), 0.005, this.hideC, v => `${Number.parseFloat(v).toFixed(2)}`)}\n ${this.showA ? makeSlider(`a`, `Opacity`, ...this._getRange(`a`), 0.01, false, v => `${Math.round(Number(v) * 100)}%`) : nothing}\n </div>\n </div>\n `;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._updateGradients();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n // Update reset defaults only for programmatic changes (not user input).\n // _userInitiated is populated synchronously in input handlers and cleared\n // here, so it correctly reflects what changed since the last render.\n if (changedProperties.has(`l`) && !this._userInitiated.has(`l`))\n this._defaultL = this.l;\n if (changedProperties.has(`c`) && !this._userInitiated.has(`c`))\n this._defaultC = this.c;\n if (changedProperties.has(`h`) && !this._userInitiated.has(`h`))\n this._defaultH = this.h;\n if (changedProperties.has(`a`) && !this._userInitiated.has(`a`))\n this._defaultA = this.a;\n this._userInitiated.clear();\n\n if (changedProperties.has(`l`) || changedProperties.has(`c`) || changedProperties.has(`h`) || changedProperties.has(`a`) || changedProperties.has(`showA`) || changedProperties.has(`slidersVertical`)) {\n this._updateGradients();\n }\n }\n\n _updateGradients(): void {\n const l = this.l;\n const c = this.c;\n const h = this.h;\n const a = this.a;\n\n // Get actual ranges from this._ranges (may be restricted via attributes)\n const [lMin, lMax] = this._ranges.l;\n const [cMin, cMax] = this._ranges.c;\n const [hMin, hMax] = this._ranges.h;\n const [aMin, aMax] = this._ranges.a;\n\n // Gradient direction: vertical sliders fill bottom→top (bottom = min, top = max).\n const dir = this.slidersVertical ? `to top` : `to right`;\n\n // L slider: black → white at current chroma + hue, using actual range\n const lGrad = `linear-gradient(in oklch ${dir}, oklch(${lMin} ${c} ${h}), oklch(${lMax} ${c} ${h}))`;\n\n // C slider: neutral grey → fully saturated at current lightness + hue, using actual range\n const cGrad = `linear-gradient(in oklch ${dir}, oklch(${l} ${cMin} ${h}), oklch(${l} ${cMax} ${h}))`;\n\n // H slider: hue range at current lightness + chroma.\n // Use 'longer hue' for full 0-360 range, 'shorter hue' for restricted ranges.\n const hRange = hMax - hMin;\n const hLonger = hRange >= 300; // Full or near-full hue range\n const hGrad = `linear-gradient(in oklch ${hLonger ? `longer` : `shorter`} hue ${dir}, oklch(${l} ${c} ${hMin}), oklch(${l} ${c} ${hMax}))`;\n\n // A slider: transparent to opaque at current colour, using actual range.\n // Includes checkerboard pattern as bottom layer, with opacity gradient on top.\n const aGrad = `\n linear-gradient(${dir}, oklch(${l} ${c} ${h} / ${aMin}), oklch(${l} ${c} ${h} / ${aMax})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n\n // Set gradient on --background-track (goes to .range-bg, the track background)\n // Set --background-track-value to transparent to hide the filled-portion bar\n const trackBgVars = [\n `--background-track`,\n `--background-track-hover`,\n ] as const;\n\n const trackValueVars = [\n `--background-track-value`,\n `--background-track-value-hover`,\n `--background-track-value-active`,\n `--background-track-value-vertical`,\n `--background-track-value-hover-vertical`,\n `--background-track-value-active-vertical`,\n ] as const;\n\n const sliders: Array<[HTMLElement | null, string]> = [\n [this._sliderL, lGrad],\n [this._sliderC, cGrad],\n [this._sliderH, hGrad],\n ];\n\n if (this.showA && this._sliderA)\n sliders.push([this._sliderA, aGrad]);\n\n for (const [el, grad] of sliders) {\n if (!el)\n continue;\n // Set gradient on track background (.range-bg)\n for (const v of trackBgVars) {\n el.style.setProperty(v, grad);\n }\n // Hide the filled-portion bar (track pseudo-element)\n for (const v of trackValueVars) {\n el.style.setProperty(v, `transparent`);\n }\n }\n\n // Preview swatch background - show checkerboard behind when opacity < 1\n if (this._previewEl) {\n if (this.a < 1) {\n const previewBg = `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n this._previewEl.style.background = previewBg;\n } else {\n this._previewEl.style.background = this.value;\n }\n }\n }\n\n _onInput = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n this[channel] = detail.value;\n this._dispatchInput();\n e.stopPropagation();\n };\n\n _onChange = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n const value = typeof detail.value === `string` ? Number.parseFloat(detail.value) : detail.value;\n switch (channel) {\n case `l`: this.l = value; break;\n case `c`: this.c = value; break;\n case `h`: this.h = value; break;\n case `a`: this.a = value; break;\n }\n e.stopPropagation();\n this.requestUpdate();\n this._dispatchChange();\n };\n\n _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n static styles: CSSResultGroup = [themeFallbacks, css`\n /*\n * Default intrinsic size — not determined by label text.\n * Override via CSS: ixfx-colour-picker { width: 100%; height: 200px; }\n * Or via custom properties: --picker-alt-width, --picker-alt-min-slider-height\n */\n :host {\n display: block;\n width: var(--picker-alt-width, 240px);\n height: var(--picker-alt-height, 240px);\n --_radius-m: var(--radius-m, 4px);\n --_radius-s: var(--radius-m, 3px);\n container-type: size;\n }\n\n .picker {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .picker[horizontal] {\n flex-direction: row;\n align-items: stretch;\n }\n\n .sliders {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n flex: 1;\n min-height: 0;\n }\n\n .picker[horizontal] .sliders {\n flex-direction: column;\n }\n\n .preview {\n flex-shrink: 0;\n height: 30%;\n border-radius: var(--_radius-m);\n border: 1px solid rgba(0, 0, 0, 0.2);\n }\n\n .preview[hidden] {\n display: none;\n }\n\n .picker[horizontal] .preview {\n width: 3em;\n height: auto;\n flex-shrink: 0;\n }\n\n ixfx-labelled-range-input {\n flex: 1;\n min-height: var(--picker-alt-min-slider-height, 2.5em);\n width: 100%;\n min-width: 0;\n --track-thickness: 2em;\n --track-radius: var(--_radius-s);\n --label-width: 5em;\n --thumb-thickness: 4px;\n --thumb-color: rgba(255, 255, 255, 0.9);\n --thumb-color-active: white;\n --thumb-radius: 3px;\n --thumb-border: 2px solid rgba(255, 255, 255, 0.85);\n --thumb-shadow: 0 0 0 2px rgba(0, 0, 0, 0.65);\n }\n\n /* Vertical sliders mode: sliders are side-by-side vertical bars */\n :host([sliders-vertical]) .sliders {\n flex-direction: row;\n align-items: stretch;\n }\n\n :host([sliders-vertical]) ixfx-labelled-range-input {\n width: auto;\n height: 100%;\n min-height: 0;\n --mini: 1; /* force mini mode: no label, tooltip on hover */\n --track-thickness: 100%; /* fill full width of the narrow slider */\n }\n\n /* Landscape */\n @container (aspect-ratio > 1) {\n .picker {\n flex-direction: row;\n display:flex;\n align-items: stretch;\n\n }\n .preview {\n width: 30%;\n height: unset;\n }\n .sliders {\n height: 100%;\n overflow: hidden;\n }\n }\n\n /* Small height. Show as landscape */\n @container (max-height: 150px) {\n .picker {\n flex-direction: row;\n align-items: stretch;\n }\n ixfx-labelled-range-input {\n --track-thickness: 1em;\n min-height: unset;\n }\n .preview {\n min-width: 50%;\n height: auto;\n }\n }\n\n /* Medium height — tighter but not extreme */\n @container (max-height: 210px) and (min-height: 150px) {\n ixfx-labelled-range-input {\n --track-thickness: 1.6em;\n min-height: 1.8em;\n }\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker': ColourPicker;\n }\n}\n","/**\n * <ixfx-colour-picker-popup> — inline colour swatch that opens an ixfx-colour-picker\n * in a native popover.\n *\n * Properties:\n * mode — \"fluid\" (default) | \"confirm\"\n * l, c, h, a — committed OKLCH values\n * hide-h, hide-l, hide-c, show-a, horizontal — passed to inner picker\n * show-preview — show the colour preview swatch inside the picker (fluid mode hides it by default)\n *\n * Getters/setters:\n * value — committed colour as CSS string e.g. \"oklch(0.7 0.15 180)\";\n * setting accepts any ixfx-compatible colour format (equivalent to calling setColour())\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set committed colour\n *\n * Events:\n * input — (fluid mode only) CustomEvent { detail: { l, c, h, a } }\n * change — CustomEvent { detail: { l, c, h, a } }\n *\n * CSS custom properties:\n * --cp-popup-swatch-size — swatch button size (default: 1.5em)\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPicker } from './colour-picker.js';\nimport type { ColourPickerEventDetail } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { ICON_CHECK } from '../icons/defaults.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { oklchToCss } from './util.js';\nimport './colour-picker.js';\n\nlet _instanceCounter = 0;\n\nconst PICKER_SIZES = {\n small: { width: 130, height: 100 },\n medium: { width: 100, height: 155 },\n large: { width: 200, height: 180 },\n huge: { width: 290, height: 240 },\n} as const;\n\ntype PickerSize = keyof typeof PICKER_SIZES;\n\nfunction swatchBackground(l: number, c: number, h: number, a: number): string {\n if (a < 1) {\n return `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 8px 8px\n `;\n }\n return oklchToCss(l, c, h);\n}\n\n@customElement(`ixfx-colour-picker-popup`)\nexport class ColourPickerPopup extends LitElement {\n @property({ type: String }) mode: `fluid` | `confirm` = `fluid`;\n\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `show-preview` }) showPreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal` }) horizontal = false;\n @property({ type: String }) size: PickerSize = `medium`;\n\n @state() private _isOpen = false;\n @state() private _everOpened = false;\n\n @query(`.popup`) _popupEl!: HTMLElement;\n @query(`ixfx-colour-picker`) _pickerEl!: ColourPicker;\n\n private readonly _uid: string;\n private readonly _anchorName: string;\n private readonly _popupId: string;\n\n // Confirm mode: values being adjusted (not yet committed)\n private _pendingL = this.l;\n private _pendingC = this.c;\n private _pendingH = this.h;\n private _pendingA = this.a;\n\n // Confirm mode: snapshot taken on open, used for revert on dismiss\n private _savedL = this.l;\n private _savedC = this.c;\n private _savedH = this.h;\n private _savedA = this.a;\n\n // Set to true just before hidePopover() in _onConfirm to suppress revert\n private _pendingConfirmed = false;\n\n constructor() {\n super();\n const id = ++_instanceCounter;\n this._uid = `cp-popup-${id}`;\n this._anchorName = `--cp-popup-anchor-${id}`;\n this._popupId = `cp-popup-panel-${id}`;\n }\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n set value(colour: Colour.Colourish) {\n this.setColour(colour);\n }\n\n private get _innerHidePreview(): boolean {\n // Fluid mode hides the preview by default (swatch already shows live colour).\n // show-preview overrides this. Confirm mode shows it by default.\n if (this.mode === `fluid`)\n return !this.showPreview;\n return false;\n }\n\n private get _pickerDimensions(): { width: number; height: number } {\n return PICKER_SIZES[this.size] ?? PICKER_SIZES.medium;\n }\n\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._applyAnchorPositioning();\n this._updateSwatchBackground();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n const colourChanged = changedProperties.has(`l`) || changedProperties.has(`c`)\n || changedProperties.has(`h`) || changedProperties.has(`a`);\n if (colourChanged) {\n this._updateSwatchBackground();\n }\n }\n\n private _applyAnchorPositioning(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.setProperty(`anchor-name`, this._anchorName);\n }\n if (this._popupEl) {\n this._popupEl.style.setProperty(`position-anchor`, this._anchorName);\n }\n }\n\n private _updateSwatchBackground(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.background = swatchBackground(this.l, this.c, this.h, this.a);\n }\n }\n\n private _onPopoverToggle = (e: Event): void => {\n const te = e as ToggleEvent;\n this._isOpen = te.newState === `open`;\n\n if (te.newState === `open`) {\n this._savedL = this.l;\n this._savedC = this.c;\n this._savedH = this.h;\n this._savedA = this.a;\n this._pendingL = this.l;\n this._pendingC = this.c;\n this._pendingH = this.h;\n this._pendingA = this.a;\n this._pendingConfirmed = false;\n } else if (this.mode === `confirm` && !this._pendingConfirmed) {\n // Dismissed without confirming — reset inner picker to saved values\n this._pickerEl?.setColour(oklchToCss(this._savedL, this._savedC, this._savedH, this._savedA));\n }\n };\n\n private _onPickerInput = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchInput();\n };\n\n private _onPickerChange = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchChange();\n };\n\n private _onConfirm = (): void => {\n this.l = this._pendingL;\n this.c = this._pendingC;\n this.h = this._pendingH;\n this.a = this._pendingA;\n this._pendingConfirmed = true;\n this._dispatchChange();\n try {\n (this._popupEl as HTMLElement & { hidePopover: () => void }).hidePopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _onSwatchClick = async (): Promise<void> => {\n if (!this._everOpened) {\n this._everOpened = true;\n await this.updateComplete;\n }\n try {\n (this._popupEl as HTMLElement & { showPopover: () => void }).showPopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n private _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n override render() {\n return html`\n <button\n class=\"swatch\"\n @click=${this._onSwatchClick}\n aria-label=\"Pick colour: ${this.value}\"\n aria-expanded=\"${this._isOpen}\"\n aria-haspopup=\"dialog\"\n ></button>\n <div\n id=\"${this._popupId}\"\n class=\"popup popup-surface\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label=\"Colour picker\"\n style=\"--cp-popup-min-width:${this._pickerDimensions.width}px;--cp-popup-min-height:${this._pickerDimensions.height}px\"\n @toggle=${this._onPopoverToggle}\n >\n ${this._everOpened\n ? html`\n <ixfx-colour-picker\n .l=${this.l}\n .c=${this.c}\n .h=${this.h}\n .a=${this.a}\n style=\"width:${this._pickerDimensions.width}px;height:${this._pickerDimensions.height}px\"\n ?hide-preview=${this._innerHidePreview}\n ?hide-h=${this.hideH}\n ?hide-l=${this.hideL}\n ?hide-c=${this.hideC}\n ?show-a=${this.showA}\n ?horizontal=${this.horizontal}\n hide-tooltips\n @input=${this._onPickerInput}\n @change=${this._onPickerChange}\n ></ixfx-colour-picker>\n ${this.mode === `confirm`\n ? html`\n <button class=\"confirm-btn\" @click=${this._onConfirm} aria-label=\"Confirm colour\" title=\"Confirm colour\">\n ${unsafeHTML(ICON_CHECK)}\n </button>\n `\n : nothing}\n `\n : nothing}\n </div>\n `;\n }\n\n static styles: CSSResultGroup = [themeFallbacks, popupSurfaceStyles, css`\n :host {\n display: inline-block;\n }\n\n .swatch {\n display: inline-block;\n width: var(--cp-popup-swatch-size, 1.5em);\n height: var(--cp-popup-swatch-size, 1.5em);\n border-radius: var(--radius-m, 4px);\n border: 1px solid rgba(0, 0, 0, 0.2);\n cursor: pointer;\n padding: 0;\n box-sizing: border-box;\n vertical-align: middle;\n transition: transform 0.1s ease, box-shadow 0.1s ease;\n }\n\n .swatch:hover {\n transform: scale(1.1);\n }\n\n .swatch:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n\n /* Popover panel */\n .popup {\n display:flex;\n flex-direction: column;\n gap: var(--space-s);\n /* Reset popover UA inset */\n inset: unset;\n margin: 0;\n\n min-width: var(--cp-popup-min-width);\n min-height: var(--cp-popup-min-height);\n\n /* CSS anchor positioning — position-anchor set via inline style in JS */\n position: fixed;\n position-area: block-end span-inline-start;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin-block-start: 4px;\n\n padding: var(--space-l);\n z-index: 100;\n\n /* Animate in/out */\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease, scale 0.12s ease;\n }\n\n .popup:popover-open {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n ixfx-colour-picker {\n display: block;\n }\n\n .confirm-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-block-start: var(--space-s);\n margin-inline-start: auto;\n width: 1.8em;\n height: 1.8em;\n border-radius: 50%;\n border: none;\n background: var(--accent, oklch(60% 0.15 140));\n color: var(--accent-text, #fff);\n padding: 0;\n cursor: pointer;\n transition: background var(--transition, 0.15s ease-out);\n }\n\n .confirm-btn svg {\n width: 1.1em;\n height: 1.1em;\n flex-shrink: 0;\n }\n\n .confirm-btn:hover {\n background: var(--accent, oklch(70% 0.15 140));\n }\n\n .confirm-btn:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker-popup': ColourPickerPopup;\n }\n}\n"],"mappings":";;;;;;;;;AAGA,MAAa,eAA0C;CACrD,GAAG,CAAC,GAAG,CAAC;CACR,GAAG,CAAC,GAAG,EAAU;CACjB,GAAG,CAAC,GAAG,GAAG;CACV,GAAG,CAAC,GAAG,CAAC;AACV;AACA,MAAa,iBAA4C;CACvD,GAAG,aAAa;CAChB,GAAG,aAAa;CAChB,GAAG,aAAa;CAChB,GAAG,aAAa;AAClB;;;;AAaA,SAAgB,WAAW,GAAW,GAAW,GAAW,IAAY,GAAW;CACjF,IAAI,IAAI,GACN,OAAO,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;CAErC,OAAO,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE;AAC9B;;;ACEO,IAAM,eAAN,MAAM,qBAAqB,WAAW;;;EACX,KAAA,IAAA;EACA,KAAA,IAAA;EACA,KAAA,IAAA;EACA,KAAA,IAAA;EAEqD,KAAA,cAAA;EACZ,KAAA,QAAA;EACA,KAAA,QAAA;EACA,KAAA,QAAA;EACf,KAAA,QAAA;EACwB,KAAA,aAAA;EACW,KAAA,kBAAA;EACN,KAAA,eAAA;EAGnD,KAAA,aAAA;EAE0C,KAAA,aAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EAE9B,KAAA,UAAA;GAC9C,GAAG,eAAe;GAClB,GAAG,eAAe;GAClB,GAAG,eAAe;GAClB,GAAG,eAAe;EACpB;EAUoB,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EAKS,KAAA,iCAAA,IAAI,IAAY;EAuUtC,KAAA,YAAA,GAAU,YAAyC;GAC7D,MAAM,SAAU,EAAkB;GAClC,KAAK,eAAe,IAAI,OAAO;GAC/B,KAAK,WAAW,OAAO;GACvB,KAAK,eAAe;GACpB,EAAE,gBAAgB;EACpB;EAEa,KAAA,aAAA,GAAU,YAAyC;GAC9D,MAAM,SAAU,EAAkB;GAClC,KAAK,eAAe,IAAI,OAAO;GAC/B,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,WAAW,OAAO,KAAK,IAAI,OAAO;GAC1F,QAAQ,SAAR;IACE,KAAK;KAAK,KAAK,IAAI;KAAO;IAC1B,KAAK;KAAK,KAAK,IAAI;KAAO;IAC1B,KAAK;KAAK,KAAK,IAAI;KAAO;IAC1B,KAAK,KAAK,KAAK,IAAI;GACrB;GACA,EAAE,gBAAgB;GAClB,KAAK,cAAc;GACnB,KAAK,gBAAgB;EACvB;;CA1VA,IAAI,QAAgB;EAClB,OAAO,WAAW,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAClD;CAEA,IAAI,MAAM,cAAsB;EAC9B,MAAM,IAAI,OAAO,QAAQ,cAAc,gBAAgB;EACvD,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE,WAAW;EACtB,KAAK,aAAa;CACpB;;;;;;CAOA,UAAU,QAAgC;EACxC,MAAM,IAAI,OAAO,QAAQ,QAAQ,gBAAgB;EACjD,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE,WAAW;CAExB;CAEA,IAAI,SAAgB;EAClB,OAAO,CAAC,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,EAAE;CAC9C;CAEA,IAAI,OAAO,OAAmB;EAC5B,KAAK,iBAAiB,KAAK,KAAK;CAClC;CAEA,IAAI,SAAgB;EAClB,OAAO,CAAC,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,EAAE;CAC9C;CAEA,IAAI,OAAO,OAAmB;EAC5B,KAAK,iBAAiB,KAAK,KAAK;CAClC;CAEA,IAAI,SAAgB;EAClB,OAAO,CAAC,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,EAAE;CAC9C;CAEA,IAAI,OAAO,OAAmB;EAC5B,KAAK,iBAAiB,KAAK,KAAK;CAClC;CAEA,IAAI,SAAgB;EAClB,OAAO,CAAC,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,EAAE;CAC9C;CAEA,IAAI,OAAO,OAAmB;EAC5B,KAAK,iBAAiB,KAAK,KAAK;CAClC;CAEA,UAAU,OAAyB;EACjC,KAAK,SAAS;CAChB;CAEA,UAAU,OAAyB;EACjC,KAAK,SAAS;CAChB;CAEA,UAAU,OAAyB;EACjC,KAAK,SAAS;CAChB;CAEA,UAAU,OAAyB;EACjC,KAAK,SAAS;CAChB;CAEA,WAAoB,mBAAyC;EAC3D,IAAI,kBAAkB,IAAI,YAAY,GACpC,KAAK,uBAAuB,KAAK,KAAK,UAAU;EAClD,IAAI,kBAAkB,IAAI,YAAY,GACpC,KAAK,uBAAuB,KAAK,KAAK,UAAU;EAClD,IAAI,kBAAkB,IAAI,YAAY,GACpC,KAAK,uBAAuB,KAAK,KAAK,UAAU;EAClD,IAAI,kBAAkB,IAAI,YAAY,GACpC,KAAK,uBAAuB,KAAK,KAAK,UAAU;EAClD,MAAM,WAAW,iBAAiB;CACpC;CAEA,iBAAyB,SAAwB,OAAyB;EACxE,MAAM,aAAa,KAAK,kBAAkB,SAAS,KAAK;EACxD,IAAI,CAAC,YACH;EACF,KAAK,UAAU,SAAS,UAAU;CACpC;CAEA,kBAA0B,SAAwB,OAAiC;EACjF,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAC1C,OAAO;EACT,MAAM,CAAC,OAAO,OAAO;EACrB,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,GAAG,GACjD,OAAO;EACT,OAAO,KAAK,gBAAgB,SAAS,CAAC,OAAO,GAAG,CAAC;CACnD;CAEA,uBAA+B,SAAwB,OAA4B;EACjF,IAAI,UAAU,MAAM;GAClB,KAAK,UAAU,SAAS,eAAe,QAAQ;GAC/C;EACF;EACA,MAAM,SAAS,KAAK,kBAAkB,SAAS,KAAK;EACpD,IAAI,QACF,KAAK,UAAU,SAAS,MAAM;CAClC;CAEA,UAAkB,SAAwB,OAAoB;EAC5D,MAAM,aAAa,KAAK,gBAAgB,SAAS,KAAK;EACtD,MAAM,eAAe,KAAK,QAAQ;EAClC,IAAI,aAAa,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,IACtE;EAEF,KAAK,UAAU;GAAE,GAAG,KAAK;IAAU,UAAU;EAAW;EAExD,QAAQ,SAAR;GACE,KAAK;IACH,KAAK,IAAI,KAAK,cAAc,KAAK,KAAK,CAAC;IACvC;GACF,KAAK;IACH,KAAK,IAAI,KAAK,cAAc,KAAK,KAAK,CAAC;IACvC;GACF,KAAK;IACH,KAAK,IAAI,KAAK,cAAc,KAAK,KAAK,CAAC;IACvC;GACF,KAAK,KACH,KAAK,IAAI,KAAK,cAAc,KAAK,KAAK,CAAC;EAE3C;EAEA,KAAK,cAAc;CACrB;CAEA,UAAkB,SAA+B;EAC/C,OAAO,KAAK,QAAQ,YAAY,eAAe;CACjD;CAEA,kBAA0B,SAAwB,OAA6B;EAE7E,MAAM,QADU,MAAM,KACF,CAAC,CAAC,MAAM,KAAK,CAAC;EAClC,IAAI,MAAM,WAAW,GACnB,OAAO;EACT,MAAM,QAAQ,OAAO,MAAM,EAAE,CAAE,KAAK,CAAC;EACrC,MAAM,MAAM,OAAO,MAAM,EAAE,CAAE,KAAK,CAAC;EACnC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,GAAG,GACjD,OAAO;EACT,OAAO,KAAK,gBAAgB,SAAS,CAAC,OAAO,GAAG,CAAC;CACnD;CAEA,gBAAwB,SAAwB,OAAqB;EACnE,MAAM,SAAS,eAAe;EAC9B,MAAM,CAAC,QAAQ,UAAU;EACzB,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,OAAO,EAAE;EAC3D,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,OAAO,EAAE;EAC3D,OAAO,CACL,KAAK,IAAI,QAAQ,OAAO,EAAE,GAC1B,KAAK,IAAI,QAAQ,OAAO,EAAE,CAC5B;CACF;CAEA,cAAsB,SAAwB,OAAuB;EACnE,MAAM,CAAC,KAAK,OAAO,KAAK,UAAU,OAAO;EACzC,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;CAC3C;CAEA,SAAkB;EAChB,MAAM,cAAc,SAAgC,OAAe,KAAa,KAAa,MAAc,UAAmB,cAA0C;GACtK,IAAI,UACF,OAAO;GACT,OAAO,IAAI;;uBAEM,QAAQ;mBACZ,MAAM;gBACT,IAAI;gBACJ,IAAI;;mBAED,KAAK,SAAS;iBAChB,KAAK;yBACG,KAAK,kBAAkB,aAAa,aAAa;uBACnD,UAAU;wBACT,KAAK,aAAa;8BACZ,KAAK,eAAe,SAAS,YAAY;oBACnD,MAAa,KAAK,SAAS,GAAG,OAAO,EAAE;qBACtC,MAAa,KAAK,UAAU,GAAG,OAAO,EAAE;;;EAGzD;EAEA,OAAO,IAAI;wCACyB,KAAK,WAAW;uCACjB,KAAK,YAAY;;YAE5C,WAAW,KAAK,OAAO,GAAG,KAAK,UAAU,GAAG,GAAG,GAAG,KAAK,QAAO,MAAK,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAChG,WAAW,KAAK,aAAa,GAAG,KAAK,UAAU,GAAG,GAAG,KAAM,KAAK,QAAO,MAAK,GAAG,KAAK,MAAM,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE;YAC/G,WAAW,KAAK,UAAU,GAAG,KAAK,UAAU,GAAG,GAAG,MAAO,KAAK,QAAO,MAAK,GAAG,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE;YAChH,KAAK,QAAQ,WAAW,KAAK,WAAW,GAAG,KAAK,UAAU,GAAG,GAAG,KAAM,QAAO,MAAK,GAAG,KAAK,MAAM,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,QAAQ;;;;CAIzI;CAEA,aAAsB,mBAAyC;EAC7D,MAAM,aAAa,iBAAiB;EACpC,KAAK,iBAAiB;CACxB;CAEA,QAAiB,mBAAyC;EACxD,MAAM,QAAQ,iBAAiB;EAK/B,IAAI,kBAAkB,IAAI,GAAG,KAAK,CAAC,KAAK,eAAe,IAAI,GAAG,GAC5D,KAAK,YAAY,KAAK;EACxB,IAAI,kBAAkB,IAAI,GAAG,KAAK,CAAC,KAAK,eAAe,IAAI,GAAG,GAC5D,KAAK,YAAY,KAAK;EACxB,IAAI,kBAAkB,IAAI,GAAG,KAAK,CAAC,KAAK,eAAe,IAAI,GAAG,GAC5D,KAAK,YAAY,KAAK;EACxB,IAAI,kBAAkB,IAAI,GAAG,KAAK,CAAC,KAAK,eAAe,IAAI,GAAG,GAC5D,KAAK,YAAY,KAAK;EACxB,KAAK,eAAe,MAAM;EAE1B,IAAI,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,OAAO,KAAK,kBAAkB,IAAI,iBAAiB,GACnM,KAAK,iBAAiB;CAE1B;CAEA,mBAAyB;EACvB,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,KAAK;EAGf,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ;EAClC,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ;EAClC,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ;EAClC,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ;EAGlC,MAAM,MAAM,KAAK,kBAAkB,WAAW;EAG9C,MAAM,QAAQ,4BAA4B,IAAI,UAAU,KAAK,GAAG,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG,EAAE,GAAG,EAAE;EAGjG,MAAM,QAAQ,4BAA4B,IAAI,UAAU,EAAE,GAAG,KAAK,GAAG,EAAE,WAAW,EAAE,GAAG,KAAK,GAAG,EAAE;EAMjG,MAAM,QAAQ,4BAFC,OAAO,QACI,MAC0B,WAAW,UAAU,OAAO,IAAI,UAAU,EAAE,GAAG,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,EAAE,GAAG,KAAK;EAIvI,MAAM,QAAQ;wBACM,IAAI,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,KAAK,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,KAAK;;;;;;EASzF,MAAM,cAAc,CAClB,sBACA,0BACF;EAEA,MAAM,iBAAiB;GACrB;GACA;GACA;GACA;GACA;GACA;EACF;EAEA,MAAM,UAA+C;GACnD,CAAC,KAAK,UAAU,KAAK;GACrB,CAAC,KAAK,UAAU,KAAK;GACrB,CAAC,KAAK,UAAU,KAAK;EACvB;EAEA,IAAI,KAAK,SAAS,KAAK,UACrB,QAAQ,KAAK,CAAC,KAAK,UAAU,KAAK,CAAC;EAErC,KAAK,MAAM,CAAC,IAAI,SAAS,SAAS;GAChC,IAAI,CAAC,IACH;GAEF,KAAK,MAAM,KAAK,aACd,GAAG,MAAM,YAAY,GAAG,IAAI;GAG9B,KAAK,MAAM,KAAK,gBACd,GAAG,MAAM,YAAY,GAAG,aAAa;EAEzC;EAGA,IAAI,KAAK,YAAY;GACnB,IAAI,KAAK,IAAI,GAAG;IACd,MAAM,YAAY;kCACQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;;;;;;IAM3E,KAAK,WAAW,MAAM,aAAa;GACrC,OACE,KAAK,WAAW,MAAM,aAAa,KAAK;EAE5C;CACF;CAyBA,iBAAuB;EACrB,MAAM,SAAkC;GAAE,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,MAAM;GAAU,OAAO;EAAQ;EACrH,KAAK,cAAc,IAAI,YAAqC,SAAS;GAAE;GAAQ,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CACjH;CAEA,kBAAwB;EACtB,MAAM,SAAkC;GAAE,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,MAAM;GAAU,OAAO;EAAQ;EACrH,KAAK,cAAc,IAAI,YAAqC,UAAU;GAAE;GAAQ,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CAClH;;EAEgC,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiInD;;AACH;AAvhBG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,KAAA,KAAA,CAAA;AAEzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAgB,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;AACpE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAS,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;AAC/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAc,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAClE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAoB,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,mBAAA,KAAA,CAAA;AACxE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,gBAAA,KAAA,CAAA;AAErE,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAG7C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAC/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAC/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAC/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAS/C,WAAA,CAAA,MAAM,WAAW,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjB,WAAA,CAAA,MAAM,WAAW,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjB,WAAA,CAAA,MAAM,WAAW,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjB,WAAA,CAAA,MAAM,WAAW,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;AACjB,WAAA,CAAA,MAAM,UAAU,CAAA,GAAA,aAAA,WAAA,cAAA,KAAA,CAAA;AAnClBA,eAAAA,WAAAA,CAAAA,kBAAc,oBAAoB,CAAA,GAAA,YAAA;;;ACKnC,IAAI,mBAAmB;AAEvB,MAAM,eAAe;CACnB,OAAO;EAAE,OAAO;EAAK,QAAQ;CAAI;CACjC,QAAQ;EAAE,OAAO;EAAK,QAAQ;CAAI;CAClC,OAAO;EAAE,OAAO;EAAK,QAAQ;CAAI;CACjC,MAAM;EAAE,OAAO;EAAK,QAAQ;CAAI;AAClC;AAIA,SAAS,iBAAiB,GAAW,GAAW,GAAW,GAAmB;CAC5E,IAAI,IAAI,GACN,OAAO;8BACmB,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;;;;;;CAO7E,OAAO,WAAW,GAAG,GAAG,CAAC;AAC3B;AAGO,IAAM,oBAAN,MAAM,0BAA0B,WAAW;CAyChD,cAAc;EACZ,MAAM;EAzCgD,KAAA,OAAA;EAExB,KAAA,IAAA;EACA,KAAA,IAAA;EACA,KAAA,IAAA;EACA,KAAA,IAAA;EAEsC,KAAA,cAAA;EACG,KAAA,QAAA;EACA,KAAA,QAAA;EACA,KAAA,QAAA;EACf,KAAA,QAAA;EACS,KAAA,aAAA;EACpB,KAAA,OAAA;EAEpB,KAAA,UAAA;EACI,KAAA,cAAA;EAUX,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EACL,KAAA,YAAA,KAAK;EAGP,KAAA,UAAA,KAAK;EACL,KAAA,UAAA,KAAK;EACL,KAAA,UAAA,KAAK;EACL,KAAA,UAAA,KAAK;EAGK,KAAA,oBAAA;EAsEA,KAAA,oBAAA,MAAmB;GAC7C,MAAM,KAAK;GACX,KAAK,UAAU,GAAG,aAAa;GAE/B,IAAI,GAAG,aAAa,QAAQ;IAC1B,KAAK,UAAU,KAAK;IACpB,KAAK,UAAU,KAAK;IACpB,KAAK,UAAU,KAAK;IACpB,KAAK,UAAU,KAAK;IACpB,KAAK,YAAY,KAAK;IACtB,KAAK,YAAY,KAAK;IACtB,KAAK,YAAY,KAAK;IACtB,KAAK,YAAY,KAAK;IACtB,KAAK,oBAAoB;GAC3B,OAAO,IAAI,KAAK,SAAS,aAAa,CAAC,KAAK,mBAE1C,KAAK,WAAW,UAAU,WAAW,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,OAAO,CAAC;EAEhG;EAE0B,KAAA,kBAAA,MAAmB;GAC3C,EAAE,gBAAgB;GAClB,MAAM,SAAU,EAA2C;GAE3D,IAAI,KAAK,SAAS,WAAW;IAC3B,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO,KAAK;IAC7B;GACF;GAEA,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO,KAAK;GACrB,KAAK,eAAe;EACtB;EAE2B,KAAA,mBAAA,MAAmB;GAC5C,EAAE,gBAAgB;GAClB,MAAM,SAAU,EAA2C;GAE3D,IAAI,KAAK,SAAS,WAAW;IAC3B,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO;IACxB,KAAK,YAAY,OAAO,KAAK;IAC7B;GACF;GAEA,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO;GAChB,KAAK,IAAI,OAAO,KAAK;GACrB,KAAK,gBAAgB;EACvB;EAEiC,KAAA,mBAAA;GAC/B,KAAK,IAAI,KAAK;GACd,KAAK,IAAI,KAAK;GACd,KAAK,IAAI,KAAK;GACd,KAAK,IAAI,KAAK;GACd,KAAK,oBAAoB;GACzB,KAAK,gBAAgB;GACrB,IAAI;IACF,KAAM,SAAuD,YAAY;GAC3E,QAAQ,CAER;EACF;EAEyB,KAAA,iBAAA,YAA2B;GAClD,IAAI,CAAC,KAAK,aAAa;IACrB,KAAK,cAAc;IACnB,MAAM,KAAK;GACb;GACA,IAAI;IACF,KAAM,SAAuD,YAAY;GAC3E,QAAQ,CAER;EACF;EApJE,MAAM,KAAK,EAAE;EACb,KAAK,OAAO,YAAY;EACxB,KAAK,cAAc,qBAAqB;EACxC,KAAK,WAAW,kBAAkB;CACpC;CAEA,IAAI,QAAgB;EAClB,OAAO,WAAW,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAClD;CAEA,IAAI,MAAM,QAA0B;EAClC,KAAK,UAAU,MAAM;CACvB;CAEA,IAAY,oBAA6B;EAGvC,IAAI,KAAK,SAAS,SAChB,OAAO,CAAC,KAAK;EACf,OAAO;CACT;CAEA,IAAY,oBAAuD;EACjE,OAAO,aAAa,KAAK,SAAS,aAAa;CACjD;CAEA,UAAU,QAAgC;EACxC,MAAM,IAAI,OAAO,QAAQ,QAAQ,gBAAgB;EACjD,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE;EACX,KAAK,IAAI,EAAE,WAAW;CACxB;CAEA,aAAsB,mBAAyC;EAC7D,MAAM,aAAa,iBAAiB;EACpC,KAAK,wBAAwB;EAC7B,KAAK,wBAAwB;CAC/B;CAEA,QAAiB,mBAAyC;EACxD,MAAM,QAAQ,iBAAiB;EAG/B,IAFsB,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KACxE,kBAAkB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,GAE1D,KAAK,wBAAwB;CAEjC;CAEA,0BAAwC;EACtC,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;EACvD,IAAI,QACF,OAAO,MAAM,YAAY,eAAe,KAAK,WAAW;EAE1D,IAAI,KAAK,UACP,KAAK,SAAS,MAAM,YAAY,mBAAmB,KAAK,WAAW;CAEvE;CAEA,0BAAwC;EACtC,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;EACvD,IAAI,QACF,OAAO,MAAM,aAAa,iBAAiB,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAE7E;CAsFA,iBAA+B;EAC7B,MAAM,SAAkC;GAAE,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,MAAM;GAAU,OAAO;EAAQ;EACrH,KAAK,cAAc,IAAI,YAAqC,SAAS;GAAE;GAAQ,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CACjH;CAEA,kBAAgC;EAC9B,MAAM,SAAkC;GAAE,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,MAAM;GAAU,OAAO;EAAQ;EACrH,KAAK,cAAc,IAAI,YAAqC,UAAU;GAAE;GAAQ,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CAClH;CAEA,SAAkB;EAChB,OAAO,IAAI;;;iBAGE,KAAK,eAAe;mCACF,KAAK,MAAM;yBACrB,KAAK,QAAQ;;;;cAIxB,KAAK,SAAS;;;;;sCAKU,KAAK,kBAAkB,MAAM,2BAA2B,KAAK,kBAAkB,OAAO;kBAC1G,KAAK,iBAAiB;;UAE9B,KAAK,cACH,IAAI;;iBAEC,KAAK,EAAE;iBACP,KAAK,EAAE;iBACP,KAAK,EAAE;iBACP,KAAK,EAAE;2BACG,KAAK,kBAAkB,MAAM,YAAY,KAAK,kBAAkB,OAAO;4BACtE,KAAK,kBAAkB;sBAC7B,KAAK,MAAM;sBACX,KAAK,MAAM;sBACX,KAAK,MAAM;sBACX,KAAK,MAAM;0BACP,KAAK,WAAW;;qBAErB,KAAK,eAAe;sBACnB,KAAK,gBAAgB;;YAE/B,KAAK,SAAS,YACZ,IAAI;iDAC+B,KAAK,WAAW;gBACjD,WAAW,UAAU,EAAE;;cAGzB,QAAQ;YAEV,QAAQ;;;CAGlB;;EAEgC,KAAA,SAAA;GAAC;GAAgB;GAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgGvE;;AACH;AA5VG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,QAAA,KAAA,CAAA;AAEzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,KAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,KAAA,KAAA,CAAA;AAEzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAe,CAAC,CAAA,GAAA,kBAAA,WAAA,eAAA,KAAA,CAAA;AACrD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;AAC9D,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAS,CAAC,CAAA,GAAA,kBAAA,WAAA,SAAA,KAAA,CAAA;AAC/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAa,CAAC,CAAA,GAAA,kBAAA,WAAA,cAAA,KAAA,CAAA;AACnD,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,kBAAA,WAAA,QAAA,KAAA,CAAA;AAEzB,WAAA,CAAA,MAAM,CAAA,GAAA,kBAAA,WAAA,WAAA,KAAA,CAAA;AACN,WAAA,CAAA,MAAM,CAAA,GAAA,kBAAA,WAAA,eAAA,KAAA,CAAA;AAEN,WAAA,CAAA,MAAM,QAAQ,CAAA,GAAA,kBAAA,WAAA,YAAA,KAAA,CAAA;AACd,WAAA,CAAA,MAAM,oBAAoB,CAAA,GAAA,kBAAA,WAAA,aAAA,KAAA,CAAA;AArB5BC,oBAAAA,WAAAA,CAAAA,kBAAc,0BAA0B,CAAA,GAAA,iBAAA"}
|
|
1
|
+
{"version":3,"file":"colour-picker-WDrPuqoO.js","names":["customElement","customElement"],"sources":["../src/colour-picker/util.ts","../src/colour-picker/colour-picker.ts","../src/colour-picker/colour-picker-popup.ts"],"sourcesContent":["import type { Range, SliderType } from \"./types\";\n\nexport const MAX_CHROMA = 0.4;\nexport const RANGE_LIMITS: Record<SliderType, Range> = {\n l: [0, 1],\n c: [0, MAX_CHROMA],\n h: [0, 360],\n a: [0, 1],\n} as const;\nexport const DEFAULT_RANGES: Record<SliderType, Range> = {\n l: RANGE_LIMITS.l,\n c: RANGE_LIMITS.c,\n h: RANGE_LIMITS.h,\n a: RANGE_LIMITS.a,\n} as const;\n\nexport function rangeSpan([min, max]: Range): number {\n return Math.max(max - min, 0);\n}\n\nexport function cloneRange(range: Range): Range {\n return [range[0], range[1]] as Range;\n}\n\n/**\n * Convert OKLCH to a CSS string\n */\nexport function oklchToCss(l: number, c: number, h: number, a: number = 1): string {\n if (a < 1) {\n return `oklch(${l} ${c} ${h} / ${a})`;\n }\n return `oklch(${l} ${c} ${h})`;\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * <ixfx-colour-picker> — OKLCH colour picker using CSS-gradient-rendered sliders.\n *\n * Properties:\n * l — lightness 0..1\n * c — chroma 0..0.4\n * h — hue 0..360\n *\n * Getters:\n * value — current color as CSS string e.g. \"oklch(0.7 0.15 180)\"\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set colour from any\n * ixfx-compatible format; also resets double-click defaults for all sliders.\n *\n * Events:\n * input — CustomEvent { detail: { l, c, h } }\n *\n * Double-click any slider label to reset that channel to the last\n * programmatically set value (not the user-dialled value).\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPickerEventDetail, Range, RangeInput } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { DEFAULT_RANGES, oklchToCss } from './util.js';\nimport '../labelled-range-input/index.js';\n\ntype ChannelSlider = `l` | `c` | `h` | `a`;\n\n@customElement(`ixfx-colour-picker`)\nexport class ColourPicker extends LitElement {\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `hide-preview`, reflect: true }) hidePreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal`, reflect: true }) horizontal = false;\n @property({ type: Boolean, attribute: `sliders-vertical`, reflect: true }) slidersVertical = false;\n @property({ type: Boolean, attribute: `hide-tooltips`, reflect: true }) hideTooltips = false;\n\n @property({ type: String, attribute: `value` })\n private _valueAttr: string | null = null;\n\n @property({ type: String, attribute: `range-l` }) rangeLAttr: string | null = null;\n @property({ type: String, attribute: `range-c` }) rangeCAttr: string | null = null;\n @property({ type: String, attribute: `range-h` }) rangeHAttr: string | null = null;\n @property({ type: String, attribute: `range-a` }) rangeAAttr: string | null = null;\n\n private _ranges: Record<ChannelSlider, Range> = {\n l: DEFAULT_RANGES.l,\n c: DEFAULT_RANGES.c,\n h: DEFAULT_RANGES.h,\n a: DEFAULT_RANGES.a,\n };\n\n @query(`#slider-l`) _sliderL!: HTMLElement;\n @query(`#slider-c`) _sliderC!: HTMLElement;\n @query(`#slider-h`) _sliderH!: HTMLElement;\n @query(`#slider-a`) _sliderA!: HTMLElement;\n @query(`.preview`) _previewEl!: HTMLElement;\n\n // Last programmatically-set values — used as double-click reset targets.\n // Initialised to the component's own defaults.\n private _defaultL = this.l;\n private _defaultC = this.c;\n private _defaultH = this.h;\n private _defaultA = this.a;\n\n // Keys are added synchronously in input handlers and cleared only inside\n // updated() (which runs asynchronously). This means updated() can reliably\n // tell whether a property change was user-initiated or programmatic.\n private readonly _userInitiated = new Set<string>();\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n set value(colourString: string) {\n const c = Colour.convert(colourString, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n this._valueAttr = colourString;\n }\n\n /**\n * Set the colour from any ixfx-compatible format (CSS string, OkLch object,\n * HSL object, etc.). Also updates the double-click reset defaults for all\n * sliders.\n */\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n // No _userInitiated keys added → updated() will set _defaultL/C/H/A. ✓\n }\n\n get rangeL(): Range {\n return [this._ranges.l[0], this._ranges.l[1]];\n }\n\n set rangeL(range: RangeInput) {\n this._applyRangeInput(`l`, range);\n }\n\n get rangeC(): Range {\n return [this._ranges.c[0], this._ranges.c[1]];\n }\n\n set rangeC(range: RangeInput) {\n this._applyRangeInput(`c`, range);\n }\n\n get rangeH(): Range {\n return [this._ranges.h[0], this._ranges.h[1]];\n }\n\n set rangeH(range: RangeInput) {\n this._applyRangeInput(`h`, range);\n }\n\n get rangeA(): Range {\n return [this._ranges.a[0], this._ranges.a[1]];\n }\n\n set rangeA(range: RangeInput) {\n this._applyRangeInput(`a`, range);\n }\n\n setRangeL(range: RangeInput): void {\n this.rangeL = range;\n }\n\n setRangeC(range: RangeInput): void {\n this.rangeC = range;\n }\n\n setRangeH(range: RangeInput): void {\n this.rangeH = range;\n }\n\n setRangeA(range: RangeInput): void {\n this.rangeA = range;\n }\n\n override willUpdate(changedProperties: PropertyValues): void {\n if (changedProperties.has(`rangeLAttr`))\n this._setRangeFromAttribute(`l`, this.rangeLAttr);\n if (changedProperties.has(`rangeCAttr`))\n this._setRangeFromAttribute(`c`, this.rangeCAttr);\n if (changedProperties.has(`rangeHAttr`))\n this._setRangeFromAttribute(`h`, this.rangeHAttr);\n if (changedProperties.has(`rangeAAttr`))\n this._setRangeFromAttribute(`a`, this.rangeAAttr);\n super.willUpdate(changedProperties);\n }\n\n private _applyRangeInput(channel: ChannelSlider, input: RangeInput): void {\n const normalized = this._coerceRangeInput(channel, input);\n if (!normalized)\n return;\n this._setRange(channel, normalized);\n }\n\n private _coerceRangeInput(channel: ChannelSlider, input: RangeInput): Range | null {\n if (!Array.isArray(input) || input.length < 2)\n return null;\n const [start, end] = input;\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _setRangeFromAttribute(channel: ChannelSlider, value: string | null): void {\n if (value === null) {\n this._setRange(channel, DEFAULT_RANGES[channel]);\n return;\n }\n const parsed = this._parseRangeString(channel, value);\n if (parsed)\n this._setRange(channel, parsed);\n }\n\n private _setRange(channel: ChannelSlider, range: Range): void {\n const normalized = this._normalizeRange(channel, range);\n const currentRange = this._ranges[channel];\n if (currentRange[0] === normalized[0] && currentRange[1] === normalized[1])\n return;\n\n this._ranges = { ...this._ranges, [channel]: normalized };\n\n switch (channel) {\n case `l`:\n this.l = this._clampToRange(`l`, this.l);\n break;\n case `c`:\n this.c = this._clampToRange(`c`, this.c);\n break;\n case `h`:\n this.h = this._clampToRange(`h`, this.h);\n break;\n case `a`:\n this.a = this._clampToRange(`a`, this.a);\n break;\n }\n\n this.requestUpdate();\n }\n\n private _getRange(channel: ChannelSlider): Range {\n return this._ranges[channel] ?? DEFAULT_RANGES[channel];\n }\n\n private _parseRangeString(channel: ChannelSlider, value: string): Range | null {\n const cleaned = value.trim();\n const parts = cleaned.split(`-`, 2);\n if (parts.length !== 2)\n return null;\n const start = Number(parts[0]!.trim());\n const end = Number(parts[1]!.trim());\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _normalizeRange(channel: ChannelSlider, range: Range): Range {\n const limits = DEFAULT_RANGES[channel];\n const [rawMin, rawMax] = range;\n const minVal = Math.min(Math.min(rawMin, rawMax), limits[1]);\n const maxVal = Math.max(Math.max(rawMin, rawMax), limits[0]);\n return [\n Math.max(minVal, limits[0]),\n Math.min(maxVal, limits[1]),\n ];\n }\n\n private _clampToRange(channel: ChannelSlider, value: number): number {\n const [min, max] = this._getRange(channel);\n return Math.min(Math.max(value, min), max);\n }\n\n override render() {\n const makeSlider = (channel: `l` | `c` | `h` | `a`, label: string, min: number, max: number, step: number, isHidden: boolean, formatter?: (value: string) => string) => {\n if (isHidden)\n return nothing;\n return html`\n <ixfx-labelled-range-input\n id=\"slider-${channel}\"\n label=\"${label}\"\n min=${min}\n max=${max}\n mini-width-threshold=200\n .value=${this[channel]}\n step=${step}\n .orientation=${this.slidersVertical ? `vertical` : `horizontal`}\n .formatter=${formatter}\n ?no-tooltip=${this.hideTooltips}\n .displayTextLogic=${this.hideTooltips ? `show` : `transient`}\n @input=${(e: Event) => this._onInput(e, channel)}\n @change=${(e: Event) => this._onChange(e, channel)}\n ></ixfx-labelled-range-input>\n `;\n };\n\n return html`\n <div class=\"picker\" ?horizontal=${this.horizontal}>\n <div class=\"preview\" ?hidden=${this.hidePreview}></div>\n <div class=\"sliders\">\n ${makeSlider(`h`, `Hue`, ...this._getRange(`h`), 1, this.hideH, v => `${Math.round(Number(v))}°`)}\n ${makeSlider(`l`, `Lightness`, ...this._getRange(`l`), 0.01, this.hideL, v => `${Math.round(Number(v) * 100)}%`)}\n ${makeSlider(`c`, `Chroma`, ...this._getRange(`c`), 0.005, this.hideC, v => `${Number.parseFloat(v).toFixed(2)}`)}\n ${this.showA ? makeSlider(`a`, `Opacity`, ...this._getRange(`a`), 0.01, false, v => `${Math.round(Number(v) * 100)}%`) : nothing}\n </div>\n </div>\n `;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._updateGradients();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n // Update reset defaults only for programmatic changes (not user input).\n // _userInitiated is populated synchronously in input handlers and cleared\n // here, so it correctly reflects what changed since the last render.\n if (changedProperties.has(`l`) && !this._userInitiated.has(`l`))\n this._defaultL = this.l;\n if (changedProperties.has(`c`) && !this._userInitiated.has(`c`))\n this._defaultC = this.c;\n if (changedProperties.has(`h`) && !this._userInitiated.has(`h`))\n this._defaultH = this.h;\n if (changedProperties.has(`a`) && !this._userInitiated.has(`a`))\n this._defaultA = this.a;\n this._userInitiated.clear();\n\n if (changedProperties.has(`l`) || changedProperties.has(`c`) || changedProperties.has(`h`) || changedProperties.has(`a`) || changedProperties.has(`showA`) || changedProperties.has(`slidersVertical`)) {\n this._updateGradients();\n }\n }\n\n _updateGradients(): void {\n const l = this.l;\n const c = this.c;\n const h = this.h;\n const a = this.a;\n\n // Get actual ranges from this._ranges (may be restricted via attributes)\n const [lMin, lMax] = this._ranges.l;\n const [cMin, cMax] = this._ranges.c;\n const [hMin, hMax] = this._ranges.h;\n const [aMin, aMax] = this._ranges.a;\n\n // Gradient direction: vertical sliders fill bottom→top (bottom = min, top = max).\n const dir = this.slidersVertical ? `to top` : `to right`;\n\n // L slider: black → white at current chroma + hue, using actual range\n const lGrad = `linear-gradient(in oklch ${dir}, oklch(${lMin} ${c} ${h}), oklch(${lMax} ${c} ${h}))`;\n\n // C slider: neutral grey → fully saturated at current lightness + hue, using actual range\n const cGrad = `linear-gradient(in oklch ${dir}, oklch(${l} ${cMin} ${h}), oklch(${l} ${cMax} ${h}))`;\n\n // H slider: hue range at current lightness + chroma.\n // Use 'longer hue' for full 0-360 range, 'shorter hue' for restricted ranges.\n const hRange = hMax - hMin;\n const hLonger = hRange >= 300; // Full or near-full hue range\n const hGrad = `linear-gradient(in oklch ${hLonger ? `longer` : `shorter`} hue ${dir}, oklch(${l} ${c} ${hMin}), oklch(${l} ${c} ${hMax}))`;\n\n // A slider: transparent to opaque at current colour, using actual range.\n // Includes checkerboard pattern as bottom layer, with opacity gradient on top.\n const aGrad = `\n linear-gradient(${dir}, oklch(${l} ${c} ${h} / ${aMin}), oklch(${l} ${c} ${h} / ${aMax})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n\n // Set gradient on --background-track (goes to .range-bg, the track background)\n // Set --background-track-value to transparent to hide the filled-portion bar\n const trackBgVars = [\n `--background-track`,\n `--background-track-hover`,\n ] as const;\n\n const trackValueVars = [\n `--background-track-value`,\n `--background-track-value-hover`,\n `--background-track-value-active`,\n `--background-track-value-vertical`,\n `--background-track-value-hover-vertical`,\n `--background-track-value-active-vertical`,\n ] as const;\n\n const sliders: Array<[HTMLElement | null, string]> = [\n [this._sliderL, lGrad],\n [this._sliderC, cGrad],\n [this._sliderH, hGrad],\n ];\n\n if (this.showA && this._sliderA)\n sliders.push([this._sliderA, aGrad]);\n\n for (const [el, grad] of sliders) {\n if (!el)\n continue;\n // Set gradient on track background (.range-bg)\n for (const v of trackBgVars) {\n el.style.setProperty(v, grad);\n }\n // Hide the filled-portion bar (track pseudo-element)\n for (const v of trackValueVars) {\n el.style.setProperty(v, `transparent`);\n }\n }\n\n // Preview swatch background - show checkerboard behind when opacity < 1\n if (this._previewEl) {\n if (this.a < 1) {\n const previewBg = `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n this._previewEl.style.background = previewBg;\n } else {\n this._previewEl.style.background = this.value;\n }\n }\n }\n\n _onInput = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n this[channel] = detail.value;\n this._dispatchInput();\n e.stopPropagation();\n };\n\n _onChange = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n const value = typeof detail.value === `string` ? Number.parseFloat(detail.value) : detail.value;\n switch (channel) {\n case `l`: this.l = value; break;\n case `c`: this.c = value; break;\n case `h`: this.h = value; break;\n case `a`: this.a = value; break;\n }\n e.stopPropagation();\n this.requestUpdate();\n this._dispatchChange();\n };\n\n _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n static styles: CSSResultGroup = [themeFallbacks, css`\n /*\n * Default intrinsic size — not determined by label text.\n * Override via CSS: ixfx-colour-picker { width: 100%; height: 200px; }\n * Or via custom properties: --picker-alt-width, --picker-alt-min-slider-height\n */\n :host {\n display: block;\n width: var(--picker-alt-width, 240px);\n height: var(--picker-alt-height, 240px);\n --_radius-m: var(--radius-m, 4px);\n --_radius-s: var(--radius-m, 3px);\n container-type: size;\n }\n\n .picker {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .picker[horizontal] {\n flex-direction: row;\n align-items: stretch;\n }\n\n .sliders {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n flex: 1;\n min-height: 0;\n }\n\n .picker[horizontal] .sliders {\n flex-direction: column;\n }\n\n .preview {\n flex-shrink: 0;\n height: 30%;\n border-radius: var(--_radius-m);\n border: 1px solid rgba(0, 0, 0, 0.2);\n }\n\n .preview[hidden] {\n display: none;\n }\n\n .picker[horizontal] .preview {\n width: 3em;\n height: auto;\n flex-shrink: 0;\n }\n\n ixfx-labelled-range-input {\n flex: 1;\n min-height: var(--picker-alt-min-slider-height, 2.5em);\n width: 100%;\n min-width: 0;\n --track-thickness: 2em;\n --track-radius: var(--_radius-s);\n --label-width: 5em;\n --thumb-thickness: 4px;\n --thumb-color: rgba(255, 255, 255, 0.9);\n --thumb-color-active: white;\n --thumb-radius: 3px;\n --thumb-border: 2px solid rgba(255, 255, 255, 0.85);\n --thumb-shadow: 0 0 0 2px rgba(0, 0, 0, 0.65);\n }\n\n /* Vertical sliders mode: sliders are side-by-side vertical bars */\n :host([sliders-vertical]) .sliders {\n flex-direction: row;\n align-items: stretch;\n }\n\n :host([sliders-vertical]) ixfx-labelled-range-input {\n width: auto;\n height: 100%;\n min-height: 0;\n --mini: 1; /* force mini mode: no label, tooltip on hover */\n --track-thickness: 100%; /* fill full width of the narrow slider */\n }\n\n /* Landscape */\n @container (aspect-ratio > 1) {\n .picker {\n flex-direction: row;\n display:flex;\n align-items: stretch;\n\n }\n .preview {\n width: 30%;\n height: unset;\n }\n .sliders {\n height: 100%;\n overflow: hidden;\n }\n }\n\n /* Small height. Show as landscape */\n @container (max-height: 150px) {\n .picker {\n flex-direction: row;\n align-items: stretch;\n }\n ixfx-labelled-range-input {\n --track-thickness: 1em;\n min-height: unset;\n }\n .preview {\n min-width: 50%;\n height: auto;\n }\n }\n\n /* Medium height — tighter but not extreme */\n @container (max-height: 210px) and (min-height: 150px) {\n ixfx-labelled-range-input {\n --track-thickness: 1.6em;\n min-height: 1.8em;\n }\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker': ColourPicker;\n }\n}\n","/**\n * <ixfx-colour-picker-popup> — inline colour swatch that opens an ixfx-colour-picker\n * in a native popover.\n *\n * Properties:\n * mode — \"fluid\" (default) | \"confirm\"\n * l, c, h, a — committed OKLCH values\n * hide-h, hide-l, hide-c, show-a, horizontal — passed to inner picker\n * show-preview — show the colour preview swatch inside the picker (fluid mode hides it by default)\n *\n * Getters/setters:\n * value — committed colour as CSS string e.g. \"oklch(0.7 0.15 180)\";\n * setting accepts any ixfx-compatible colour format (equivalent to calling setColour())\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set committed colour\n *\n * Events:\n * input — (fluid mode only) CustomEvent { detail: { l, c, h, a } }\n * change — CustomEvent { detail: { l, c, h, a } }\n *\n * CSS custom properties:\n * --cp-popup-swatch-size — swatch button size (default: 1.5em)\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPicker } from './colour-picker.js';\nimport type { ColourPickerEventDetail } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { ICON_CHECK } from '../icons/defaults.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { oklchToCss } from './util.js';\nimport './colour-picker.js';\n\nlet _instanceCounter = 0;\n\nconst PICKER_SIZES = {\n small: { width: 130, height: 100 },\n medium: { width: 100, height: 155 },\n large: { width: 200, height: 180 },\n huge: { width: 290, height: 240 },\n} as const;\n\ntype PickerSize = keyof typeof PICKER_SIZES;\n\nfunction swatchBackground(l: number, c: number, h: number, a: number): string {\n if (a < 1) {\n return `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 8px 8px\n `;\n }\n return oklchToCss(l, c, h);\n}\n\n@customElement(`ixfx-colour-picker-popup`)\nexport class ColourPickerPopup extends LitElement {\n @property({ type: String }) mode: `fluid` | `confirm` = `fluid`;\n\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `show-preview` }) showPreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal` }) horizontal = false;\n @property({ type: String }) size: PickerSize = `medium`;\n\n @state() private _isOpen = false;\n @state() private _everOpened = false;\n\n @query(`.popup`) _popupEl!: HTMLElement;\n @query(`ixfx-colour-picker`) _pickerEl!: ColourPicker;\n\n private readonly _uid: string;\n private readonly _anchorName: string;\n private readonly _popupId: string;\n\n // Confirm mode: values being adjusted (not yet committed)\n private _pendingL = this.l;\n private _pendingC = this.c;\n private _pendingH = this.h;\n private _pendingA = this.a;\n\n // Confirm mode: snapshot taken on open, used for revert on dismiss\n private _savedL = this.l;\n private _savedC = this.c;\n private _savedH = this.h;\n private _savedA = this.a;\n\n // Set to true just before hidePopover() in _onConfirm to suppress revert\n private _pendingConfirmed = false;\n\n constructor() {\n super();\n const id = ++_instanceCounter;\n this._uid = `cp-popup-${id}`;\n this._anchorName = `--cp-popup-anchor-${id}`;\n this._popupId = `cp-popup-panel-${id}`;\n }\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n set value(colour: Colour.Colourish) {\n this.setColour(colour);\n }\n\n private get _innerHidePreview(): boolean {\n // Fluid mode hides the preview by default (swatch already shows live colour).\n // show-preview overrides this. Confirm mode shows it by default.\n if (this.mode === `fluid`)\n return !this.showPreview;\n return false;\n }\n\n private get _pickerDimensions(): { width: number; height: number } {\n return PICKER_SIZES[this.size] ?? PICKER_SIZES.medium;\n }\n\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._applyAnchorPositioning();\n this._updateSwatchBackground();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n const colourChanged = changedProperties.has(`l`) || changedProperties.has(`c`)\n || changedProperties.has(`h`) || changedProperties.has(`a`);\n if (colourChanged) {\n this._updateSwatchBackground();\n }\n }\n\n private _applyAnchorPositioning(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.setProperty(`anchor-name`, this._anchorName);\n }\n if (this._popupEl) {\n this._popupEl.style.setProperty(`position-anchor`, this._anchorName);\n }\n }\n\n private _updateSwatchBackground(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.background = swatchBackground(this.l, this.c, this.h, this.a);\n }\n }\n\n private _onPopoverToggle = (e: Event): void => {\n const te = e as ToggleEvent;\n this._isOpen = te.newState === `open`;\n\n if (te.newState === `open`) {\n this._savedL = this.l;\n this._savedC = this.c;\n this._savedH = this.h;\n this._savedA = this.a;\n this._pendingL = this.l;\n this._pendingC = this.c;\n this._pendingH = this.h;\n this._pendingA = this.a;\n this._pendingConfirmed = false;\n } else if (this.mode === `confirm` && !this._pendingConfirmed) {\n // Dismissed without confirming — reset inner picker to saved values\n this._pickerEl?.setColour(oklchToCss(this._savedL, this._savedC, this._savedH, this._savedA));\n }\n };\n\n private _onPickerInput = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchInput();\n };\n\n private _onPickerChange = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchChange();\n };\n\n private _onConfirm = (): void => {\n this.l = this._pendingL;\n this.c = this._pendingC;\n this.h = this._pendingH;\n this.a = this._pendingA;\n this._pendingConfirmed = true;\n this._dispatchChange();\n try {\n (this._popupEl as HTMLElement & { hidePopover: () => void }).hidePopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _onSwatchClick = async (): Promise<void> => {\n if (!this._everOpened) {\n this._everOpened = true;\n await this.updateComplete;\n }\n try {\n (this._popupEl as HTMLElement & { showPopover: () => void }).showPopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n private _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a, unit: `scalar`, space: `oklch` };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n override render() {\n return html`\n <button\n class=\"swatch\"\n @click=${this._onSwatchClick}\n aria-label=\"Pick colour: ${this.value}\"\n aria-expanded=\"${this._isOpen}\"\n aria-haspopup=\"dialog\"\n ></button>\n <div\n id=\"${this._popupId}\"\n class=\"popup popup-surface\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label=\"Colour picker\"\n style=\"--cp-popup-min-width:${this._pickerDimensions.width}px;--cp-popup-min-height:${this._pickerDimensions.height}px\"\n @toggle=${this._onPopoverToggle}\n >\n ${this._everOpened\n ? html`\n <ixfx-colour-picker\n .l=${this.l}\n .c=${this.c}\n .h=${this.h}\n .a=${this.a}\n style=\"width:${this._pickerDimensions.width}px;height:${this._pickerDimensions.height}px\"\n ?hide-preview=${this._innerHidePreview}\n ?hide-h=${this.hideH}\n ?hide-l=${this.hideL}\n ?hide-c=${this.hideC}\n ?show-a=${this.showA}\n ?horizontal=${this.horizontal}\n hide-tooltips\n @input=${this._onPickerInput}\n @change=${this._onPickerChange}\n ></ixfx-colour-picker>\n ${this.mode === `confirm`\n ? html`\n <button class=\"confirm-btn\" @click=${this._onConfirm} aria-label=\"Confirm colour\" title=\"Confirm colour\">\n ${unsafeHTML(ICON_CHECK)}\n </button>\n `\n : nothing}\n `\n : nothing}\n </div>\n `;\n }\n\n static styles: CSSResultGroup = [themeFallbacks, popupSurfaceStyles, css`\n :host {\n display: inline-block;\n }\n\n .swatch {\n display: inline-block;\n width: var(--cp-popup-swatch-size, 1.5em);\n height: var(--cp-popup-swatch-size, 1.5em);\n border-radius: var(--radius-m, 4px);\n border: 1px solid rgba(0, 0, 0, 0.2);\n cursor: pointer;\n padding: 0;\n box-sizing: border-box;\n vertical-align: middle;\n transition: transform 0.1s ease, box-shadow 0.1s ease;\n }\n\n .swatch:hover {\n transform: scale(1.1);\n }\n\n .swatch:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n\n /* Popover panel */\n .popup {\n display:flex;\n flex-direction: column;\n gap: var(--space-s);\n /* Reset popover UA inset */\n inset: unset;\n margin: 0;\n\n min-width: var(--cp-popup-min-width);\n min-height: var(--cp-popup-min-height);\n\n /* CSS anchor positioning — position-anchor set via inline style in JS */\n position: fixed;\n position-area: block-end span-inline-start;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin-block-start: 4px;\n\n padding: var(--space-l);\n z-index: 100;\n\n /* Animate in/out */\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease, scale 0.12s ease;\n }\n\n .popup:popover-open {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n ixfx-colour-picker {\n display: block;\n }\n\n .confirm-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-block-start: var(--space-s);\n margin-inline-start: auto;\n width: 1.8em;\n height: 1.8em;\n border-radius: 50%;\n border: none;\n background: var(--accent, oklch(60% 0.15 140));\n color: var(--accent-text, #fff);\n padding: 0;\n cursor: pointer;\n transition: background var(--transition, 0.15s ease-out);\n }\n\n .confirm-btn svg {\n width: 1.1em;\n height: 1.1em;\n flex-shrink: 0;\n }\n\n .confirm-btn:hover {\n background: var(--accent, oklch(70% 0.15 140));\n }\n\n .confirm-btn:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker-popup': ColourPickerPopup;\n }\n}\n"],"mappings":"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"}
|
package/dist/colour-picker.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ColourPickerInputEvent, i as ColourPickerEventDetail, n as ColourPicker, o as OklchValue, r as ColourPickerChangeEvent, t as ColourPickerPopup } from "./index-
|
|
1
|
+
import { a as ColourPickerInputEvent, i as ColourPickerEventDetail, n as ColourPicker, o as OklchValue, r as ColourPickerChangeEvent, t as ColourPickerPopup } from "./index-tq6f8007.js";
|
|
2
2
|
export { ColourPicker, type ColourPickerChangeEvent, type ColourPickerEventDetail, type ColourPickerInputEvent, ColourPickerPopup, type OklchValue };
|
package/dist/colour-picker.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-
|
|
1
|
+
import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-WDrPuqoO.js";
|
|
2
2
|
export { ColourPicker, ColourPickerPopup };
|
package/dist/crumbs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { E as TreeSelectEvent, O as TreeTickleEvent, a as TreeComponent, k as TreeDataModel, n as TreeActivateEvent, o as TreeComponentEventMap, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-DGmKBbpy.js";
|
|
2
2
|
import { n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-Bc23SI94.js";
|
|
3
|
-
import "./menu-item-
|
|
3
|
+
import "./menu-item-CZi9vy5O.js";
|
|
4
4
|
import "./narrowed-text.js";
|
|
5
5
|
import { LitElement, PropertyValues } from "lit";
|
|
6
6
|
//#region src/crumbs/crumb-navigation.d.ts
|
package/dist/crumbs.js
CHANGED
|
@@ -3,9 +3,9 @@ import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrA
|
|
|
3
3
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
4
4
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
5
|
import "./interaction-BskmlA9t.js";
|
|
6
|
-
import "./menu-item-
|
|
6
|
+
import "./menu-item-Woc8jJc1.js";
|
|
7
7
|
import { t as collectDataResult } from "./data-provider-35TyWclX.js";
|
|
8
|
-
import { t as scrollFadeStyles } from "./scroll-fade-
|
|
8
|
+
import { t as scrollFadeStyles } from "./scroll-fade-BrNUIYnm.js";
|
|
9
9
|
import "./narrowed-text.js";
|
|
10
10
|
import { LitElement, css, html, nothing } from "lit";
|
|
11
11
|
import { property, state } from "lit/decorators.js";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import "./icon-CDGprSdE.js";
|
|
1
2
|
import { F as ListDragPreviewSourceResolver, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent } from "./tree-component-DGmKBbpy.js";
|
|
2
|
-
import { S as ListSearchController } from "./index-
|
|
3
|
-
import "./index-
|
|
3
|
+
import { S as ListSearchController } from "./index-CsaQwNkz.js";
|
|
4
|
+
import "./index-9AhaHIT2.js";
|
|
4
5
|
import "./pan-text-CoYmt2qd.js";
|
|
5
6
|
import { LitElement } from "lit";
|
|
6
7
|
import { CommandId, CommandRegistry } from "@clinth/ui-commands";
|
|
@@ -330,4 +331,4 @@ interface DataGridElement {
|
|
|
330
331
|
}
|
|
331
332
|
//#endregion
|
|
332
333
|
export { DataGridGroupBy as A, DataGridColumn as C, DataGridEditorFactory as D, DataGridEditorContext as E, DataGridSortState as F, GlobalFormatter as I, DataGridInteractionMode as M, DataGridSelectionMode as N, DataGridEditorType as O, DataGridSortDirection as P, BuiltInFormatterOptions as S, DataGridEditability as T, DataGridSelectDetail as _, DataGridColumnReorderDetail as a, DataGridSortEvent as b, DataGridColumnResizeEvent as c, DataGridElement as d, DataGridElementEventMap as f, DataGridRowActivateEvent as g, DataGridRowActivateDetail as h, DataGridCellEditEvent as i, DataGridGroupLabel as j, DataGridGetRowKey as k, DataGridColumnVisibilityDetail as l, DataGridGroupChangeEvent as m, DataGridCellClickEvent as n, DataGridColumnReorderEvent as o, DataGridGroupChangeDetail as p, DataGridCellEditDetail as r, DataGridColumnResizeDetail as s, DataGridCellClickDetail as t, DataGridColumnVisibilityEvent as u, DataGridSelectEvent as v, DataGridColumnMenu as w, BuiltInFormatterName as x, DataGridSortDetail as y };
|
|
333
|
-
//# sourceMappingURL=data-grid-
|
|
334
|
+
//# sourceMappingURL=data-grid-pv6eaJCZ.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-grid-pv6eaJCZ.d.ts","names":[],"sources":["../src/data-grid/types.ts","../src/data-grid/data-grid.ts"],"mappings":"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"}
|
package/dist/data-grid.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { I as ListDragSource, L as ListNativeDragStartDetail, M as ListDragPreview, N as ListDragPreviewContext, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent, j as ListDragEntry } from "./tree-component-DGmKBbpy.js";
|
|
2
|
-
import { A as DataGridGroupBy, C as DataGridColumn, D as DataGridEditorFactory, E as DataGridEditorContext, F as DataGridSortState, I as GlobalFormatter, M as DataGridInteractionMode, N as DataGridSelectionMode, O as DataGridEditorType, P as DataGridSortDirection, S as BuiltInFormatterOptions, T as DataGridEditability, _ as DataGridSelectDetail, a as DataGridColumnReorderDetail, b as DataGridSortEvent, c as DataGridColumnResizeEvent, d as DataGridElement, f as DataGridElementEventMap, g as DataGridRowActivateEvent, h as DataGridRowActivateDetail, i as DataGridCellEditEvent, j as DataGridGroupLabel, k as DataGridGetRowKey, l as DataGridColumnVisibilityDetail, m as DataGridGroupChangeEvent, n as DataGridCellClickEvent, o as DataGridColumnReorderEvent, p as DataGridGroupChangeDetail, r as DataGridCellEditDetail, s as DataGridColumnResizeDetail, t as DataGridCellClickDetail, u as DataGridColumnVisibilityEvent, v as DataGridSelectEvent, w as DataGridColumnMenu, x as BuiltInFormatterName, y as DataGridSortDetail } from "./data-grid-
|
|
2
|
+
import { A as DataGridGroupBy, C as DataGridColumn, D as DataGridEditorFactory, E as DataGridEditorContext, F as DataGridSortState, I as GlobalFormatter, M as DataGridInteractionMode, N as DataGridSelectionMode, O as DataGridEditorType, P as DataGridSortDirection, S as BuiltInFormatterOptions, T as DataGridEditability, _ as DataGridSelectDetail, a as DataGridColumnReorderDetail, b as DataGridSortEvent, c as DataGridColumnResizeEvent, d as DataGridElement, f as DataGridElementEventMap, g as DataGridRowActivateEvent, h as DataGridRowActivateDetail, i as DataGridCellEditEvent, j as DataGridGroupLabel, k as DataGridGetRowKey, l as DataGridColumnVisibilityDetail, m as DataGridGroupChangeEvent, n as DataGridCellClickEvent, o as DataGridColumnReorderEvent, p as DataGridGroupChangeDetail, r as DataGridCellEditDetail, s as DataGridColumnResizeDetail, t as DataGridCellClickDetail, u as DataGridColumnVisibilityEvent, v as DataGridSelectEvent, w as DataGridColumnMenu, x as BuiltInFormatterName, y as DataGridSortDetail } from "./data-grid-pv6eaJCZ.js";
|
|
3
3
|
export { type BuiltInFormatterName, type BuiltInFormatterOptions, DataGridCellClickDetail, DataGridCellClickEvent, DataGridCellEditDetail, DataGridCellEditEvent, type DataGridColumn, type DataGridColumnMenu, DataGridColumnReorderDetail, DataGridColumnReorderEvent, DataGridColumnResizeDetail, DataGridColumnResizeEvent, DataGridColumnVisibilityDetail, DataGridColumnVisibilityEvent, type DataGridEditability, type DataGridEditorContext, type DataGridEditorFactory, type DataGridEditorType, DataGridElement, DataGridElementEventMap, type DataGridGetRowKey, type DataGridGroupBy, DataGridGroupChangeDetail, DataGridGroupChangeEvent, type DataGridGroupLabel, type DataGridInteractionMode, DataGridRowActivateDetail, DataGridRowActivateEvent, DataGridSelectDetail, DataGridSelectEvent, type DataGridSelectionMode, DataGridSortDetail, type DataGridSortDirection, DataGridSortEvent, type DataGridSortState, type GlobalFormatter, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, type ListDragSource, type ListNativeDragStartDetail, type ListNativeDragStartEvent };
|
package/dist/data-grid.js
CHANGED
|
@@ -2,13 +2,15 @@ import { t as TickledController } from "./tickled-controller-Dh1Uh_vG.js";
|
|
|
2
2
|
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
3
3
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
4
4
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
5
|
+
import "./icon-1gpwtPx8.js";
|
|
6
|
+
import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES } from "./incr-search-D91M4Ozq.js";
|
|
7
|
+
import { t as handleStyles } from "./handle-DAXs7kbJ.js";
|
|
7
8
|
import { t as ListNativeDragController } from "./list-native-drag-controller-B9xO0XWn.js";
|
|
8
9
|
import { i as listItemFadeKeyframes } from "./list-item-animation-BUoEKi5s.js";
|
|
9
10
|
import "./interaction-BskmlA9t.js";
|
|
11
|
+
import { t as scrollFadeStyles } from "./scroll-fade-BrNUIYnm.js";
|
|
10
12
|
import { t as createDragGhost } from "./drag-ghost-DtSDvjri.js";
|
|
11
|
-
import "./menu-
|
|
13
|
+
import "./menu-B2Qv3Oiz.js";
|
|
12
14
|
import "./pan-text-CqtvjPyK.js";
|
|
13
15
|
import { LitElement, css, html, nothing } from "lit";
|
|
14
16
|
import { property, query, state } from "lit/decorators.js";
|
|
@@ -310,6 +312,8 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
310
312
|
tickledItemStyles,
|
|
311
313
|
listItemFadeKeyframes,
|
|
312
314
|
listSearchStyles,
|
|
315
|
+
scrollFadeStyles(`x`),
|
|
316
|
+
scrollFadeStyles(`y`),
|
|
313
317
|
css`
|
|
314
318
|
:host {
|
|
315
319
|
--data-grid-row-height: 28px;
|
|
@@ -326,6 +330,11 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
326
330
|
autoSizeColumn(). Read back in JS (_columnResizeAnimationMs) to know
|
|
327
331
|
when the animation has finished, so keep it a plain time value. */
|
|
328
332
|
--data-grid-column-resize-duration: 180ms;
|
|
333
|
+
/* Dense 28px rows read badly under the global 30px full-strength fade,
|
|
334
|
+
so default to a shorter, shallower edge hint. Consumers can override
|
|
335
|
+
--scroll-fade-width / --scroll-fade-strength per instance. */
|
|
336
|
+
--scroll-fade-width: 20px;
|
|
337
|
+
--scroll-fade-strength: 0.8;
|
|
329
338
|
position: relative;
|
|
330
339
|
display: block;
|
|
331
340
|
overflow: hidden;
|
|
@@ -345,6 +354,9 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
345
354
|
}
|
|
346
355
|
.header-scroll {
|
|
347
356
|
display: flex; flex: 1; overflow: hidden;
|
|
357
|
+
/* Horizontal edge fade comes from the shared .scroll-fade-x class
|
|
358
|
+
(see ../styles/scroll-fade.ts). Its scrollLeft is synced from the
|
|
359
|
+
viewport in _onScroll, which drives its own scroll-timeline. */
|
|
348
360
|
}
|
|
349
361
|
.header-cell {
|
|
350
362
|
display: flex; align-items: center; gap: var(--space-xs);
|
|
@@ -363,7 +375,7 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
363
375
|
.header-cell.width-animating, .cell.width-animating { transition: none; }
|
|
364
376
|
}
|
|
365
377
|
.header-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
366
|
-
.sort-icon {
|
|
378
|
+
.sort-icon { display: inline-flex; align-items: center; opacity: 0.7; }
|
|
367
379
|
.resize-handle {
|
|
368
380
|
position: absolute; right: -4px; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 1;
|
|
369
381
|
display: flex; align-items: stretch; justify-content: center;
|
|
@@ -374,10 +386,16 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
374
386
|
}
|
|
375
387
|
.resize-handle:hover::before { background: var(--split-gutter-hover-color, var(--surface-6)); }
|
|
376
388
|
.resize-handle[data-active]::before { background: var(--split-gutter-active-color, var(--accent)); }
|
|
377
|
-
.reorder-handle { cursor: grab; opacity: 0
|
|
389
|
+
.reorder-handle { cursor: grab; opacity: 0; display: inline-flex; align-items: center; transition: opacity var(--transition, 0.15s ease-out); }
|
|
390
|
+
.header-cell:hover .reorder-handle, .header-cell:focus-within .reorder-handle, .header-cell[drag-source] .reorder-handle { opacity: var(--ixfx-handle-opacity, 0.5); }
|
|
378
391
|
.reorder-handle .ixfx-handle { --ixfx-handle-length: 14px; --ixfx-handle-thickness: var(--data-grid-reorder-handle-width, 10px); --ixfx-handle-dot-size: 3px; }
|
|
379
392
|
.flyout-trigger { flex-shrink: 0; width: 36px; display: flex; align-items: center; justify-content: center; cursor: pointer; border-left: var(--border-subtle); background: var(--data-grid-header-bg); }
|
|
380
393
|
.viewport { flex: 1; overflow: auto; position: relative; }
|
|
394
|
+
/* Vertical edge fade from the shared .scroll-fade-y class
|
|
395
|
+
(see ../styles/scroll-fade.ts). The mask lives on the viewport —
|
|
396
|
+
below the header bar — so the top fade never covers the column
|
|
397
|
+
headers. Reach/strength tune via --scroll-fade-width /
|
|
398
|
+
--scroll-fade-strength (defaults set on :host above). */
|
|
381
399
|
.spacer { position: relative; }
|
|
382
400
|
.row.item {
|
|
383
401
|
position: absolute; left: 0; right: 0; display: flex; align-items: stretch;
|
|
@@ -1419,7 +1437,7 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
1419
1437
|
return html`
|
|
1420
1438
|
<div class="grid">
|
|
1421
1439
|
<div class="header-bar">
|
|
1422
|
-
<div class="header-scroll">
|
|
1440
|
+
<div class="header-scroll scroll-fade-x">
|
|
1423
1441
|
${showCheckbox ? html`<div class="header-cell checkbox-col"></div>` : nothing}
|
|
1424
1442
|
${repeat(this._visibleColumns, (c) => c.key, (col, idx) => html`
|
|
1425
1443
|
<div class="header-cell ${this._animatingColKeys.has(col.key) ? `width-animating` : ``}" style="width:${col.width ?? 150}px" ?drag-source=${this._drag?.active && this._drag.sourceCol.key === col.key}
|
|
@@ -1429,7 +1447,7 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
1429
1447
|
@pointerdown=${(e) => this._beginHeaderDrag(e, col, idx)}
|
|
1430
1448
|
><span class="ixfx-handle" data-handle="dotted" data-shape="vertical" part="reorder-handle"></span></span>` : nothing}
|
|
1431
1449
|
<span class="header-label">${col.label}</span>
|
|
1432
|
-
${this.sortState?.key === col.key ? html`<span class="sort-icon"
|
|
1450
|
+
${this.sortState?.key === col.key ? html`<span class="sort-icon"><ixfx-icon name=${this.sortState.direction === `asc` ? `chevron-up` : `chevron-down`} size="12"></ixfx-icon></span>` : nothing}
|
|
1433
1451
|
${col.resizable !== false ? html`<span class="resize-handle" ?data-active=${this._resizingColKey === col.key} @pointerdown=${(e) => this._onResizePointerDown(e, col)} @click=${(e) => e.stopPropagation()} @dblclick=${(e) => {
|
|
1434
1452
|
e.preventDefault();
|
|
1435
1453
|
e.stopPropagation();
|
|
@@ -1486,14 +1504,14 @@ let DataGridElement = class DataGridElement extends LitElement {
|
|
|
1486
1504
|
</ixfx-menu-container>
|
|
1487
1505
|
</ixfx-menu-trigger>`}
|
|
1488
1506
|
</div>
|
|
1489
|
-
<div class="viewport" @scroll=${this._onScroll}>
|
|
1507
|
+
<div class="viewport scroll-fade-y" @scroll=${this._onScroll}>
|
|
1490
1508
|
<div class="spacer" style="height:${this._flat.length * rh}px; width:${this._colWidthSum}px">
|
|
1491
1509
|
${repeat(visibleFlat, (f) => f.key, (entry, i) => {
|
|
1492
1510
|
const absIdx = startRow + i;
|
|
1493
1511
|
if (entry.type === `group`) {
|
|
1494
1512
|
const gKey = entry.key.replace(/^__group__/, ``);
|
|
1495
1513
|
const collapsed = this._collapsedGroups.has(gKey);
|
|
1496
|
-
return html`<div class="group-row ${collapsed ? `collapsed` : ``}" style="top:${absIdx * rh}px; height:${rh}px" @click=${() => this._toggleGroup(gKey)}><span class="caret"
|
|
1514
|
+
return html`<div class="group-row ${collapsed ? `collapsed` : ``}" style="top:${absIdx * rh}px; height:${rh}px" @click=${() => this._toggleGroup(gKey)}><span class="caret"><ixfx-icon name="chevron-down" size="12"></ixfx-icon></span><span>${entry.label}</span><span class="count">(${entry.count})</span><span class="divider"></span></div>`;
|
|
1497
1515
|
}
|
|
1498
1516
|
const row = entry.row;
|
|
1499
1517
|
const absIdx2 = entry.idx;
|