@ixfx/components 0.5.14 → 0.5.16
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 +19 -5
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +475 -127
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.js +2 -2
- package/dist/checkbox.js +1 -1
- package/dist/{colour-picker-DGso9ZOp.js → colour-picker-DbypcEp6.js} +2 -2
- package/dist/{colour-picker-DGso9ZOp.js.map → colour-picker-DbypcEp6.js.map} +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +16 -4
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +405 -125
- package/dist/crumbs.js.map +1 -1
- package/dist/data-display.js +1 -1
- package/dist/editable-label.js +1 -1
- package/dist/{fallbacks-pNMOMx38.js → fallbacks-DPgPEqo8.js} +51 -1
- package/dist/{fallbacks-pNMOMx38.js.map → fallbacks-DPgPEqo8.js.map} +1 -1
- package/dist/{icon-B22XVlCt.js → icon-DG9Lm3LT.js} +2 -2
- package/dist/{icon-B22XVlCt.js.map → icon-DG9Lm3LT.js.map} +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -12
- package/dist/index.js.map +1 -1
- package/dist/labelled-radial-input.js +2 -2
- package/dist/{menu-nuOIUD9K.js → menu-B8gE2MSo.js} +4 -4
- package/dist/{menu-nuOIUD9K.js.map → menu-B8gE2MSo.js.map} +1 -1
- package/dist/{menu-item-BBTZnjAR.js → menu-item-BYRvfyXK.js} +5 -4
- package/dist/menu-item-BYRvfyXK.js.map +1 -0
- package/dist/menu-item-DSyf9f_L.d.ts.map +1 -1
- package/dist/menu.js +2 -2
- package/dist/miller.js +1 -1
- package/dist/narrowed-text.js +1 -1
- package/dist/panel.js +2 -2
- package/dist/polar-pad.js +1 -1
- package/dist/{radial-input-DxCrt_NE.js → radial-input-CVxGH-Cp.js} +2 -2
- package/dist/{radial-input-DxCrt_NE.js.map → radial-input-CVxGH-Cp.js.map} +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.js +1 -1
- package/dist/range.js +1 -1
- package/dist/selecthorizontal.js +1 -1
- package/dist/{slider-input-DFpG23bS.js → slider-input-CzmSVgm7.js} +2 -2
- package/dist/{slider-input-DFpG23bS.js.map → slider-input-CzmSVgm7.js.map} +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/split-layout.js +1 -1
- package/dist/swipe.js +1 -1
- package/dist/{tab-list-DhkVhRQc.js → tab-list-6W5CgXix.js} +2 -2
- package/dist/{tab-list-DhkVhRQc.js.map → tab-list-6W5CgXix.js.map} +1 -1
- package/dist/{tab-list-BohmbvqF.d.ts → tab-list-ih-0I0NE.d.ts} +2 -2
- package/dist/{tab-list-BohmbvqF.d.ts.map → tab-list-ih-0I0NE.d.ts.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +1 -1
- package/dist/{tree-CL-txefQ.js → tree-BtiiDX1a.js} +2 -2
- package/dist/{tree-CL-txefQ.js.map → tree-BtiiDX1a.js.map} +1 -1
- package/dist/tree.js +1 -1
- package/dist/xy-pad.js +1 -1
- package/docs-user/button.md +8 -0
- package/docs-user/crumbs.md +24 -9
- package/docs-user/tabs.md +19 -2
- package/package.json +1 -1
- package/dist/menu-item-BBTZnjAR.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider-input-DFpG23bS.js","names":["#onKeyDown","#ensureUserGradientDefs","#lastInteractedHandle","#dragHandle","#setSingleValueFromRelative","#dragging","#activePointerId","#dragStartClientPos","#poleValueAtDragStart","#onPointerMove","#onPointerUp","#getRelativeValueA","#getRelativeValueB","#poleA","#poleB","#getRelativeValueC","#lowKey","#highKey","#lengthDragStart","#lengthDragLowKey","#lengthDragHighKey","#lengthDragLength","#lengthDragStartLow","#lengthDragStartRelative","#setDualOrTripleValueFromRelative","#applyLengthDragFromRelative","#onPointerMoveCursor","#lastPointerClient","#poleC","#low","#stepHandleByRelativeDelta","#cursorAtRelative","#lanes","#onHostKeyDown","#syncGradientDefs","#gradientObserver","#userGradientDefs","#quantise","#isUserInteraction","#applySingleStyleValueLane","#emitInputAndChange","#resolvePoleChange","#poles","#syncPoleProperties","#detectChanged","#high","#hasInitialisedValueC","#getEffectiveValueMin","#buildInputDetail","#buildChangeDetail","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#getCssVar","#getCssVarColor","#isMultiHandle","#renderHandleGroup","#renderValueMarker","#viewBox","#onPointerDown","#onPointerLeaveCursor","#onFocusIn","#renderTrack","#renderLane","#renderMidpointMarker","customElement"],"sources":["../src/slider-input/svg-utils.ts","../src/slider-input/slider-input.ts"],"sourcesContent":["/**\n * SVG utilities for the slider-input component.\n * Linear track geometry helpers (mirrors radial-input's svg-utils for arc maths).\n */\n\nimport type { SliderOrientation, SliderSingleStyle } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Track geometry in viewBox units.\n * Horizontal: trackStart = track-INSET, trackEnd = 100 - INSET (along x).\n * Vertical: trackStart = INSET, trackEnd = 100 - INSET (along y, top = high).\n */\nexport interface TrackBounds {\n trackStart: number;\n trackEnd: number;\n /** Centre along the long axis. */\n centre: number;\n /** Centre along the cross axis (always 100/2 = 50 here, but kept for symmetry). */\n crossCentre: number;\n}\n\nexport const INSET = 5;\nexport const LONG = 100;\nexport const CROSS = 24;\n\n/**\n * Get the track bounds in viewBox units for a given orientation.\n */\nexport function getTrackBounds(orientation: SliderOrientation): TrackBounds {\n if (orientation === `horizontal`) {\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n }\n // Vertical: viewBox is 0 0 CROSS LONG; the track runs along the y axis from\n // INSET to LONG-INSET. `centre` is the middle of the long (y) axis; the\n // `crossCentre` is the middle of the cross (x) axis.\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n}\n\n/**\n * Map a relative value (0..1) to a leader point on the track for the given\n * orientation and single-style.\n *\n * Range: grows from trackStart to trackEnd.\n * Bipolar: track centre is 0.5; values spread from centre outward.\n * Unipolar: spread symmetrically around centre.\n *\n * For vertical orientation, higher values are toward the top of the track,\n * matching the spec (\"higher values → top of track\").\n */\nexport function valueToPosition(\n relativeValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): Point {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n\n let pos: number;\n if (singleStyle === `range`) {\n pos = trackBounds.trackStart + relativeValue * span;\n } else if (singleStyle === `bipolar`) {\n // Mid (0.5) -> centre; <0.5 below centre, >0.5 above.\n if (relativeValue <= 0.5) {\n const t = relativeValue / 0.5;\n pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);\n } else {\n const t = (relativeValue - 0.5) / 0.5;\n pos = centre + t * (trackBounds.trackEnd - centre);\n }\n } else {\n // unipolar: spread symmetrically around centre\n const halfLen = (relativeValue * span) / 2;\n pos = centre + halfLen;\n }\n\n if (orientation === `horizontal`) {\n return { x: pos, y: crossCentre };\n }\n // Vertical: higher values toward top (smaller y). `pos` is a value along the\n // long axis (0..LONG), so the SVG y coordinate (0 at top) is LONG - pos.\n return { x: crossCentre, y: LONG - pos };\n}\n\n/**\n * Get the segment endpoints for a 'value' lane. The lane is drawn from\n * the lane's lower relative value to its upper relative value.\n *\n * For 'range' and 'bipolar' styles, the endpoints are obtained by mapping\n * each value through `valueToPosition`. For 'unipolar', the bar is centred\n * on the track centre with length proportional to valueMax (valueMin is\n * ignored), matching the spec: \"spreads symmetrically around centre\".\n */\nexport function getValueSegment(\n valueMin: number,\n valueMax: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n if (singleStyle === `unipolar`) {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n const halfLen = (valueMax * span) / 2;\n if (orientation === `horizontal`) {\n return {\n start: { x: centre - halfLen, y: crossCentre },\n end: { x: centre + halfLen, y: crossCentre },\n };\n }\n // Vertical: spread the bar symmetrically around the track centre along y.\n return {\n start: { x: crossCentre, y: centre - halfLen },\n end: { x: crossCentre, y: centre + halfLen },\n };\n }\n\n return {\n start: valueToPosition(valueMin, singleStyle, trackBounds, orientation),\n end: valueToPosition(valueMax, singleStyle, trackBounds, orientation),\n };\n}\n\n/**\n * Get the segment endpoints for an 'anchored' lane. The lane is centered\n * on the current value, with length controlled by laneValue (0..1).\n */\nexport function getAnchoredSegment(\n relativeValue: number,\n laneValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const halfLen = (laneValue * span) / 2;\n\n // For unipolar, the value represents the size of a bar centred on the track\n // centre, not a spatial position. Anchor the lane to the track centre so it\n // follows the value's \"magnitude\" rather than the bar's right-end.\n // Mirrors radial-input's getAnchoredArcAngles for unipolar.\n // `centre.x` is along the track axis; `centre.y` is perpendicular. For\n // horizontal that's (LONG/2, CROSS/2); for vertical that's (CROSS/2, LONG/2).\n const centre = singleStyle === `unipolar`\n ? (orientation === `horizontal`\n ? { x: trackBounds.centre, y: trackBounds.crossCentre }\n : { x: trackBounds.crossCentre, y: trackBounds.centre })\n : valueToPosition(relativeValue, singleStyle, trackBounds, orientation);\n\n // Compute along-axis offsets\n let startPos: number;\n let endPos: number;\n if (orientation === `horizontal`) {\n startPos = centre.x - halfLen;\n endPos = centre.x + halfLen;\n } else {\n startPos = centre.y - halfLen;\n endPos = centre.y + halfLen;\n }\n\n const start = orientation === `horizontal`\n ? { x: startPos, y: centre.y }\n : { x: centre.x, y: startPos };\n const end = orientation === `horizontal`\n ? { x: endPos, y: centre.y }\n : { x: centre.x, y: endPos };\n return { start, end };\n}\n\n/**\n * Generate an SVG path string for a straight line. Returns '' for a\n * zero-length segment (start ≈ end), mirroring the radial-input arc\n * helper's edge case.\n */\nexport function generateLinePath(start: Point, end: Point): string {\n if (Math.abs(start.x - end.x) < 0.001 && Math.abs(start.y - end.y) < 0.001) {\n return ``;\n }\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n}\n\n/**\n * Generate a closed SVG `<path>` for a filled rectangle (used for filled\n * lane segments). `halfWidth` is the perpendicular half-thickness; `perpOffset`\n * shifts the rect perpendicularly from the track centreline.\n */\nexport function generateRectPath(\n start: Point,\n end: Point,\n halfWidth: number,\n perpOffset: number,\n orientation: SliderOrientation,\n): string {\n // Direction vector along the track\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001)\n return ``;\n\n // Unit perpendicular\n const perpX = -dy / len;\n const perpY = dx / len;\n\n // Inset corners slightly so the rect's ends don't extend past the start/end\n const insetX = (dx / len) * halfWidth;\n const insetY = (dy / len) * halfWidth;\n\n const sIn = { x: start.x + insetX, y: start.y + insetY };\n const eIn = { x: end.x - insetX, y: end.y - insetY };\n\n const c1 = { x: sIn.x + perpX * (halfWidth + perpOffset), y: sIn.y + perpY * (halfWidth + perpOffset) };\n const c2 = { x: eIn.x + perpX * (halfWidth + perpOffset), y: eIn.y + perpY * (halfWidth + perpOffset) };\n const c3 = { x: eIn.x + perpX * (-halfWidth + perpOffset), y: eIn.y + perpY * (-halfWidth + perpOffset) };\n const c4 = { x: sIn.x + perpX * (-halfWidth + perpOffset), y: sIn.y + perpY * (-halfWidth + perpOffset) };\n\n // Silence unused-orientation warning — kept for API parity\n void orientation;\n\n return `M ${c1.x} ${c1.y} L ${c2.x} ${c2.y} L ${c3.x} ${c3.y} L ${c4.x} ${c4.y} Z`;\n}\n\n/**\n * Clamp `value` to the [min, max] range.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Linear-reinterpolate `value` from [fromMin, fromMax] to [toMin, toMax].\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n if (fromMax === fromMin)\n return toMin;\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n\n/**\n * Convert a relative value (0..1) to an absolute value in the min..max range.\n */\nexport function relativeToValue(\n relativeValue: number,\n min: number,\n max: number,\n): number {\n return scale(relativeValue, 0, 1, min, max);\n}\n\n/**\n * Convert an absolute value to a relative (0..1) position.\n */\nexport function valueToRelative(\n value: number,\n min: number,\n max: number,\n): number {\n return scale(value, min, max, 0, 1);\n}\n\n/**\n * Convert a pointer client position (clientX or clientY depending on\n * orientation) to a relative value (0..1) given the host element's\n * bounding rect on the long axis.\n */\nexport function clientPosToRelative(\n clientPos: number,\n hostStart: number,\n hostSize: number,\n): number {\n if (hostSize <= 0)\n return 0;\n return clamp((clientPos - hostStart) / hostSize, 0, 1);\n}\n\n/**\n * Inverse: relative value (0..1) → client position offset from host start.\n */\nexport function relativeToClientPos(\n relativeValue: number,\n hostStart: number,\n hostSize: number,\n): number {\n return hostStart + relativeValue * hostSize;\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-slider-input> — linear SVG-based slider.\n *\n * Mirrors `ixfx-radial-input` as closely as possible, swapping arc geometry\n * for a linear track. Supports horizontal and vertical orientations, three\n * value modes (single/dual/triple), triple-segment \"value\" lanes, and\n * `value-drag` length-drag gestures for dual/triple modes.\n *\n * Attributes / properties\n * value-a, value-b, value-c — primary/secondary/tertiary handle values\n * min, max — value range\n * step, stops — keyboard/wheel/pointer step resolution\n * value-mode — 'single' | 'dual' | 'triple'\n * single-style — 'range' | 'bipolar' | 'unipolar' (single mode only)\n * orientation — 'horizontal' | 'vertical'\n * marker-style — 'needle' | 'dot' | 'none'\n * crossover — 'none' | 'allow' (dual/triple modes)\n * value-drag — 'none' | 'stop' | 'flex' (dual/triple modes)\n * value-min — minimum gap between A and B (dual/triple modes)\n * disabled — boolean\n * lighttouch — boolean — wheel adjusts value on hover instead of requiring focus\n *\n * Events\n * input — fires continuously during user interaction\n * change — debounced 150ms after interaction; immediate for programmatic\n *\n * Mouse wheel (via WheelNudgeMixin): up = increase, down = decrease. In multi-handle\n * modes wheel targets the last-interacted-with handle (focus or pointerdown).\n * Shift+wheel halves the step. See docs/infra-mousewheel.md.\n */\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { Point } from './svg-utils.js';\nimport type {\n SliderChangedField,\n SliderCrossover,\n SliderHandleKey,\n SliderInputChangeDetail,\n SliderInputElementEventMap,\n SliderInputInputDetail,\n SliderLaneData,\n SliderLaneType,\n SliderMarkerStyle,\n SliderOrientation,\n SliderSingleStyle,\n SliderValueCFollow,\n SliderValueDrag,\n SliderValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { resolveAxisStep } from '../keyboard.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport {\n clamp,\n clientPosToRelative,\n CROSS,\n generateLinePath,\n getAnchoredSegment,\n getTrackBounds,\n getValueSegment,\n INSET,\n LONG,\n scale,\n valueToPosition,\n valueToRelative,\n} from './svg-utils.js';\n\nconst HANDLE_HIT_RADIUS = 0.06;\nconst DEFAULT_VALUE_MIN_FRACTION = 0.01;\nconst CHANGE_DEBOUNCE_MS = 150;\n\n@customElement(`ixfx-slider-input`)\nexport class SliderInputElement extends WheelNudgeMixin(LitElement) {\n // ─── Public properties ───────────────────────────────────────────────\n @property({ type: Number, attribute: `value-a` })\n valueA = 50;\n\n @property({ type: Number, attribute: `value-b` })\n valueB = 0;\n\n /**\n * Triple-mode middle handle. `undefined` until first willUpdate, then\n * defaulted to the midpoint of valueA/valueB (matching radial-input's\n * deferred lane-correction pattern).\n */\n @property({ type: Number, attribute: `value-c` })\n valueC: number | undefined = undefined;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n step: number | undefined = undefined;\n\n @property({ type: Number })\n stops: number | undefined = undefined;\n\n @property({ type: String, attribute: `value-mode` })\n valueMode: SliderValueMode = `single`;\n\n @property({ type: String, attribute: `single-style` })\n singleStyle: SliderSingleStyle = `range`;\n\n @property({ type: String })\n orientation: SliderOrientation = `horizontal`;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: SliderMarkerStyle = `needle`;\n\n /**\n * Optional marker-style override for the C handle in triple mode. Lets\n * consumers give C a different shape (e.g. dot) from the global\n * `markerStyle` applied to A/B.\n */\n @property({ type: String, attribute: `marker-style-c` })\n markerStyleC: SliderMarkerStyle | undefined = undefined;\n\n @property({ type: String })\n crossover: SliderCrossover = `allow`;\n\n @property({ type: String, attribute: `value-drag` })\n valueDrag: SliderValueDrag = `none`;\n\n /**\n * In triple mode, how the C handle reacts when A or B moves the [A, B]\n * band. `none` (default): C keeps its value unless pushed outside the\n * new band. `proportional`: C is re-anchored at the same fractional\n * position it had within the *old* band, so it moves with A/B.\n */\n @property({ type: String, attribute: `value-c-follow` })\n valueCFollow: SliderValueCFollow = `none`;\n\n @property({ type: Number, attribute: `value-min` })\n valueMin = 1;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // ─── Internal state ──────────────────────────────────────────────────\n #lanes: Map<string, SliderLaneData> = new Map();\n\n /** Raw pole values: independent of which is \"low\" or \"high\". */\n #poleA = 50;\n #poleB = 0;\n #poleC: number | undefined = undefined;\n\n #dragging = false;\n /** Pointer ID being tracked (fixes radial-input's hardcoded pointerId). */\n #activePointerId: number | undefined = undefined;\n #dragStartClientPos = 0;\n #poleValueAtDragStart = 0;\n /** Which handle is currently being dragged, or 'length' for segment drag. */\n #dragHandle: SliderHandleKey | `length` | undefined = undefined;\n /** Snapshotted poles at length-drag start. */\n #lengthDragStart: { poleA: number; poleB: number } | undefined = undefined;\n /** Track the low/high identity at length-drag start (so we know which raw pole gets which end). */\n #lengthDragLowKey: SliderHandleKey | undefined = undefined;\n #lengthDragHighKey: SliderHandleKey | undefined = undefined;\n #lengthDragLength = 0;\n #lengthDragStartLow = 0;\n /**\n * Where the pointer was when the length drag began (in host-relative\n * 0..1 terms). Preserves the grab offset so dragging the bar doesn't snap\n * its low edge under the cursor.\n */\n #lengthDragStartRelative = 0;\n\n /** The handle that last received direct interaction (pointerdown/keydown/wheel/focus). */\n #lastInteractedHandle: SliderHandleKey = `a`;\n\n /**\n * Last pointer client position seen by #onPointerMoveCursor, used to\n * recompute the cursor after a drag ends (without waiting for a fresh\n * pointermove).\n */\n #lastPointerClient = { x: 0, y: 0 };\n\n #changeDebounceTimer: number | undefined = undefined;\n #isUserInteraction = false;\n #hasInitialisedValueC = false;\n\n /**\n * Holds `<linearGradient>`/`<radialGradient>` elements authored as light-DOM\n * children of this element, once relocated into the shadow root (see\n * `#syncGradientDefs`). Lets consumers reference `url(#id)` paint servers\n * from `--lane-*-color` / `--track-color` etc. — CSS custom properties\n * pierce the shadow boundary, but `url(#id)` paint-server *resolution* does\n * not, so the gradient definitions themselves must physically live inside\n * this element's shadow root to be resolvable by lanes/track painted there.\n */\n #userGradientDefs: SVGDefsElement | undefined;\n #gradientObserver: MutationObserver | undefined;\n\n // ─── Construction ───────────────────────────────────────────────────\n constructor() {\n super();\n // Make the host focusable so users can Tab to the slider. The actual\n // focus indicator + keyboard listener are on the inner <svg> (which\n // sits inside the shadow DOM), but the host needs an HTML tabindex\n // attribute to be reachable from the document's tab order.\n if (!this.disabled) {\n this.setAttribute(`tabindex`, `0`);\n }\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1,\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n valueMin: 0,\n valueMax: 0,\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`tabindex`, this.disabled ? `-1` : `0`);\n // Listen for keydown on the host itself (in addition to the SVG in\n // shadow DOM) so the keyboard handler fires when the host has focus\n // from Tab navigation. The host is the focusable element (via its\n // tabindex attribute set in the constructor); events fired while the\n // host is focused don't reach the inner <svg>'s lit listener.\n this.addEventListener(`keydown`, this.#onHostKeyDown as EventListener);\n this.#syncGradientDefs();\n this.#gradientObserver = new MutationObserver(this.#syncGradientDefs);\n this.#gradientObserver.observe(this, { childList: true, subtree: true });\n }\n\n #onHostKeyDown = (event: KeyboardEvent): void => {\n this.#onKeyDown(event);\n };\n\n // ─── Gradient defs relocation ───────────────────────────────────────\n /**\n * Lazily creates the inert `<svg><defs>` carrier that user-authored\n * gradients get moved into. Kept entirely outside Lit's managed template —\n * it's a plain sibling of the interactive `<svg class=\"slider-svg\">` inside\n * the shadow root, so `url(#id)` references from lane/track paint\n * properties resolve against it regardless of render() re-runs.\n */\n #ensureUserGradientDefs(): SVGDefsElement {\n if (this.#userGradientDefs)\n return this.#userGradientDefs;\n const svgNs = `http://www.w3.org/2000/svg`;\n const carrier = document.createElementNS(svgNs, `svg`);\n carrier.setAttribute(`width`, `0`);\n carrier.setAttribute(`height`, `0`);\n carrier.setAttribute(`aria-hidden`, `true`);\n // Inline (not classed) so no shadow stylesheet rule — including a broad\n // `svg { width: 100%; ... }` selector — can ever stretch this carrier\n // into a click-blocking overlay; `:host` has no explicit `position`, so\n // an accidentally-enlarged `position: absolute` box here would escape to\n // whatever ancestor up the *light* DOM happens to be positioned.\n carrier.style.cssText = `position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none;`;\n const defs = document.createElementNS(svgNs, `defs`) as SVGDefsElement;\n carrier.append(defs);\n this.renderRoot.append(carrier);\n this.#userGradientDefs = defs;\n return defs;\n }\n\n /**\n * Moves any `<linearGradient>`/`<radialGradient>` authored as light-DOM\n * descendants of this element into the shadow root (see\n * `#ensureUserGradientDefs`). This *reparents* rather than clones the\n * nodes, so consumers get normal, live SVG paint-server semantics — e.g.\n * animating a `<stop>`'s `stop-color` \"just works\" — with no gradient\n * management on the component's part. Idempotent: once moved, a node is no\n * longer a light-DOM descendant of `this`, so it won't be found again.\n */\n #syncGradientDefs = (): void => {\n const found = this.querySelectorAll(`linearGradient, radialGradient`);\n if (found.length === 0)\n return;\n const defs = this.#ensureUserGradientDefs();\n for (const node of found) {\n defs.append(node);\n }\n };\n\n // ─── Lane management API ────────────────────────────────────────────\n addLane(\n key: string,\n options?: {\n value?: number;\n valueMin?: number;\n valueMax?: number;\n type?: SliderLaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const rel = this.#getRelativeValueA();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? rel,\n valueMin: options?.valueMin ?? 0,\n valueMax: options?.valueMax ?? rel,\n type: options?.type ?? `value`,\n offset: options?.offset ?? 0,\n width: options?.width ?? 0.1,\n });\n this.requestUpdate();\n }\n\n setLaneValue(key: string, value: number): void {\n const lane = this.#lanes.get(key);\n if (lane) {\n lane.value = clamp(value, 0, 1);\n this.requestUpdate();\n }\n }\n\n setLaneRange(key: string, valueMin: number, valueMax: number): void {\n const lane = this.#lanes.get(key);\n if (!lane)\n return;\n const lo = clamp(Math.min(valueMin, valueMax), 0, 1);\n const hi = clamp(Math.max(valueMin, valueMax), 0, 1);\n lane.valueMin = lo;\n lane.valueMax = hi;\n this.requestUpdate();\n }\n\n removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, SliderLaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): SliderLaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // ─── Derived getters ────────────────────────────────────────────────\n #getRelativeValueA(): number {\n return valueToRelative(this.valueA, this.min, this.max);\n }\n\n #getRelativeValueB(): number {\n return valueToRelative(this.valueB, this.min, this.max);\n }\n\n #getRelativeValueC(): number {\n const c = this.valueC ?? (this.#poleA + this.#poleB) / 2;\n return valueToRelative(c, this.min, this.max);\n }\n\n #low(): number {\n return Math.min(this.#poleA, this.#poleB);\n }\n\n #high(): number {\n return Math.max(this.#poleA, this.#poleB);\n }\n\n #lowKey(): SliderHandleKey {\n return this.#poleA <= this.#poleB ? `a` : `b`;\n }\n\n #highKey(): SliderHandleKey {\n return this.#poleA > this.#poleB ? `a` : `b`;\n }\n\n /**\n * Effective `valueMin` in value units between A and B. Mirrors radial-input's\n * default of 1% of max-min when the property holds the literal minimum.\n */\n #getEffectiveValueMin(): number {\n const range = this.max - this.min;\n if (this.valueMin && this.valueMin > 0)\n return this.valueMin;\n return range * DEFAULT_VALUE_MIN_FRACTION;\n }\n\n #quantise(value: number): number {\n if (this.stops && this.stops > 1) {\n const range = this.max - this.min;\n const step = range / this.stops;\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n if (this.step !== undefined && this.step > 0) {\n const snapped = Math.round((value - this.min) / this.step) * this.step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n return value;\n }\n\n // ─── Value setting ──────────────────────────────────────────────────\n #setSingleValueFromRelative(relativeValue: number, isUserInteraction = false): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clampedValue = this.#quantise(clamp(newValue, this.min, this.max));\n\n if (clampedValue === this.valueA)\n return;\n\n const previousValue = this.valueA;\n this.valueA = clampedValue;\n this.#poleA = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValueA() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n { previousValue },\n isUserInteraction,\n );\n }\n\n #setDualOrTripleValueFromRelative(\n relativeValue: number,\n handle: SliderHandleKey,\n isUserInteraction = false,\n ): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clamped = clamp(newValue, this.min, this.max);\n\n const result = this.#resolvePoleChange(handle, clamped, this.#lastInteractedHandle);\n if (!result)\n return;\n\n const previous = { ...this.#poles() };\n this.#poleA = result.poleA;\n this.#poleB = result.poleB;\n if (result.poleC !== undefined)\n this.#poleC = result.poleC;\n this.#syncPoleProperties();\n\n const changed = this.#detectChanged(previous, this.#poles());\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(valueToRelative(this.#high(), this.min, this.max) * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: Math.max(previous.poleA, previous.poleB),\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n isUserInteraction,\n changed,\n );\n }\n\n #poles(): { poleA: number; poleB: number; poleC: number | undefined } {\n return { poleA: this.#poleA, poleB: this.#poleB, poleC: this.#poleC };\n }\n\n #syncPoleProperties(): void {\n this.valueA = this.#poleA;\n this.valueB = this.#poleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n }\n }\n\n #resolvePoleChange(\n handle: SliderHandleKey,\n proposed: number,\n originalHandle: SliderHandleKey,\n ): { poleA: number; poleB: number; poleC?: number } | null {\n let poleA = this.#poleA;\n let poleB = this.#poleB;\n let poleC = this.#poleC;\n\n if (this.valueMode === `triple` && handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const clamped = clamp(proposed, lo, hi);\n const quantised = this.#quantise(clamped);\n if (quantised === this.#poleC)\n return null;\n return { poleA, poleB, poleC: quantised };\n }\n\n const gap = this.#getEffectiveValueMin();\n const other = handle === `a` ? poleB : poleA;\n\n let desired = this.#quantise(clamp(proposed, this.min, this.max));\n\n if (this.crossover === `none`) {\n // Pin to the side this handle started on relative to the other one.\n const startedLow = (handle === `a` ? poleA : poleB) <= other;\n if (startedLow) {\n desired = Math.min(desired, other - gap);\n } else {\n desired = Math.max(desired, other + gap);\n }\n } else {\n // 'allow' — snap into the forbidden band, but allow crossover beyond.\n if (desired > other - gap && desired < other + gap) {\n // Within forbidden band; snap to nearer edge.\n const distToLow = Math.abs(desired - (other - gap));\n const distToHigh = Math.abs(desired - (other + gap));\n desired = distToLow <= distToHigh ? other - gap : other + gap;\n }\n }\n\n // Final clamp to [min, max]\n desired = clamp(desired, this.min, this.max);\n\n if (handle === `a`) {\n if (desired === poleA)\n return null;\n poleA = desired;\n } else {\n if (desired === poleB)\n return null;\n poleB = desired;\n }\n\n // Triple-mode: re-anchor C relative to the new [low, high]\n if (this.valueMode === `triple` && poleC !== undefined) {\n const oldLo = Math.min(this.#poleA, this.#poleB);\n const oldHi = Math.max(this.#poleA, this.#poleB);\n const newLo = Math.min(poleA, poleB);\n const newHi = Math.max(poleA, poleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((poleC - oldLo) / (oldHi - oldLo), 0, 1);\n poleC = newLo + frac * (newHi - newLo);\n } else {\n if (poleC < newLo)\n poleC = newLo;\n if (poleC > newHi)\n poleC = newHi;\n }\n }\n\n // Avoid unused-warning for originalHandle (used in caller for tie-breaking)\n void originalHandle;\n return { poleA, poleB, poleC };\n }\n\n #detectChanged(\n prev: { poleA: number; poleB: number; poleC: number | undefined },\n curr: { poleA: number; poleB: number; poleC: number | undefined },\n ): SliderChangedField {\n const aDiff = prev.poleA !== curr.poleA;\n const bDiff = prev.poleB !== curr.poleB;\n const cDiff = prev.poleC !== curr.poleC;\n\n if (this.valueMode === `triple`) {\n if (aDiff && bDiff && !cDiff)\n return `both`;\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n if (cDiff)\n return `c`;\n return `min`;\n }\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n return `min`;\n }\n\n #emitInputAndChange(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n isUserInteraction: boolean,\n changed?: SliderChangedField,\n ): void {\n const detailInput = this.#buildInputDetail(changed);\n const detailChange = this.#buildChangeDetail(previous, changed);\n\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<SliderInputInputDetail>(`input`, {\n detail: detailInput,\n bubbles: true,\n composed: true,\n }),\n );\n this.#scheduleChangeEvent(detailChange);\n } else {\n this.#fireChangeEvent(detailChange);\n }\n }\n\n #buildInputDetail(changed?: SliderChangedField): SliderInputInputDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMinRel = valueToRelative(lo, this.min, this.max);\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n valueC: this.#poleC,\n valueCRelative: valueToRelative(this.#poleC, this.min, this.max),\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n changed,\n };\n }\n\n #buildChangeDetail(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n changed?: SliderChangedField,\n ): SliderInputChangeDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n previousValue: previous.previousValue,\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n valueC: this.#poleC,\n previousValueC: previous.previousValueC ?? this.#poleC,\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n changed,\n };\n }\n\n #scheduleChangeEvent(detail: SliderInputChangeDetail): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(detail);\n this.#changeDebounceTimer = undefined;\n }, CHANGE_DEBOUNCE_MS);\n }\n\n #fireChangeEvent(detail: SliderInputChangeDetail): void {\n this.dispatchEvent(\n new CustomEvent<SliderInputChangeDetail>(`change`, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ─── CSS-var lookup ────────────────────────────────────────────────\n #getCssVar(name: string, defaultValue: number): number {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n if (!val)\n return defaultValue;\n\n if (val.includes(`calc(`)) {\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n try {\n const fn = new Function(`return ${evalStr.replace(/calc\\s*\\(([^)]+)\\)/g, `$1`)}`);\n const result = fn();\n return typeof result === `number` && !Number.isNaN(result) ? result : defaultValue;\n } catch {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n }\n\n const parsed = Number.parseFloat(val);\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // ─── Pointer interaction ────────────────────────────────────────────\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n\n event.preventDefault();\n\n // Move focus to the host so keyboard interaction (arrows, wheel)\n // continues to work after a click/drag, and the focus indicator shows.\n this.focus();\n\n // Force the dragging cursor immediately, since the pointer may move\n // outside the SVG bounds while dragged (and #onPointerMoveCursor is\n // bound to the SVG only).\n svg.style.cursor = `grabbing`;\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n // For vertical, top of host = high value, so flip the relative value\n // (clientPosToRelative gives 0 at hostStart, 1 at hostEnd).\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n // For unipolar (single mode), the value bar is symmetric around the track\n // centre, so the click position maps to the value via a V-shape: 0 at\n // the centre, 1 at either end. Clicking 25% in from either side sets\n // the same value (0.5), as does clicking at the very start or end (1).\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n // Resolve handle\n if (this.valueMode === `single`) {\n this.#lastInteractedHandle = `a`;\n this.#dragHandle = `a`;\n this.#setSingleValueFromRelative(relativeValue, true);\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n this.#poleValueAtDragStart = this.valueA;\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n // Multi-handle: hit-test\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n const aHandle = this.#poleA <= this.#poleB ? `a` : `b`;\n const bHandle = this.#poleA > this.#poleB ? `a` : `b`;\n const posA = aRel;\n const posB = bRel;\n const isTriple = this.valueMode === `triple`;\n const cRel = isTriple ? this.#getRelativeValueC() : 0;\n const posC = cRel;\n const nearA = Math.abs(relativeValue - posA) < HANDLE_HIT_RADIUS;\n const nearB = Math.abs(relativeValue - posB) < HANDLE_HIT_RADIUS;\n const nearC = isTriple && Math.abs(relativeValue - posC) < HANDLE_HIT_RADIUS;\n\n let chosenHandle: SliderHandleKey | `length` | undefined;\n\n // When two or more handles overlap (e.g. A and C, A and B, etc.), pick\n // the one whose raw pole was NOT last-interacted, so repeated clicks\n // on a near-coincident pair alternate rather than sticking.\n const pickNonLast = (candidates: SliderHandleKey[]): SliderHandleKey => {\n const notLast = candidates.find(h => h !== this.#lastInteractedHandle);\n return notLast ?? candidates[0];\n };\n if (nearA && nearB && nearC) {\n chosenHandle = pickNonLast([aHandle, bHandle, `c`]);\n } else if (nearA && nearB) {\n chosenHandle = pickNonLast([aHandle, bHandle]);\n } else if (nearA && nearC) {\n chosenHandle = pickNonLast([aHandle, `c`]);\n } else if (nearB && nearC) {\n chosenHandle = pickNonLast([bHandle, `c`]);\n } else if (nearA) {\n chosenHandle = aHandle;\n } else if (nearB) {\n chosenHandle = bHandle;\n } else if (nearC) {\n chosenHandle = `c`;\n } else if (this.valueDrag !== `none` && relativeValue > lo && relativeValue < hi) {\n chosenHandle = `length`;\n } else if (this.valueDrag === `none` && relativeValue <= lo) {\n // Dead zone on low side — click-to-set low handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#lowKey();\n } else if (this.valueDrag === `none` && relativeValue >= hi) {\n // Dead zone on high side — click-to-set high handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#highKey();\n } else {\n // Not on a handle, not on a draggable segment, not on a click-to-set\n // dead zone (when value-drag is off). No-op — the pointer event will\n // still register and release cleanly via #onPointerUp, but no value\n // changes.\n chosenHandle = undefined;\n }\n\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n\n if (chosenHandle === undefined) {\n // Linger-as-track-click but no drag started.\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n this.#dragHandle = chosenHandle;\n\n if (chosenHandle === `length`) {\n this.#lengthDragStart = { poleA: this.#poleA, poleB: this.#poleB };\n this.#lengthDragLowKey = this.#lowKey();\n this.#lengthDragHighKey = this.#highKey();\n this.#lengthDragLength = this.#poleB - this.#poleA < 0\n ? this.#poleA - this.#poleB\n : this.#poleB - this.#poleA;\n this.#lengthDragStartLow = Math.min(this.#poleA, this.#poleB);\n // Remember where the user grabbed the bar (host-relative). Without\n // this, the low edge would jump under the cursor at drag-start.\n this.#lengthDragStartRelative = relativeValue;\n } else {\n this.#lastInteractedHandle = chosenHandle;\n this.#poleValueAtDragStart = chosenHandle === `a` ? this.#poleA : this.#poleB;\n // Click-to-set immediately\n this.#setDualOrTripleValueFromRelative(relativeValue, chosenHandle, true);\n }\n\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n #onPointerMove = (event: PointerEvent): void => {\n if (!this.#dragging)\n return;\n\n event.preventDefault();\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(relativeValue, true);\n return;\n }\n\n if (this.#dragHandle === `length`) {\n this.#applyLengthDragFromRelative(relativeValue);\n } else if (this.#dragHandle) {\n this.#setDualOrTripleValueFromRelative(relativeValue, this.#dragHandle, true);\n }\n };\n\n #applyLengthDragFromRelative(relativeValue: number): void {\n if (!this.#lengthDragStart)\n return;\n const range = this.max - this.min;\n const deltaR = relativeValue - this.#lengthDragStartRelative;\n const deltaValue = deltaR * range;\n\n let proposedLow = this.#lengthDragStartLow + deltaValue;\n let proposedHigh = proposedLow + this.#lengthDragLength;\n\n if (this.valueDrag === `stop`) {\n const originalLength = this.#lengthDragLength;\n let candidateLow = proposedLow;\n let candidateHigh = proposedLow + originalLength;\n if (candidateLow < this.min) {\n const maxDelta = this.min - this.#lengthDragStartLow;\n candidateLow = this.#lengthDragStartLow + maxDelta;\n candidateHigh = candidateLow + originalLength;\n }\n if (candidateHigh > this.max) {\n // Translate back so high sits at max.\n const shift = this.max - candidateHigh;\n candidateLow += shift;\n candidateHigh += shift;\n }\n proposedLow = candidateLow;\n proposedHigh = candidateHigh;\n } else if (this.valueDrag === `flex`) {\n proposedLow = clamp(proposedLow, this.min, this.max);\n proposedHigh = clamp(proposedHigh, this.min, this.max);\n }\n\n const lowKey = this.#lengthDragLowKey ?? this.#lowKey();\n const highKey = this.#lengthDragHighKey ?? this.#highKey();\n\n const previous = this.#poles();\n const newPoleA = lowKey === `a` ? proposedLow : proposedHigh;\n const newPoleB = lowKey === `b` ? proposedLow : proposedHigh;\n this.#poleA = newPoleA;\n this.#poleB = newPoleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n const oldLo = Math.min(previous.poleA, previous.poleB);\n const oldHi = Math.max(previous.poleA, previous.poleB);\n const newLo = Math.min(newPoleA, newPoleB);\n const newHi = Math.max(newPoleA, newPoleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((this.#poleC - oldLo) / (oldHi - oldLo), 0, 1);\n this.#poleC = newLo + frac * (newHi - newLo);\n } else {\n if (this.#poleC < newLo)\n this.#poleC = newLo;\n if (this.#poleC > newHi)\n this.#poleC = newHi;\n }\n }\n this.#syncPoleProperties();\n\n const changed: SliderChangedField = `both`;\n this.#isUserInteraction = true;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n changed,\n );\n }\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.#dragHandle = undefined;\n this.#lengthDragStart = undefined;\n this.#lengthDragLowKey = undefined;\n this.#lengthDragHighKey = undefined;\n this.toggleAttribute(`dragging`, false);\n\n // Re-evaluate cursor at the last known pointer position so the cursor\n // doesn't stay stuck at `grabbing` after release.\n this.#onPointerMoveCursor(\n new PointerEvent(`pointermove`, {\n clientX: this.#lastPointerClient.x,\n clientY: this.#lastPointerClient.y,\n }),\n );\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`);\n if (\n svg\n && this.#activePointerId !== undefined\n && `hasPointerCapture` in svg\n && typeof (svg as Element & { hasPointerCapture?: (id: number) => boolean }).hasPointerCapture === `function`\n ) {\n const has = (svg as Element & { hasPointerCapture: (id: number) => boolean }).hasPointerCapture;\n if (has.call(svg, this.#activePointerId)) {\n try {\n (svg as Element & { releasePointerCapture: (id: number) => void }).releasePointerCapture(this.#activePointerId);\n } catch {\n // ignore\n }\n }\n }\n this.#activePointerId = undefined;\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // ─── Keyboard interaction ───────────────────────────────────────────\n #onKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled)\n return;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n // Determine which handle to act on\n let handle: SliderHandleKey = `a`;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() + effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) + effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() - effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) - effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `Home`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(0, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 0);\n }\n handled = true;\n break;\n\n case `End`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(1, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 1);\n }\n handled = true;\n break;\n }\n\n if (handled)\n event.preventDefault();\n };\n\n #stepHandleByRelativeDelta(handle: SliderHandleKey, targetRelative: number): void {\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(clamp(targetRelative, 0, 1), true);\n return;\n }\n if (handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const proposed = scale(clamp(targetRelative, 0, 1), 0, 1, this.min, this.max);\n const clamped = clamp(proposed, lo, hi);\n const q = this.#quantise(clamped);\n if (q === this.#poleC)\n return;\n const previous = this.#poles();\n this.#poleC = q;\n this.#syncPoleProperties();\n this.#isUserInteraction = true;\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n `c`,\n );\n return;\n }\n\n this.#setDualOrTripleValueFromRelative(clamp(targetRelative, 0, 1), handle, true);\n }\n\n // ─── Wheel interaction ──────────────────────────────────────────────\n // The WheelNudgeMixin installs a host-level `wheel` listener; this method is\n // called once per handled tick with the resolved direction.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n // Resolve target handle from event target, falling back to last-interacted.\n let handle: SliderHandleKey = this.#lastInteractedHandle;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n const current = handle === `a`\n ? this.#poleA\n : handle === `b`\n ? this.#poleB\n : (this.#poleC ?? this.#low());\n const currentRel = valueToRelative(current, this.min, this.max);\n // Negate the direction so \"wheel forward\" always increases the value,\n // regardless of the platform's deltaY convention (Windows reports\n // deltaY < 0 for forward, Mac natural-scrolling reports deltaY > 0).\n // Shift narrows the step but doesn't change polarity.\n const targetRel = clamp(currentRel - direction * effectiveStep / range, 0, 1);\n\n this.#stepHandleByRelativeDelta(handle, targetRel);\n }\n\n #onFocusIn = (event: FocusEvent): void => {\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n this.#lastInteractedHandle = h;\n }\n }\n };\n\n // ─── Rendering ──────────────────────────────────────────────────────\n #viewBox(): string {\n if (this.orientation === `horizontal`)\n return `0 0 ${LONG} ${CROSS}`;\n return `0 0 ${CROSS} ${LONG}`;\n }\n\n #renderTrack() {\n const isVertical = this.orientation === `vertical`;\n const strokeWidth = this.#getCssVar(`--track-width`, 2);\n const color = this.#getCssVarColor(`--track-color`, `var(--surface-4)`);\n const fill = this.#getCssVarColor(`--track-fill`, `transparent`);\n\n if (isVertical) {\n return svg`\n <rect\n class=\"track\"\n x=\"${CROSS / 2 - strokeWidth / 2}\"\n y=\"${INSET}\"\n width=\"${strokeWidth}\"\n height=\"${LONG - 2 * INSET}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n return svg`\n <rect\n class=\"track\"\n x=\"${INSET}\"\n y=\"${CROSS / 2 - strokeWidth / 2}\"\n width=\"${LONG - 2 * INSET}\"\n height=\"${strokeWidth}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n\n #getCssVarColor(name: string, fallback: string): string {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n return val || fallback;\n }\n\n #renderLane(lane: SliderLaneData) {\n const bounds = getTrackBounds(this.orientation);\n let path = ``;\n\n if (lane.type === `fixed`) {\n const start = this.orientation === `horizontal`\n ? { x: bounds.trackStart, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackStart };\n const end = this.orientation === `horizontal`\n ? { x: bounds.trackEnd, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackEnd };\n path = generateLinePath(start, end);\n } else if (lane.type === `anchored`) {\n const rel = this.#getRelativeValueA();\n const seg = getAnchoredSegment(rel, lane.value ?? 0.1, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n } else {\n // 'value' lane: from valueMin to valueMax.\n const lo = lane.valueMin ?? 0;\n const hi = lane.valueMax ?? 0;\n const seg = getValueSegment(lo, hi, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n }\n\n if (!path)\n return svg``;\n\n const offset = lane.offset;\n const w = this.orientation === `horizontal`\n ? `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`\n : `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`;\n const transform = this.orientation === `horizontal`\n ? `translateY(${offset * CROSS / 2}px)`\n : `translateX(${offset * CROSS / 2}px)`;\n\n return svg`\n <path\n class=\"lane\"\n data-lane-key=\"${lane.key}\"\n part=\"lane lane-${lane.key}\"\n d=\"${path}\"\n style=\"\n stroke-width: ${w};\n stroke-linecap: round;\n transform: ${transform};\n \"\n />\n `;\n }\n\n #renderValueMarker(handle: SliderHandleKey | undefined, defs: unknown[]) {\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n\n let value: number;\n if (this.valueMode === `single`) {\n value = this.#getRelativeValueA();\n } else {\n if (handle === `a`)\n value = this.#getRelativeValueA();\n else if (handle === `b`)\n value = this.#getRelativeValueB();\n else value = this.#getRelativeValueC();\n }\n\n const pos = valueToPosition(value, this.singleStyle, bounds, this.orientation);\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 0);\n const markerLength = this.#getCssVar(`--marker-length`, 0.8);\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n\n const center = isHorizontal\n ? { x: pos.x, y: bounds.crossCentre + markerOffset * (CROSS / 2) }\n : { x: bounds.crossCentre + markerOffset * (CROSS / 2), y: pos.y };\n\n // For unipolar, the value bar is symmetric around the track centre, so\n // the \"low end\" is the reflection of the high end across the centre.\n const isUnipolarSingle = this.valueMode === `single` && this.singleStyle === `unipolar`;\n const lowCenter = isUnipolarSingle\n ? (isHorizontal\n ? { x: 2 * bounds.centre - center.x, y: center.y }\n : { x: center.x, y: 2 * bounds.centre - center.y })\n : undefined;\n\n const id = handle ?? `s`;\n\n // Per-handle marker-style override: in triple mode the C handle can\n // take a different shape than the global `markerStyle` applied to A/B.\n const effectiveMarkerStyle = handle === `c` && this.markerStyleC\n ? this.markerStyleC\n : this.markerStyle;\n\n if (effectiveMarkerStyle === `dot`) {\n const r = markerThickness * (CROSS / 2);\n const renderDot = (cx: number, cy: number, mid: string) => {\n if (markerBorderWidth > 0) {\n defs.push(svg`<circle id=\"dot-${mid}-path\" cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`);\n return svg`\n <use href=\"#dot-${mid}-path\" class=\"marker-border\" />\n <use href=\"#dot-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`;\n };\n\n const high = renderDot(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderDot(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `needle`) {\n const halfLen = (markerLength * CROSS) / 4;\n // Draw perpendicular to the track\n const renderNeedle = (cx: number, cy: number, mid: string) => {\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: cx, y: cy - halfLen };\n end = { x: cx, y: cy + halfLen };\n } else {\n start = { x: cx - halfLen, y: cy };\n end = { x: cx + halfLen, y: cy };\n }\n const path = `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<path id=\"needle-${mid}-path\" d=\"${path}\" />`);\n return svg`\n <use href=\"#needle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#needle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<path d=\"${path}\" stroke-linecap=\"round\" />`;\n };\n\n const high = renderNeedle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderNeedle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `triangle`) {\n // Apex sits on the value-track centreline at `center`; base sits\n // perpendicular to the track, offset *outward* by markerLength so the\n // shape hangs outside the value band with its point facing in.\n const halfLen = (markerLength * CROSS) / 4;\n const halfBase = markerThickness * (CROSS / 2);\n const renderTriangle = (cx: number, cy: number, mid: string) => {\n let apex: Point;\n let base1: Point;\n let base2: Point;\n if (isHorizontal) {\n apex = { x: cx, y: cy };\n base1 = { x: cx - halfBase, y: cy + halfLen };\n base2 = { x: cx + halfBase, y: cy + halfLen };\n } else {\n apex = { x: cx, y: cy };\n base1 = { x: cx + halfLen, y: cy - halfBase };\n base2 = { x: cx + halfLen, y: cy + halfBase };\n }\n const points = `${apex.x},${apex.y} ${base1.x},${base1.y} ${base2.x},${base2.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<polygon id=\"triangle-${mid}-path\" points=\"${points}\" />`);\n return svg`\n <use href=\"#triangle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#triangle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<polygon points=\"${points}\" />`;\n };\n\n const high = renderTriangle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderTriangle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n return svg``;\n }\n\n #renderMidpointMarker() {\n if (this.valueMode !== `single`)\n return svg``;\n if (this.singleStyle !== `bipolar` && this.singleStyle !== `unipolar`)\n return svg``;\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const halfLen = (length * CROSS) / 4;\n\n const center = isHorizontal\n ? { x: bounds.centre, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.centre };\n\n if (this.markerStyle === `dot`) {\n const size = this.#getCssVar(`--midpoint-thickness`, 0.08);\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <circle cx=\"${center.x}\" cy=\"${center.y}\" r=\"${size * (CROSS / 2)}\" />\n </g>\n `;\n }\n\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: center.x, y: center.y - halfLen };\n end = { x: center.x, y: center.y + halfLen };\n } else {\n start = { x: center.x - halfLen, y: center.y };\n end = { x: center.x + halfLen, y: center.y };\n }\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\" />\n </g>\n `;\n }\n\n #renderHandleGroup(handle: SliderHandleKey | undefined, content: unknown) {\n if (!handle) {\n // Single-mode: don't put tabindex on the `<g>`. The SVG itself is the\n // focusable element (see render()), so the host is tab-reachable and\n // the SVG-level keydown handler fires.\n return svg`<g role=\"slider\"\n class=\"value-marker\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${this.valueA}\"\n part=\"value-marker\">${content}</g>`;\n }\n const partName = `value-marker value-marker-${handle}`;\n const value = handle === `a`\n ? this.valueA\n : handle === `b`\n ? this.valueB\n : (this.valueC ?? (this.#poleA + this.#poleB) / 2);\n // Multi-handle: each handle is its own focusable group so Tab moves\n // between them independently.\n return svg`<g tabindex=\"${this.disabled ? -1 : 0}\" role=\"slider\"\n class=\"value-marker\"\n data-handle=\"${handle}\"\n aria-label=\"${handle}\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${value}\"\n part=\"${partName}\">${content}</g>`;\n }\n\n #isMultiHandle(): boolean {\n return this.valueMode !== `single`;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Sync internal poles from public properties\n if (changed.has(`valueA`) || changed.has(`valueB`) || !this.hasUpdated) {\n this.#poleA = this.valueA;\n this.#poleB = this.valueB;\n }\n\n // Initial / mode-change valueC defaulting\n if (this.valueMode === `triple`) {\n if (\n this.valueC === undefined\n || !this.#hasInitialisedValueC\n || changed.has(`valueMode`)\n ) {\n this.#poleC = (this.#poleA + this.#poleB) / 2;\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n } else {\n this.#poleC = this.valueC;\n }\n // Clamp C to [low, high]\n const lo = Math.min(this.#poleA, this.#poleB);\n const hi = Math.max(this.#poleA, this.#poleB);\n if (this.#poleC < lo)\n this.#poleC = lo;\n if (this.#poleC > hi)\n this.#poleC = hi;\n this.valueC = this.#poleC;\n } else {\n this.#poleC = undefined;\n }\n\n // Sync value lane before render\n if (\n changed.has(`valueA`)\n || changed.has(`valueB`)\n || changed.has(`valueMode`)\n || changed.has(`singleStyle`)\n || !this.hasUpdated\n ) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n if (this.valueMode === `single`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n } else {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n }\n }\n }\n\n /**\n * Sync the default 'value' lane's valueMin/valueMax for single-mode single-styles.\n * Range: bar from trackStart to value.\n * Bipolar: bar grows from track centre outward to value (or value to centre if below midpoint).\n * Unipolar: bar is centred on the track centre with length proportional to value.\n */\n #applySingleStyleValueLane(valueLane: SliderLaneData, relativeValue: number): void {\n if (this.singleStyle === `bipolar`) {\n valueLane.valueMin = Math.min(0.5, relativeValue);\n valueLane.valueMax = Math.max(0.5, relativeValue);\n } else {\n valueLane.valueMin = 0;\n valueLane.valueMax = relativeValue;\n }\n }\n\n override render(): unknown {\n const lanes = Array.from(this.#lanes.values());\n\n // Initial cursor before the first pointermove arrives. The dynamic\n // cursor (#onPointerMoveCursor) takes over as soon as the user moves\n // the pointer. In single mode the default `pointer` matches \"click to\n // set\"; in multi mode `default` matches \"no implicit interaction for\n // arbitrary track positions\".\n const cursor = this.disabled\n ? `not-allowed`\n : this.valueMode === `single`\n ? `pointer`\n : `default`;\n\n const handles: SliderHandleKey[] = this.#isMultiHandle()\n ? (this.valueMode === `triple` ? [`a`, `b`, `c`] : [`a`, `b`])\n : [];\n\n // Halo shapes for --marker-border-width>0 are pushed here so they end up\n // inside a single root <defs>, matching radial-input's pattern.\n // Compute marker content first so the defs list is populated, then\n // reference both in the template below.\n const markerDefs: unknown[] = [];\n const handleGroups = this.#isMultiHandle()\n ? handles.map(h => this.#renderHandleGroup(h, this.#renderValueMarker(h, markerDefs)))\n : this.#renderHandleGroup(undefined, this.#renderValueMarker(undefined, markerDefs));\n\n return html`\n <svg\n class=\"slider-svg\"\n viewBox=\"${this.#viewBox()}\"\n preserveAspectRatio=\"none\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n style=\"cursor: ${cursor}; width: 100%; height: 100%;\"\n @pointerdown=\"${this.#onPointerDown}\"\n @pointermove=\"${this.#onPointerMoveCursor}\"\n @pointerleave=\"${this.#onPointerLeaveCursor}\"\n @keydown=\"${this.#onKeyDown}\"\n @focusin=\"${this.#onFocusIn}\"\n >\n ${markerDefs.length > 0 ? svg`<defs>${markerDefs}</defs>` : svg``}\n ${this.#renderTrack()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${handleGroups}\n </svg>\n `;\n }\n\n /**\n * Compute the cursor for the current pointer position. The mapping:\n * - `grab` over a marker handle (single A, or multi A/B/C)\n * - `move` over a draggable segment (between A and B when value-drag is on)\n * - `pointer` over empty track where clicking sets a value (single mode,\n * or the dead zones outside A/B in multi mode)\n * - `default` over no-op segments (between A and B in dual mode when\n * value-drag is none, or between A-C/C-B in triple when value-drag is none)\n * - `not-allowed` when disabled\n *\n * `relativeValue` is in the host's long-axis space (0 = start, 1 = end,\n * already flipped for vertical). For unipolar single mode, the value\n * bar's marker positions are computed in the same space; the abs(2x-1)\n * remap only applies when setting the value on click/drag.\n */\n #cursorAtRelative(relativeValue: number): string {\n if (this.disabled)\n return `not-allowed`;\n if (this.#dragging)\n return `grabbing`;\n\n const HANDLE_HIT = 0.06;\n\n if (this.valueMode === `single`) {\n if (this.singleStyle === `unipolar`) {\n // In unipolar the bar is symmetric around the track centre; the\n // value bar's two ends sit at `0.5 ± value/2`.\n const halfLen = this.#getRelativeValueA() / 2;\n const low = 0.5 - halfLen;\n const high = 0.5 + halfLen;\n if (\n Math.abs(relativeValue - low) < HANDLE_HIT\n || Math.abs(relativeValue - high) < HANDLE_HIT\n ) {\n return `grab`;\n }\n return `pointer`;\n }\n const aRel = this.#getRelativeValueA();\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT) {\n return `grab`;\n }\n return `pointer`;\n }\n\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n\n // Over a handle: grab\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT)\n return `grab`;\n if (Math.abs(relativeValue - bRel) < HANDLE_HIT)\n return `grab`;\n if (this.valueMode === `triple`) {\n const cRel = this.#getRelativeValueC();\n if (Math.abs(relativeValue - cRel) < HANDLE_HIT)\n return `grab`;\n }\n\n // Inside the segment between A and B\n if (relativeValue > lo && relativeValue < hi) {\n return this.valueDrag !== `none` ? `move` : `default`;\n }\n\n // Outside A/B (dead zone) — clicking here jumps A or B to that position\n return `pointer`;\n }\n\n #onPointerMoveCursor = (event: PointerEvent): void => {\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n this.#lastPointerClient = { x: event.clientX, y: event.clientY };\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n // For vertical, top of host = high value, so flip the relative value.\n // Unipolar click mapping is NOT applied here — it's only for click-to-set;\n // the cursor needs the host-relative position to find the markers.\n const relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n const cursor = this.#cursorAtRelative(relativeValue);\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n #onPointerLeaveCursor = (): void => {\n // Reset to the default cursor (whatever the host sets) when the pointer\n // leaves the slider area, so the cursor doesn't stay stuck on `grab` etc.\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n const cursor = this.disabled ? `not-allowed` : `default`;\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --value-relative / min/max/c CSS variables unconditionally\n if (this.valueMode === `single`) {\n this.style.setProperty(`--value-relative`, this.#getRelativeValueA().toString());\n } else {\n const lo = valueToRelative(this.#low(), this.min, this.max);\n const hi = valueToRelative(this.#high(), this.min, this.max);\n this.style.setProperty(`--value-min-relative`, lo.toString());\n this.style.setProperty(`--value-max-relative`, hi.toString());\n this.style.setProperty(`--value-relative`, hi.toString());\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.style.setProperty(`--value-c-relative`, valueToRelative(this.#poleC, this.min, this.max).toString());\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this.#onHostKeyDown);\n this.#gradientObserver?.disconnect();\n this.#gradientObserver = undefined;\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n this.#changeDebounceTimer = undefined;\n }\n this.#onPointerUp();\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 200px;\n height: 24px;\n touch-action: none;\n user-select: none;\n tabindex: 0;\n --value-relative: 0;\n --value-min-relative: 0;\n --value-max-relative: 0;\n --value-c-relative: 0;\n\n --lane-width: 0.16;\n --lane-track-width: 0.08;\n --lane-value-width: 0.12;\n }\n\n :host([orientation=\"vertical\"]) {\n width: 24px;\n height: 200px;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n :host {\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n svg.slider-svg {\n width: 100%;\n height: 100%;\n outline: none;\n overflow: visible;\n }\n\n svg.slider-svg:focus {\n outline: none;\n }\n\n svg.slider-svg:focus-visible,\n :host(:focus-visible) svg.slider-svg {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n .track {\n stroke: var(--track-color, var(--surface-4));\n stroke-width: var(--track-width, 2);\n }\n\n .lane {\n fill: none;\n stroke-linecap: round;\n stroke-dasharray: var(--lane-dasharray, none);\n stroke-dashoffset: var(--lane-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .lane[data-lane-key='track'] {\n stroke: var(--lane-track-color, var(--surface-4));\n }\n\n .lane[data-lane-key='value'] {\n stroke: var(--lane-value-color, var(--accent));\n }\n\n .lane:not([data-lane-key='track']):not([data-lane-key='value']) {\n stroke: var(--lane-color, var(--accent));\n }\n\n .value-marker > path:not(.marker-border):not(.marker-fill),\n .value-marker > .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n stroke-linecap: round;\n stroke-dasharray: var(--marker-dasharray, none);\n stroke-dashoffset: var(--marker-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker > .marker-border {\n stroke: var(--marker-border-color, transparent);\n stroke-width: calc((var(--marker-thickness, 0.15) + var(--marker-border-width, 0) * 2) * 12px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-fill,\n .value-marker circle,\n .value-marker polygon {\n fill: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n }\n\n .value-marker[data-handle=\"a\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"a\"] > .marker-fill,\n .value-marker[data-handle=\"a\"] > circle,\n .value-marker[data-handle=\"a\"] > polygon {\n stroke: var(--marker-a-color, var(--marker-color, var(--accent)));\n fill: var(--marker-a-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"b\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"b\"] > .marker-fill,\n .value-marker[data-handle=\"b\"] > circle,\n .value-marker[data-handle=\"b\"] > polygon {\n stroke: var(--marker-b-color, var(--marker-color, var(--accent)));\n fill: var(--marker-b-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"c\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"c\"] > .marker-fill,\n .value-marker[data-handle=\"c\"] > circle,\n .value-marker[data-handle=\"c\"] > polygon {\n stroke: var(--marker-c-color, var(--marker-color, var(--accent)));\n fill: var(--marker-c-color, var(--marker-color, var(--accent)));\n }\n\n .midpoint-marker line {\n stroke: var(--midpoint-color, var(--surface-muted-text));\n stroke-width: var(--midpoint-thickness, 1px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .midpoint-marker circle {\n fill: var(--midpoint-color, var(--surface-muted-text));\n stroke: var(--midpoint-border-color, transparent);\n stroke-width: var(--midpoint-border-width, 0);\n vector-effect: non-scaling-stroke;\n }\n `];\n}\n\n// ─── Tag-name registration ───────────────────────────────────────────\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-slider-input': SliderInputElement;\n }\n}\n\n// ─── Module-scope interface merge (typed addEventListener) ─────────────\nexport interface SliderInputElement {\n addEventListener: (<K extends keyof SliderInputElementEventMap>(\n type: K,\n listener: (this: SliderInputElement, event: SliderInputElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slider-input-CzmSVgm7.js","names":["#onKeyDown","#ensureUserGradientDefs","#lastInteractedHandle","#dragHandle","#setSingleValueFromRelative","#dragging","#activePointerId","#dragStartClientPos","#poleValueAtDragStart","#onPointerMove","#onPointerUp","#getRelativeValueA","#getRelativeValueB","#poleA","#poleB","#getRelativeValueC","#lowKey","#highKey","#lengthDragStart","#lengthDragLowKey","#lengthDragHighKey","#lengthDragLength","#lengthDragStartLow","#lengthDragStartRelative","#setDualOrTripleValueFromRelative","#applyLengthDragFromRelative","#onPointerMoveCursor","#lastPointerClient","#poleC","#low","#stepHandleByRelativeDelta","#cursorAtRelative","#lanes","#onHostKeyDown","#syncGradientDefs","#gradientObserver","#userGradientDefs","#quantise","#isUserInteraction","#applySingleStyleValueLane","#emitInputAndChange","#resolvePoleChange","#poles","#syncPoleProperties","#detectChanged","#high","#hasInitialisedValueC","#getEffectiveValueMin","#buildInputDetail","#buildChangeDetail","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#getCssVar","#getCssVarColor","#isMultiHandle","#renderHandleGroup","#renderValueMarker","#viewBox","#onPointerDown","#onPointerLeaveCursor","#onFocusIn","#renderTrack","#renderLane","#renderMidpointMarker","customElement"],"sources":["../src/slider-input/svg-utils.ts","../src/slider-input/slider-input.ts"],"sourcesContent":["/**\n * SVG utilities for the slider-input component.\n * Linear track geometry helpers (mirrors radial-input's svg-utils for arc maths).\n */\n\nimport type { SliderOrientation, SliderSingleStyle } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Track geometry in viewBox units.\n * Horizontal: trackStart = track-INSET, trackEnd = 100 - INSET (along x).\n * Vertical: trackStart = INSET, trackEnd = 100 - INSET (along y, top = high).\n */\nexport interface TrackBounds {\n trackStart: number;\n trackEnd: number;\n /** Centre along the long axis. */\n centre: number;\n /** Centre along the cross axis (always 100/2 = 50 here, but kept for symmetry). */\n crossCentre: number;\n}\n\nexport const INSET = 5;\nexport const LONG = 100;\nexport const CROSS = 24;\n\n/**\n * Get the track bounds in viewBox units for a given orientation.\n */\nexport function getTrackBounds(orientation: SliderOrientation): TrackBounds {\n if (orientation === `horizontal`) {\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n }\n // Vertical: viewBox is 0 0 CROSS LONG; the track runs along the y axis from\n // INSET to LONG-INSET. `centre` is the middle of the long (y) axis; the\n // `crossCentre` is the middle of the cross (x) axis.\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n}\n\n/**\n * Map a relative value (0..1) to a leader point on the track for the given\n * orientation and single-style.\n *\n * Range: grows from trackStart to trackEnd.\n * Bipolar: track centre is 0.5; values spread from centre outward.\n * Unipolar: spread symmetrically around centre.\n *\n * For vertical orientation, higher values are toward the top of the track,\n * matching the spec (\"higher values → top of track\").\n */\nexport function valueToPosition(\n relativeValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): Point {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n\n let pos: number;\n if (singleStyle === `range`) {\n pos = trackBounds.trackStart + relativeValue * span;\n } else if (singleStyle === `bipolar`) {\n // Mid (0.5) -> centre; <0.5 below centre, >0.5 above.\n if (relativeValue <= 0.5) {\n const t = relativeValue / 0.5;\n pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);\n } else {\n const t = (relativeValue - 0.5) / 0.5;\n pos = centre + t * (trackBounds.trackEnd - centre);\n }\n } else {\n // unipolar: spread symmetrically around centre\n const halfLen = (relativeValue * span) / 2;\n pos = centre + halfLen;\n }\n\n if (orientation === `horizontal`) {\n return { x: pos, y: crossCentre };\n }\n // Vertical: higher values toward top (smaller y). `pos` is a value along the\n // long axis (0..LONG), so the SVG y coordinate (0 at top) is LONG - pos.\n return { x: crossCentre, y: LONG - pos };\n}\n\n/**\n * Get the segment endpoints for a 'value' lane. The lane is drawn from\n * the lane's lower relative value to its upper relative value.\n *\n * For 'range' and 'bipolar' styles, the endpoints are obtained by mapping\n * each value through `valueToPosition`. For 'unipolar', the bar is centred\n * on the track centre with length proportional to valueMax (valueMin is\n * ignored), matching the spec: \"spreads symmetrically around centre\".\n */\nexport function getValueSegment(\n valueMin: number,\n valueMax: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n if (singleStyle === `unipolar`) {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n const halfLen = (valueMax * span) / 2;\n if (orientation === `horizontal`) {\n return {\n start: { x: centre - halfLen, y: crossCentre },\n end: { x: centre + halfLen, y: crossCentre },\n };\n }\n // Vertical: spread the bar symmetrically around the track centre along y.\n return {\n start: { x: crossCentre, y: centre - halfLen },\n end: { x: crossCentre, y: centre + halfLen },\n };\n }\n\n return {\n start: valueToPosition(valueMin, singleStyle, trackBounds, orientation),\n end: valueToPosition(valueMax, singleStyle, trackBounds, orientation),\n };\n}\n\n/**\n * Get the segment endpoints for an 'anchored' lane. The lane is centered\n * on the current value, with length controlled by laneValue (0..1).\n */\nexport function getAnchoredSegment(\n relativeValue: number,\n laneValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const halfLen = (laneValue * span) / 2;\n\n // For unipolar, the value represents the size of a bar centred on the track\n // centre, not a spatial position. Anchor the lane to the track centre so it\n // follows the value's \"magnitude\" rather than the bar's right-end.\n // Mirrors radial-input's getAnchoredArcAngles for unipolar.\n // `centre.x` is along the track axis; `centre.y` is perpendicular. For\n // horizontal that's (LONG/2, CROSS/2); for vertical that's (CROSS/2, LONG/2).\n const centre = singleStyle === `unipolar`\n ? (orientation === `horizontal`\n ? { x: trackBounds.centre, y: trackBounds.crossCentre }\n : { x: trackBounds.crossCentre, y: trackBounds.centre })\n : valueToPosition(relativeValue, singleStyle, trackBounds, orientation);\n\n // Compute along-axis offsets\n let startPos: number;\n let endPos: number;\n if (orientation === `horizontal`) {\n startPos = centre.x - halfLen;\n endPos = centre.x + halfLen;\n } else {\n startPos = centre.y - halfLen;\n endPos = centre.y + halfLen;\n }\n\n const start = orientation === `horizontal`\n ? { x: startPos, y: centre.y }\n : { x: centre.x, y: startPos };\n const end = orientation === `horizontal`\n ? { x: endPos, y: centre.y }\n : { x: centre.x, y: endPos };\n return { start, end };\n}\n\n/**\n * Generate an SVG path string for a straight line. Returns '' for a\n * zero-length segment (start ≈ end), mirroring the radial-input arc\n * helper's edge case.\n */\nexport function generateLinePath(start: Point, end: Point): string {\n if (Math.abs(start.x - end.x) < 0.001 && Math.abs(start.y - end.y) < 0.001) {\n return ``;\n }\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n}\n\n/**\n * Generate a closed SVG `<path>` for a filled rectangle (used for filled\n * lane segments). `halfWidth` is the perpendicular half-thickness; `perpOffset`\n * shifts the rect perpendicularly from the track centreline.\n */\nexport function generateRectPath(\n start: Point,\n end: Point,\n halfWidth: number,\n perpOffset: number,\n orientation: SliderOrientation,\n): string {\n // Direction vector along the track\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001)\n return ``;\n\n // Unit perpendicular\n const perpX = -dy / len;\n const perpY = dx / len;\n\n // Inset corners slightly so the rect's ends don't extend past the start/end\n const insetX = (dx / len) * halfWidth;\n const insetY = (dy / len) * halfWidth;\n\n const sIn = { x: start.x + insetX, y: start.y + insetY };\n const eIn = { x: end.x - insetX, y: end.y - insetY };\n\n const c1 = { x: sIn.x + perpX * (halfWidth + perpOffset), y: sIn.y + perpY * (halfWidth + perpOffset) };\n const c2 = { x: eIn.x + perpX * (halfWidth + perpOffset), y: eIn.y + perpY * (halfWidth + perpOffset) };\n const c3 = { x: eIn.x + perpX * (-halfWidth + perpOffset), y: eIn.y + perpY * (-halfWidth + perpOffset) };\n const c4 = { x: sIn.x + perpX * (-halfWidth + perpOffset), y: sIn.y + perpY * (-halfWidth + perpOffset) };\n\n // Silence unused-orientation warning — kept for API parity\n void orientation;\n\n return `M ${c1.x} ${c1.y} L ${c2.x} ${c2.y} L ${c3.x} ${c3.y} L ${c4.x} ${c4.y} Z`;\n}\n\n/**\n * Clamp `value` to the [min, max] range.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Linear-reinterpolate `value` from [fromMin, fromMax] to [toMin, toMax].\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n if (fromMax === fromMin)\n return toMin;\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n\n/**\n * Convert a relative value (0..1) to an absolute value in the min..max range.\n */\nexport function relativeToValue(\n relativeValue: number,\n min: number,\n max: number,\n): number {\n return scale(relativeValue, 0, 1, min, max);\n}\n\n/**\n * Convert an absolute value to a relative (0..1) position.\n */\nexport function valueToRelative(\n value: number,\n min: number,\n max: number,\n): number {\n return scale(value, min, max, 0, 1);\n}\n\n/**\n * Convert a pointer client position (clientX or clientY depending on\n * orientation) to a relative value (0..1) given the host element's\n * bounding rect on the long axis.\n */\nexport function clientPosToRelative(\n clientPos: number,\n hostStart: number,\n hostSize: number,\n): number {\n if (hostSize <= 0)\n return 0;\n return clamp((clientPos - hostStart) / hostSize, 0, 1);\n}\n\n/**\n * Inverse: relative value (0..1) → client position offset from host start.\n */\nexport function relativeToClientPos(\n relativeValue: number,\n hostStart: number,\n hostSize: number,\n): number {\n return hostStart + relativeValue * hostSize;\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-slider-input> — linear SVG-based slider.\n *\n * Mirrors `ixfx-radial-input` as closely as possible, swapping arc geometry\n * for a linear track. Supports horizontal and vertical orientations, three\n * value modes (single/dual/triple), triple-segment \"value\" lanes, and\n * `value-drag` length-drag gestures for dual/triple modes.\n *\n * Attributes / properties\n * value-a, value-b, value-c — primary/secondary/tertiary handle values\n * min, max — value range\n * step, stops — keyboard/wheel/pointer step resolution\n * value-mode — 'single' | 'dual' | 'triple'\n * single-style — 'range' | 'bipolar' | 'unipolar' (single mode only)\n * orientation — 'horizontal' | 'vertical'\n * marker-style — 'needle' | 'dot' | 'none'\n * crossover — 'none' | 'allow' (dual/triple modes)\n * value-drag — 'none' | 'stop' | 'flex' (dual/triple modes)\n * value-min — minimum gap between A and B (dual/triple modes)\n * disabled — boolean\n * lighttouch — boolean — wheel adjusts value on hover instead of requiring focus\n *\n * Events\n * input — fires continuously during user interaction\n * change — debounced 150ms after interaction; immediate for programmatic\n *\n * Mouse wheel (via WheelNudgeMixin): up = increase, down = decrease. In multi-handle\n * modes wheel targets the last-interacted-with handle (focus or pointerdown).\n * Shift+wheel halves the step. See docs/infra-mousewheel.md.\n */\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { Point } from './svg-utils.js';\nimport type {\n SliderChangedField,\n SliderCrossover,\n SliderHandleKey,\n SliderInputChangeDetail,\n SliderInputElementEventMap,\n SliderInputInputDetail,\n SliderLaneData,\n SliderLaneType,\n SliderMarkerStyle,\n SliderOrientation,\n SliderSingleStyle,\n SliderValueCFollow,\n SliderValueDrag,\n SliderValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { resolveAxisStep } from '../keyboard.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport {\n clamp,\n clientPosToRelative,\n CROSS,\n generateLinePath,\n getAnchoredSegment,\n getTrackBounds,\n getValueSegment,\n INSET,\n LONG,\n scale,\n valueToPosition,\n valueToRelative,\n} from './svg-utils.js';\n\nconst HANDLE_HIT_RADIUS = 0.06;\nconst DEFAULT_VALUE_MIN_FRACTION = 0.01;\nconst CHANGE_DEBOUNCE_MS = 150;\n\n@customElement(`ixfx-slider-input`)\nexport class SliderInputElement extends WheelNudgeMixin(LitElement) {\n // ─── Public properties ───────────────────────────────────────────────\n @property({ type: Number, attribute: `value-a` })\n valueA = 50;\n\n @property({ type: Number, attribute: `value-b` })\n valueB = 0;\n\n /**\n * Triple-mode middle handle. `undefined` until first willUpdate, then\n * defaulted to the midpoint of valueA/valueB (matching radial-input's\n * deferred lane-correction pattern).\n */\n @property({ type: Number, attribute: `value-c` })\n valueC: number | undefined = undefined;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n step: number | undefined = undefined;\n\n @property({ type: Number })\n stops: number | undefined = undefined;\n\n @property({ type: String, attribute: `value-mode` })\n valueMode: SliderValueMode = `single`;\n\n @property({ type: String, attribute: `single-style` })\n singleStyle: SliderSingleStyle = `range`;\n\n @property({ type: String })\n orientation: SliderOrientation = `horizontal`;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: SliderMarkerStyle = `needle`;\n\n /**\n * Optional marker-style override for the C handle in triple mode. Lets\n * consumers give C a different shape (e.g. dot) from the global\n * `markerStyle` applied to A/B.\n */\n @property({ type: String, attribute: `marker-style-c` })\n markerStyleC: SliderMarkerStyle | undefined = undefined;\n\n @property({ type: String })\n crossover: SliderCrossover = `allow`;\n\n @property({ type: String, attribute: `value-drag` })\n valueDrag: SliderValueDrag = `none`;\n\n /**\n * In triple mode, how the C handle reacts when A or B moves the [A, B]\n * band. `none` (default): C keeps its value unless pushed outside the\n * new band. `proportional`: C is re-anchored at the same fractional\n * position it had within the *old* band, so it moves with A/B.\n */\n @property({ type: String, attribute: `value-c-follow` })\n valueCFollow: SliderValueCFollow = `none`;\n\n @property({ type: Number, attribute: `value-min` })\n valueMin = 1;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // ─── Internal state ──────────────────────────────────────────────────\n #lanes: Map<string, SliderLaneData> = new Map();\n\n /** Raw pole values: independent of which is \"low\" or \"high\". */\n #poleA = 50;\n #poleB = 0;\n #poleC: number | undefined = undefined;\n\n #dragging = false;\n /** Pointer ID being tracked (fixes radial-input's hardcoded pointerId). */\n #activePointerId: number | undefined = undefined;\n #dragStartClientPos = 0;\n #poleValueAtDragStart = 0;\n /** Which handle is currently being dragged, or 'length' for segment drag. */\n #dragHandle: SliderHandleKey | `length` | undefined = undefined;\n /** Snapshotted poles at length-drag start. */\n #lengthDragStart: { poleA: number; poleB: number } | undefined = undefined;\n /** Track the low/high identity at length-drag start (so we know which raw pole gets which end). */\n #lengthDragLowKey: SliderHandleKey | undefined = undefined;\n #lengthDragHighKey: SliderHandleKey | undefined = undefined;\n #lengthDragLength = 0;\n #lengthDragStartLow = 0;\n /**\n * Where the pointer was when the length drag began (in host-relative\n * 0..1 terms). Preserves the grab offset so dragging the bar doesn't snap\n * its low edge under the cursor.\n */\n #lengthDragStartRelative = 0;\n\n /** The handle that last received direct interaction (pointerdown/keydown/wheel/focus). */\n #lastInteractedHandle: SliderHandleKey = `a`;\n\n /**\n * Last pointer client position seen by #onPointerMoveCursor, used to\n * recompute the cursor after a drag ends (without waiting for a fresh\n * pointermove).\n */\n #lastPointerClient = { x: 0, y: 0 };\n\n #changeDebounceTimer: number | undefined = undefined;\n #isUserInteraction = false;\n #hasInitialisedValueC = false;\n\n /**\n * Holds `<linearGradient>`/`<radialGradient>` elements authored as light-DOM\n * children of this element, once relocated into the shadow root (see\n * `#syncGradientDefs`). Lets consumers reference `url(#id)` paint servers\n * from `--lane-*-color` / `--track-color` etc. — CSS custom properties\n * pierce the shadow boundary, but `url(#id)` paint-server *resolution* does\n * not, so the gradient definitions themselves must physically live inside\n * this element's shadow root to be resolvable by lanes/track painted there.\n */\n #userGradientDefs: SVGDefsElement | undefined;\n #gradientObserver: MutationObserver | undefined;\n\n // ─── Construction ───────────────────────────────────────────────────\n constructor() {\n super();\n // Make the host focusable so users can Tab to the slider. The actual\n // focus indicator + keyboard listener are on the inner <svg> (which\n // sits inside the shadow DOM), but the host needs an HTML tabindex\n // attribute to be reachable from the document's tab order.\n if (!this.disabled) {\n this.setAttribute(`tabindex`, `0`);\n }\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1,\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n valueMin: 0,\n valueMax: 0,\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`tabindex`, this.disabled ? `-1` : `0`);\n // Listen for keydown on the host itself (in addition to the SVG in\n // shadow DOM) so the keyboard handler fires when the host has focus\n // from Tab navigation. The host is the focusable element (via its\n // tabindex attribute set in the constructor); events fired while the\n // host is focused don't reach the inner <svg>'s lit listener.\n this.addEventListener(`keydown`, this.#onHostKeyDown as EventListener);\n this.#syncGradientDefs();\n this.#gradientObserver = new MutationObserver(this.#syncGradientDefs);\n this.#gradientObserver.observe(this, { childList: true, subtree: true });\n }\n\n #onHostKeyDown = (event: KeyboardEvent): void => {\n this.#onKeyDown(event);\n };\n\n // ─── Gradient defs relocation ───────────────────────────────────────\n /**\n * Lazily creates the inert `<svg><defs>` carrier that user-authored\n * gradients get moved into. Kept entirely outside Lit's managed template —\n * it's a plain sibling of the interactive `<svg class=\"slider-svg\">` inside\n * the shadow root, so `url(#id)` references from lane/track paint\n * properties resolve against it regardless of render() re-runs.\n */\n #ensureUserGradientDefs(): SVGDefsElement {\n if (this.#userGradientDefs)\n return this.#userGradientDefs;\n const svgNs = `http://www.w3.org/2000/svg`;\n const carrier = document.createElementNS(svgNs, `svg`);\n carrier.setAttribute(`width`, `0`);\n carrier.setAttribute(`height`, `0`);\n carrier.setAttribute(`aria-hidden`, `true`);\n // Inline (not classed) so no shadow stylesheet rule — including a broad\n // `svg { width: 100%; ... }` selector — can ever stretch this carrier\n // into a click-blocking overlay; `:host` has no explicit `position`, so\n // an accidentally-enlarged `position: absolute` box here would escape to\n // whatever ancestor up the *light* DOM happens to be positioned.\n carrier.style.cssText = `position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none;`;\n const defs = document.createElementNS(svgNs, `defs`) as SVGDefsElement;\n carrier.append(defs);\n this.renderRoot.append(carrier);\n this.#userGradientDefs = defs;\n return defs;\n }\n\n /**\n * Moves any `<linearGradient>`/`<radialGradient>` authored as light-DOM\n * descendants of this element into the shadow root (see\n * `#ensureUserGradientDefs`). This *reparents* rather than clones the\n * nodes, so consumers get normal, live SVG paint-server semantics — e.g.\n * animating a `<stop>`'s `stop-color` \"just works\" — with no gradient\n * management on the component's part. Idempotent: once moved, a node is no\n * longer a light-DOM descendant of `this`, so it won't be found again.\n */\n #syncGradientDefs = (): void => {\n const found = this.querySelectorAll(`linearGradient, radialGradient`);\n if (found.length === 0)\n return;\n const defs = this.#ensureUserGradientDefs();\n for (const node of found) {\n defs.append(node);\n }\n };\n\n // ─── Lane management API ────────────────────────────────────────────\n addLane(\n key: string,\n options?: {\n value?: number;\n valueMin?: number;\n valueMax?: number;\n type?: SliderLaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const rel = this.#getRelativeValueA();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? rel,\n valueMin: options?.valueMin ?? 0,\n valueMax: options?.valueMax ?? rel,\n type: options?.type ?? `value`,\n offset: options?.offset ?? 0,\n width: options?.width ?? 0.1,\n });\n this.requestUpdate();\n }\n\n setLaneValue(key: string, value: number): void {\n const lane = this.#lanes.get(key);\n if (lane) {\n lane.value = clamp(value, 0, 1);\n this.requestUpdate();\n }\n }\n\n setLaneRange(key: string, valueMin: number, valueMax: number): void {\n const lane = this.#lanes.get(key);\n if (!lane)\n return;\n const lo = clamp(Math.min(valueMin, valueMax), 0, 1);\n const hi = clamp(Math.max(valueMin, valueMax), 0, 1);\n lane.valueMin = lo;\n lane.valueMax = hi;\n this.requestUpdate();\n }\n\n removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, SliderLaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): SliderLaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // ─── Derived getters ────────────────────────────────────────────────\n #getRelativeValueA(): number {\n return valueToRelative(this.valueA, this.min, this.max);\n }\n\n #getRelativeValueB(): number {\n return valueToRelative(this.valueB, this.min, this.max);\n }\n\n #getRelativeValueC(): number {\n const c = this.valueC ?? (this.#poleA + this.#poleB) / 2;\n return valueToRelative(c, this.min, this.max);\n }\n\n #low(): number {\n return Math.min(this.#poleA, this.#poleB);\n }\n\n #high(): number {\n return Math.max(this.#poleA, this.#poleB);\n }\n\n #lowKey(): SliderHandleKey {\n return this.#poleA <= this.#poleB ? `a` : `b`;\n }\n\n #highKey(): SliderHandleKey {\n return this.#poleA > this.#poleB ? `a` : `b`;\n }\n\n /**\n * Effective `valueMin` in value units between A and B. Mirrors radial-input's\n * default of 1% of max-min when the property holds the literal minimum.\n */\n #getEffectiveValueMin(): number {\n const range = this.max - this.min;\n if (this.valueMin && this.valueMin > 0)\n return this.valueMin;\n return range * DEFAULT_VALUE_MIN_FRACTION;\n }\n\n #quantise(value: number): number {\n if (this.stops && this.stops > 1) {\n const range = this.max - this.min;\n const step = range / this.stops;\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n if (this.step !== undefined && this.step > 0) {\n const snapped = Math.round((value - this.min) / this.step) * this.step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n return value;\n }\n\n // ─── Value setting ──────────────────────────────────────────────────\n #setSingleValueFromRelative(relativeValue: number, isUserInteraction = false): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clampedValue = this.#quantise(clamp(newValue, this.min, this.max));\n\n if (clampedValue === this.valueA)\n return;\n\n const previousValue = this.valueA;\n this.valueA = clampedValue;\n this.#poleA = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValueA() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n { previousValue },\n isUserInteraction,\n );\n }\n\n #setDualOrTripleValueFromRelative(\n relativeValue: number,\n handle: SliderHandleKey,\n isUserInteraction = false,\n ): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clamped = clamp(newValue, this.min, this.max);\n\n const result = this.#resolvePoleChange(handle, clamped, this.#lastInteractedHandle);\n if (!result)\n return;\n\n const previous = { ...this.#poles() };\n this.#poleA = result.poleA;\n this.#poleB = result.poleB;\n if (result.poleC !== undefined)\n this.#poleC = result.poleC;\n this.#syncPoleProperties();\n\n const changed = this.#detectChanged(previous, this.#poles());\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(valueToRelative(this.#high(), this.min, this.max) * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: Math.max(previous.poleA, previous.poleB),\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n isUserInteraction,\n changed,\n );\n }\n\n #poles(): { poleA: number; poleB: number; poleC: number | undefined } {\n return { poleA: this.#poleA, poleB: this.#poleB, poleC: this.#poleC };\n }\n\n #syncPoleProperties(): void {\n this.valueA = this.#poleA;\n this.valueB = this.#poleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n }\n }\n\n #resolvePoleChange(\n handle: SliderHandleKey,\n proposed: number,\n originalHandle: SliderHandleKey,\n ): { poleA: number; poleB: number; poleC?: number } | null {\n let poleA = this.#poleA;\n let poleB = this.#poleB;\n let poleC = this.#poleC;\n\n if (this.valueMode === `triple` && handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const clamped = clamp(proposed, lo, hi);\n const quantised = this.#quantise(clamped);\n if (quantised === this.#poleC)\n return null;\n return { poleA, poleB, poleC: quantised };\n }\n\n const gap = this.#getEffectiveValueMin();\n const other = handle === `a` ? poleB : poleA;\n\n let desired = this.#quantise(clamp(proposed, this.min, this.max));\n\n if (this.crossover === `none`) {\n // Pin to the side this handle started on relative to the other one.\n const startedLow = (handle === `a` ? poleA : poleB) <= other;\n if (startedLow) {\n desired = Math.min(desired, other - gap);\n } else {\n desired = Math.max(desired, other + gap);\n }\n } else {\n // 'allow' — snap into the forbidden band, but allow crossover beyond.\n if (desired > other - gap && desired < other + gap) {\n // Within forbidden band; snap to nearer edge.\n const distToLow = Math.abs(desired - (other - gap));\n const distToHigh = Math.abs(desired - (other + gap));\n desired = distToLow <= distToHigh ? other - gap : other + gap;\n }\n }\n\n // Final clamp to [min, max]\n desired = clamp(desired, this.min, this.max);\n\n if (handle === `a`) {\n if (desired === poleA)\n return null;\n poleA = desired;\n } else {\n if (desired === poleB)\n return null;\n poleB = desired;\n }\n\n // Triple-mode: re-anchor C relative to the new [low, high]\n if (this.valueMode === `triple` && poleC !== undefined) {\n const oldLo = Math.min(this.#poleA, this.#poleB);\n const oldHi = Math.max(this.#poleA, this.#poleB);\n const newLo = Math.min(poleA, poleB);\n const newHi = Math.max(poleA, poleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((poleC - oldLo) / (oldHi - oldLo), 0, 1);\n poleC = newLo + frac * (newHi - newLo);\n } else {\n if (poleC < newLo)\n poleC = newLo;\n if (poleC > newHi)\n poleC = newHi;\n }\n }\n\n // Avoid unused-warning for originalHandle (used in caller for tie-breaking)\n void originalHandle;\n return { poleA, poleB, poleC };\n }\n\n #detectChanged(\n prev: { poleA: number; poleB: number; poleC: number | undefined },\n curr: { poleA: number; poleB: number; poleC: number | undefined },\n ): SliderChangedField {\n const aDiff = prev.poleA !== curr.poleA;\n const bDiff = prev.poleB !== curr.poleB;\n const cDiff = prev.poleC !== curr.poleC;\n\n if (this.valueMode === `triple`) {\n if (aDiff && bDiff && !cDiff)\n return `both`;\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n if (cDiff)\n return `c`;\n return `min`;\n }\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n return `min`;\n }\n\n #emitInputAndChange(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n isUserInteraction: boolean,\n changed?: SliderChangedField,\n ): void {\n const detailInput = this.#buildInputDetail(changed);\n const detailChange = this.#buildChangeDetail(previous, changed);\n\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<SliderInputInputDetail>(`input`, {\n detail: detailInput,\n bubbles: true,\n composed: true,\n }),\n );\n this.#scheduleChangeEvent(detailChange);\n } else {\n this.#fireChangeEvent(detailChange);\n }\n }\n\n #buildInputDetail(changed?: SliderChangedField): SliderInputInputDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMinRel = valueToRelative(lo, this.min, this.max);\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n valueC: this.#poleC,\n valueCRelative: valueToRelative(this.#poleC, this.min, this.max),\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n changed,\n };\n }\n\n #buildChangeDetail(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n changed?: SliderChangedField,\n ): SliderInputChangeDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n previousValue: previous.previousValue,\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n valueC: this.#poleC,\n previousValueC: previous.previousValueC ?? this.#poleC,\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n changed,\n };\n }\n\n #scheduleChangeEvent(detail: SliderInputChangeDetail): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(detail);\n this.#changeDebounceTimer = undefined;\n }, CHANGE_DEBOUNCE_MS);\n }\n\n #fireChangeEvent(detail: SliderInputChangeDetail): void {\n this.dispatchEvent(\n new CustomEvent<SliderInputChangeDetail>(`change`, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ─── CSS-var lookup ────────────────────────────────────────────────\n #getCssVar(name: string, defaultValue: number): number {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n if (!val)\n return defaultValue;\n\n if (val.includes(`calc(`)) {\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n try {\n const fn = new Function(`return ${evalStr.replace(/calc\\s*\\(([^)]+)\\)/g, `$1`)}`);\n const result = fn();\n return typeof result === `number` && !Number.isNaN(result) ? result : defaultValue;\n } catch {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n }\n\n const parsed = Number.parseFloat(val);\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // ─── Pointer interaction ────────────────────────────────────────────\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n\n event.preventDefault();\n\n // Move focus to the host so keyboard interaction (arrows, wheel)\n // continues to work after a click/drag, and the focus indicator shows.\n this.focus();\n\n // Force the dragging cursor immediately, since the pointer may move\n // outside the SVG bounds while dragged (and #onPointerMoveCursor is\n // bound to the SVG only).\n svg.style.cursor = `grabbing`;\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n // For vertical, top of host = high value, so flip the relative value\n // (clientPosToRelative gives 0 at hostStart, 1 at hostEnd).\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n // For unipolar (single mode), the value bar is symmetric around the track\n // centre, so the click position maps to the value via a V-shape: 0 at\n // the centre, 1 at either end. Clicking 25% in from either side sets\n // the same value (0.5), as does clicking at the very start or end (1).\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n // Resolve handle\n if (this.valueMode === `single`) {\n this.#lastInteractedHandle = `a`;\n this.#dragHandle = `a`;\n this.#setSingleValueFromRelative(relativeValue, true);\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n this.#poleValueAtDragStart = this.valueA;\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n // Multi-handle: hit-test\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n const aHandle = this.#poleA <= this.#poleB ? `a` : `b`;\n const bHandle = this.#poleA > this.#poleB ? `a` : `b`;\n const posA = aRel;\n const posB = bRel;\n const isTriple = this.valueMode === `triple`;\n const cRel = isTriple ? this.#getRelativeValueC() : 0;\n const posC = cRel;\n const nearA = Math.abs(relativeValue - posA) < HANDLE_HIT_RADIUS;\n const nearB = Math.abs(relativeValue - posB) < HANDLE_HIT_RADIUS;\n const nearC = isTriple && Math.abs(relativeValue - posC) < HANDLE_HIT_RADIUS;\n\n let chosenHandle: SliderHandleKey | `length` | undefined;\n\n // When two or more handles overlap (e.g. A and C, A and B, etc.), pick\n // the one whose raw pole was NOT last-interacted, so repeated clicks\n // on a near-coincident pair alternate rather than sticking.\n const pickNonLast = (candidates: SliderHandleKey[]): SliderHandleKey => {\n const notLast = candidates.find(h => h !== this.#lastInteractedHandle);\n return notLast ?? candidates[0];\n };\n if (nearA && nearB && nearC) {\n chosenHandle = pickNonLast([aHandle, bHandle, `c`]);\n } else if (nearA && nearB) {\n chosenHandle = pickNonLast([aHandle, bHandle]);\n } else if (nearA && nearC) {\n chosenHandle = pickNonLast([aHandle, `c`]);\n } else if (nearB && nearC) {\n chosenHandle = pickNonLast([bHandle, `c`]);\n } else if (nearA) {\n chosenHandle = aHandle;\n } else if (nearB) {\n chosenHandle = bHandle;\n } else if (nearC) {\n chosenHandle = `c`;\n } else if (this.valueDrag !== `none` && relativeValue > lo && relativeValue < hi) {\n chosenHandle = `length`;\n } else if (this.valueDrag === `none` && relativeValue <= lo) {\n // Dead zone on low side — click-to-set low handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#lowKey();\n } else if (this.valueDrag === `none` && relativeValue >= hi) {\n // Dead zone on high side — click-to-set high handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#highKey();\n } else {\n // Not on a handle, not on a draggable segment, not on a click-to-set\n // dead zone (when value-drag is off). No-op — the pointer event will\n // still register and release cleanly via #onPointerUp, but no value\n // changes.\n chosenHandle = undefined;\n }\n\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n\n if (chosenHandle === undefined) {\n // Linger-as-track-click but no drag started.\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n this.#dragHandle = chosenHandle;\n\n if (chosenHandle === `length`) {\n this.#lengthDragStart = { poleA: this.#poleA, poleB: this.#poleB };\n this.#lengthDragLowKey = this.#lowKey();\n this.#lengthDragHighKey = this.#highKey();\n this.#lengthDragLength = this.#poleB - this.#poleA < 0\n ? this.#poleA - this.#poleB\n : this.#poleB - this.#poleA;\n this.#lengthDragStartLow = Math.min(this.#poleA, this.#poleB);\n // Remember where the user grabbed the bar (host-relative). Without\n // this, the low edge would jump under the cursor at drag-start.\n this.#lengthDragStartRelative = relativeValue;\n } else {\n this.#lastInteractedHandle = chosenHandle;\n this.#poleValueAtDragStart = chosenHandle === `a` ? this.#poleA : this.#poleB;\n // Click-to-set immediately\n this.#setDualOrTripleValueFromRelative(relativeValue, chosenHandle, true);\n }\n\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n #onPointerMove = (event: PointerEvent): void => {\n if (!this.#dragging)\n return;\n\n event.preventDefault();\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(relativeValue, true);\n return;\n }\n\n if (this.#dragHandle === `length`) {\n this.#applyLengthDragFromRelative(relativeValue);\n } else if (this.#dragHandle) {\n this.#setDualOrTripleValueFromRelative(relativeValue, this.#dragHandle, true);\n }\n };\n\n #applyLengthDragFromRelative(relativeValue: number): void {\n if (!this.#lengthDragStart)\n return;\n const range = this.max - this.min;\n const deltaR = relativeValue - this.#lengthDragStartRelative;\n const deltaValue = deltaR * range;\n\n let proposedLow = this.#lengthDragStartLow + deltaValue;\n let proposedHigh = proposedLow + this.#lengthDragLength;\n\n if (this.valueDrag === `stop`) {\n const originalLength = this.#lengthDragLength;\n let candidateLow = proposedLow;\n let candidateHigh = proposedLow + originalLength;\n if (candidateLow < this.min) {\n const maxDelta = this.min - this.#lengthDragStartLow;\n candidateLow = this.#lengthDragStartLow + maxDelta;\n candidateHigh = candidateLow + originalLength;\n }\n if (candidateHigh > this.max) {\n // Translate back so high sits at max.\n const shift = this.max - candidateHigh;\n candidateLow += shift;\n candidateHigh += shift;\n }\n proposedLow = candidateLow;\n proposedHigh = candidateHigh;\n } else if (this.valueDrag === `flex`) {\n proposedLow = clamp(proposedLow, this.min, this.max);\n proposedHigh = clamp(proposedHigh, this.min, this.max);\n }\n\n const lowKey = this.#lengthDragLowKey ?? this.#lowKey();\n const highKey = this.#lengthDragHighKey ?? this.#highKey();\n\n const previous = this.#poles();\n const newPoleA = lowKey === `a` ? proposedLow : proposedHigh;\n const newPoleB = lowKey === `b` ? proposedLow : proposedHigh;\n this.#poleA = newPoleA;\n this.#poleB = newPoleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n const oldLo = Math.min(previous.poleA, previous.poleB);\n const oldHi = Math.max(previous.poleA, previous.poleB);\n const newLo = Math.min(newPoleA, newPoleB);\n const newHi = Math.max(newPoleA, newPoleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((this.#poleC - oldLo) / (oldHi - oldLo), 0, 1);\n this.#poleC = newLo + frac * (newHi - newLo);\n } else {\n if (this.#poleC < newLo)\n this.#poleC = newLo;\n if (this.#poleC > newHi)\n this.#poleC = newHi;\n }\n }\n this.#syncPoleProperties();\n\n const changed: SliderChangedField = `both`;\n this.#isUserInteraction = true;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n changed,\n );\n }\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.#dragHandle = undefined;\n this.#lengthDragStart = undefined;\n this.#lengthDragLowKey = undefined;\n this.#lengthDragHighKey = undefined;\n this.toggleAttribute(`dragging`, false);\n\n // Re-evaluate cursor at the last known pointer position so the cursor\n // doesn't stay stuck at `grabbing` after release.\n this.#onPointerMoveCursor(\n new PointerEvent(`pointermove`, {\n clientX: this.#lastPointerClient.x,\n clientY: this.#lastPointerClient.y,\n }),\n );\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`);\n if (\n svg\n && this.#activePointerId !== undefined\n && `hasPointerCapture` in svg\n && typeof (svg as Element & { hasPointerCapture?: (id: number) => boolean }).hasPointerCapture === `function`\n ) {\n const has = (svg as Element & { hasPointerCapture: (id: number) => boolean }).hasPointerCapture;\n if (has.call(svg, this.#activePointerId)) {\n try {\n (svg as Element & { releasePointerCapture: (id: number) => void }).releasePointerCapture(this.#activePointerId);\n } catch {\n // ignore\n }\n }\n }\n this.#activePointerId = undefined;\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // ─── Keyboard interaction ───────────────────────────────────────────\n #onKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled)\n return;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n // Determine which handle to act on\n let handle: SliderHandleKey = `a`;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() + effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) + effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() - effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) - effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `Home`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(0, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 0);\n }\n handled = true;\n break;\n\n case `End`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(1, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 1);\n }\n handled = true;\n break;\n }\n\n if (handled)\n event.preventDefault();\n };\n\n #stepHandleByRelativeDelta(handle: SliderHandleKey, targetRelative: number): void {\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(clamp(targetRelative, 0, 1), true);\n return;\n }\n if (handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const proposed = scale(clamp(targetRelative, 0, 1), 0, 1, this.min, this.max);\n const clamped = clamp(proposed, lo, hi);\n const q = this.#quantise(clamped);\n if (q === this.#poleC)\n return;\n const previous = this.#poles();\n this.#poleC = q;\n this.#syncPoleProperties();\n this.#isUserInteraction = true;\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n `c`,\n );\n return;\n }\n\n this.#setDualOrTripleValueFromRelative(clamp(targetRelative, 0, 1), handle, true);\n }\n\n // ─── Wheel interaction ──────────────────────────────────────────────\n // The WheelNudgeMixin installs a host-level `wheel` listener; this method is\n // called once per handled tick with the resolved direction.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n // Resolve target handle from event target, falling back to last-interacted.\n let handle: SliderHandleKey = this.#lastInteractedHandle;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n const current = handle === `a`\n ? this.#poleA\n : handle === `b`\n ? this.#poleB\n : (this.#poleC ?? this.#low());\n const currentRel = valueToRelative(current, this.min, this.max);\n // Negate the direction so \"wheel forward\" always increases the value,\n // regardless of the platform's deltaY convention (Windows reports\n // deltaY < 0 for forward, Mac natural-scrolling reports deltaY > 0).\n // Shift narrows the step but doesn't change polarity.\n const targetRel = clamp(currentRel - direction * effectiveStep / range, 0, 1);\n\n this.#stepHandleByRelativeDelta(handle, targetRel);\n }\n\n #onFocusIn = (event: FocusEvent): void => {\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n this.#lastInteractedHandle = h;\n }\n }\n };\n\n // ─── Rendering ──────────────────────────────────────────────────────\n #viewBox(): string {\n if (this.orientation === `horizontal`)\n return `0 0 ${LONG} ${CROSS}`;\n return `0 0 ${CROSS} ${LONG}`;\n }\n\n #renderTrack() {\n const isVertical = this.orientation === `vertical`;\n const strokeWidth = this.#getCssVar(`--track-width`, 2);\n const color = this.#getCssVarColor(`--track-color`, `var(--surface-4)`);\n const fill = this.#getCssVarColor(`--track-fill`, `transparent`);\n\n if (isVertical) {\n return svg`\n <rect\n class=\"track\"\n x=\"${CROSS / 2 - strokeWidth / 2}\"\n y=\"${INSET}\"\n width=\"${strokeWidth}\"\n height=\"${LONG - 2 * INSET}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n return svg`\n <rect\n class=\"track\"\n x=\"${INSET}\"\n y=\"${CROSS / 2 - strokeWidth / 2}\"\n width=\"${LONG - 2 * INSET}\"\n height=\"${strokeWidth}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n\n #getCssVarColor(name: string, fallback: string): string {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n return val || fallback;\n }\n\n #renderLane(lane: SliderLaneData) {\n const bounds = getTrackBounds(this.orientation);\n let path = ``;\n\n if (lane.type === `fixed`) {\n const start = this.orientation === `horizontal`\n ? { x: bounds.trackStart, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackStart };\n const end = this.orientation === `horizontal`\n ? { x: bounds.trackEnd, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackEnd };\n path = generateLinePath(start, end);\n } else if (lane.type === `anchored`) {\n const rel = this.#getRelativeValueA();\n const seg = getAnchoredSegment(rel, lane.value ?? 0.1, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n } else {\n // 'value' lane: from valueMin to valueMax.\n const lo = lane.valueMin ?? 0;\n const hi = lane.valueMax ?? 0;\n const seg = getValueSegment(lo, hi, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n }\n\n if (!path)\n return svg``;\n\n const offset = lane.offset;\n const w = this.orientation === `horizontal`\n ? `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`\n : `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`;\n const transform = this.orientation === `horizontal`\n ? `translateY(${offset * CROSS / 2}px)`\n : `translateX(${offset * CROSS / 2}px)`;\n\n return svg`\n <path\n class=\"lane\"\n data-lane-key=\"${lane.key}\"\n part=\"lane lane-${lane.key}\"\n d=\"${path}\"\n style=\"\n stroke-width: ${w};\n stroke-linecap: round;\n transform: ${transform};\n \"\n />\n `;\n }\n\n #renderValueMarker(handle: SliderHandleKey | undefined, defs: unknown[]) {\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n\n let value: number;\n if (this.valueMode === `single`) {\n value = this.#getRelativeValueA();\n } else {\n if (handle === `a`)\n value = this.#getRelativeValueA();\n else if (handle === `b`)\n value = this.#getRelativeValueB();\n else value = this.#getRelativeValueC();\n }\n\n const pos = valueToPosition(value, this.singleStyle, bounds, this.orientation);\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 0);\n const markerLength = this.#getCssVar(`--marker-length`, 0.8);\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n\n const center = isHorizontal\n ? { x: pos.x, y: bounds.crossCentre + markerOffset * (CROSS / 2) }\n : { x: bounds.crossCentre + markerOffset * (CROSS / 2), y: pos.y };\n\n // For unipolar, the value bar is symmetric around the track centre, so\n // the \"low end\" is the reflection of the high end across the centre.\n const isUnipolarSingle = this.valueMode === `single` && this.singleStyle === `unipolar`;\n const lowCenter = isUnipolarSingle\n ? (isHorizontal\n ? { x: 2 * bounds.centre - center.x, y: center.y }\n : { x: center.x, y: 2 * bounds.centre - center.y })\n : undefined;\n\n const id = handle ?? `s`;\n\n // Per-handle marker-style override: in triple mode the C handle can\n // take a different shape than the global `markerStyle` applied to A/B.\n const effectiveMarkerStyle = handle === `c` && this.markerStyleC\n ? this.markerStyleC\n : this.markerStyle;\n\n if (effectiveMarkerStyle === `dot`) {\n const r = markerThickness * (CROSS / 2);\n const renderDot = (cx: number, cy: number, mid: string) => {\n if (markerBorderWidth > 0) {\n defs.push(svg`<circle id=\"dot-${mid}-path\" cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`);\n return svg`\n <use href=\"#dot-${mid}-path\" class=\"marker-border\" />\n <use href=\"#dot-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`;\n };\n\n const high = renderDot(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderDot(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `needle`) {\n const halfLen = (markerLength * CROSS) / 4;\n // Draw perpendicular to the track\n const renderNeedle = (cx: number, cy: number, mid: string) => {\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: cx, y: cy - halfLen };\n end = { x: cx, y: cy + halfLen };\n } else {\n start = { x: cx - halfLen, y: cy };\n end = { x: cx + halfLen, y: cy };\n }\n const path = `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<path id=\"needle-${mid}-path\" d=\"${path}\" />`);\n return svg`\n <use href=\"#needle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#needle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<path d=\"${path}\" stroke-linecap=\"round\" />`;\n };\n\n const high = renderNeedle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderNeedle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `triangle`) {\n // Apex sits on the value-track centreline at `center`; base sits\n // perpendicular to the track, offset *outward* by markerLength so the\n // shape hangs outside the value band with its point facing in.\n const halfLen = (markerLength * CROSS) / 4;\n const halfBase = markerThickness * (CROSS / 2);\n const renderTriangle = (cx: number, cy: number, mid: string) => {\n let apex: Point;\n let base1: Point;\n let base2: Point;\n if (isHorizontal) {\n apex = { x: cx, y: cy };\n base1 = { x: cx - halfBase, y: cy + halfLen };\n base2 = { x: cx + halfBase, y: cy + halfLen };\n } else {\n apex = { x: cx, y: cy };\n base1 = { x: cx + halfLen, y: cy - halfBase };\n base2 = { x: cx + halfLen, y: cy + halfBase };\n }\n const points = `${apex.x},${apex.y} ${base1.x},${base1.y} ${base2.x},${base2.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<polygon id=\"triangle-${mid}-path\" points=\"${points}\" />`);\n return svg`\n <use href=\"#triangle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#triangle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<polygon points=\"${points}\" />`;\n };\n\n const high = renderTriangle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderTriangle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n return svg``;\n }\n\n #renderMidpointMarker() {\n if (this.valueMode !== `single`)\n return svg``;\n if (this.singleStyle !== `bipolar` && this.singleStyle !== `unipolar`)\n return svg``;\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const halfLen = (length * CROSS) / 4;\n\n const center = isHorizontal\n ? { x: bounds.centre, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.centre };\n\n if (this.markerStyle === `dot`) {\n const size = this.#getCssVar(`--midpoint-thickness`, 0.08);\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <circle cx=\"${center.x}\" cy=\"${center.y}\" r=\"${size * (CROSS / 2)}\" />\n </g>\n `;\n }\n\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: center.x, y: center.y - halfLen };\n end = { x: center.x, y: center.y + halfLen };\n } else {\n start = { x: center.x - halfLen, y: center.y };\n end = { x: center.x + halfLen, y: center.y };\n }\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\" />\n </g>\n `;\n }\n\n #renderHandleGroup(handle: SliderHandleKey | undefined, content: unknown) {\n if (!handle) {\n // Single-mode: don't put tabindex on the `<g>`. The SVG itself is the\n // focusable element (see render()), so the host is tab-reachable and\n // the SVG-level keydown handler fires.\n return svg`<g role=\"slider\"\n class=\"value-marker\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${this.valueA}\"\n part=\"value-marker\">${content}</g>`;\n }\n const partName = `value-marker value-marker-${handle}`;\n const value = handle === `a`\n ? this.valueA\n : handle === `b`\n ? this.valueB\n : (this.valueC ?? (this.#poleA + this.#poleB) / 2);\n // Multi-handle: each handle is its own focusable group so Tab moves\n // between them independently.\n return svg`<g tabindex=\"${this.disabled ? -1 : 0}\" role=\"slider\"\n class=\"value-marker\"\n data-handle=\"${handle}\"\n aria-label=\"${handle}\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${value}\"\n part=\"${partName}\">${content}</g>`;\n }\n\n #isMultiHandle(): boolean {\n return this.valueMode !== `single`;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Sync internal poles from public properties\n if (changed.has(`valueA`) || changed.has(`valueB`) || !this.hasUpdated) {\n this.#poleA = this.valueA;\n this.#poleB = this.valueB;\n }\n\n // Initial / mode-change valueC defaulting\n if (this.valueMode === `triple`) {\n if (\n this.valueC === undefined\n || !this.#hasInitialisedValueC\n || changed.has(`valueMode`)\n ) {\n this.#poleC = (this.#poleA + this.#poleB) / 2;\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n } else {\n this.#poleC = this.valueC;\n }\n // Clamp C to [low, high]\n const lo = Math.min(this.#poleA, this.#poleB);\n const hi = Math.max(this.#poleA, this.#poleB);\n if (this.#poleC < lo)\n this.#poleC = lo;\n if (this.#poleC > hi)\n this.#poleC = hi;\n this.valueC = this.#poleC;\n } else {\n this.#poleC = undefined;\n }\n\n // Sync value lane before render\n if (\n changed.has(`valueA`)\n || changed.has(`valueB`)\n || changed.has(`valueMode`)\n || changed.has(`singleStyle`)\n || !this.hasUpdated\n ) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n if (this.valueMode === `single`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n } else {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n }\n }\n }\n\n /**\n * Sync the default 'value' lane's valueMin/valueMax for single-mode single-styles.\n * Range: bar from trackStart to value.\n * Bipolar: bar grows from track centre outward to value (or value to centre if below midpoint).\n * Unipolar: bar is centred on the track centre with length proportional to value.\n */\n #applySingleStyleValueLane(valueLane: SliderLaneData, relativeValue: number): void {\n if (this.singleStyle === `bipolar`) {\n valueLane.valueMin = Math.min(0.5, relativeValue);\n valueLane.valueMax = Math.max(0.5, relativeValue);\n } else {\n valueLane.valueMin = 0;\n valueLane.valueMax = relativeValue;\n }\n }\n\n override render(): unknown {\n const lanes = Array.from(this.#lanes.values());\n\n // Initial cursor before the first pointermove arrives. The dynamic\n // cursor (#onPointerMoveCursor) takes over as soon as the user moves\n // the pointer. In single mode the default `pointer` matches \"click to\n // set\"; in multi mode `default` matches \"no implicit interaction for\n // arbitrary track positions\".\n const cursor = this.disabled\n ? `not-allowed`\n : this.valueMode === `single`\n ? `pointer`\n : `default`;\n\n const handles: SliderHandleKey[] = this.#isMultiHandle()\n ? (this.valueMode === `triple` ? [`a`, `b`, `c`] : [`a`, `b`])\n : [];\n\n // Halo shapes for --marker-border-width>0 are pushed here so they end up\n // inside a single root <defs>, matching radial-input's pattern.\n // Compute marker content first so the defs list is populated, then\n // reference both in the template below.\n const markerDefs: unknown[] = [];\n const handleGroups = this.#isMultiHandle()\n ? handles.map(h => this.#renderHandleGroup(h, this.#renderValueMarker(h, markerDefs)))\n : this.#renderHandleGroup(undefined, this.#renderValueMarker(undefined, markerDefs));\n\n return html`\n <svg\n class=\"slider-svg\"\n viewBox=\"${this.#viewBox()}\"\n preserveAspectRatio=\"none\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n style=\"cursor: ${cursor}; width: 100%; height: 100%;\"\n @pointerdown=\"${this.#onPointerDown}\"\n @pointermove=\"${this.#onPointerMoveCursor}\"\n @pointerleave=\"${this.#onPointerLeaveCursor}\"\n @keydown=\"${this.#onKeyDown}\"\n @focusin=\"${this.#onFocusIn}\"\n >\n ${markerDefs.length > 0 ? svg`<defs>${markerDefs}</defs>` : svg``}\n ${this.#renderTrack()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${handleGroups}\n </svg>\n `;\n }\n\n /**\n * Compute the cursor for the current pointer position. The mapping:\n * - `grab` over a marker handle (single A, or multi A/B/C)\n * - `move` over a draggable segment (between A and B when value-drag is on)\n * - `pointer` over empty track where clicking sets a value (single mode,\n * or the dead zones outside A/B in multi mode)\n * - `default` over no-op segments (between A and B in dual mode when\n * value-drag is none, or between A-C/C-B in triple when value-drag is none)\n * - `not-allowed` when disabled\n *\n * `relativeValue` is in the host's long-axis space (0 = start, 1 = end,\n * already flipped for vertical). For unipolar single mode, the value\n * bar's marker positions are computed in the same space; the abs(2x-1)\n * remap only applies when setting the value on click/drag.\n */\n #cursorAtRelative(relativeValue: number): string {\n if (this.disabled)\n return `not-allowed`;\n if (this.#dragging)\n return `grabbing`;\n\n const HANDLE_HIT = 0.06;\n\n if (this.valueMode === `single`) {\n if (this.singleStyle === `unipolar`) {\n // In unipolar the bar is symmetric around the track centre; the\n // value bar's two ends sit at `0.5 ± value/2`.\n const halfLen = this.#getRelativeValueA() / 2;\n const low = 0.5 - halfLen;\n const high = 0.5 + halfLen;\n if (\n Math.abs(relativeValue - low) < HANDLE_HIT\n || Math.abs(relativeValue - high) < HANDLE_HIT\n ) {\n return `grab`;\n }\n return `pointer`;\n }\n const aRel = this.#getRelativeValueA();\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT) {\n return `grab`;\n }\n return `pointer`;\n }\n\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n\n // Over a handle: grab\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT)\n return `grab`;\n if (Math.abs(relativeValue - bRel) < HANDLE_HIT)\n return `grab`;\n if (this.valueMode === `triple`) {\n const cRel = this.#getRelativeValueC();\n if (Math.abs(relativeValue - cRel) < HANDLE_HIT)\n return `grab`;\n }\n\n // Inside the segment between A and B\n if (relativeValue > lo && relativeValue < hi) {\n return this.valueDrag !== `none` ? `move` : `default`;\n }\n\n // Outside A/B (dead zone) — clicking here jumps A or B to that position\n return `pointer`;\n }\n\n #onPointerMoveCursor = (event: PointerEvent): void => {\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n this.#lastPointerClient = { x: event.clientX, y: event.clientY };\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n // For vertical, top of host = high value, so flip the relative value.\n // Unipolar click mapping is NOT applied here — it's only for click-to-set;\n // the cursor needs the host-relative position to find the markers.\n const relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n const cursor = this.#cursorAtRelative(relativeValue);\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n #onPointerLeaveCursor = (): void => {\n // Reset to the default cursor (whatever the host sets) when the pointer\n // leaves the slider area, so the cursor doesn't stay stuck on `grab` etc.\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n const cursor = this.disabled ? `not-allowed` : `default`;\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --value-relative / min/max/c CSS variables unconditionally\n if (this.valueMode === `single`) {\n this.style.setProperty(`--value-relative`, this.#getRelativeValueA().toString());\n } else {\n const lo = valueToRelative(this.#low(), this.min, this.max);\n const hi = valueToRelative(this.#high(), this.min, this.max);\n this.style.setProperty(`--value-min-relative`, lo.toString());\n this.style.setProperty(`--value-max-relative`, hi.toString());\n this.style.setProperty(`--value-relative`, hi.toString());\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.style.setProperty(`--value-c-relative`, valueToRelative(this.#poleC, this.min, this.max).toString());\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this.#onHostKeyDown);\n this.#gradientObserver?.disconnect();\n this.#gradientObserver = undefined;\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n this.#changeDebounceTimer = undefined;\n }\n this.#onPointerUp();\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 200px;\n height: 24px;\n touch-action: none;\n user-select: none;\n tabindex: 0;\n --value-relative: 0;\n --value-min-relative: 0;\n --value-max-relative: 0;\n --value-c-relative: 0;\n\n --lane-width: 0.16;\n --lane-track-width: 0.08;\n --lane-value-width: 0.12;\n }\n\n :host([orientation=\"vertical\"]) {\n width: 24px;\n height: 200px;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n :host {\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n svg.slider-svg {\n width: 100%;\n height: 100%;\n outline: none;\n overflow: visible;\n }\n\n svg.slider-svg:focus {\n outline: none;\n }\n\n svg.slider-svg:focus-visible,\n :host(:focus-visible) svg.slider-svg {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n .track {\n stroke: var(--track-color, var(--surface-4));\n stroke-width: var(--track-width, 2);\n }\n\n .lane {\n fill: none;\n stroke-linecap: round;\n stroke-dasharray: var(--lane-dasharray, none);\n stroke-dashoffset: var(--lane-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .lane[data-lane-key='track'] {\n stroke: var(--lane-track-color, var(--surface-4));\n }\n\n .lane[data-lane-key='value'] {\n stroke: var(--lane-value-color, var(--accent));\n }\n\n .lane:not([data-lane-key='track']):not([data-lane-key='value']) {\n stroke: var(--lane-color, var(--accent));\n }\n\n .value-marker > path:not(.marker-border):not(.marker-fill),\n .value-marker > .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n stroke-linecap: round;\n stroke-dasharray: var(--marker-dasharray, none);\n stroke-dashoffset: var(--marker-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker > .marker-border {\n stroke: var(--marker-border-color, transparent);\n stroke-width: calc((var(--marker-thickness, 0.15) + var(--marker-border-width, 0) * 2) * 12px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-fill,\n .value-marker circle,\n .value-marker polygon {\n fill: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n }\n\n .value-marker[data-handle=\"a\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"a\"] > .marker-fill,\n .value-marker[data-handle=\"a\"] > circle,\n .value-marker[data-handle=\"a\"] > polygon {\n stroke: var(--marker-a-color, var(--marker-color, var(--accent)));\n fill: var(--marker-a-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"b\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"b\"] > .marker-fill,\n .value-marker[data-handle=\"b\"] > circle,\n .value-marker[data-handle=\"b\"] > polygon {\n stroke: var(--marker-b-color, var(--marker-color, var(--accent)));\n fill: var(--marker-b-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"c\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"c\"] > .marker-fill,\n .value-marker[data-handle=\"c\"] > circle,\n .value-marker[data-handle=\"c\"] > polygon {\n stroke: var(--marker-c-color, var(--marker-color, var(--accent)));\n fill: var(--marker-c-color, var(--marker-color, var(--accent)));\n }\n\n .midpoint-marker line {\n stroke: var(--midpoint-color, var(--surface-muted-text));\n stroke-width: var(--midpoint-thickness, 1px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .midpoint-marker circle {\n fill: var(--midpoint-color, var(--surface-muted-text));\n stroke: var(--midpoint-border-color, transparent);\n stroke-width: var(--midpoint-border-width, 0);\n vector-effect: non-scaling-stroke;\n }\n `];\n}\n\n// ─── Tag-name registration ───────────────────────────────────────────\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-slider-input': SliderInputElement;\n }\n}\n\n// ─── Module-scope interface merge (typed addEventListener) ─────────────\nexport interface SliderInputElement {\n addEventListener: (<K extends keyof SliderInputElementEventMap>(\n type: K,\n listener: (this: SliderInputElement, event: SliderInputElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;;;;;AAiCA,SAAgB,eAAe,aAA6C;CAC1E,IAAI,gBAAgB,cAClB,OAAO;EACL,YAAA;EACA,UAAU;EACV,QAAQ;EACR,aAAA;CACF;CAKF,OAAO;EACL,YAAA;EACA,UAAU;EACV,QAAQ;EACR,aAAA;CACF;AACF;;;;;;;;;;;;AAaA,SAAgB,gBACd,eACA,aACA,aACA,aACO;CACP,MAAM,OAAO,YAAY,WAAW,YAAY;CAChD,MAAM,SAAS,YAAY;CAC3B,MAAM,cAAc,YAAY;CAEhC,IAAI;CACJ,IAAI,gBAAgB,SAClB,MAAM,YAAY,aAAa,gBAAgB;MAC1C,IAAI,gBAAgB,WAAW;EAEpC,IAAI,iBAAiB,IAAK;GACxB,MAAM,IAAI,gBAAgB;GAC1B,MAAM,YAAY,aAAa,KAAK,SAAS,YAAY;EAC3D,OAEE,MAAM,UADK,gBAAgB,MAAO,MACd,YAAY,WAAW;CAE/C,OAGE,MAAM,SADW,gBAAgB,OAAQ;CAI3C,IAAI,gBAAgB,cAClB,OAAO;EAAE,GAAG;EAAK,GAAG;CAAY;CAIlC,OAAO;EAAE,GAAG;EAAa,GAAA,MAAU;CAAI;AACzC;;;;;;;;;;AAWA,SAAgB,gBACd,UACA,UACA,aACA,aACA,aAC8B;CAC9B,IAAI,gBAAgB,YAAY;EAC9B,MAAM,OAAO,YAAY,WAAW,YAAY;EAChD,MAAM,SAAS,YAAY;EAC3B,MAAM,cAAc,YAAY;EAChC,MAAM,UAAW,WAAW,OAAQ;EACpC,IAAI,gBAAgB,cAClB,OAAO;GACL,OAAO;IAAE,GAAG,SAAS;IAAS,GAAG;GAAY;GAC7C,KAAK;IAAE,GAAG,SAAS;IAAS,GAAG;GAAY;EAC7C;EAGF,OAAO;GACL,OAAO;IAAE,GAAG;IAAa,GAAG,SAAS;GAAQ;GAC7C,KAAK;IAAE,GAAG;IAAa,GAAG,SAAS;GAAQ;EAC7C;CACF;CAEA,OAAO;EACL,OAAO,gBAAgB,UAAU,aAAa,aAAa,WAAW;EACtE,KAAK,gBAAgB,UAAU,aAAa,aAAa,WAAW;CACtE;AACF;;;;;AAMA,SAAgB,mBACd,eACA,WACA,aACA,aACA,aAC8B;CAE9B,MAAM,UAAW,aADJ,YAAY,WAAW,YAAY,cACX;CAQrC,MAAM,SAAS,gBAAgB,aAC1B,gBAAgB,eACb;EAAE,GAAG,YAAY;EAAQ,GAAG,YAAY;CAAY,IACpD;EAAE,GAAG,YAAY;EAAa,GAAG,YAAY;CAAO,IACxD,gBAAgB,eAAe,aAAa,aAAa,WAAW;CAGxE,IAAI;CACJ,IAAI;CACJ,IAAI,gBAAgB,cAAc;EAChC,WAAW,OAAO,IAAI;EACtB,SAAS,OAAO,IAAI;CACtB,OAAO;EACL,WAAW,OAAO,IAAI;EACtB,SAAS,OAAO,IAAI;CACtB;CAQA,OAAO;EAAE,OANK,gBAAgB,eAC1B;GAAE,GAAG;GAAU,GAAG,OAAO;EAAE,IAC3B;GAAE,GAAG,OAAO;GAAG,GAAG;EAAS;EAIf,KAHJ,gBAAgB,eACxB;GAAE,GAAG;GAAQ,GAAG,OAAO;EAAE,IACzB;GAAE,GAAG,OAAO;GAAG,GAAG;EAAO;CACT;AACtB;;;;;;AAOA,SAAgB,iBAAiB,OAAc,KAAoB;CACjE,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,QAAS,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,MACnE,OAAO;CAET,OAAO,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,IAAI;AACnD;;;;AA8CA,SAAgB,MAAM,OAAe,KAAa,KAAqB;CACrE,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;;;;AAKA,SAAgB,MACd,OACA,SACA,SACA,OACA,OACQ;CACR,IAAI,YAAY,SACd,OAAO;CAET,OAAO,SADa,QAAQ,YAAY,UAAU,YACrB,QAAQ;AACvC;;;;AAgBA,SAAgB,gBACd,OACA,KACA,KACQ;CACR,OAAO,MAAM,OAAO,KAAK,KAAK,GAAG,CAAC;AACpC;;;;;;AAOA,SAAgB,oBACd,WACA,WACA,UACQ;CACR,IAAI,YAAY,GACd,OAAO;CACT,OAAO,OAAO,YAAY,aAAa,UAAU,GAAG,CAAC;AACvD;;;ACjOA,MAAM,oBAAoB;AAC1B,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAGpB,IAAM,qBAAN,MAAM,2BAA2B,gBAAgB,UAAU,CAAC,CAAC;CAsElE;;CAGA;CACA;CACA;CAEA;;CAEA;CACA;CACA;;CAEA;;CAEA;;CAEA;CACA;CACA;CACA;;;;;;CAMA;;CAGA;;;;;;CAOA;CAEA;CACA;CACA;;;;;;;;;;CAWA;CACA;CAGA,cAAc;EACZ,MAAM;EA3HC,KAAA,SAAA;EAGA,KAAA,SAAA;EAQoB,KAAA,SAAA,KAAA;EAGvB,KAAA,MAAA;EAGA,KAAA,MAAA;EAGqB,KAAA,OAAA,KAAA;EAGC,KAAA,QAAA,KAAA;EAGC,KAAA,YAAA;EAGI,KAAA,cAAA;EAGA,KAAA,cAAA;EAGA,KAAA,cAAA;EAQa,KAAA,eAAA,KAAA;EAGjB,KAAA,YAAA;EAGA,KAAA,YAAA;EASM,KAAA,eAAA;EAGxB,KAAA,WAAA;EAGA,KAAA,WAAA;EAG2B,KAAA,yBAAA,IAAI,IAAI;EAGrC,KAAA,SAAA;EACA,KAAA,SAAA;EACoB,KAAA,SAAA,KAAA;EAEjB,KAAA,YAAA;EAE2B,KAAA,mBAAA,KAAA;EACjB,KAAA,sBAAA;EACE,KAAA,wBAAA;EAE8B,KAAA,cAAA,KAAA;EAEW,KAAA,mBAAA,KAAA;EAEhB,KAAA,oBAAA,KAAA;EACC,KAAA,qBAAA,KAAA;EAC9B,KAAA,oBAAA;EACE,KAAA,sBAAA;EAMK,KAAA,2BAAA;EAGc,KAAA,wBAAA;EAOpB,KAAA,qBAAA;GAAE,GAAG;GAAG,GAAG;EAAE;EAES,KAAA,uBAAA,KAAA;EACtB,KAAA,qBAAA;EACG,KAAA,wBAAA;EAuDN,KAAA,kBAAA,UAA+B;GAC/C,KAAKA,WAAW,KAAK;EACvB;EAwCgC,KAAA,0BAAA;GAC9B,MAAM,QAAQ,KAAK,iBAAiB,gCAAgC;GACpE,IAAI,MAAM,WAAW,GACnB;GACF,MAAM,OAAO,KAAKC,wBAAwB;GAC1C,KAAK,MAAM,QAAQ,OACjB,KAAK,OAAO,IAAI;EAEpB;EAsdkB,KAAA,kBAAA,UAA8B;GAC9C,IAAI,KAAK,UACP;GAEF,MAAM,MAAM,KAAK,WAAW,cAAc,gBAAgB;GAC1D,IAAI,CAAC,KACH;GAEF,MAAM,eAAe;GAIrB,KAAK,MAAM;GAKX,IAAI,MAAM,SAAS;GAEnB,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,gBAAgB;GACxC,MAAM,YAAY,aAAa,MAAM,UAAU,MAAM;GAKrD,MAAM,cAAc,oBAAoB,WAJtB,aAAa,KAAK,MAAM,KAAK,MAC9B,aAAa,KAAK,SAAS,KAAK,KAGqB;GACtE,IAAI,gBAAgB,aAAa,IAAI,cAAc;GAKnD,IAAI,KAAK,cAAc,YAAY,KAAK,gBAAgB,YACtD,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,CAAC;GAIhD,IAAI,KAAK,cAAc,UAAU;IAC/B,KAAKC,wBAAwB;IAC7B,KAAKC,cAAc;IACnB,KAAKC,4BAA4B,eAAe,IAAI;IACpD,KAAKC,YAAY;IACjB,KAAK,gBAAgB,YAAY,IAAI;IACrC,KAAKC,mBAAmB,MAAM;IAC9B,IAAI;KACF,IAAI,kBAAkB,MAAM,SAAS;IACvC,QAAQ,CAER;IACA,KAAKC,sBAAsB;IAC3B,KAAKC,wBAAwB,KAAK;IAClC,OAAO,iBAAiB,eAAe,KAAKC,cAAc;IAC1D,OAAO,iBAAiB,aAAa,KAAKC,YAAY;IACtD,OAAO,iBAAiB,iBAAiB,KAAKA,YAAY;IAC1D;GACF;GAGA,MAAM,OAAO,KAAKC,mBAAmB;GACrC,MAAM,OAAO,KAAKC,mBAAmB;GACrC,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;GAC9B,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;GAC9B,MAAM,UAAU,KAAKC,UAAU,KAAKC,SAAS,MAAM;GACnD,MAAM,UAAU,KAAKD,SAAS,KAAKC,SAAS,MAAM;GAClD,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,WAAW,KAAK,cAAc;GAEpC,MAAM,OADO,WAAW,KAAKC,mBAAmB,IAAI;GAEpD,MAAM,QAAQ,KAAK,IAAI,gBAAgB,IAAI,IAAI;GAC/C,MAAM,QAAQ,KAAK,IAAI,gBAAgB,IAAI,IAAI;GAC/C,MAAM,QAAQ,YAAY,KAAK,IAAI,gBAAgB,IAAI,IAAI;GAE3D,IAAI;GAKJ,MAAM,eAAe,eAAmD;IAEtE,OADgB,WAAW,MAAK,MAAK,MAAM,KAAKb,qBACnC,KAAK,WAAW;GAC/B;GACA,IAAI,SAAS,SAAS,OACpB,eAAe,YAAY;IAAC;IAAS;IAAS;GAAG,CAAC;QAC7C,IAAI,SAAS,OAClB,eAAe,YAAY,CAAC,SAAS,OAAO,CAAC;QACxC,IAAI,SAAS,OAClB,eAAe,YAAY,CAAC,SAAS,GAAG,CAAC;QACpC,IAAI,SAAS,OAClB,eAAe,YAAY,CAAC,SAAS,GAAG,CAAC;QACpC,IAAI,OACT,eAAe;QACV,IAAI,OACT,eAAe;QACV,IAAI,OACT,eAAe;QACV,IAAI,KAAK,cAAc,UAAU,gBAAgB,MAAM,gBAAgB,IAC5E,eAAe;QACV,IAAI,KAAK,cAAc,UAAU,iBAAiB,IAGvD,eAAe,KAAKc,QAAQ;QACvB,IAAI,KAAK,cAAc,UAAU,iBAAiB,IAGvD,eAAe,KAAKC,SAAS;QAM7B,eAAe,KAAA;GAGjB,KAAKZ,YAAY;GACjB,KAAK,gBAAgB,YAAY,IAAI;GACrC,KAAKC,mBAAmB,MAAM;GAC9B,IAAI;IACF,IAAI,kBAAkB,MAAM,SAAS;GACvC,QAAQ,CAER;GACA,KAAKC,sBAAsB;GAE3B,IAAI,iBAAiB,KAAA,GAAW;IAE9B,OAAO,iBAAiB,eAAe,KAAKE,cAAc;IAC1D,OAAO,iBAAiB,aAAa,KAAKC,YAAY;IACtD,OAAO,iBAAiB,iBAAiB,KAAKA,YAAY;IAC1D;GACF;GAEA,KAAKP,cAAc;GAEnB,IAAI,iBAAiB,UAAU;IAC7B,KAAKe,mBAAmB;KAAE,OAAO,KAAKL;KAAQ,OAAO,KAAKC;IAAO;IACjE,KAAKK,oBAAoB,KAAKH,QAAQ;IACtC,KAAKI,qBAAqB,KAAKH,SAAS;IACxC,KAAKI,oBAAoB,KAAKP,SAAS,KAAKD,SAAS,IACjD,KAAKA,SAAS,KAAKC,SACnB,KAAKA,SAAS,KAAKD;IACvB,KAAKS,sBAAsB,KAAK,IAAI,KAAKT,QAAQ,KAAKC,MAAM;IAG5D,KAAKS,2BAA2B;GAClC,OAAO;IACL,KAAKrB,wBAAwB;IAC7B,KAAKM,wBAAwB,iBAAiB,MAAM,KAAKK,SAAS,KAAKC;IAEvE,KAAKU,kCAAkC,eAAe,cAAc,IAAI;GAC1E;GAEA,OAAO,iBAAiB,eAAe,KAAKf,cAAc;GAC1D,OAAO,iBAAiB,aAAa,KAAKC,YAAY;GACtD,OAAO,iBAAiB,iBAAiB,KAAKA,YAAY;EAC5D;EAEkB,KAAA,kBAAA,UAA8B;GAC9C,IAAI,CAAC,KAAKL,WACR;GAEF,MAAM,eAAe;GAErB,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,gBAAgB;GAIxC,MAAM,cAAc,oBAHF,aAAa,MAAM,UAAU,MAAM,SACnC,aAAa,KAAK,MAAM,KAAK,MAC9B,aAAa,KAAK,SAAS,KAAK,KACqB;GACtE,IAAI,gBAAgB,aAAa,IAAI,cAAc;GACnD,IAAI,KAAK,cAAc,YAAY,KAAK,gBAAgB,YACtD,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,CAAC;GAGhD,IAAI,KAAK,cAAc,UAAU;IAC/B,KAAKD,4BAA4B,eAAe,IAAI;IACpD;GACF;GAEA,IAAI,KAAKD,gBAAgB,UACvB,KAAKsB,6BAA6B,aAAa;QAC1C,IAAI,KAAKtB,aACd,KAAKqB,kCAAkC,eAAe,KAAKrB,aAAa,IAAI;EAEhF;EAgF2B,KAAA,qBAAA;GACzB,KAAKE,YAAY;GACjB,KAAKF,cAAc,KAAA;GACnB,KAAKe,mBAAmB,KAAA;GACxB,KAAKC,oBAAoB,KAAA;GACzB,KAAKC,qBAAqB,KAAA;GAC1B,KAAK,gBAAgB,YAAY,KAAK;GAItC,KAAKM,qBACH,IAAI,aAAa,eAAe;IAC9B,SAAS,KAAKC,mBAAmB;IACjC,SAAS,KAAKA,mBAAmB;GACnC,CAAC,CACH;GAEA,MAAM,MAAM,KAAK,WAAW,cAAc,gBAAgB;GAC1D,IACE,OACG,KAAKrB,qBAAqB,KAAA,KAC1B,uBAAuB,OACvB,OAAQ,IAAkE,sBAAsB,YAEtF;QAAA,IAAiE,kBACtE,KAAK,KAAK,KAAKA,gBAAgB,GACrC,IAAI;KACF,IAAmE,sBAAsB,KAAKA,gBAAgB;IAChH,QAAQ,CAER;;GAGJ,KAAKA,mBAAmB,KAAA;GAExB,OAAO,oBAAoB,eAAe,KAAKG,cAAc;GAC7D,OAAO,oBAAoB,aAAa,KAAKC,YAAY;GACzD,OAAO,oBAAoB,iBAAiB,KAAKA,YAAY;EAC/D;EAGc,KAAA,cAAA,UAA+B;GAC3C,IAAI,KAAK,UACP;GAEF,MAAM,QAAQ,KAAK,MAAM,KAAK;GAC9B,MAAM,gBAAgB,gBAAgB,OAAO,KAAK,OAAO,KAAK,MAAM,MAAM,QAAQ;GAGlF,IAAI,SAA0B;GAC9B,MAAM,SAAS,MAAM;GACrB,IAAI,UAAU,OAAO,OAAO,YAAY,YAAY;IAClD,MAAM,WAAW,OAAO,QAAQ,eAAe;IAC/C,IAAI,UAAU;KACZ,MAAM,IAAI,SAAS,SAAS;KAC5B,IAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAClC,SAAS;IACb;GACF;GACA,IAAI,KAAK,cAAc,UACrB,SAAS;GACX,KAAKR,wBAAwB;GAE7B,IAAI,UAAU;GAEd,QAAQ,MAAM,KAAd;IACE,KAAK;IACL,KAAK;KACH,IAAI,KAAK,cAAc,UAAU;MAC/B,MAAM,IAAI,KAAKS,mBAAmB,IAAI,gBAAgB;MACtD,KAAKP,4BAA4B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI;KACvD,OAAO;MAEL,MAAM,IAAI,gBADM,WAAW,MAAM,KAAKS,SAAU,WAAW,MAAM,KAAKC,SAAU,KAAKc,UAAU,KAAKC,KAAK,GACtE,KAAK,KAAK,KAAK,GAAG,IAAI,gBAAgB;MACzE,KAAKC,2BAA2B,QAAQ,CAAC;KAC3C;KACA,UAAU;KACV;IAEF,KAAK;IACL,KAAK;KACH,IAAI,KAAK,cAAc,UAAU;MAC/B,MAAM,IAAI,KAAKnB,mBAAmB,IAAI,gBAAgB;MACtD,KAAKP,4BAA4B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI;KACvD,OAAO;MAEL,MAAM,IAAI,gBADM,WAAW,MAAM,KAAKS,SAAU,WAAW,MAAM,KAAKC,SAAU,KAAKc,UAAU,KAAKC,KAAK,GACtE,KAAK,KAAK,KAAK,GAAG,IAAI,gBAAgB;MACzE,KAAKC,2BAA2B,QAAQ,CAAC;KAC3C;KACA,UAAU;KACV;IAEF,KAAK;KACH,IAAI,KAAK,cAAc,UACrB,KAAK1B,4BAA4B,GAAG,IAAI;UAExC,KAAK0B,2BAA2B,QAAQ,CAAC;KAE3C,UAAU;KACV;IAEF,KAAK;KACH,IAAI,KAAK,cAAc,UACrB,KAAK1B,4BAA4B,GAAG,IAAI;UAExC,KAAK0B,2BAA2B,QAAQ,CAAC;KAE3C,UAAU;GAEd;GAEA,IAAI,SACF,MAAM,eAAe;EACzB;EAwEc,KAAA,cAAA,UAA4B;GACxC,MAAM,SAAS,MAAM;GACrB,IAAI,UAAU,OAAO,OAAO,YAAY,YAAY;IAClD,MAAM,WAAW,OAAO,QAAQ,eAAe;IAC/C,IAAI,UAAU;KACZ,MAAM,IAAI,SAAS,SAAS;KAC5B,IAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAClC,KAAK5B,wBAAwB;IACjC;GACF;EACF;EAifwB,KAAA,wBAAA,UAA8B;GACpD,MAAM,MAAM,KAAK,WAAW,cAAc,gBAAgB;GAC1D,IAAI,CAAC,KACH;GACF,KAAKyB,qBAAqB;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;GAAQ;GAC/D,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,gBAAgB;GAIxC,MAAM,cAAc,oBAHF,aAAa,MAAM,UAAU,MAAM,SACnC,aAAa,KAAK,MAAM,KAAK,MAC9B,aAAa,KAAK,SAAS,KAAK,KACqB;GAItE,MAAM,gBAAgB,aAAa,IAAI,cAAc;GACrD,MAAM,SAAS,KAAKI,kBAAkB,aAAa;GACnD,IAAI,IAAI,MAAM,WAAW,QACvB,IAAI,MAAM,SAAS;EAEvB;EAEoC,KAAA,8BAAA;GAGlC,MAAM,MAAM,KAAK,WAAW,cAAc,gBAAgB;GAC1D,IAAI,CAAC,KACH;GACF,MAAM,SAAS,KAAK,WAAW,gBAAgB;GAC/C,IAAI,IAAI,MAAM,WAAW,QACvB,IAAI,MAAM,SAAS;EAEvB;EArgDE,IAAI,CAAC,KAAK,UACR,KAAK,aAAa,YAAY,GAAG;EAEnC,KAAKC,OAAO,IAAI,SAAS;GACvB,KAAK;GACL,OAAO;GACP,MAAM;GACN,QAAQ;GACR,OAAO;EACT,CAAC;EACD,KAAKA,OAAO,IAAI,SAAS;GACvB,KAAK;GACL,UAAU;GACV,UAAU;GACV,MAAM;GACN,QAAQ;GACR,OAAO;EACT,CAAC;CACH;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,aAAa,YAAY,KAAK,WAAW,OAAO,GAAG;EAMxD,KAAK,iBAAiB,WAAW,KAAKC,cAA+B;EACrE,KAAKC,kBAAkB;EACvB,KAAKC,oBAAoB,IAAI,iBAAiB,KAAKD,iBAAiB;EACpE,KAAKC,kBAAkB,QAAQ,MAAM;GAAE,WAAW;GAAM,SAAS;EAAK,CAAC;CACzE;CAEA;;;;;;;;CAYA,0BAA0C;EACxC,IAAI,KAAKC,mBACP,OAAO,KAAKA;EACd,MAAM,QAAQ;EACd,MAAM,UAAU,SAAS,gBAAgB,OAAO,KAAK;EACrD,QAAQ,aAAa,SAAS,GAAG;EACjC,QAAQ,aAAa,UAAU,GAAG;EAClC,QAAQ,aAAa,eAAe,MAAM;EAM1C,QAAQ,MAAM,UAAU;EACxB,MAAM,OAAO,SAAS,gBAAgB,OAAO,MAAM;EACnD,QAAQ,OAAO,IAAI;EACnB,KAAK,WAAW,OAAO,OAAO;EAC9B,KAAKA,oBAAoB;EACzB,OAAO;CACT;;;;;;;;;;CAWA;CAWA,QACE,KACA,SAQM;EACN,MAAM,MAAM,KAAKzB,mBAAmB;EACpC,KAAKqB,OAAO,IAAI,KAAK;GACnB;GACA,OAAO,SAAS,SAAS;GACzB,UAAU,SAAS,YAAY;GAC/B,UAAU,SAAS,YAAY;GAC/B,MAAM,SAAS,QAAQ;GACvB,QAAQ,SAAS,UAAU;GAC3B,OAAO,SAAS,SAAS;EAC3B,CAAC;EACD,KAAK,cAAc;CACrB;CAEA,aAAa,KAAa,OAAqB;EAC7C,MAAM,OAAO,KAAKA,OAAO,IAAI,GAAG;EAChC,IAAI,MAAM;GACR,KAAK,QAAQ,MAAM,OAAO,GAAG,CAAC;GAC9B,KAAK,cAAc;EACrB;CACF;CAEA,aAAa,KAAa,UAAkB,UAAwB;EAClE,MAAM,OAAO,KAAKA,OAAO,IAAI,GAAG;EAChC,IAAI,CAAC,MACH;EACF,MAAM,KAAK,MAAM,KAAK,IAAI,UAAU,QAAQ,GAAG,GAAG,CAAC;EACnD,MAAM,KAAK,MAAM,KAAK,IAAI,UAAU,QAAQ,GAAG,GAAG,CAAC;EACnD,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,cAAc;CACrB;CAEA,WAAW,KAAmB;EAC5B,KAAKA,OAAO,OAAO,GAAG;EACtB,KAAK,cAAc;CACrB;CAEA,WAAgD;EAC9C,OAAO,IAAI,IAAI,KAAKA,MAAM;CAC5B;CAEA,QAAQ,KAAyC;EAC/C,OAAO,KAAKA,OAAO,IAAI,GAAG;CAC5B;CAGA,qBAA6B;EAC3B,OAAO,gBAAgB,KAAK,QAAQ,KAAK,KAAK,KAAK,GAAG;CACxD;CAEA,qBAA6B;EAC3B,OAAO,gBAAgB,KAAK,QAAQ,KAAK,KAAK,KAAK,GAAG;CACxD;CAEA,qBAA6B;EAE3B,OAAO,gBADG,KAAK,WAAW,KAAKnB,SAAS,KAAKC,UAAU,GAC7B,KAAK,KAAK,KAAK,GAAG;CAC9C;CAEA,OAAe;EACb,OAAO,KAAK,IAAI,KAAKD,QAAQ,KAAKC,MAAM;CAC1C;CAEA,QAAgB;EACd,OAAO,KAAK,IAAI,KAAKD,QAAQ,KAAKC,MAAM;CAC1C;CAEA,UAA2B;EACzB,OAAO,KAAKD,UAAU,KAAKC,SAAS,MAAM;CAC5C;CAEA,WAA4B;EAC1B,OAAO,KAAKD,SAAS,KAAKC,SAAS,MAAM;CAC3C;;;;;CAMA,wBAAgC;EAC9B,MAAM,QAAQ,KAAK,MAAM,KAAK;EAC9B,IAAI,KAAK,YAAY,KAAK,WAAW,GACnC,OAAO,KAAK;EACd,OAAO,QAAQ;CACjB;CAEA,UAAU,OAAuB;EAC/B,IAAI,KAAK,SAAS,KAAK,QAAQ,GAAG;GAEhC,MAAM,QADQ,KAAK,MAAM,KAAK,OACT,KAAK;GAE1B,OAAO,MADS,KAAK,OAAO,QAAQ,KAAK,OAAO,IAAI,IAAI,OAAO,KAAK,KAC9C,KAAK,KAAK,KAAK,GAAG;EAC1C;EACA,IAAI,KAAK,SAAS,KAAA,KAAa,KAAK,OAAO,GAEzC,OAAO,MADS,KAAK,OAAO,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK,KACxD,KAAK,KAAK,KAAK,GAAG;EAE1C,OAAO;CACT;CAGA,4BAA4B,eAAuB,oBAAoB,OAAa;EAClF,MAAM,WAAW,MAAM,eAAe,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG;EAC9D,MAAM,eAAe,KAAKuB,UAAU,MAAM,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC;EAEvE,IAAI,iBAAiB,KAAK,QACxB;EAEF,MAAM,gBAAgB,KAAK;EAC3B,KAAK,SAAS;EACd,KAAKxB,SAAS;EACd,KAAKyB,qBAAqB;EAE1B,MAAM,YAAY,KAAKN,OAAO,IAAI,OAAO;EACzC,IAAI,aAAa,UAAU,SAAS,SAClC,KAAKO,2BAA2B,WAAW,KAAK5B,mBAAmB,CAAC;EAGtE,IAAI,KAAK,aAAa,mBAAmB,GAAG;GAC1C,MAAM,aAAa,KAAK,MAAM,KAAKA,mBAAmB,IAAI,GAAG;GAC7D,KAAK,aAAa,gBAAgB,GAAG,WAAW,EAAE;EACpD;EAEA,KAAK6B,oBACH,EAAE,cAAc,GAChB,iBACF;CACF;CAEA,kCACE,eACA,QACA,oBAAoB,OACd;EAEN,MAAM,UAAU,MADC,MAAM,eAAe,GAAG,GAAG,KAAK,KAAK,KAAK,GACrC,GAAU,KAAK,KAAK,KAAK,GAAG;EAElD,MAAM,SAAS,KAAKC,mBAAmB,QAAQ,SAAS,KAAKvC,qBAAqB;EAClF,IAAI,CAAC,QACH;EAEF,MAAM,WAAW,EAAE,GAAG,KAAKwC,OAAO,EAAE;EACpC,KAAK7B,SAAS,OAAO;EACrB,KAAKC,SAAS,OAAO;EACrB,IAAI,OAAO,UAAU,KAAA,GACnB,KAAKc,SAAS,OAAO;EACvB,KAAKe,oBAAoB;EAEzB,MAAM,UAAU,KAAKC,eAAe,UAAU,KAAKF,OAAO,CAAC;EAC3D,KAAKJ,qBAAqB;EAE1B,MAAM,YAAY,KAAKN,OAAO,IAAI,OAAO;EACzC,IAAI,aAAa,UAAU,SAAS,SAAS;GAC3C,UAAU,WAAW,gBAAgB,KAAKH,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;GACpE,UAAU,WAAW,gBAAgB,KAAKgB,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG;EACvE;EAEA,IAAI,KAAK,aAAa,mBAAmB,GAAG;GAC1C,MAAM,aAAa,KAAK,MAAM,gBAAgB,KAAKA,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG,IAAI,GAAG;GACrF,KAAK,aAAa,gBAAgB,GAAG,WAAW,EAAE;EACpD;EAEA,KAAKL,oBACH;GACE,eAAe,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACtD,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACzD,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACzD,gBAAgB,SAAS;EAC3B,GACA,mBACA,OACF;CACF;CAEA,SAAsE;EACpE,OAAO;GAAE,OAAO,KAAK3B;GAAQ,OAAO,KAAKC;GAAQ,OAAO,KAAKc;EAAO;CACtE;CAEA,sBAA4B;EAC1B,KAAK,SAAS,KAAKf;EACnB,KAAK,SAAS,KAAKC;EACnB,IAAI,KAAK,cAAc,YAAY,KAAKc,WAAW,KAAA,GAAW;GAC5D,KAAK,SAAS,KAAKA;GACnB,KAAKkB,wBAAwB;EAC/B;CACF;CAEA,mBACE,QACA,UACA,gBACyD;EACzD,IAAI,QAAQ,KAAKjC;EACjB,IAAI,QAAQ,KAAKC;EACjB,IAAI,QAAQ,KAAKc;EAEjB,IAAI,KAAK,cAAc,YAAY,WAAW,KAAK;GAGjD,MAAM,UAAU,MAAM,UAFX,KAAKC,KAEgB,GADrB,KAAKgB,MACoB,CAAE;GACtC,MAAM,YAAY,KAAKR,UAAU,OAAO;GACxC,IAAI,cAAc,KAAKT,QACrB,OAAO;GACT,OAAO;IAAE;IAAO;IAAO,OAAO;GAAU;EAC1C;EAEA,MAAM,MAAM,KAAKmB,sBAAsB;EACvC,MAAM,QAAQ,WAAW,MAAM,QAAQ;EAEvC,IAAI,UAAU,KAAKV,UAAU,MAAM,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC;EAEhE,IAAI,KAAK,cAAc,QAAQ;GAG7B,KADoB,WAAW,MAAM,QAAQ,UAAU,OAErD,UAAU,KAAK,IAAI,SAAS,QAAQ,GAAG;QAEvC,UAAU,KAAK,IAAI,SAAS,QAAQ,GAAG;EAE3C,OAEE,IAAI,UAAU,QAAQ,OAAO,UAAU,QAAQ,KAI7C,UAFkB,KAAK,IAAI,WAAW,QAAQ,IAE5B,KADC,KAAK,IAAI,WAAW,QAAQ,IACf,IAAI,QAAQ,MAAM,QAAQ;EAK9D,UAAU,MAAM,SAAS,KAAK,KAAK,KAAK,GAAG;EAE3C,IAAI,WAAW,KAAK;GAClB,IAAI,YAAY,OACd,OAAO;GACT,QAAQ;EACV,OAAO;GACL,IAAI,YAAY,OACd,OAAO;GACT,QAAQ;EACV;EAGA,IAAI,KAAK,cAAc,YAAY,UAAU,KAAA,GAAW;GACtD,MAAM,QAAQ,KAAK,IAAI,KAAKxB,QAAQ,KAAKC,MAAM;GAC/C,MAAM,QAAQ,KAAK,IAAI,KAAKD,QAAQ,KAAKC,MAAM;GAC/C,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK;GACnC,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK;GACnC,IAAI,KAAK,iBAAiB,kBAAkB,QAAQ,OAElD,QAAQ,QADK,OAAO,QAAQ,UAAU,QAAQ,QAAQ,GAAG,CACtC,KAAK,QAAQ;QAC3B;IACL,IAAI,QAAQ,OACV,QAAQ;IACV,IAAI,QAAQ,OACV,QAAQ;GACZ;EACF;EAIA,OAAO;GAAE;GAAO;GAAO;EAAM;CAC/B;CAEA,eACE,MACA,MACoB;EACpB,MAAM,QAAQ,KAAK,UAAU,KAAK;EAClC,MAAM,QAAQ,KAAK,UAAU,KAAK;EAClC,MAAM,QAAQ,KAAK,UAAU,KAAK;EAElC,IAAI,KAAK,cAAc,UAAU;GAC/B,IAAI,SAAS,SAAS,CAAC,OACrB,OAAO;GACT,IAAI,SAAS,OACX,OAAO;GACT,IAAI,OACF,OAAO;GACT,IAAI,OACF,OAAO;GACT,IAAI,OACF,OAAO;GACT,OAAO;EACT;EACA,IAAI,SAAS,OACX,OAAO;EACT,IAAI,OACF,OAAO;EACT,IAAI,OACF,OAAO;EACT,OAAO;CACT;CAEA,oBACE,UAMA,mBACA,SACM;EACN,MAAM,cAAc,KAAKkC,kBAAkB,OAAO;EAClD,MAAM,eAAe,KAAKC,mBAAmB,UAAU,OAAO;EAE9D,IAAI,mBAAmB;GACrB,KAAK,cACH,IAAI,YAAoC,SAAS;IAC/C,QAAQ;IACR,SAAS;IACT,UAAU;GACZ,CAAC,CACH;GACA,KAAKC,qBAAqB,YAAY;EACxC,OACE,KAAKC,iBAAiB,YAAY;CAEtC;CAEA,kBAAkB,SAAsD;EACtE,IAAI,KAAK,cAAc,UACrB,OAAO;GACL,OAAO,KAAK;GACZ,eAAe,KAAKxC,mBAAmB;EACzC;EAGF,MAAM,KAAK,KAAKkB,KAAK;EACrB,MAAM,KAAK,KAAKgB,MAAM;EACtB,MAAM,cAAc,gBAAgB,IAAI,KAAK,KAAK,KAAK,GAAG;EAC1D,MAAM,cAAc,gBAAgB,IAAI,KAAK,KAAK,KAAK,GAAG;EAE1D,IAAI,KAAK,cAAc,YAAY,KAAKjB,WAAW,KAAA,GACjD,OAAO;GACL,OAAO;GACP,eAAe;GACf,UAAU;GACV,UAAU;GACV,kBAAkB;GAClB,kBAAkB;GAClB,QAAQ,KAAKA;GACb,gBAAgB,gBAAgB,KAAKA,QAAQ,KAAK,KAAK,KAAK,GAAG;GAC/D;EACF;EAGF,OAAO;GACL,OAAO;GACP,eAAe;GACf,UAAU;GACV,UAAU;GACV,kBAAkB;GAClB,kBAAkB;GAClB;EACF;CACF;CAEA,mBACE,UAMA,SACyB;EACzB,IAAI,KAAK,cAAc,UACrB,OAAO;GACL,OAAO,KAAK;GACZ,eAAe,KAAKjB,mBAAmB;GACvC,eAAe,SAAS;EAC1B;EAGF,MAAM,KAAK,KAAKkB,KAAK;EACrB,MAAM,KAAK,KAAKgB,MAAM;EACtB,MAAM,cAAc,gBAAgB,IAAI,KAAK,KAAK,KAAK,GAAG;EAE1D,IAAI,KAAK,cAAc,YAAY,KAAKjB,WAAW,KAAA,GACjD,OAAO;GACL,OAAO;GACP,eAAe;GACf,eAAe,SAAS;GACxB,UAAU;GACV,UAAU;GACV,kBAAkB,SAAS,oBAAoB;GAC/C,kBAAkB,SAAS,oBAAoB;GAC/C,QAAQ,KAAKA;GACb,gBAAgB,SAAS,kBAAkB,KAAKA;GAChD;EACF;EAGF,OAAO;GACL,OAAO;GACP,eAAe;GACf,eAAe,SAAS;GACxB,UAAU;GACV,UAAU;GACV,kBAAkB,SAAS,oBAAoB;GAC/C,kBAAkB,SAAS,oBAAoB;GAC/C;EACF;CACF;CAEA,qBAAqB,QAAuC;EAC1D,IAAI,KAAKwB,yBAAyB,KAAA,GAChC,aAAa,KAAKA,oBAAoB;EAExC,KAAKA,uBAAuB,OAAO,iBAAiB;GAClD,KAAKD,iBAAiB,MAAM;GAC5B,KAAKC,uBAAuB,KAAA;EAC9B,GAAG,kBAAkB;CACvB;CAEA,iBAAiB,QAAuC;EACtD,KAAK,cACH,IAAI,YAAqC,UAAU;GACjD;GACA,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAGA,WAAW,MAAc,cAA8B;EACrD,MAAM,QAAQ,iBAAiB,IAAI;EACnC,MAAM,MAAM,MAAM,iBAAiB,IAAI,CAAC,CAAC,KAAK;EAC9C,IAAI,CAAC,KACH,OAAO;EAET,IAAI,IAAI,SAAS,OAAO,GAAG;GACzB,MAAM,gBAAgB,MAAM,iBAAiB,kBAAkB,CAAC,CAAC,KAAK;GACtE,IAAI,CAAC,eAAe;IAClB,MAAM,SAAS,OAAO,WAAW,IAAI,QAAQ,aAAa,EAAE,CAAC;IAC7D,OAAO,OAAO,MAAM,MAAM,IAAI,eAAe;GAC/C;GACA,MAAM,UAAU,IAAI,QAAQ,4BAA4B,aAAa;GACrE,IAAI;IAEF,MAAM,SAAS,IADA,SAAS,UAAU,QAAQ,QAAQ,uBAAuB,IAAI,GAC7D,CAAC,CAAC;IAClB,OAAO,OAAO,WAAW,YAAY,CAAC,OAAO,MAAM,MAAM,IAAI,SAAS;GACxE,QAAQ;IACN,MAAM,SAAS,OAAO,WAAW,IAAI,QAAQ,aAAa,EAAE,CAAC;IAC7D,OAAO,OAAO,MAAM,MAAM,IAAI,eAAe;GAC/C;EACF;EAEA,MAAM,SAAS,OAAO,WAAW,GAAG;EACpC,OAAO,OAAO,MAAM,MAAM,IAAI,eAAe;CAC/C;CAGA;CA6JA;CA6BA,6BAA6B,eAA6B;EACxD,IAAI,CAAC,KAAKlC,kBACR;EACF,MAAM,QAAQ,KAAK,MAAM,KAAK;EAE9B,MAAM,cADS,gBAAgB,KAAKK,4BACR;EAE5B,IAAI,cAAc,KAAKD,sBAAsB;EAC7C,IAAI,eAAe,cAAc,KAAKD;EAEtC,IAAI,KAAK,cAAc,QAAQ;GAC7B,MAAM,iBAAiB,KAAKA;GAC5B,IAAI,eAAe;GACnB,IAAI,gBAAgB,cAAc;GAClC,IAAI,eAAe,KAAK,KAAK;IAC3B,MAAM,WAAW,KAAK,MAAM,KAAKC;IACjC,eAAe,KAAKA,sBAAsB;IAC1C,gBAAgB,eAAe;GACjC;GACA,IAAI,gBAAgB,KAAK,KAAK;IAE5B,MAAM,QAAQ,KAAK,MAAM;IACzB,gBAAgB;IAChB,iBAAiB;GACnB;GACA,cAAc;GACd,eAAe;EACjB,OAAO,IAAI,KAAK,cAAc,QAAQ;GACpC,cAAc,MAAM,aAAa,KAAK,KAAK,KAAK,GAAG;GACnD,eAAe,MAAM,cAAc,KAAK,KAAK,KAAK,GAAG;EACvD;EAEA,MAAM,SAAS,KAAKH,qBAAqB,KAAKH,QAAQ;EACtC,KAAKI,sBAAsB,KAAKH,SAAS;EAEzD,MAAM,WAAW,KAAKyB,OAAO;EAC7B,MAAM,WAAW,WAAW,MAAM,cAAc;EAChD,MAAM,WAAW,WAAW,MAAM,cAAc;EAChD,KAAK7B,SAAS;EACd,KAAKC,SAAS;EACd,IAAI,KAAK,cAAc,YAAY,KAAKc,WAAW,KAAA,GAAW;GAC5D,MAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACrD,MAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACrD,MAAM,QAAQ,KAAK,IAAI,UAAU,QAAQ;GACzC,MAAM,QAAQ,KAAK,IAAI,UAAU,QAAQ;GACzC,IAAI,KAAK,iBAAiB,kBAAkB,QAAQ,OAAO;IACzD,MAAM,OAAO,OAAO,KAAKA,SAAS,UAAU,QAAQ,QAAQ,GAAG,CAAC;IAChE,KAAKA,SAAS,QAAQ,QAAQ,QAAQ;GACxC,OAAO;IACL,IAAI,KAAKA,SAAS,OAChB,KAAKA,SAAS;IAChB,IAAI,KAAKA,SAAS,OAChB,KAAKA,SAAS;GAClB;EACF;EACA,KAAKe,oBAAoB;EAEzB,MAAM,UAA8B;EACpC,KAAKL,qBAAqB;EAE1B,MAAM,YAAY,KAAKN,OAAO,IAAI,OAAO;EACzC,IAAI,aAAa,UAAU,SAAS,SAAS;GAC3C,UAAU,WAAW,gBAAgB,KAAKH,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;GACpE,UAAU,WAAW,gBAAgB,KAAKgB,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG;EACvE;EAEA,KAAKL,oBACH;GACE,eAAe,SAAS;GACxB,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACzD,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;GACzD,gBAAgB,SAAS;EAC3B,GACA,MACA,OACF;CACF;CAEA;CAyCA;CA0EA,2BAA2B,QAAyB,gBAA8B;EAChF,IAAI,KAAK,cAAc,UAAU;GAC/B,KAAKpC,4BAA4B,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI;GAClE;EACF;EACA,IAAI,WAAW,KAAK;GAClB,MAAM,KAAK,KAAKyB,KAAK;GACrB,MAAM,KAAK,KAAKgB,MAAM;GAEtB,MAAM,UAAU,MADC,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK,GACnD,GAAU,IAAI,EAAE;GACtC,MAAM,IAAI,KAAKR,UAAU,OAAO;GAChC,IAAI,MAAM,KAAKT,QACb;GACF,MAAM,WAAW,KAAKc,OAAO;GAC7B,KAAKd,SAAS;GACd,KAAKe,oBAAoB;GACzB,KAAKL,qBAAqB;GAC1B,KAAKE,oBACH;IACE,eAAe,SAAS;IACxB,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;IACzD,kBAAkB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK;IACzD,gBAAgB,SAAS;GAC3B,GACA,MACA,GACF;GACA;EACF;EAEA,KAAKhB,kCAAkC,MAAM,gBAAgB,GAAG,CAAC,GAAG,QAAQ,IAAI;CAClF;CAKA,iBAA0B,WAA2B,OAAyB;EAE5E,IAAI,SAA0B,KAAKtB;EACnC,MAAM,SAAS,MAAM;EACrB,IAAI,UAAU,OAAO,OAAO,YAAY,YAAY;GAClD,MAAM,WAAW,OAAO,QAAQ,eAAe;GAC/C,IAAI,UAAU;IACZ,MAAM,IAAI,SAAS,SAAS;IAC5B,IAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAClC,SAAS;GACb;EACF;EACA,IAAI,KAAK,cAAc,UACrB,SAAS;EACX,KAAKA,wBAAwB;EAE7B,MAAM,QAAQ,KAAK,MAAM,KAAK;EAC9B,MAAM,gBAAgB,gBAAgB,OAAO,KAAK,OAAO,KAAK,MAAM,MAAM,QAAQ;EAYlF,MAAM,YAAY,MALC,gBALH,WAAW,MACvB,KAAKW,SACL,WAAW,MACT,KAAKC,SACJ,KAAKc,UAAU,KAAKC,KAAK,GACY,KAAK,KAAK,KAAK,GAKnC,IAAa,YAAY,gBAAgB,OAAO,GAAG,CAAC;EAE5E,KAAKC,2BAA2B,QAAQ,SAAS;CACnD;CAEA;CAaA,WAAmB;EACjB,IAAI,KAAK,gBAAgB,cACvB,OAAO;EACT,OAAO;CACT;CAEA,eAAe;EACb,MAAM,aAAa,KAAK,gBAAgB;EACxC,MAAM,cAAc,KAAKuB,WAAW,iBAAiB,CAAC;EACtD,MAAM,QAAQ,KAAKC,gBAAgB,iBAAiB,kBAAkB;EACtE,MAAM,OAAO,KAAKA,gBAAgB,gBAAgB,aAAa;EAE/D,IAAI,YACF,OAAO,GAAG;;;eAGO,KAAI,cAAc,EAAE;eACtB,EAAA;mBACF,YAAY;oBACJ,GAAU;kBACnB,KAAK;oBACH,MAAM;;;;EAKtB,OAAO,GAAG;;;aAGK,EAAA;aACE,KAAI,cAAc,EAAE;iBACjB,GAAU;kBAChB,YAAY;gBACd,KAAK;kBACH,MAAM;;;;CAItB;CAEA,gBAAgB,MAAc,UAA0B;EAGtD,OAFc,iBAAiB,IACf,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,KAChC,KAAK;CAChB;CAEA,YAAY,MAAsB;EAChC,MAAM,SAAS,eAAe,KAAK,WAAW;EAC9C,IAAI,OAAO;EAEX,IAAI,KAAK,SAAS,SAOhB,OAAO,iBANO,KAAK,gBAAgB,eAC/B;GAAE,GAAG,OAAO;GAAY,GAAG,OAAO;EAAY,IAC9C;GAAE,GAAG,OAAO;GAAa,GAAG,OAAO;EAAW,GACtC,KAAK,gBAAgB,eAC7B;GAAE,GAAG,OAAO;GAAU,GAAG,OAAO;EAAY,IAC5C;GAAE,GAAG,OAAO;GAAa,GAAG,OAAO;EAAS,CACd;OAC7B,IAAI,KAAK,SAAS,YAAY;GAEnC,MAAM,MAAM,mBADA,KAAK3C,mBACc,GAAK,KAAK,SAAS,IAAK,KAAK,aAAa,QAAQ,KAAK,WAAW;GACjG,OAAO,iBAAiB,IAAI,OAAO,IAAI,GAAG;EAC5C,OAAO;GAIL,MAAM,MAAM,gBAFD,KAAK,YAAY,GACjB,KAAK,YAAY,GACQ,KAAK,aAAa,QAAQ,KAAK,WAAW;GAC9E,OAAO,iBAAiB,IAAI,OAAO,IAAI,GAAG;EAC5C;EAEA,IAAI,CAAC,MACH,OAAO,GAAG;EAEZ,MAAM,SAAS,KAAK;EACpB,MAAM,IAAI,KAAK,gBAAgB,eAC3B,mBAAmB,KAAK,IAAI,qCAC5B,mBAAmB,KAAK,IAAI;EAChC,MAAM,YAAY,KAAK,gBAAgB,eACnC,cAAc,SAAA,KAAiB,EAAE,OACjC,cAAc,SAAA,KAAiB,EAAE;EAErC,OAAO,GAAG;;;yBAGW,KAAK,IAAI;0BACR,KAAK,IAAI;aACtB,KAAK;;0BAEQ,EAAE;;uBAEL,UAAU;;;;CAI/B;CAEA,mBAAmB,QAAqC,MAAiB;EACvE,MAAM,SAAS,eAAe,KAAK,WAAW;EAC9C,MAAM,eAAe,KAAK,gBAAgB;EAE1C,IAAI;EACJ,IAAI,KAAK,cAAc,UACrB,QAAQ,KAAKA,mBAAmB;OAEhC,IAAI,WAAW,KACb,QAAQ,KAAKA,mBAAmB;OAC7B,IAAI,WAAW,KAClB,QAAQ,KAAKC,mBAAmB;OAC7B,QAAQ,KAAKG,mBAAmB;EAGvC,MAAM,MAAM,gBAAgB,OAAO,KAAK,aAAa,QAAQ,KAAK,WAAW;EAE7E,MAAM,eAAe,KAAKsC,WAAW,mBAAmB,CAAC;EACzD,MAAM,eAAe,KAAKA,WAAW,mBAAmB,EAAG;EAC3D,MAAM,kBAAkB,KAAKA,WAAW,sBAAsB,GAAI;EAClE,MAAM,oBAAoB,KAAKA,WAAW,yBAAyB,CAAC;EAEpE,MAAM,SAAS,eACX;GAAE,GAAG,IAAI;GAAG,GAAG,OAAO,cAAc,eAAA;EAA2B,IAC/D;GAAE,GAAG,OAAO,cAAc,eAAA;GAA4B,GAAG,IAAI;EAAE;EAKnE,MAAM,YADmB,KAAK,cAAc,YAAY,KAAK,gBAAgB,aAExE,eACG;GAAE,GAAG,IAAI,OAAO,SAAS,OAAO;GAAG,GAAG,OAAO;EAAE,IAC/C;GAAE,GAAG,OAAO;GAAG,GAAG,IAAI,OAAO,SAAS,OAAO;EAAE,IACnD,KAAA;EAEJ,MAAM,KAAK,UAAU;EAIrB,MAAM,uBAAuB,WAAW,OAAO,KAAK,eAChD,KAAK,eACL,KAAK;EAET,IAAI,yBAAyB,OAAO;GAClC,MAAM,IAAI,kBAAA;GACV,MAAM,aAAa,IAAY,IAAY,QAAgB;IACzD,IAAI,oBAAoB,GAAG;KACzB,KAAK,KAAK,GAAG,mBAAmB,IAAI,aAAa,GAAG,QAAQ,GAAG,OAAO,EAAE,KAAK;KAC7E,OAAO,GAAG;8BACU,IAAI;8BACJ,IAAI;;IAE1B;IACA,OAAO,GAAG,eAAe,GAAG,QAAQ,GAAG,OAAO,EAAE;GAClD;GAEA,MAAM,OAAO,UAAU,OAAO,GAAG,OAAO,GAAG,EAAE;GAC7C,IAAI,WACF,OAAO,GAAG,GAAG,OAAO,UAAU,UAAU,GAAG,UAAU,GAAG,GAAG,GAAG,KAAK;GAErE,OAAO;EACT;EAEA,IAAI,yBAAyB,UAAU;GACrC,MAAM,UAAW,eAAA,KAAwB;GAEzC,MAAM,gBAAgB,IAAY,IAAY,QAAgB;IAC5D,IAAI;IACJ,IAAI;IACJ,IAAI,cAAc;KAChB,QAAQ;MAAE,GAAG;MAAI,GAAG,KAAK;KAAQ;KACjC,MAAM;MAAE,GAAG;MAAI,GAAG,KAAK;KAAQ;IACjC,OAAO;KACL,QAAQ;MAAE,GAAG,KAAK;MAAS,GAAG;KAAG;KACjC,MAAM;MAAE,GAAG,KAAK;MAAS,GAAG;KAAG;IACjC;IACA,MAAM,OAAO,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,IAAI;IACvD,IAAI,oBAAoB,GAAG;KACzB,KAAK,KAAK,GAAG,oBAAoB,IAAI,YAAY,KAAK,KAAK;KAC3D,OAAO,GAAG;iCACa,IAAI;iCACJ,IAAI;;IAE7B;IACA,OAAO,GAAG,YAAY,KAAK;GAC7B;GAEA,MAAM,OAAO,aAAa,OAAO,GAAG,OAAO,GAAG,EAAE;GAChD,IAAI,WACF,OAAO,GAAG,GAAG,OAAO,aAAa,UAAU,GAAG,UAAU,GAAG,GAAG,GAAG,KAAK;GAExE,OAAO;EACT;EAEA,IAAI,yBAAyB,YAAY;GAIvC,MAAM,UAAW,eAAA,KAAwB;GACzC,MAAM,WAAW,kBAAA;GACjB,MAAM,kBAAkB,IAAY,IAAY,QAAgB;IAC9D,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI,cAAc;KAChB,OAAO;MAAE,GAAG;MAAI,GAAG;KAAG;KACtB,QAAQ;MAAE,GAAG,KAAK;MAAU,GAAG,KAAK;KAAQ;KAC5C,QAAQ;MAAE,GAAG,KAAK;MAAU,GAAG,KAAK;KAAQ;IAC9C,OAAO;KACL,OAAO;MAAE,GAAG;MAAI,GAAG;KAAG;KACtB,QAAQ;MAAE,GAAG,KAAK;MAAS,GAAG,KAAK;KAAS;KAC5C,QAAQ;MAAE,GAAG,KAAK;MAAS,GAAG,KAAK;KAAS;IAC9C;IACA,MAAM,SAAS,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;IAC7E,IAAI,oBAAoB,GAAG;KACzB,KAAK,KAAK,GAAG,yBAAyB,IAAI,iBAAiB,OAAO,KAAK;KACvE,OAAO,GAAG;mCACe,IAAI;mCACJ,IAAI;;IAE/B;IACA,OAAO,GAAG,oBAAoB,OAAO;GACvC;GAEA,MAAM,OAAO,eAAe,OAAO,GAAG,OAAO,GAAG,EAAE;GAClD,IAAI,WACF,OAAO,GAAG,GAAG,OAAO,eAAe,UAAU,GAAG,UAAU,GAAG,GAAG,GAAG,KAAK;GAE1E,OAAO;EACT;EAEA,OAAO,GAAG;CACZ;CAEA,wBAAwB;EACtB,IAAI,KAAK,cAAc,UACrB,OAAO,GAAG;EACZ,IAAI,KAAK,gBAAgB,aAAa,KAAK,gBAAgB,YACzD,OAAO,GAAG;EACZ,MAAM,SAAS,eAAe,KAAK,WAAW;EAC9C,MAAM,eAAe,KAAK,gBAAgB;EAE1C,MAAM,UADS,KAAKA,WAAW,qBAAqB,GAC9B,IAAA,KAAa;EAEnC,MAAM,SAAS,eACX;GAAE,GAAG,OAAO;GAAQ,GAAG,OAAO;EAAY,IAC1C;GAAE,GAAG,OAAO;GAAa,GAAG,OAAO;EAAO;EAE9C,IAAI,KAAK,gBAAgB,OAAO;GAC9B,MAAM,OAAO,KAAKA,WAAW,wBAAwB,GAAI;GACzD,OAAO,GAAG;;wBAEQ,OAAO,EAAE,QAAQ,OAAO,EAAE,OAAO,OAAA,GAAmB;;;EAGxE;EAEA,IAAI;EACJ,IAAI;EACJ,IAAI,cAAc;GAChB,QAAQ;IAAE,GAAG,OAAO;IAAG,GAAG,OAAO,IAAI;GAAQ;GAC7C,MAAM;IAAE,GAAG,OAAO;IAAG,GAAG,OAAO,IAAI;GAAQ;EAC7C,OAAO;GACL,QAAQ;IAAE,GAAG,OAAO,IAAI;IAAS,GAAG,OAAO;GAAE;GAC7C,MAAM;IAAE,GAAG,OAAO,IAAI;IAAS,GAAG,OAAO;GAAE;EAC7C;EAEA,OAAO,GAAG;;oBAEM,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,EAAE;;;CAGtE;CAEA,mBAAmB,QAAqC,SAAkB;EACxE,IAAI,CAAC,QAIH,OAAO,GAAG;;4BAEY,KAAK,YAAY;yBACpB,KAAK,IAAI,mBAAmB,KAAK,IAAI;yBACrC,KAAK,OAAO;8BACP,QAAQ;EAElC,MAAM,WAAW,6BAA6B;EAC9C,MAAM,QAAQ,WAAW,MACrB,KAAK,SACL,WAAW,MACT,KAAK,SACJ,KAAK,WAAW,KAAKxC,SAAS,KAAKC,UAAU;EAGpD,OAAO,GAAG,gBAAgB,KAAK,WAAW,KAAK,EAAE;;qBAEhC,OAAO;oBACR,OAAO;0BACD,KAAK,YAAY;uBACpB,KAAK,IAAI,mBAAmB,KAAK,IAAI;uBACrC,MAAM;cACf,SAAS,IAAI,QAAQ;CACjC;CAEA,iBAA0B;EACxB,OAAO,KAAK,cAAc;CAC5B;CAGA,WAA8B,SAA+B;EAC3D,MAAM,WAAW,OAAO;EAGxB,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,CAAC,KAAK,YAAY;GACtE,KAAKD,SAAS,KAAK;GACnB,KAAKC,SAAS,KAAK;EACrB;EAGA,IAAI,KAAK,cAAc,UAAU;GAC/B,IACE,KAAK,WAAW,KAAA,KACb,CAAC,KAAKgC,yBACN,QAAQ,IAAI,WAAW,GAC1B;IACA,KAAKlB,UAAU,KAAKf,SAAS,KAAKC,UAAU;IAC5C,KAAK,SAAS,KAAKc;IACnB,KAAKkB,wBAAwB;GAC/B,OACE,KAAKlB,SAAS,KAAK;GAGrB,MAAM,KAAK,KAAK,IAAI,KAAKf,QAAQ,KAAKC,MAAM;GAC5C,MAAM,KAAK,KAAK,IAAI,KAAKD,QAAQ,KAAKC,MAAM;GAC5C,IAAI,KAAKc,SAAS,IAChB,KAAKA,SAAS;GAChB,IAAI,KAAKA,SAAS,IAChB,KAAKA,SAAS;GAChB,KAAK,SAAS,KAAKA;EACrB,OACE,KAAKA,SAAS,KAAA;EAIhB,IACE,QAAQ,IAAI,QAAQ,KACjB,QAAQ,IAAI,QAAQ,KACpB,QAAQ,IAAI,WAAW,KACvB,QAAQ,IAAI,aAAa,KACzB,CAAC,KAAK,YACT;GACA,MAAM,YAAY,KAAKI,OAAO,IAAI,OAAO;GACzC,IAAI,aAAa,UAAU,SAAS,SAAS;IAC3C,IAAI,KAAK,cAAc,UACrB,KAAKO,2BAA2B,WAAW,KAAK5B,mBAAmB,CAAC;SAC/D;KACL,UAAU,WAAW,gBAAgB,KAAKkB,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;KACpE,UAAU,WAAW,gBAAgB,KAAKgB,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG;IACvE;GACF;EACF;CACF;;;;;;;CAQA,2BAA2B,WAA2B,eAA6B;EACjF,IAAI,KAAK,gBAAgB,WAAW;GAClC,UAAU,WAAW,KAAK,IAAI,IAAK,aAAa;GAChD,UAAU,WAAW,KAAK,IAAI,IAAK,aAAa;EAClD,OAAO;GACL,UAAU,WAAW;GACrB,UAAU,WAAW;EACvB;CACF;CAEA,SAA2B;EACzB,MAAM,QAAQ,MAAM,KAAK,KAAKb,OAAO,OAAO,CAAC;EAO7C,MAAM,SAAS,KAAK,WAChB,gBACA,KAAK,cAAc,WACjB,YACA;EAEN,MAAM,UAA6B,KAAKuB,eAAe,IAClD,KAAK,cAAc,WAAW;GAAC;GAAK;GAAK;EAAG,IAAI,CAAC,KAAK,GAAG,IAC1D,CAAC;EAML,MAAM,aAAwB,CAAC;EAC/B,MAAM,eAAe,KAAKA,eAAe,IACrC,QAAQ,KAAI,MAAK,KAAKC,mBAAmB,GAAG,KAAKC,mBAAmB,GAAG,UAAU,CAAC,CAAC,IACnF,KAAKD,mBAAmB,KAAA,GAAW,KAAKC,mBAAmB,KAAA,GAAW,UAAU,CAAC;EAErF,OAAO,IAAI;;;mBAGI,KAAKC,SAAS,EAAE;;oBAEf,KAAK,WAAW,KAAK,EAAE;yBAClB,OAAO;wBACR,KAAKC,eAAe;wBACpB,KAAKjC,qBAAqB;yBACzB,KAAKkC,sBAAsB;oBAChC,KAAK5D,WAAW;oBAChB,KAAK6D,WAAW;;UAE1B,WAAW,SAAS,IAAI,GAAG,SAAS,WAAW,WAAW,GAAG,GAAG;UAChE,KAAKC,aAAa,EAAE;UACpB,MAAM,KAAI,SAAQ,KAAKC,YAAY,IAAI,CAAC,EAAE;UAC1C,KAAKC,sBAAsB,EAAE;UAC7B,aAAa;;;CAGrB;;;;;;;;;;;;;;;;CAiBA,kBAAkB,eAA+B;EAC/C,IAAI,KAAK,UACP,OAAO;EACT,IAAI,KAAK3D,WACP,OAAO;EAET,MAAM,aAAa;EAEnB,IAAI,KAAK,cAAc,UAAU;GAC/B,IAAI,KAAK,gBAAgB,YAAY;IAGnC,MAAM,UAAU,KAAKM,mBAAmB,IAAI;IAC5C,MAAM,MAAM,KAAM;IAClB,MAAM,OAAO,KAAM;IACnB,IACE,KAAK,IAAI,gBAAgB,GAAG,IAAI,cAC7B,KAAK,IAAI,gBAAgB,IAAI,IAAI,YAEpC,OAAO;IAET,OAAO;GACT;GACA,MAAM,OAAO,KAAKA,mBAAmB;GACrC,IAAI,KAAK,IAAI,gBAAgB,IAAI,IAAI,YACnC,OAAO;GAET,OAAO;EACT;EAEA,MAAM,OAAO,KAAKA,mBAAmB;EACrC,MAAM,OAAO,KAAKC,mBAAmB;EACrC,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;EAC9B,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;EAG9B,IAAI,KAAK,IAAI,gBAAgB,IAAI,IAAI,YACnC,OAAO;EACT,IAAI,KAAK,IAAI,gBAAgB,IAAI,IAAI,YACnC,OAAO;EACT,IAAI,KAAK,cAAc,UAAU;GAC/B,MAAM,OAAO,KAAKG,mBAAmB;GACrC,IAAI,KAAK,IAAI,gBAAgB,IAAI,IAAI,YACnC,OAAO;EACX;EAGA,IAAI,gBAAgB,MAAM,gBAAgB,IACxC,OAAO,KAAK,cAAc,SAAS,SAAS;EAI9C,OAAO;CACT;CAEA;CAqBA;CAYA,QAA2B,SAA+B;EACxD,MAAM,QAAQ,OAAO;EAGrB,IAAI,KAAK,cAAc,UACrB,KAAK,MAAM,YAAY,oBAAoB,KAAKJ,mBAAmB,CAAC,CAAC,SAAS,CAAC;OAC1E;GACL,MAAM,KAAK,gBAAgB,KAAKkB,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;GAC1D,MAAM,KAAK,gBAAgB,KAAKgB,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG;GAC3D,KAAK,MAAM,YAAY,wBAAwB,GAAG,SAAS,CAAC;GAC5D,KAAK,MAAM,YAAY,wBAAwB,GAAG,SAAS,CAAC;GAC5D,KAAK,MAAM,YAAY,oBAAoB,GAAG,SAAS,CAAC;GACxD,IAAI,KAAK,cAAc,YAAY,KAAKjB,WAAW,KAAA,GACjD,KAAK,MAAM,YAAY,sBAAsB,gBAAgB,KAAKA,QAAQ,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC;EAE5G;CACF;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,oBAAoB,WAAW,KAAKK,cAAc;EACvD,KAAKE,mBAAmB,WAAW;EACnC,KAAKA,oBAAoB,KAAA;EACzB,IAAI,KAAKiB,yBAAyB,KAAA,GAAW;GAC3C,aAAa,KAAKA,oBAAoB;GACtC,KAAKA,uBAAuB,KAAA;EAC9B;EACA,KAAK1C,aAAa;CACpB;;EAEyB,KAAA,SAAA;GAAC;GAAgB;GAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2I9D;;AACH;AAlzDG,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAG/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAQ/C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAU,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAG/C,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,OAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,OAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,QAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,SAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,mBAAA,WAAA,aAAA,KAAA,CAAA;AAGlD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AAGpD,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AAQpD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAiB,CAAC,CAAA,GAAA,mBAAA,WAAA,gBAAA,KAAA,CAAA;AAGtD,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,aAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,mBAAA,WAAA,aAAA,KAAA,CAAA;AASlD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAiB,CAAC,CAAA,GAAA,mBAAA,WAAA,gBAAA,KAAA,CAAA;AAGtD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAGjD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAnE3CuD,qBAAAA,WAAAA,CAAAA,kBAAc,mBAAmB,CAAA,GAAA,kBAAA"}
|
package/dist/slider-input.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as SliderInputElement } from "./slider-input-
|
|
1
|
+
import { t as SliderInputElement } from "./slider-input-CzmSVgm7.js";
|
|
2
2
|
export { SliderInputElement };
|
package/dist/split-layout.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DPgPEqo8.js";
|
|
2
2
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { LitElement, css, html } from "lit";
|
|
4
4
|
import { property, state } from "lit/decorators.js";
|
package/dist/swipe.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DPgPEqo8.js";
|
|
2
2
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
4
4
|
import { t as WheelNudgeMixin } from "./wheel-nudge-BlSCe_hD.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DPgPEqo8.js";
|
|
2
2
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { LitElement, css, html, nothing } from "lit";
|
|
4
4
|
import { property } from "lit/decorators.js";
|
|
@@ -594,4 +594,4 @@ TabListElement = __decorate([safeCustomElement(`ixfx-tab-list`)], TabListElement
|
|
|
594
594
|
//#endregion
|
|
595
595
|
export { TabListElement as t };
|
|
596
596
|
|
|
597
|
-
//# sourceMappingURL=tab-list-
|
|
597
|
+
//# sourceMappingURL=tab-list-6W5CgXix.js.map
|