@ixfx/components 0.5.18 → 0.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/bundle/index.d.ts +22 -7
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +252 -36
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +4 -2
  6. package/dist/button.d.ts +1 -1
  7. package/dist/button.d.ts.map +1 -1
  8. package/dist/{colour-picker-DbypcEp6.js → colour-picker-37NyVenk.js} +2 -2
  9. package/dist/{colour-picker-DbypcEp6.js.map → colour-picker-37NyVenk.js.map} +1 -1
  10. package/dist/colour-picker.js +1 -1
  11. package/dist/{crumb-navigation-DTwJ8468.js → crumb-navigation-BrB0r14u.js} +116 -19
  12. package/dist/crumb-navigation-BrB0r14u.js.map +1 -0
  13. package/dist/crumbs.d.ts +2 -0
  14. package/dist/crumbs.d.ts.map +1 -1
  15. package/dist/crumbs.js +1 -1
  16. package/dist/{defaults-DcE8RQJc.js → defaults-BkWCPJFL.js} +7 -1
  17. package/dist/{defaults-DcE8RQJc.js.map → defaults-BkWCPJFL.js.map} +1 -1
  18. package/dist/icons.js +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +32 -7
  21. package/dist/index.js.map +1 -1
  22. package/dist/split-layout.d.ts +7 -1
  23. package/dist/split-layout.d.ts.map +1 -1
  24. package/dist/split-layout.js +84 -14
  25. package/dist/split-layout.js.map +1 -1
  26. package/dist/style.css +4 -2
  27. package/dist/{tab-list-CLqlPnX-.d.ts → tab-list-Beuh2nom.d.ts} +9 -2
  28. package/dist/tab-list-Beuh2nom.d.ts.map +1 -0
  29. package/dist/{tab-list-6W5CgXix.js → tab-list-mAoD6L0e.js} +20 -2
  30. package/dist/tab-list-mAoD6L0e.js.map +1 -0
  31. package/dist/tabs.d.ts +1 -1
  32. package/dist/tabs.js +1 -1
  33. package/docs-user/crumbs.md +4 -0
  34. package/docs-user/split-layout.md +29 -7
  35. package/package.json +3 -1
  36. package/dist/crumb-navigation-DTwJ8468.js.map +0 -1
  37. package/dist/tab-list-6W5CgXix.js.map +0 -1
  38. package/dist/tab-list-CLqlPnX-.d.ts.map +0 -1
package/bundle/style.css CHANGED
@@ -36,7 +36,8 @@
36
36
  --space-xl: 16px;
37
37
  --space-2xl: 20px;
38
38
  --border: 1px solid oklch(25% .02 240);
39
- --border-subtle: 1px solid oklch(18% .02 240);
39
+ --border-subtle-color: oklch(18% .02 240);
40
+ --border-subtle: 1px solid var(--border-subtle-color);
40
41
  --radius-s: 3px;
41
42
  --radius-m: 4px;
42
43
  --radius-l: 6px;
@@ -106,7 +107,8 @@
106
107
  --error: oklch(55% .15 20);
107
108
  --error-text: #fff;
108
109
  --border: 1px solid oklch(80% .01 240);
109
- --border-subtle: 1px solid oklch(88% .01 240);
110
+ --border-subtle-color: oklch(88% .01 240);
111
+ --border-subtle: 1px solid var(--border-subtle-color);
110
112
  --shadow-m: 0 2px 8px #0000001a;
111
113
  --shadow-l: 0 4px 16px #00000026;
112
114
  --prominence-idle-opacity: .55;
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(): typeof nothing | import("lit").TemplateResult<1>;
10
+ protected _renderIcon(): import("lit").TemplateResult<1> | typeof nothing;
11
11
  protected render(): import("lit").TemplateResult<1>;
12
12
  static styles: import("lit").CSSResult[];
13
13
  }
@@ -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,sBAAW,wBAAA;YAgBX,wBAAM;SAQT,sBAAM;;QAMP;YACI;IACR,eAAe"}
1
+ {"version":3,"file":"button.d.ts","names":[],"sources":["../src/button/button.ts"],"mappings":";;cASa,sBAAsB;EAEjC;EAGA;EAGA;EAGA;EAGA;EAGA;YAEU,6BAAW,2BAAA;YAgBX,wBAAM;SAQT,sBAAM;;QAMP;YACI;IACR,eAAe"}
@@ -1,7 +1,7 @@
1
1
  import { t as themeFallbacks } from "./fallbacks-DPgPEqo8.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-DcE8RQJc.js";
4
+ import { n as ICON_CHECK } from "./defaults-BkWCPJFL.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";
@@ -922,4 +922,4 @@ ColourPickerPopup = __decorate([safeCustomElement(`ixfx-colour-picker-popup`)],
922
922
  //#endregion
923
923
  export { ColourPicker as n, ColourPickerPopup as t };
924
924
 
925
- //# sourceMappingURL=colour-picker-DbypcEp6.js.map
925
+ //# sourceMappingURL=colour-picker-37NyVenk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"colour-picker-DbypcEp6.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 };\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 };\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:\n * value — committed colour as CSS string e.g. \"oklch(0.7 0.15 180)\"\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 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 };\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 };\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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"}
1
+ {"version":3,"file":"colour-picker-37NyVenk.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 };\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 };\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:\n * value — committed colour as CSS string e.g. \"oklch(0.7 0.15 180)\"\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 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 };\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 };\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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"}
@@ -1,2 +1,2 @@
1
- import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-DbypcEp6.js";
1
+ import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-37NyVenk.js";
2
2
  export { ColourPicker, ColourPickerPopup };
@@ -90,6 +90,8 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
90
90
  this.leadingCaret = false;
91
91
  this.caretEmbedded = true;
92
92
  this.hideRoot = false;
93
+ this.padEnding = false;
94
+ this.withUp = false;
93
95
  this.#previousSelectionKey = ``;
94
96
  this.#menuOpenedByKeyboard = false;
95
97
  this.#currentOpenTrigger = null;
@@ -468,6 +470,24 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
468
470
  inline: `start`
469
471
  });
470
472
  }
473
+ #updateTrailingWidth() {
474
+ if (!this.padEnding || !this.shadowRoot) return;
475
+ const hostContainer = this.shadowRoot.querySelector(`.host-container`);
476
+ const trailing = this.shadowRoot.querySelector(`.trailing`);
477
+ if (!hostContainer || !trailing) return;
478
+ const segments = this.shadowRoot.querySelectorAll(`.crumb-segment`);
479
+ const lastSegment = segments[segments.length - 1];
480
+ if (!lastSegment) return;
481
+ const containerWidth = hostContainer.getBoundingClientRect().width;
482
+ const itemWidth = lastSegment.getBoundingClientRect().width;
483
+ if (itemWidth < containerWidth) {
484
+ trailing.style.width = `${containerWidth - itemWidth - 5}px`;
485
+ requestAnimationFrame(() => {
486
+ if (hostContainer.scrollWidth <= hostContainer.clientWidth) hostContainer.style.setProperty(`--scroll-fade-x-start`, `0px`, `important`);
487
+ else hostContainer.style.removeProperty(`--scroll-fade-x-start`);
488
+ });
489
+ } else trailing.style.width = ``;
490
+ }
471
491
  #setSelected(node) {
472
492
  const previous = this.selectedNode;
473
493
  if (previous) this.#previousSelectionKey = previous.item?.key ?? ``;
@@ -480,6 +500,9 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
480
500
  if (path) {
481
501
  const depth = this.hideRoot && path.length > 1 ? path.length - 2 : path.length - 1;
482
502
  requestAnimationFrame(() => {
503
+ this.#updateTrailingWidth();
504
+ const hostContainer = this.#getHostContainer();
505
+ if (hostContainer) hostContainer.scrollLeft = 0;
483
506
  this.#scrollSegmentIntoView(depth);
484
507
  });
485
508
  }
@@ -610,6 +633,15 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
610
633
  composed: true
611
634
  }));
612
635
  }
636
+ #onUpClick() {
637
+ const r = this.root;
638
+ const sel = this.selectedNode;
639
+ if (!r || !sel) return;
640
+ const path = this.#findPath(r, sel);
641
+ if (!path || path.length <= 1) return;
642
+ const parent = path[path.length - 2];
643
+ this.#setSelected(parent);
644
+ }
613
645
  /** Navigate to a node by key path. Returns false if any key is not found in already-loaded children. */
614
646
  navigateTo(keys) {
615
647
  if (!this.root?.children) return false;
@@ -657,6 +689,9 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
657
689
  let pathNodes = this.#findPath(r, sel) ?? [r];
658
690
  if (this.hideRoot && pathNodes.length > 1) pathNodes = pathNodes.slice(1);
659
691
  this.#hasChildOptions();
692
+ const isAtRoot = (() => {
693
+ return (this.#findPath(r, sel) ?? [r]).length <= 1;
694
+ })();
660
695
  const parts = [];
661
696
  let segmentId = 0;
662
697
  pathNodes.forEach((node, i) => {
@@ -770,18 +805,29 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
770
805
  }
771
806
  });
772
807
  return html`
773
- <div
774
- class="host-container scroll-fade-x"
775
- tabindex="0"
776
- @focus=${this.#onFocus}
777
- @blur=${this.#onBlur}
778
- @keydown=${this.#onKeyDown}
779
- @click=${this.#onHostClick}
780
- @menu-trigger-close=${this.#onMenuTriggerClose}
781
- @mouseout=${(e) => this.tickled.handlePointerLeave(e)}
782
- >
783
- <div class="parts"
784
- @mouseover=${(e) => {
808
+ <div class="crumb-wrapper">
809
+ ${this.withUp ? html`
810
+ <button
811
+ class="up-button"
812
+ ?disabled=${isAtRoot}
813
+ aria-label="Go up one level"
814
+ @click=${this.#onUpClick}
815
+ >
816
+ <ixfx-icon name="folder-up"></ixfx-icon>
817
+ </button>
818
+ ` : nothing}
819
+ <div
820
+ class="host-container scroll-fade-x"
821
+ tabindex="0"
822
+ @focus=${this.#onFocus}
823
+ @blur=${this.#onBlur}
824
+ @keydown=${this.#onKeyDown}
825
+ @click=${this.#onHostClick}
826
+ @menu-trigger-close=${this.#onMenuTriggerClose}
827
+ @mouseout=${(e) => this.tickled.handlePointerLeave(e)}
828
+ >
829
+ <div class="parts"
830
+ @mouseover=${(e) => {
785
831
  if (this.#isWheelScrolling) return;
786
832
  const target = e.target;
787
833
  if (!(target instanceof HTMLElement)) return;
@@ -802,8 +848,9 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
802
848
  composed: true
803
849
  }));
804
850
  }}
805
- >${parts}<div class="trailing"></div></div>
806
- ${this.showSuggestions ? this.#renderChildOptions() : nothing}
851
+ >${parts}${this.padEnding ? html`<div class="trailing"></div>` : nothing}</div>
852
+ ${this.showSuggestions ? this.#renderChildOptions() : nothing}
853
+ </div>
807
854
  </div>
808
855
  `;
809
856
  }
@@ -881,15 +928,57 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
881
928
  outline-offset: 2px;
882
929
  }
883
930
 
931
+ .crumb-wrapper {
932
+ display: flex;
933
+ align-items: center;
934
+ gap: var(--crumb-item-gap);
935
+ width: 100%;
936
+ }
937
+
938
+ .up-button {
939
+ display: inline-flex;
940
+ align-items: center;
941
+ justify-content: center;
942
+ flex-shrink: 0;
943
+ background: var(--crumb-item-bg);
944
+ border: var(--crumb-item-border);
945
+ border-radius: var(--crumb-item-border-radius);
946
+ padding: var(--crumb-item-padding);
947
+ cursor: pointer;
948
+ color: inherit;
949
+ }
950
+
951
+ .up-button:disabled {
952
+ opacity: 0.5;
953
+ cursor: not-allowed;
954
+ }
955
+
956
+ .up-button:hover:not(:disabled) {
957
+ background: var(--crumb-item-bg-tickled);
958
+ border-color: var(--crumb-item-border-tickled);
959
+ }
960
+
961
+ .up-button ixfx-icon {
962
+ width: 1em;
963
+ height: 1em;
964
+ pointer-events: none;
965
+ }
966
+
884
967
  /* Edge fade (shows/hides based on scroll position) comes from the
885
968
  * shared .scroll-fade-x class - see ../styles/scroll-fade.ts */
886
969
  .host-container {
887
970
  display: flex;
888
- width: 100%;
971
+ flex: 1;
972
+ min-width: 0;
889
973
  outline: none;
890
974
  overflow: scroll;
891
975
  scroll-snap-type: x mandatory;
892
976
  scrollbar-width: none;
977
+ overscroll-behavior: none;
978
+ }
979
+
980
+ .host-container::-webkit-scrollbar {
981
+ display: none;
893
982
  }
894
983
 
895
984
  .parts {
@@ -898,9 +987,7 @@ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
898
987
  }
899
988
 
900
989
  .trailing {
901
- flex: 1;
902
- min-width: 1em;
903
- cursor: pointer;
990
+ flex-shrink: 0;
904
991
  }
905
992
 
906
993
  .crumb-segment {
@@ -1116,8 +1203,18 @@ __decorate([property({
1116
1203
  reflect: true,
1117
1204
  attribute: `hide-root`
1118
1205
  })], CrumbNavigationElement.prototype, "hideRoot", void 0);
1206
+ __decorate([property({
1207
+ type: Boolean,
1208
+ reflect: true,
1209
+ attribute: `pad-ending`
1210
+ })], CrumbNavigationElement.prototype, "padEnding", void 0);
1211
+ __decorate([property({
1212
+ type: Boolean,
1213
+ reflect: true,
1214
+ attribute: `with-up`
1215
+ })], CrumbNavigationElement.prototype, "withUp", void 0);
1119
1216
  CrumbNavigationElement = __decorate([safeCustomElement(`ixfx-crumb-navigation`)], CrumbNavigationElement);
1120
1217
  //#endregion
1121
1218
  export { scrollFadeStyles as n, CrumbNavigationElement as t };
1122
1219
 
1123
- //# sourceMappingURL=crumb-navigation-DTwJ8468.js.map
1220
+ //# sourceMappingURL=crumb-navigation-BrB0r14u.js.map