@ixfx/components 0.5.19 → 0.5.20
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 +95 -115
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +484 -325
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +7 -12
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +5 -4
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-CphdEaZd.js → button-pcDaCemT.js} +2 -2
- package/dist/{button-CphdEaZd.js.map → button-pcDaCemT.js.map} +1 -1
- package/dist/button.d.ts +3 -2
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +1 -0
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +2 -2
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-37NyVenk.js → colour-picker-D43Q96r0.js} +28 -15
- package/dist/colour-picker-D43Q96r0.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/{crumb-navigation-BrB0r14u.js → crumb-navigation-Pif-kupA.js} +10 -9
- package/dist/{crumb-navigation-BrB0r14u.js.map → crumb-navigation-Pif-kupA.js.map} +1 -1
- package/dist/crumbs.d.ts +2 -4
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +1 -1
- package/dist/data-display.d.ts +2 -1
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +23 -25
- package/dist/data-display.js.map +1 -1
- package/dist/{decorate-VRK8rslU.js → decorate-DdjvVHS-.js} +2 -2
- package/dist/{decorate-VRK8rslU.js.map → decorate-DdjvVHS-.js.map} +1 -1
- package/dist/editable-label.d.ts +2 -1
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +2 -2
- package/dist/editable-label.js.map +1 -1
- package/dist/fallbacks-DEE1nCTt.js +406 -0
- package/dist/fallbacks-DEE1nCTt.js.map +1 -0
- package/dist/{hex-editor-Bk6rxhfg.js → hex-editor-B-UI4OZu.js} +8 -6
- package/dist/{hex-editor-Bk6rxhfg.js.map → hex-editor-B-UI4OZu.js.map} +1 -1
- package/dist/{hex-editor-Caq8vNQk.d.ts → hex-editor-CMIxtNgT.d.ts} +3 -2
- package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-BUwP1CZ1.d.ts → icon-Bd5BiU4b.d.ts} +4 -3
- package/dist/icon-Bd5BiU4b.d.ts.map +1 -0
- package/dist/{icon-DG9Lm3LT.js → icon-CK14NUcE.js} +5 -7
- package/dist/{icon-DG9Lm3LT.js.map → icon-CK14NUcE.js.map} +1 -1
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +1 -1
- package/dist/{incr-search-2pz21xtR.js → incr-search-CeERfijK.js} +6 -9
- package/dist/{incr-search-2pz21xtR.js.map → incr-search-CeERfijK.js.map} +1 -1
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-D9u_Q7-b.d.ts → index-BslNaMLo.d.ts} +3 -3
- package/dist/index-BslNaMLo.d.ts.map +1 -0
- package/dist/{index-DkhBGHgF.d.ts → index-Cdmrn0SZ.d.ts} +11 -11
- package/dist/index-Cdmrn0SZ.d.ts.map +1 -0
- package/dist/{index-BUB5SICW.d.ts → index-CkMIKEWp.d.ts} +4 -3
- package/dist/index-CkMIKEWp.d.ts.map +1 -0
- package/dist/{index-RqMh1i-O.d.ts → index-D87kRcEs.d.ts} +1 -2
- package/dist/index-D87kRcEs.d.ts.map +1 -0
- package/dist/{index-BKAlRgbq.d.ts → index-DrKRD8_a.d.ts} +7 -4
- package/dist/index-DrKRD8_a.d.ts.map +1 -0
- package/dist/{index-BeuCXtiO.d.ts → index-tX6fKF8m.d.ts} +3 -3
- package/dist/index-tX6fKF8m.d.ts.map +1 -0
- package/dist/index.d.ts +48 -53
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +126 -118
- package/dist/index.js.map +1 -1
- package/dist/interaction-_Y2qO3QI.js +1 -0
- package/dist/{labelled-input-base-hoKGwyKT.js → labelled-input-base-9K_w3oLj.js} +2 -2
- package/dist/{labelled-input-base-hoKGwyKT.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-ORb1rGq6.d.ts} +3 -2
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +5 -4
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +4 -4
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +2 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +3 -5
- package/dist/led.js.map +1 -1
- package/dist/{menu-CdwSe_XN.js → menu-BiFarLUA.js} +9 -8
- package/dist/{menu-CdwSe_XN.js.map → menu-BiFarLUA.js.map} +1 -1
- package/dist/{menu-item-BG5w7fi4.d.ts → menu-item-AtoP6bD4.d.ts} +4 -4
- package/dist/menu-item-AtoP6bD4.d.ts.map +1 -0
- package/dist/{menu-item-CrmUwIoJ.js → menu-item-yHSPV8nS.js} +10 -9
- package/dist/{menu-item-CrmUwIoJ.js.map → menu-item-yHSPV8nS.js.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +5 -7
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +26 -24
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +2 -1
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +14 -15
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +3 -3
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +2 -1
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +3 -3
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-CVxGH-Cp.js → radial-input-C4f-2Bya.js} +15 -25
- package/dist/{radial-input-CVxGH-Cp.js.map → radial-input-C4f-2Bya.js.map} +1 -1
- package/dist/{radial-input-BhZeyyP-.d.ts → radial-input-Dhu5ZGP5.d.ts} +3 -2
- package/dist/radial-input-Dhu5ZGP5.d.ts.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +3 -2
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +3 -3
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +3 -2
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +3 -3
- package/dist/range.js.map +1 -1
- package/dist/selecthorizontal.d.ts +2 -1
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +2 -2
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/{slider-input-TidGhvXt.d.ts → slider-input-BEaztT-g.d.ts} +3 -2
- package/dist/slider-input-BEaztT-g.d.ts.map +1 -0
- package/dist/{slider-input-CzmSVgm7.js → slider-input-SW7e2Ac2.js} +28 -31
- package/dist/{slider-input-CzmSVgm7.js.map → slider-input-SW7e2Ac2.js.map} +1 -1
- package/dist/slider-input.d.ts +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/snap-container.d.ts +2 -1
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +5 -6
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +2 -1
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +4 -6
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts +2 -1
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +4 -5
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-Beuh2nom.d.ts → tab-list-B8v9KntS.d.ts} +4 -4
- package/dist/tab-list-B8v9KntS.d.ts.map +1 -0
- package/dist/{tab-list-mAoD6L0e.js → tab-list-CR0v53KJ.js} +3 -3
- package/dist/{tab-list-mAoD6L0e.js.map → tab-list-CR0v53KJ.js.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +1 -1
- package/dist/{tickled-controller-BF2Ea0DE.d.ts → tickled-controller-JDOR9B8V.d.ts} +9 -6
- package/dist/tickled-controller-JDOR9B8V.d.ts.map +1 -0
- package/dist/{tickled-styles-fNDdqf6l.js → tickled-styles-Bgo_Lpw-.js} +28 -28
- package/dist/tickled-styles-Bgo_Lpw-.js.map +1 -0
- package/dist/{timeline-B2fgDL4U.js → timeline-CdSI003L.js} +3 -3
- package/dist/{timeline-B2fgDL4U.js.map → timeline-CdSI003L.js.map} +1 -1
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-BlvBUQxx.d.ts → tooltip-BMTSUPBU.d.ts} +3 -2
- package/dist/tooltip-BMTSUPBU.d.ts.map +1 -0
- package/dist/{tree-BtiiDX1a.js → tree-CqPhQRHo.js} +11 -10
- package/dist/{tree-BtiiDX1a.js.map → tree-CqPhQRHo.js.map} +1 -1
- package/dist/{tree-component-DQ9vzdy5.d.ts → tree-component-CDLO1ITF.d.ts} +124 -8
- package/dist/tree-component-CDLO1ITF.d.ts.map +1 -0
- package/dist/tree.d.ts +4 -9
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-DSfbtHs3.d.ts +8 -0
- package/dist/types-DSfbtHs3.d.ts.map +1 -0
- package/dist/{wheel-nudge-DgMTRYlh.d.ts → wheel-nudge-C-ra_1os.d.ts} +2 -1
- package/dist/wheel-nudge-C-ra_1os.d.ts.map +1 -0
- package/dist/{wheel-nudge-BlSCe_hD.js → wheel-nudge-Dhzi5nHc.js} +2 -2
- package/dist/{wheel-nudge-BlSCe_hD.js.map → wheel-nudge-Dhzi5nHc.js.map} +1 -1
- package/dist/{xy-axis-CxHC8z5E.js → xy-axis-BpA2eJq6.js} +4 -6
- package/dist/{xy-axis-CxHC8z5E.js.map → xy-axis-BpA2eJq6.js.map} +1 -1
- package/dist/{xy-axis-5KhVTNoX.d.ts → xy-axis-CtDDQzGZ.d.ts} +6 -8
- package/dist/xy-axis-CtDDQzGZ.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +2 -1
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +3 -3
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/ac-token.md +7 -1
- package/docs-user/colour-picker.md +8 -4
- package/docs-user/menu.md +11 -8
- package/package.json +1 -1
- package/dist/colour-picker-37NyVenk.js.map +0 -1
- package/dist/fallbacks-DPgPEqo8.js +0 -218
- package/dist/fallbacks-DPgPEqo8.js.map +0 -1
- package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
- package/dist/icon-BUwP1CZ1.d.ts.map +0 -1
- package/dist/index-BKAlRgbq.d.ts.map +0 -1
- package/dist/index-BUB5SICW.d.ts.map +0 -1
- package/dist/index-BeuCXtiO.d.ts.map +0 -1
- package/dist/index-D9u_Q7-b.d.ts.map +0 -1
- package/dist/index-DkhBGHgF.d.ts.map +0 -1
- package/dist/index-RqMh1i-O.d.ts.map +0 -1
- package/dist/interaction-D6efrBLo.js +0 -1
- package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
- package/dist/menu-item-BG5w7fi4.d.ts.map +0 -1
- package/dist/radial-input-BhZeyyP-.d.ts.map +0 -1
- package/dist/slider-input-TidGhvXt.d.ts.map +0 -1
- package/dist/tab-list-Beuh2nom.d.ts.map +0 -1
- package/dist/tickled-controller-BF2Ea0DE.d.ts.map +0 -1
- package/dist/tickled-styles-fNDdqf6l.js.map +0 -1
- package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
- package/dist/tree-component-DQ9vzdy5.d.ts.map +0 -1
- package/dist/types-DO3gt5vg.d.ts +0 -130
- package/dist/types-DO3gt5vg.d.ts.map +0 -1
- package/dist/wheel-nudge-DgMTRYlh.d.ts.map +0 -1
- package/dist/xy-axis-5KhVTNoX.d.ts.map +0 -1
- /package/bundle/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
- /package/dist/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radial-input-CVxGH-Cp.js","names":["#_radius","#dragging","#dragStartY","#valueAtDragStart","#onPointerMove","#onPointerUp","#setValueFromRelative","#stepByRelativeDelta","#lanes","#getRelativeValue","#quantise","#isUserInteraction","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#getCssVar","#getEffectiveMarkerStyle","#getNeedlePath","#onPointerDown","#onKeyDown","#renderCircleFill","#renderWedge","#renderCircleBorder","#renderLane","#renderMidpointMarker","#renderValueMarker","customElement"],"sources":["../src/radial-input/svg-utils.ts","../src/radial-input/radial-input.ts"],"sourcesContent":["/**\n * SVG utilities for radial input component\n * Handles geometry calculations for flattened circle arcs\n */\n\nimport type { ValueMode } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface ArcParameters {\n startAngle: number; // radians\n endAngle: number; // radians\n radius: number;\n center: Point;\n}\n\nconst PI2 = Math.PI * 2;\nconst MIDPOINT_ANGLE = -Math.PI / 2; // Top-center of circle\n\n/**\n * Convert polar coordinates (angle in radians, radius) to SVG Cartesian coordinates\n * @param angle - Angle in radians (0 = right/east, increases clockwise in SVG)\n * @param radius - Distance from center\n * @param center - Center point (default: {x: 50, y: 50})\n * @returns Point in SVG coordinates\n */\nexport function polarToCartesian(\n angle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): Point {\n return {\n x: center.x + Math.cos(angle) * radius,\n y: center.y + Math.sin(angle) * radius,\n };\n}\n\n/**\n * Convert SVG Cartesian coordinates to polar (angle in radians, radius)\n * @param x - X coordinate\n * @param y - Y coordinate\n * @param center - Center point (default: {x: 50, y: 50})\n * @returns Angle in radians (0..2π) and radius\n */\nexport function cartesianToPolar(\n x: number,\n y: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; radius: number } {\n const dx = x - center.x;\n const dy = y - center.y;\n const radius = Math.sqrt(dx * dx + dy * dy);\n const raw = Math.atan2(dy, dx);\n const angle = ((raw % PI2) + PI2) % PI2; // Normalize to 0..2π\n return { angle, radius };\n}\n\n/**\n * Calculate start and end angles for a flattened circle\n * @param flatten - How much of the circle to hide (0..1): 0 = full circle, 0.5 = half circle, 1 = no arc\n * @returns Start and end angles in radians\n */\nexport function getFlattenedCircleAngles(flatten: number): {\n startAngle: number;\n endAngle: number;\n totalArc: number;\n} {\n // flatten represents the percentage of circle hidden\n // 0 = full circle (360°), 0.5 = half circle (180°), 1 = no arc (0°)\n const visibleArc = PI2 * (1 - flatten); // Total visible arc in radians\n\n // Center the visible arc at the top (angle = -π/2)\n // Start and end angles are symmetric around top-center\n const halfArc = visibleArc / 2;\n const topAngle = -Math.PI / 2; // Top center (270° in standard coords, but -90° from east)\n\n const startAngle = topAngle - halfArc;\n const endAngle = topAngle + halfArc;\n const totalArc = endAngle - startAngle;\n\n return { startAngle, endAngle, totalArc };\n}\n\n/**\n * Map a value (0..1) to an angle based on value mode\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Angle in radians\n */\nexport function valueToAngle(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): number {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n switch (valueMode) {\n case `range`:\n // Linear mapping from start to end\n return startAngle + relativeValue * totalArc;\n\n case `bipolar`: {\n // Midpoint is at top (MIDPOINT_ANGLE = -π/2)\n if (relativeValue <= 0.5) {\n // Map 0..0.5 to startAngle..MIDPOINT_ANGLE (going counterclockwise to top)\n const t = relativeValue / 0.5;\n return startAngle + t * (MIDPOINT_ANGLE - startAngle);\n } else {\n // Map 0.5..1 to MIDPOINT_ANGLE..endAngle (going clockwise from top)\n const t = (relativeValue - 0.5) / 0.5;\n return MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);\n }\n }\n\n case `unipolar`: {\n // Marker stays at top for unipolar mode\n return MIDPOINT_ANGLE;\n }\n\n default:\n return startAngle;\n }\n}\n\n/**\n * Get start and end angles for a value arc\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Start and end angles for the arc\n */\nexport function getValueArcAngles(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n switch (valueMode) {\n case `range`:\n // Arc from start to value position\n return {\n startAngle,\n endAngle: startAngle + relativeValue * totalArc,\n };\n\n case `bipolar`: {\n // Midpoint is at top (MIDPOINT_ANGLE = -π/2)\n if (relativeValue < 0.5) {\n // Arc from some point toward top (going counterclockwise)\n const t = relativeValue / 0.5;\n const valueAngle = startAngle + t * (MIDPOINT_ANGLE - startAngle);\n return {\n startAngle: valueAngle,\n endAngle: MIDPOINT_ANGLE,\n };\n } else if (relativeValue > 0.5) {\n // Arc from top going clockwise\n const t = (relativeValue - 0.5) / 0.5;\n const valueAngle = MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n };\n } else {\n // Exactly at midpoint, no arc\n return { startAngle: MIDPOINT_ANGLE, endAngle: MIDPOINT_ANGLE };\n }\n }\n\n case `unipolar`: {\n // Spread symmetrically from top (MIDPOINT_ANGLE = -π/2)\n const spreadAmount = relativeValue * totalArc / 2;\n return {\n startAngle: MIDPOINT_ANGLE - spreadAmount,\n endAngle: MIDPOINT_ANGLE + spreadAmount,\n };\n }\n\n default:\n return { startAngle, endAngle: startAngle };\n }\n}\n\n/**\n * Get start and end angles for an anchored arc\n * Centered on current value position, extends equally in both directions\n * @param relativeValue - Current value position (0..1)\n * @param laneValue - Width of the arc (0..1, where 1 = full range)\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Start and end angles for the arc\n */\nexport function getAnchoredArcAngles(\n relativeValue: number,\n laneValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n // Get the angle for the current value (this is the center of the arc)\n const centerAngle = valueToAngle(relativeValue, valueMode, flatten);\n\n // Calculate half-width of the arc\n // laneValue is 0..1, where 1 = full range\n const halfWidth = (laneValue * totalArc) / 2;\n\n let arcStart = centerAngle - halfWidth;\n let arcEnd = centerAngle + halfWidth;\n\n // Clamp to valid bounds (prevent wrapping)\n // The valid range is [startAngle, endAngle]\n if (arcStart < startAngle)\n arcStart = startAngle;\n if (arcEnd > endAngle)\n arcEnd = endAngle;\n\n // If the arc would be degenerate after clamping, return a single point\n if (arcStart >= arcEnd) {\n return { startAngle: centerAngle, endAngle: centerAngle };\n }\n\n return { startAngle: arcStart, endAngle: arcEnd };\n}\n\n/**\n * Generate SVG path for an arc\n * @param startAngle - Start angle in radians\n * @param endAngle - End angle in radians\n * @param radius - Arc radius\n * @param center - Center point\n * @returns SVG path data string\n */\nexport function generateArcPath(\n startAngle: number,\n endAngle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): string {\n if (startAngle === endAngle) {\n return ``; // No arc to draw\n }\n\n // Calculate arc length to determine large-arc-flag\n let arcLength = endAngle - startAngle;\n\n // Handle wrap-around case (e.g., from 5.5 to 0.5 radians)\n if (arcLength < 0) {\n arcLength += PI2;\n }\n\n // Handle full or near-full circle case\n // When arcLength is nearly 2π, start and end points are essentially the same\n // and drawing a full circle needs special handling\n if (arcLength >= PI2 - 0.001) {\n // Draw a full circle by going almost all the way around\n const adjustedEnd = startAngle + PI2 - 0.001;\n const start = polarToCartesian(startAngle, radius, center);\n const end = polarToCartesian(adjustedEnd, radius, center);\n return `M ${start.x},${start.y} A ${radius},${radius} 0 1 1 ${end.x},${end.y}`;\n }\n\n const start = polarToCartesian(startAngle, radius, center);\n const end = polarToCartesian(endAngle, radius, center);\n\n const largeArcFlag = arcLength > Math.PI ? 1 : 0;\n\n return `M ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} 1 ${end.x},${end.y}`;\n}\n\n/**\n * Generate SVG path for a full flattened circle border\n * @param radius - Circle radius\n * @param flatten - Flattening amount (0..1)\n * @param center - Center point\n * @returns SVG path data string\n */\nexport function generateCircleBorderPath(\n radius: number,\n flatten: number,\n center: Point = { x: 50, y: 50 },\n): string {\n const { startAngle, endAngle } = getFlattenedCircleAngles(flatten);\n return generateArcPath(startAngle, endAngle, radius, center);\n}\n\n/**\n * Generate SVG path data for a filled wedge (pie-slice) sector\n * @param startAngle - Start angle in radians\n * @param endAngle - End angle in radians\n * @param radius - Wedge radius (same as dial radius)\n * @param center - Center point\n * @param clockwise - Whether to draw arc clockwise (true) or counterclockwise (false)\n * @returns SVG path data string for filled wedge\n */\nexport function generateWedgePath(\n startAngle: number,\n endAngle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n clockwise: boolean = true,\n): string {\n if (startAngle === endAngle) {\n return ``; // No wedge to draw\n }\n\n // Calculate arc length (always positive, representing shortest path)\n let arcLength = endAngle - startAngle;\n if (arcLength < 0) {\n arcLength += PI2;\n }\n\n // Handle full or near-full circle case\n if (arcLength >= PI2 - 0.001) {\n // Draw a near-full circle wedge\n const start = polarToCartesian(startAngle, radius, center);\n const adjustedEnd = startAngle + PI2 - 0.001;\n const adjEnd = polarToCartesian(adjustedEnd, radius, center);\n const largeArcFlag = 1;\n const sweepFlag = clockwise ? 1 : 0;\n return `M ${center.x},${center.y} L ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} ${sweepFlag} ${adjEnd.x},${adjEnd.y} Z`;\n }\n\n let actualStartAngle = startAngle;\n let actualEndAngle = endAngle;\n let actualClockwise = clockwise;\n\n // When going counterclockwise and arcLength > π, we want the short clockwise path instead\n // by swapping start and end\n if (!clockwise && arcLength > Math.PI) {\n actualStartAngle = endAngle;\n actualEndAngle = startAngle;\n actualClockwise = true;\n arcLength = PI2 - arcLength;\n }\n\n const start = polarToCartesian(actualStartAngle, radius, center);\n const end = polarToCartesian(actualEndAngle, radius, center);\n\n const largeArcFlag = arcLength > Math.PI ? 1 : 0;\n const sweepFlag = actualClockwise ? 1 : 0;\n\n // M center L start A radius radius 0 large sweep end Z\n return `M ${center.x},${center.y} L ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} ${sweepFlag} ${end.x},${end.y} Z`;\n}\n\n/**\n * Get wedge angles based on value mode\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Object with startAngle, endAngle, and clockwise flag\n */\nexport function getWedgeAngles(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number; clockwise: boolean } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n const valueAngle = valueToAngle(relativeValue, valueMode, flatten);\n\n switch (valueMode) {\n case `range`:\n // Wedge from startAngle to valueAngle (always clockwise)\n return {\n startAngle,\n endAngle: valueAngle,\n clockwise: true,\n };\n\n case `bipolar`: {\n // When value < 0.5, go counterclockwise from midpoint to value\n // When value >= 0.5, go clockwise from midpoint to value\n if (relativeValue < 0.5) {\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n clockwise: false,\n };\n } else {\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n clockwise: true,\n };\n }\n }\n\n case `unipolar`: {\n // Wedge centered at MIDPOINT, spreading value * totalArc/2 in each direction\n const halfSpread = relativeValue * totalArc / 2;\n return {\n startAngle: MIDPOINT_ANGLE - halfSpread,\n endAngle: MIDPOINT_ANGLE + halfSpread,\n clockwise: true,\n };\n }\n\n default:\n return { startAngle, endAngle: startAngle, clockwise: true };\n }\n}\n\n/**\n * Get position for a marker (needle or dot) at a given value\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @param radius - Circle radius\n * @param center - Center point\n * @returns Angle in radians and position point\n */\nexport function getMarkerPosition(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; position: Point } {\n const angle = valueToAngle(relativeValue, valueMode, flatten);\n const position = polarToCartesian(angle, radius, center);\n return { angle, position };\n}\n\n/**\n * Get position for midpoint marker (used in bipolar/unipolar modes)\n * @param radius - Circle radius\n * @param center - Center point\n * @returns Position at top-center of circle\n */\nexport function getMidpointPosition(\n radius: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; position: Point } {\n const position = polarToCartesian(MIDPOINT_ANGLE, radius, center);\n return { angle: MIDPOINT_ANGLE, position };\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Scale a value from one range to another\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n","/**\n * Radial input component\n * A rotary dial input inspired by Ableton Live and music production software.\n *\n * Mouse wheel: up = increase, down = decrease, with the same step resolution as\n * arrow keys (Shift halves the step). The dial must have focus by default, or\n * set the `lighttouch` boolean attribute to react on hover instead. See\n * `docs/infra-mousewheel.md`.\n */\n\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type {\n LaneData,\n LaneType,\n MarkerStyle,\n RadialInputChangeDetail,\n RadialInputInputDetail,\n ValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, 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 generateArcPath,\n generateCircleBorderPath,\n generateWedgePath,\n getAnchoredArcAngles,\n getMarkerPosition,\n getMidpointPosition,\n getValueArcAngles,\n getWedgeAngles,\n scale,\n} from './svg-utils.js';\n\nconst CENTER = { x: 50, y: 50 }; // Center point in viewBox\n\n@customElement(`ixfx-radial-input`)\nexport class RadialInputElement extends WheelNudgeMixin(LitElement) {\n // Internal backing field for radius (used with custom setter for clamping)\n #_radius = 45;\n\n // Radius property (controls dial size, 10-50 range to prevent clipping)\n @property({ type: Number })\n get radius(): number {\n return this.#_radius;\n }\n\n set radius(v: number) {\n this.#_radius = clamp(v, 10, 50);\n }\n\n // Value properties (matches ixfx-range API)\n @property({ type: Number })\n value = 0;\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;\n\n // Value mode\n @property({ type: String, attribute: `value-mode` })\n valueMode: ValueMode = `range`;\n\n // Appearance\n @property({ type: Number })\n flatten = 0.3;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: MarkerStyle = `needle`;\n\n @property({ type: Boolean })\n wedge = false;\n\n // Interaction\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // Internal state\n #lanes: Map<string, LaneData> = new Map();\n #dragging = false;\n #dragStartY = 0;\n #valueAtDragStart = 0;\n #changeDebounceTimer: number | undefined;\n #isUserInteraction = false;\n\n constructor() {\n super();\n // Initialize default lanes\n // Note: value lane will be updated in willUpdate() to reflect initial value\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1, // Full range\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n value: 0, // Will be updated in willUpdate()\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n // Lane management API\n addLane(\n key: string,\n options?: {\n value?: number;\n type?: LaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const relativeValue = this.#getRelativeValue();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? relativeValue,\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 removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, LaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): LaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // Internal helpers\n #getRelativeValue(): number {\n return scale(this.value, this.min, this.max, 0, 1);\n }\n\n #getEffectiveMarkerStyle(): MarkerStyle {\n if (this.valueMode === `unipolar` && this.markerStyle === `needle`) {\n return `none`;\n }\n return this.markerStyle;\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 return Math.round((value - this.min) / step) * step + this.min;\n }\n return value;\n }\n\n #setValueFromRelative(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.value)\n return;\n\n const previousValue = this.value;\n this.value = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n // Update 'value' lane if it exists\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.value = this.#getRelativeValue();\n }\n\n // Update data-tooltip for live tooltips\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValue() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n // Fire input event only for user interactions\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<RadialInputInputDetail>(`input`, {\n detail: {\n value: this.value,\n valueRelative: this.#getRelativeValue(),\n },\n bubbles: true,\n composed: true,\n }),\n );\n\n // Debounce change event\n this.#scheduleChangeEvent(previousValue);\n } else {\n // Immediate change event for programmatic changes\n this.#fireChangeEvent(previousValue);\n }\n }\n\n #scheduleChangeEvent(previousValue: number): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(previousValue);\n this.#changeDebounceTimer = undefined;\n }, 150);\n }\n\n #fireChangeEvent(previousValue: number): void {\n this.dispatchEvent(\n new CustomEvent<RadialInputChangeDetail>(`change`, {\n detail: {\n value: this.value,\n valueRelative: this.#getRelativeValue(),\n previousValue,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // Pointer interaction handlers\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n\n event.preventDefault();\n const svg = this.renderRoot.querySelector(`svg`);\n svg?.focus();\n this.#dragging = true;\n this.#dragStartY = event.clientY;\n this.#valueAtDragStart = this.value;\n this.toggleAttribute(`dragging`, true);\n\n if (svg) {\n svg.setPointerCapture(event.pointerId);\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 // Calculate sensitivity: full range = 2× component height\n const sensitivity = this.clientHeight * 2;\n const shiftDivisor = event.shiftKey ? KEY_STEP_DIVISOR : 1;\n const effectiveSensitivity = sensitivity * shiftDivisor;\n\n // Calculate delta (negative because up = increase)\n const deltaY = this.#dragStartY - event.clientY;\n const deltaValue = (deltaY / effectiveSensitivity) * (this.max - this.min);\n const newValue = this.#valueAtDragStart + deltaValue;\n\n const relativeValue = scale(newValue, this.min, this.max, 0, 1);\n this.#setValueFromRelative(clamp(relativeValue, 0, 1), true);\n };\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.toggleAttribute(`dragging`, false);\n\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg && `hasPointerCapture` in svg && typeof svg.hasPointerCapture === `function`) {\n if (svg.hasPointerCapture(1)) {\n svg.releasePointerCapture(1);\n }\n }\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // Keyboard interaction handler\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 let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n this.#stepByRelativeDelta(effectiveStep / range, true);\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n this.#stepByRelativeDelta(-effectiveStep / range, true);\n handled = true;\n break;\n\n case `Home`:\n this.#setValueFromRelative(0, true);\n handled = true;\n break;\n\n case `End`:\n this.#setValueFromRelative(1, true);\n handled = true;\n break;\n }\n\n if (handled) {\n event.preventDefault();\n }\n };\n\n /**\n * Apply a relative-delta nudge to the current value, clamped to [min, max] and\n * quantised. Shared between keyboard arrow keys and the wheel handler.\n */\n #stepByRelativeDelta(relativeDelta: number, isUserInteraction: boolean): void {\n this.#setValueFromRelative(\n clamp(this.#getRelativeValue() + relativeDelta, 0, 1),\n isUserInteraction,\n );\n }\n\n // Wheel handler — installed by WheelNudgeMixin on the host. Inverted from the\n // shared convention (`docs/infra-mousewheel.md`): wheel forward/up decreases\n // the value, wheel backward/down increases it. Matches the perceived\n // rotation of a physical rotary dial — turning the dial clockwise is the\n // most natural \"forward\" gesture and should reduce the value.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n this.#stepByRelativeDelta(-direction * effectiveStep / range, true);\n }\n\n // Rendering helpers\n #renderCircleBorder() {\n const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);\n const borderWidth = this.#getCssVar(`--dial-border-width`, 2);\n const borderColor = getComputedStyle(this).getPropertyValue(`--dial-border-color`).trim() || `var(--surface-4)`;\n return svg`<path class=\"dial-border\" d=\"${path}\" fill=\"none\" stroke=\"${borderColor}\" stroke-width=\"${borderWidth}\" stroke-linecap=\"round\" vector-effect=\"non-scaling-stroke\" />`;\n }\n\n #renderCircleFill() {\n const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);\n const fill = getComputedStyle(this).getPropertyValue(`--dial-fill`).trim() || `transparent`;\n return svg`<path class=\"dial-fill\" d=\"${path}\" fill=\"${fill}\" />`;\n }\n\n #renderWedge() {\n const relativeValue = this.#getRelativeValue();\n const { startAngle, endAngle, clockwise } = getWedgeAngles(\n relativeValue,\n this.valueMode,\n this.flatten,\n );\n\n const path = generateWedgePath(startAngle, endAngle, this.radius, CENTER, clockwise);\n if (!path)\n return svg``;\n\n return svg`<path class=\"wedge\" d=\"${path}\" />`;\n }\n\n #renderLane(lane: LaneData) {\n let arcPath = ``;\n\n if (lane.type === `fixed`) {\n // Fixed lanes always show full range\n arcPath = generateCircleBorderPath(\n this.radius - lane.offset * this.radius,\n this.flatten,\n CENTER,\n );\n } else if (lane.type === `anchored`) {\n // Anchored lanes: centered on current value, arc width based on lane.value\n const { startAngle, endAngle } = getAnchoredArcAngles(\n this.#getRelativeValue(),\n lane.value,\n this.valueMode,\n this.flatten,\n );\n arcPath = generateArcPath(\n startAngle,\n endAngle,\n this.radius - lane.offset * this.radius,\n CENTER,\n );\n } else {\n // Value lanes follow the value mode\n const { startAngle, endAngle } = getValueArcAngles(\n lane.value,\n this.valueMode,\n this.flatten,\n );\n arcPath = generateArcPath(\n startAngle,\n endAngle,\n this.radius - lane.offset * this.radius,\n CENTER,\n );\n }\n\n if (!arcPath)\n return svg``;\n\n return svg`\n <path \n class=\"lane\" \n data-lane-key=\"${lane.key}\" \n part=\"lane lane-${lane.key}\"\n d=\"${arcPath}\"\n style=\"\n stroke-width: calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${this.radius}%);\n stroke-linecap: round;\n \"\n />\n `;\n }\n\n #getNeedlePath(angle: number, length: number, offset: number): string {\n const startRadius = offset * this.radius;\n const endRadius = length * this.radius;\n\n const start = {\n x: CENTER.x + Math.cos(angle) * startRadius,\n y: CENTER.y + Math.sin(angle) * startRadius,\n };\n const end = {\n x: CENTER.x + Math.cos(angle) * endRadius,\n y: CENTER.y + Math.sin(angle) * endRadius,\n };\n\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n }\n\n #renderValueMarker(needlePath?: string) {\n const relativeValue = this.#getRelativeValue();\n const { angle, position } = getMarkerPosition(\n relativeValue,\n this.valueMode,\n this.flatten,\n this.radius,\n CENTER,\n );\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 1);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n const effectiveStyle = this.#getEffectiveMarkerStyle();\n\n if (effectiveStyle === `dot`) {\n const size = this.#getCssVar(`--marker-thickness`, 0.15);\n const r = size * this.radius;\n const dotX = CENTER.x + (position.x - CENTER.x) * markerOffset;\n const dotY = CENTER.y + (position.y - CENTER.y) * markerOffset;\n\n if (markerBorderWidth > 0) {\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <use href=\"#dot-path\" class=\"marker-border\" />\n <use href=\"#dot-path\" class=\"marker-fill\" />\n </g>\n `;\n }\n\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <circle cx=\"${dotX}\" cy=\"${dotY}\" r=\"${r}\" />\n </g>\n `;\n } else if (effectiveStyle === `needle`) {\n if (markerBorderWidth > 0 && needlePath) {\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <use href=\"#needle-path\" class=\"marker-border\" />\n <use href=\"#needle-path\" class=\"marker-fill\" />\n </g>\n `;\n }\n\n const length = this.#getCssVar(`--marker-length`, 0.8);\n const offset = this.#getCssVar(`--marker-offset`, 0.2);\n const path = this.#getNeedlePath(angle, length, offset);\n\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <path d=\"${path}\" />\n </g>\n `;\n }\n }\n\n #renderMidpointMarker() {\n // Only show in bipolar/unipolar modes\n if (this.valueMode !== `bipolar` && this.valueMode !== `unipolar`) {\n return svg``;\n }\n\n const { position } = getMidpointPosition(this.radius, CENTER);\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 \n cx=\"${position.x}\" \n cy=\"${position.y}\" \n r=\"${size * this.radius}\" \n />\n </g>\n `;\n } else {\n // Needle style\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const offset = this.#getCssVar(`--midpoint-offset`, 0.85);\n\n const angle = -Math.PI / 2; // Top of circle\n const startRadius = offset * this.radius;\n const endRadius = (offset + length) * this.radius;\n\n const start = {\n x: CENTER.x + Math.cos(angle) * startRadius,\n y: CENTER.y + Math.sin(angle) * startRadius,\n };\n const end = {\n x: CENTER.x + Math.cos(angle) * endRadius,\n y: CENTER.y + Math.sin(angle) * endRadius,\n };\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line \n x1=\"${start.x}\" \n y1=\"${start.y}\" \n x2=\"${end.x}\" \n y2=\"${end.y}\" \n />\n </g>\n `;\n }\n }\n\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 // Handle CSS calc() expressions with var(--value-relative)\n if (val.includes(`calc(`)) {\n // Get the current --value-relative value\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n // Fallback to default if --value-relative not set\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // Replace var(--value-relative) with the actual value\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n\n // Use Function constructor for safe evaluation (no eval)\n try {\n // Create a function that evaluates math expressions\n // eslint-disable-next-line no-new-func\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 (e) {\n // Fallback: try to parse just numbers\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 // Lifecycle methods\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Ensure value lane reflects current value before first render\n // This handles declaratively set initial values\n if (changed.has(`value`) || !this.hasUpdated) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.value = this.#getRelativeValue();\n }\n }\n }\n\n override render(): unknown {\n const lanes = Array.from(this.#lanes.values());\n\n const relativeValue = this.#getRelativeValue();\n const { angle, position } = getMarkerPosition(\n relativeValue,\n this.valueMode,\n this.flatten,\n this.radius,\n CENTER,\n );\n\n const needleLength = this.#getCssVar(`--marker-length`, 0.8);\n const needleOffset = this.#getCssVar(`--marker-offset`, 0.2);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n const needlePath = markerBorderWidth > 0 ? this.#getNeedlePath(angle, needleLength, needleOffset) : undefined;\n\n const dotSize = this.#getCssVar(`--marker-thickness`, 0.15);\n const dotR = dotSize * this.radius;\n\n const defs = [];\n if (needlePath) {\n defs.push(svg`<path id=\"needle-path\" d=\"${needlePath}\" />`);\n }\n if (markerBorderWidth > 0) {\n defs.push(svg`<circle id=\"dot-path\" cx=\"${position.x}\" cy=\"${position.y}\" r=\"${dotR}\" />`);\n }\n\n return html`\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n @pointerdown=\"${this.#onPointerDown}\"\n @keydown=\"${this.#onKeyDown}\"\n style=\"cursor: ${this.#dragging ? `ns-resize` : `grab`}\"\n >\n ${defs.length > 0 ? svg`<defs>${defs}</defs>` : ``}\n ${this.#renderCircleFill()}\n ${this.wedge ? this.#renderWedge() : ``}\n ${this.#renderCircleBorder()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${this.#renderValueMarker(needlePath)}\n </svg>\n `;\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --radius CSS variable when property changes\n if (changed.has(`radius`)) {\n this.style.setProperty(`--radius`, `${this.radius}%`);\n }\n\n // Update --value-relative CSS variable\n this.style.setProperty(`--value-relative`, this.#getRelativeValue().toString());\n\n // Adjust component height based on flatten to reduce wasted vertical space.\n // The dial is flattened at the top, so we don't need full height.\n if (changed.has(`flatten`)) {\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const radius = this.#getCssVar(`--radius`, 45);\n const markerPadding = Math.round(markerThickness * radius) + 5;\n const viewBoxHeight = Math.round(100 * (1 - this.flatten)) + markerPadding;\n // Set CSS variable to control host height\n this.style.setProperty(`--dial-height`, `${viewBoxHeight}px`);\n // Also update SVG viewBox to match\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg) {\n svg.setAttribute(`viewBox`, `0 0 100 ${viewBoxHeight}`);\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#onPointerUp();\n }\n\n override firstUpdated(): void {\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const radius = this.#getCssVar(`--radius`, 45);\n const markerPadding = Math.round(markerThickness * radius);\n const viewBoxHeight = Math.round(100 * (1 - this.flatten)) + markerPadding;\n this.style.setProperty(`--dial-height`, `${viewBoxHeight}px`);\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg) {\n svg.setAttribute(`viewBox`, `0 0 100 ${viewBoxHeight}`);\n }\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 100px;\n height: var(--dial-height, 100px);\n touch-action: none;\n user-select: none;\n tabindex: 0;\n\n /* Dynamic value - set by JS */\n --value-relative: 0;\n\n /* Lane widths (used in stroke-width calculations) */\n --lane-width: 0.16;\n --lane-track-width: 0.08;\n --lane-value-width: 0.12;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n svg {\n width: 100%;\n height: 100%;\n outline: none;\n }\n\n svg:active {\n cursor: grabbing;\n }\n\n svg:focus-visible {\n outline: var(--radial-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--radial-input-svg-focus-outline-offset, 2px);\n }\n\n .dial-border {\n fill: none;\n stroke: var(--dial-border-color, var(--surface-4));\n stroke-width: var(--dial-border-width, 2px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .dial-fill {\n fill: var(--dial-fill, transparent);\n }\n\n .wedge {\n fill: var(--wedge-fill, var(--accent));\n fill-opacity: var(--wedge-fill-opacity, 0.25);\n stroke: var(--wedge-border-color, var(--accent));\n stroke-width: var(--wedge-border-width, 0);\n stroke-opacity: var(--wedge-border-opacity, 1);\n vector-effect: non-scaling-stroke;\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,\n .value-marker .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * var(--radius, 45%));\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) * var(--radius, 45%));\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-border {\n fill: none;\n }\n\n .value-marker .marker-fill,\n .value-marker circle {\n fill: 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\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-radial-input': RadialInputElement;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radial-input-C4f-2Bya.js","names":["#_radius","#dragging","#dragStartY","#valueAtDragStart","#onPointerMove","#onPointerUp","#setValueFromRelative","#stepByRelativeDelta","#lanes","#getRelativeValue","#quantise","#isUserInteraction","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#getCssVar","#getEffectiveMarkerStyle","#getNeedlePath","#onPointerDown","#onKeyDown","#renderCircleFill","#renderWedge","#renderCircleBorder","#renderLane","#renderMidpointMarker","#renderValueMarker","customElement"],"sources":["../src/radial-input/svg-utils.ts","../src/radial-input/radial-input.ts"],"sourcesContent":["/**\n * SVG utilities for radial input component\n * Handles geometry calculations for flattened circle arcs\n */\n\nimport type { ValueMode } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface ArcParameters {\n startAngle: number; // radians\n endAngle: number; // radians\n radius: number;\n center: Point;\n}\n\nconst PI2 = Math.PI * 2;\nconst MIDPOINT_ANGLE = -Math.PI / 2; // Top-center of circle\n\n/**\n * Convert polar coordinates (angle in radians, radius) to SVG Cartesian coordinates\n * @param angle - Angle in radians (0 = right/east, increases clockwise in SVG)\n * @param radius - Distance from center\n * @param center - Center point (default: {x: 50, y: 50})\n * @returns Point in SVG coordinates\n */\nexport function polarToCartesian(\n angle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): Point {\n return {\n x: center.x + Math.cos(angle) * radius,\n y: center.y + Math.sin(angle) * radius,\n };\n}\n\n/**\n * Convert SVG Cartesian coordinates to polar (angle in radians, radius)\n * @param x - X coordinate\n * @param y - Y coordinate\n * @param center - Center point (default: {x: 50, y: 50})\n * @returns Angle in radians (0..2π) and radius\n */\nexport function cartesianToPolar(\n x: number,\n y: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; radius: number } {\n const dx = x - center.x;\n const dy = y - center.y;\n const radius = Math.sqrt(dx * dx + dy * dy);\n const raw = Math.atan2(dy, dx);\n const angle = ((raw % PI2) + PI2) % PI2; // Normalize to 0..2π\n return { angle, radius };\n}\n\n/**\n * Calculate start and end angles for a flattened circle\n * @param flatten - How much of the circle to hide (0..1): 0 = full circle, 0.5 = half circle, 1 = no arc\n * @returns Start and end angles in radians\n */\nexport function getFlattenedCircleAngles(flatten: number): {\n startAngle: number;\n endAngle: number;\n totalArc: number;\n} {\n // flatten represents the percentage of circle hidden\n // 0 = full circle (360°), 0.5 = half circle (180°), 1 = no arc (0°)\n const visibleArc = PI2 * (1 - flatten); // Total visible arc in radians\n\n // Center the visible arc at the top (angle = -π/2)\n // Start and end angles are symmetric around top-center\n const halfArc = visibleArc / 2;\n const topAngle = -Math.PI / 2; // Top center (270° in standard coords, but -90° from east)\n\n const startAngle = topAngle - halfArc;\n const endAngle = topAngle + halfArc;\n const totalArc = endAngle - startAngle;\n\n return { startAngle, endAngle, totalArc };\n}\n\n/**\n * Map a value (0..1) to an angle based on value mode\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Angle in radians\n */\nexport function valueToAngle(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): number {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n switch (valueMode) {\n case `range`:\n // Linear mapping from start to end\n return startAngle + relativeValue * totalArc;\n\n case `bipolar`: {\n // Midpoint is at top (MIDPOINT_ANGLE = -π/2)\n if (relativeValue <= 0.5) {\n // Map 0..0.5 to startAngle..MIDPOINT_ANGLE (going counterclockwise to top)\n const t = relativeValue / 0.5;\n return startAngle + t * (MIDPOINT_ANGLE - startAngle);\n } else {\n // Map 0.5..1 to MIDPOINT_ANGLE..endAngle (going clockwise from top)\n const t = (relativeValue - 0.5) / 0.5;\n return MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);\n }\n }\n\n case `unipolar`: {\n // Marker stays at top for unipolar mode\n return MIDPOINT_ANGLE;\n }\n\n default:\n return startAngle;\n }\n}\n\n/**\n * Get start and end angles for a value arc\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Start and end angles for the arc\n */\nexport function getValueArcAngles(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n switch (valueMode) {\n case `range`:\n // Arc from start to value position\n return {\n startAngle,\n endAngle: startAngle + relativeValue * totalArc,\n };\n\n case `bipolar`: {\n // Midpoint is at top (MIDPOINT_ANGLE = -π/2)\n if (relativeValue < 0.5) {\n // Arc from some point toward top (going counterclockwise)\n const t = relativeValue / 0.5;\n const valueAngle = startAngle + t * (MIDPOINT_ANGLE - startAngle);\n return {\n startAngle: valueAngle,\n endAngle: MIDPOINT_ANGLE,\n };\n } else if (relativeValue > 0.5) {\n // Arc from top going clockwise\n const t = (relativeValue - 0.5) / 0.5;\n const valueAngle = MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n };\n } else {\n // Exactly at midpoint, no arc\n return { startAngle: MIDPOINT_ANGLE, endAngle: MIDPOINT_ANGLE };\n }\n }\n\n case `unipolar`: {\n // Spread symmetrically from top (MIDPOINT_ANGLE = -π/2)\n const spreadAmount = relativeValue * totalArc / 2;\n return {\n startAngle: MIDPOINT_ANGLE - spreadAmount,\n endAngle: MIDPOINT_ANGLE + spreadAmount,\n };\n }\n\n default:\n return { startAngle, endAngle: startAngle };\n }\n}\n\n/**\n * Get start and end angles for an anchored arc\n * Centered on current value position, extends equally in both directions\n * @param relativeValue - Current value position (0..1)\n * @param laneValue - Width of the arc (0..1, where 1 = full range)\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Start and end angles for the arc\n */\nexport function getAnchoredArcAngles(\n relativeValue: number,\n laneValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n\n // Get the angle for the current value (this is the center of the arc)\n const centerAngle = valueToAngle(relativeValue, valueMode, flatten);\n\n // Calculate half-width of the arc\n // laneValue is 0..1, where 1 = full range\n const halfWidth = (laneValue * totalArc) / 2;\n\n let arcStart = centerAngle - halfWidth;\n let arcEnd = centerAngle + halfWidth;\n\n // Clamp to valid bounds (prevent wrapping)\n // The valid range is [startAngle, endAngle]\n if (arcStart < startAngle)\n arcStart = startAngle;\n if (arcEnd > endAngle)\n arcEnd = endAngle;\n\n // If the arc would be degenerate after clamping, return a single point\n if (arcStart >= arcEnd) {\n return { startAngle: centerAngle, endAngle: centerAngle };\n }\n\n return { startAngle: arcStart, endAngle: arcEnd };\n}\n\n/**\n * Generate SVG path for an arc\n * @param startAngle - Start angle in radians\n * @param endAngle - End angle in radians\n * @param radius - Arc radius\n * @param center - Center point\n * @returns SVG path data string\n */\nexport function generateArcPath(\n startAngle: number,\n endAngle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): string {\n if (startAngle === endAngle) {\n return ``; // No arc to draw\n }\n\n // Calculate arc length to determine large-arc-flag\n let arcLength = endAngle - startAngle;\n\n // Handle wrap-around case (e.g., from 5.5 to 0.5 radians)\n if (arcLength < 0) {\n arcLength += PI2;\n }\n\n // Handle full or near-full circle case\n // When arcLength is nearly 2π, start and end points are essentially the same\n // and drawing a full circle needs special handling\n if (arcLength >= PI2 - 0.001) {\n // Draw a full circle by going almost all the way around\n const adjustedEnd = startAngle + PI2 - 0.001;\n const start = polarToCartesian(startAngle, radius, center);\n const end = polarToCartesian(adjustedEnd, radius, center);\n return `M ${start.x},${start.y} A ${radius},${radius} 0 1 1 ${end.x},${end.y}`;\n }\n\n const start = polarToCartesian(startAngle, radius, center);\n const end = polarToCartesian(endAngle, radius, center);\n\n const largeArcFlag = arcLength > Math.PI ? 1 : 0;\n\n return `M ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} 1 ${end.x},${end.y}`;\n}\n\n/**\n * Generate SVG path for a full flattened circle border\n * @param radius - Circle radius\n * @param flatten - Flattening amount (0..1)\n * @param center - Center point\n * @returns SVG path data string\n */\nexport function generateCircleBorderPath(\n radius: number,\n flatten: number,\n center: Point = { x: 50, y: 50 },\n): string {\n const { startAngle, endAngle } = getFlattenedCircleAngles(flatten);\n return generateArcPath(startAngle, endAngle, radius, center);\n}\n\n/**\n * Generate SVG path data for a filled wedge (pie-slice) sector\n * @param startAngle - Start angle in radians\n * @param endAngle - End angle in radians\n * @param radius - Wedge radius (same as dial radius)\n * @param center - Center point\n * @param clockwise - Whether to draw arc clockwise (true) or counterclockwise (false)\n * @returns SVG path data string for filled wedge\n */\nexport function generateWedgePath(\n startAngle: number,\n endAngle: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n clockwise: boolean = true,\n): string {\n if (startAngle === endAngle) {\n return ``; // No wedge to draw\n }\n\n // Calculate arc length (always positive, representing shortest path)\n let arcLength = endAngle - startAngle;\n if (arcLength < 0) {\n arcLength += PI2;\n }\n\n // Handle full or near-full circle case\n if (arcLength >= PI2 - 0.001) {\n // Draw a near-full circle wedge\n const start = polarToCartesian(startAngle, radius, center);\n const adjustedEnd = startAngle + PI2 - 0.001;\n const adjEnd = polarToCartesian(adjustedEnd, radius, center);\n const largeArcFlag = 1;\n const sweepFlag = clockwise ? 1 : 0;\n return `M ${center.x},${center.y} L ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} ${sweepFlag} ${adjEnd.x},${adjEnd.y} Z`;\n }\n\n let actualStartAngle = startAngle;\n let actualEndAngle = endAngle;\n let actualClockwise = clockwise;\n\n // When going counterclockwise and arcLength > π, we want the short clockwise path instead\n // by swapping start and end\n if (!clockwise && arcLength > Math.PI) {\n actualStartAngle = endAngle;\n actualEndAngle = startAngle;\n actualClockwise = true;\n arcLength = PI2 - arcLength;\n }\n\n const start = polarToCartesian(actualStartAngle, radius, center);\n const end = polarToCartesian(actualEndAngle, radius, center);\n\n const largeArcFlag = arcLength > Math.PI ? 1 : 0;\n const sweepFlag = actualClockwise ? 1 : 0;\n\n // M center L start A radius radius 0 large sweep end Z\n return `M ${center.x},${center.y} L ${start.x},${start.y} A ${radius},${radius} 0 ${largeArcFlag} ${sweepFlag} ${end.x},${end.y} Z`;\n}\n\n/**\n * Get wedge angles based on value mode\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @returns Object with startAngle, endAngle, and clockwise flag\n */\nexport function getWedgeAngles(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n): { startAngle: number; endAngle: number; clockwise: boolean } {\n const { startAngle, endAngle, totalArc } = getFlattenedCircleAngles(flatten);\n const valueAngle = valueToAngle(relativeValue, valueMode, flatten);\n\n switch (valueMode) {\n case `range`:\n // Wedge from startAngle to valueAngle (always clockwise)\n return {\n startAngle,\n endAngle: valueAngle,\n clockwise: true,\n };\n\n case `bipolar`: {\n // When value < 0.5, go counterclockwise from midpoint to value\n // When value >= 0.5, go clockwise from midpoint to value\n if (relativeValue < 0.5) {\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n clockwise: false,\n };\n } else {\n return {\n startAngle: MIDPOINT_ANGLE,\n endAngle: valueAngle,\n clockwise: true,\n };\n }\n }\n\n case `unipolar`: {\n // Wedge centered at MIDPOINT, spreading value * totalArc/2 in each direction\n const halfSpread = relativeValue * totalArc / 2;\n return {\n startAngle: MIDPOINT_ANGLE - halfSpread,\n endAngle: MIDPOINT_ANGLE + halfSpread,\n clockwise: true,\n };\n }\n\n default:\n return { startAngle, endAngle: startAngle, clockwise: true };\n }\n}\n\n/**\n * Get position for a marker (needle or dot) at a given value\n * @param relativeValue - Value in 0..1 range\n * @param valueMode - How to interpret the value\n * @param flatten - Circle flattening amount (0..1)\n * @param radius - Circle radius\n * @param center - Center point\n * @returns Angle in radians and position point\n */\nexport function getMarkerPosition(\n relativeValue: number,\n valueMode: ValueMode,\n flatten: number,\n radius: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; position: Point } {\n const angle = valueToAngle(relativeValue, valueMode, flatten);\n const position = polarToCartesian(angle, radius, center);\n return { angle, position };\n}\n\n/**\n * Get position for midpoint marker (used in bipolar/unipolar modes)\n * @param radius - Circle radius\n * @param center - Center point\n * @returns Position at top-center of circle\n */\nexport function getMidpointPosition(\n radius: number,\n center: Point = { x: 50, y: 50 },\n): { angle: number; position: Point } {\n const position = polarToCartesian(MIDPOINT_ANGLE, radius, center);\n return { angle: MIDPOINT_ANGLE, position };\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Scale a value from one range to another\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n","/**\n * Radial input component\n * A rotary dial input inspired by Ableton Live and music production software.\n *\n * Mouse wheel: up = increase, down = decrease, with the same step resolution as\n * arrow keys (Shift halves the step). The dial must have focus by default, or\n * set the `lighttouch` boolean attribute to react on hover instead. See\n * `docs/infra-mousewheel.md`.\n */\n\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type {\n LaneData,\n LaneType,\n MarkerStyle,\n RadialInputChangeDetail,\n RadialInputInputDetail,\n ValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, 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 generateArcPath,\n generateCircleBorderPath,\n generateWedgePath,\n getAnchoredArcAngles,\n getMarkerPosition,\n getMidpointPosition,\n getValueArcAngles,\n getWedgeAngles,\n scale,\n} from './svg-utils.js';\n\nconst CENTER = { x: 50, y: 50 }; // Center point in viewBox\n\n@customElement(`ixfx-radial-input`)\nexport class RadialInputElement extends WheelNudgeMixin(LitElement) {\n // Internal backing field for radius (used with custom setter for clamping)\n #_radius = 45;\n\n // Radius property (controls dial size, 10-50 range to prevent clipping)\n @property({ type: Number })\n get radius(): number {\n return this.#_radius;\n }\n\n set radius(v: number) {\n this.#_radius = clamp(v, 10, 50);\n }\n\n // Value properties (matches ixfx-range API)\n @property({ type: Number })\n value = 0;\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;\n\n // Value mode\n @property({ type: String, attribute: `value-mode` })\n valueMode: ValueMode = `range`;\n\n // Appearance\n @property({ type: Number })\n flatten = 0.3;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: MarkerStyle = `needle`;\n\n @property({ type: Boolean })\n wedge = false;\n\n // Interaction\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // Internal state\n #lanes: Map<string, LaneData> = new Map();\n #dragging = false;\n #dragStartY = 0;\n #valueAtDragStart = 0;\n #changeDebounceTimer: number | undefined;\n #isUserInteraction = false;\n\n constructor() {\n super();\n // Initialize default lanes\n // Note: value lane will be updated in willUpdate() to reflect initial value\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1, // Full range\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n value: 0, // Will be updated in willUpdate()\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n // Lane management API\n addLane(\n key: string,\n options?: {\n value?: number;\n type?: LaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const relativeValue = this.#getRelativeValue();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? relativeValue,\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 removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, LaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): LaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // Internal helpers\n #getRelativeValue(): number {\n return scale(this.value, this.min, this.max, 0, 1);\n }\n\n #getEffectiveMarkerStyle(): MarkerStyle {\n if (this.valueMode === `unipolar` && this.markerStyle === `needle`) {\n return `none`;\n }\n return this.markerStyle;\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 return Math.round((value - this.min) / step) * step + this.min;\n }\n return value;\n }\n\n #setValueFromRelative(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.value)\n return;\n\n const previousValue = this.value;\n this.value = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n // Update 'value' lane if it exists\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.value = this.#getRelativeValue();\n }\n\n // Update data-tooltip for live tooltips\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValue() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n // Fire input event only for user interactions\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<RadialInputInputDetail>(`input`, {\n detail: {\n value: this.value,\n valueRelative: this.#getRelativeValue(),\n },\n bubbles: true,\n composed: true,\n }),\n );\n\n // Debounce change event\n this.#scheduleChangeEvent(previousValue);\n } else {\n // Immediate change event for programmatic changes\n this.#fireChangeEvent(previousValue);\n }\n }\n\n #scheduleChangeEvent(previousValue: number): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(previousValue);\n this.#changeDebounceTimer = undefined;\n }, 150);\n }\n\n #fireChangeEvent(previousValue: number): void {\n this.dispatchEvent(\n new CustomEvent<RadialInputChangeDetail>(`change`, {\n detail: {\n value: this.value,\n valueRelative: this.#getRelativeValue(),\n previousValue,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // Pointer interaction handlers\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n\n event.preventDefault();\n const svg = this.renderRoot.querySelector(`svg`);\n svg?.focus();\n this.#dragging = true;\n this.#dragStartY = event.clientY;\n this.#valueAtDragStart = this.value;\n this.toggleAttribute(`dragging`, true);\n\n if (svg) {\n svg.setPointerCapture(event.pointerId);\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 // Calculate sensitivity: full range = 2× component height\n const sensitivity = this.clientHeight * 2;\n const shiftDivisor = event.shiftKey ? KEY_STEP_DIVISOR : 1;\n const effectiveSensitivity = sensitivity * shiftDivisor;\n\n // Calculate delta (negative because up = increase)\n const deltaY = this.#dragStartY - event.clientY;\n const deltaValue = (deltaY / effectiveSensitivity) * (this.max - this.min);\n const newValue = this.#valueAtDragStart + deltaValue;\n\n const relativeValue = scale(newValue, this.min, this.max, 0, 1);\n this.#setValueFromRelative(clamp(relativeValue, 0, 1), true);\n };\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.toggleAttribute(`dragging`, false);\n\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg && `hasPointerCapture` in svg && typeof svg.hasPointerCapture === `function`) {\n if (svg.hasPointerCapture(1)) {\n svg.releasePointerCapture(1);\n }\n }\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // Keyboard interaction handler\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 let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n this.#stepByRelativeDelta(effectiveStep / range, true);\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n this.#stepByRelativeDelta(-effectiveStep / range, true);\n handled = true;\n break;\n\n case `Home`:\n this.#setValueFromRelative(0, true);\n handled = true;\n break;\n\n case `End`:\n this.#setValueFromRelative(1, true);\n handled = true;\n break;\n }\n\n if (handled) {\n event.preventDefault();\n }\n };\n\n /**\n * Apply a relative-delta nudge to the current value, clamped to [min, max] and\n * quantised. Shared between keyboard arrow keys and the wheel handler.\n */\n #stepByRelativeDelta(relativeDelta: number, isUserInteraction: boolean): void {\n this.#setValueFromRelative(\n clamp(this.#getRelativeValue() + relativeDelta, 0, 1),\n isUserInteraction,\n );\n }\n\n // Wheel handler — installed by WheelNudgeMixin on the host. Inverted from the\n // shared convention (`docs/infra-mousewheel.md`): wheel forward/up decreases\n // the value, wheel backward/down increases it. Matches the perceived\n // rotation of a physical rotary dial — turning the dial clockwise is the\n // most natural \"forward\" gesture and should reduce the value.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n this.#stepByRelativeDelta(-direction * effectiveStep / range, true);\n }\n\n // Rendering helpers\n #renderCircleBorder() {\n const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);\n const borderWidth = this.#getCssVar(`--dial-border-width`, 2);\n const borderColor = getComputedStyle(this).getPropertyValue(`--dial-border-color`).trim() || `var(--surface-4)`;\n return svg`<path class=\"dial-border\" d=\"${path}\" fill=\"none\" stroke=\"${borderColor}\" stroke-width=\"${borderWidth}\" stroke-linecap=\"round\" vector-effect=\"non-scaling-stroke\" />`;\n }\n\n #renderCircleFill() {\n const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);\n const fill = getComputedStyle(this).getPropertyValue(`--dial-fill`).trim() || `transparent`;\n return svg`<path class=\"dial-fill\" d=\"${path}\" fill=\"${fill}\" />`;\n }\n\n #renderWedge() {\n const relativeValue = this.#getRelativeValue();\n const { startAngle, endAngle, clockwise } = getWedgeAngles(\n relativeValue,\n this.valueMode,\n this.flatten,\n );\n\n const path = generateWedgePath(startAngle, endAngle, this.radius, CENTER, clockwise);\n if (!path)\n return svg``;\n\n return svg`<path class=\"wedge\" d=\"${path}\" />`;\n }\n\n #renderLane(lane: LaneData) {\n let arcPath = ``;\n\n if (lane.type === `fixed`) {\n // Fixed lanes always show full range\n arcPath = generateCircleBorderPath(\n this.radius - lane.offset * this.radius,\n this.flatten,\n CENTER,\n );\n } else if (lane.type === `anchored`) {\n // Anchored lanes: centered on current value, arc width based on lane.value\n const { startAngle, endAngle } = getAnchoredArcAngles(\n this.#getRelativeValue(),\n lane.value,\n this.valueMode,\n this.flatten,\n );\n arcPath = generateArcPath(\n startAngle,\n endAngle,\n this.radius - lane.offset * this.radius,\n CENTER,\n );\n } else {\n // Value lanes follow the value mode\n const { startAngle, endAngle } = getValueArcAngles(\n lane.value,\n this.valueMode,\n this.flatten,\n );\n arcPath = generateArcPath(\n startAngle,\n endAngle,\n this.radius - lane.offset * this.radius,\n CENTER,\n );\n }\n\n if (!arcPath)\n return svg``;\n\n return svg`\n <path \n class=\"lane\" \n data-lane-key=\"${lane.key}\" \n part=\"lane lane-${lane.key}\"\n d=\"${arcPath}\"\n style=\"\n stroke-width: calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${this.radius}%);\n stroke-linecap: round;\n \"\n />\n `;\n }\n\n #getNeedlePath(angle: number, length: number, offset: number): string {\n const startRadius = offset * this.radius;\n const endRadius = length * this.radius;\n\n const start = {\n x: CENTER.x + Math.cos(angle) * startRadius,\n y: CENTER.y + Math.sin(angle) * startRadius,\n };\n const end = {\n x: CENTER.x + Math.cos(angle) * endRadius,\n y: CENTER.y + Math.sin(angle) * endRadius,\n };\n\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n }\n\n #renderValueMarker(needlePath?: string) {\n const relativeValue = this.#getRelativeValue();\n const { angle, position } = getMarkerPosition(\n relativeValue,\n this.valueMode,\n this.flatten,\n this.radius,\n CENTER,\n );\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 1);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n const effectiveStyle = this.#getEffectiveMarkerStyle();\n\n if (effectiveStyle === `dot`) {\n const size = this.#getCssVar(`--marker-thickness`, 0.15);\n const r = size * this.radius;\n const dotX = CENTER.x + (position.x - CENTER.x) * markerOffset;\n const dotY = CENTER.y + (position.y - CENTER.y) * markerOffset;\n\n if (markerBorderWidth > 0) {\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <use href=\"#dot-path\" class=\"marker-border\" />\n <use href=\"#dot-path\" class=\"marker-fill\" />\n </g>\n `;\n }\n\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <circle cx=\"${dotX}\" cy=\"${dotY}\" r=\"${r}\" />\n </g>\n `;\n } else if (effectiveStyle === `needle`) {\n if (markerBorderWidth > 0 && needlePath) {\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <use href=\"#needle-path\" class=\"marker-border\" />\n <use href=\"#needle-path\" class=\"marker-fill\" />\n </g>\n `;\n }\n\n const length = this.#getCssVar(`--marker-length`, 0.8);\n const offset = this.#getCssVar(`--marker-offset`, 0.2);\n const path = this.#getNeedlePath(angle, length, offset);\n\n return svg`\n <g class=\"value-marker\" part=\"value-marker\">\n <path d=\"${path}\" />\n </g>\n `;\n }\n }\n\n #renderMidpointMarker() {\n // Only show in bipolar/unipolar modes\n if (this.valueMode !== `bipolar` && this.valueMode !== `unipolar`) {\n return svg``;\n }\n\n const { position } = getMidpointPosition(this.radius, CENTER);\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 \n cx=\"${position.x}\" \n cy=\"${position.y}\" \n r=\"${size * this.radius}\" \n />\n </g>\n `;\n } else {\n // Needle style\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const offset = this.#getCssVar(`--midpoint-offset`, 0.85);\n\n const angle = -Math.PI / 2; // Top of circle\n const startRadius = offset * this.radius;\n const endRadius = (offset + length) * this.radius;\n\n const start = {\n x: CENTER.x + Math.cos(angle) * startRadius,\n y: CENTER.y + Math.sin(angle) * startRadius,\n };\n const end = {\n x: CENTER.x + Math.cos(angle) * endRadius,\n y: CENTER.y + Math.sin(angle) * endRadius,\n };\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line \n x1=\"${start.x}\" \n y1=\"${start.y}\" \n x2=\"${end.x}\" \n y2=\"${end.y}\" \n />\n </g>\n `;\n }\n }\n\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 // Handle CSS calc() expressions with var(--value-relative)\n if (val.includes(`calc(`)) {\n // Get the current --value-relative value\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n // Fallback to default if --value-relative not set\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // Replace var(--value-relative) with the actual value\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n\n // Use Function constructor for safe evaluation (no eval)\n try {\n // Create a function that evaluates math expressions\n // eslint-disable-next-line no-new-func\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 (e) {\n // Fallback: try to parse just numbers\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 // Lifecycle methods\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Ensure value lane reflects current value before first render\n // This handles declaratively set initial values\n if (changed.has(`value`) || !this.hasUpdated) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.value = this.#getRelativeValue();\n }\n }\n }\n\n override render(): unknown {\n const lanes = Array.from(this.#lanes.values());\n\n const relativeValue = this.#getRelativeValue();\n const { angle, position } = getMarkerPosition(\n relativeValue,\n this.valueMode,\n this.flatten,\n this.radius,\n CENTER,\n );\n\n const needleLength = this.#getCssVar(`--marker-length`, 0.8);\n const needleOffset = this.#getCssVar(`--marker-offset`, 0.2);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n const needlePath = markerBorderWidth > 0 ? this.#getNeedlePath(angle, needleLength, needleOffset) : undefined;\n\n const dotSize = this.#getCssVar(`--marker-thickness`, 0.15);\n const dotR = dotSize * this.radius;\n\n const defs = [];\n if (needlePath) {\n defs.push(svg`<path id=\"needle-path\" d=\"${needlePath}\" />`);\n }\n if (markerBorderWidth > 0) {\n defs.push(svg`<circle id=\"dot-path\" cx=\"${position.x}\" cy=\"${position.y}\" r=\"${dotR}\" />`);\n }\n\n return html`\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n @pointerdown=\"${this.#onPointerDown}\"\n @keydown=\"${this.#onKeyDown}\"\n style=\"cursor: ${this.#dragging ? `ns-resize` : `grab`}\"\n >\n ${defs.length > 0 ? svg`<defs>${defs}</defs>` : ``}\n ${this.#renderCircleFill()}\n ${this.wedge ? this.#renderWedge() : ``}\n ${this.#renderCircleBorder()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${this.#renderValueMarker(needlePath)}\n </svg>\n `;\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --radius CSS variable when property changes\n if (changed.has(`radius`)) {\n this.style.setProperty(`--radius`, `${this.radius}%`);\n }\n\n // Update --value-relative CSS variable\n this.style.setProperty(`--value-relative`, this.#getRelativeValue().toString());\n\n // Adjust component height based on flatten to reduce wasted vertical space.\n // The dial is flattened at the top, so we don't need full height.\n if (changed.has(`flatten`)) {\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const radius = this.#getCssVar(`--radius`, 45);\n const markerPadding = Math.round(markerThickness * radius) + 5;\n const viewBoxHeight = Math.round(100 * (1 - this.flatten)) + markerPadding;\n // Set CSS variable to control host height\n this.style.setProperty(`--dial-height`, `${viewBoxHeight}px`);\n // Also update SVG viewBox to match\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg) {\n svg.setAttribute(`viewBox`, `0 0 100 ${viewBoxHeight}`);\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#onPointerUp();\n }\n\n override firstUpdated(): void {\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const radius = this.#getCssVar(`--radius`, 45);\n const markerPadding = Math.round(markerThickness * radius);\n const viewBoxHeight = Math.round(100 * (1 - this.flatten)) + markerPadding;\n this.style.setProperty(`--dial-height`, `${viewBoxHeight}px`);\n const svg = this.renderRoot.querySelector(`svg`);\n if (svg) {\n svg.setAttribute(`viewBox`, `0 0 100 ${viewBoxHeight}`);\n }\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 100px;\n height: var(--dial-height, 100px);\n touch-action: none;\n user-select: none;\n tabindex: 0;\n\n /* Dynamic value - set by JS */\n --value-relative: 0;\n\n /* Lane widths (used in stroke-width calculations) */\n --lane-width: 0.16;\n --lane-track-width: 0.08;\n --lane-value-width: 0.12;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n svg {\n width: 100%;\n height: 100%;\n outline: none;\n }\n\n svg:active {\n cursor: grabbing;\n }\n\n svg:focus-visible {\n outline: var(--radial-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--radial-input-svg-focus-outline-offset, 2px);\n }\n\n .dial-border {\n fill: none;\n stroke: var(--dial-border-color, var(--surface-4));\n stroke-width: var(--dial-border-width, 2px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .dial-fill {\n fill: var(--dial-fill, transparent);\n }\n\n .wedge {\n fill: var(--wedge-fill, var(--accent));\n fill-opacity: var(--wedge-fill-opacity, 0.25);\n stroke: var(--wedge-border-color, var(--accent));\n stroke-width: var(--wedge-border-width, 0);\n stroke-opacity: var(--wedge-border-opacity, 1);\n vector-effect: non-scaling-stroke;\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,\n .value-marker .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * var(--radius, 45%));\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) * var(--radius, 45%));\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-border {\n fill: none;\n }\n\n .value-marker .marker-fill,\n .value-marker circle {\n fill: 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\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-radial-input': RadialInputElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-
|
|
1
|
+
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-C-ra_1os.js";
|
|
2
2
|
import { LitElement, PropertyValues } from "lit";
|
|
3
|
+
|
|
3
4
|
//#region src/radial-input/types.d.ts
|
|
4
5
|
/**
|
|
5
6
|
* Type definitions for radial input component
|
|
@@ -68,4 +69,4 @@ declare global {
|
|
|
68
69
|
}
|
|
69
70
|
//#endregion
|
|
70
71
|
export { RadialInputChangeDetail as a, RadialInputInputEvent as c, MarkerStyle as i, ValueMode as l, LaneData as n, RadialInputChangeEvent as o, LaneType as r, RadialInputInputDetail as s, RadialInputElement as t };
|
|
71
|
-
//# sourceMappingURL=radial-input-
|
|
72
|
+
//# sourceMappingURL=radial-input-Dhu5ZGP5.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radial-input-Dhu5ZGP5.d.ts","names":[],"sources":["../src/radial-input/types.ts","../src/radial-input/radial-input.ts"],"mappings":";;;;;;;KAIY,SAAA;AAAA,KACA,WAAA;AAAA,KACA,QAAA;AAAA,UAEK,QAAA;EACf,GAAA;EACA,KAAA;EACA,IAAA,EAAM,QAAQ;EACd,MAAA;EACA,KAAA;AAAA;AAAA,UAGe,sBAAA;EACf,KAAA;EACA,aAAa;AAAA;AAAA,UAGE,uBAAA;EACf,KAAA;EACA,aAAA;EACA,aAAA;AAAA;AAAA,KAGU,qBAAA,GAAwB,WAAW,CAAC,sBAAA;AAAA,KACpC,sBAAA,GAAyB,WAAW,CAAC,uBAAA;;;cCRA,uBAAA;cAuBpC,kBAAA,SAA2B,uBAAA;EAAA;MAMlC,MAAA;EAAA,IAIA,MAAA,CAAO,CAAA;EAMX,KAAA;EAGA,GAAA;EAGA,GAAA;EAGA,IAAA;EAGA,KAAA;EAIA,SAAA,EAAW,SAAA;EAIX,OAAA;EAGA,WAAA,EAAa,WAAA;EAGb,KAAA;EAIA,QAAA;;EA+BA,OAAA,CACE,GAAA,UACA,OAAA;IACE,KAAA;IACA,IAAA,GAAO,QAAA;IACP,MAAA;IACA,KAAA;EAAA;EAcJ,YAAA,CAAa,GAAA,UAAa,KAAA;EAQ1B,UAAA,CAAW,GAAA;EAKX,QAAA,IAAY,WAAA,SAAoB,QAAA;EAIhC,OAAA,CAAQ,GAAA,WAAc,QAAA;EA+Mb,gBAAA,CAAiB,SAAA,EAAW,cAAA,EAAgB,KAAA,EAAO,UAAA;EAAA,UA4PzC,UAAA,CAAW,OAAA,EAAS,cAAA;EAa9B,MAAA;EAAA,UAgDU,OAAA,CAAQ,OAAA,EAAS,cAAA;EA4B3B,oBAAA;EAQA,YAAA;EAAA,OAYO,MAAA,gBAAM,SAAA;AAAA;AAAA,QAwHhB,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,kBAAkB;EAAA;AAAA"}
|
package/dist/radial-input.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as RadialInputElement } from "./radial-input-
|
|
1
|
+
import { t as RadialInputElement } from "./radial-input-Dhu5ZGP5.js";
|
|
2
2
|
export { RadialInputElement };
|
package/dist/radial-input.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as RadialInputElement } from "./radial-input-
|
|
1
|
+
import { t as RadialInputElement } from "./radial-input-C4f-2Bya.js";
|
|
2
2
|
export { RadialInputElement };
|
package/dist/range-input.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-
|
|
2
|
-
import { n as TooltipElement, r as TooltipOrientations } from "./tooltip-
|
|
1
|
+
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-C-ra_1os.js";
|
|
2
|
+
import { n as TooltipElement, r as TooltipOrientations } from "./tooltip-BMTSUPBU.js";
|
|
3
3
|
import { CSSResultGroup, LitElement } from "lit";
|
|
4
|
+
|
|
4
5
|
//#region src/range-input/range-input.d.ts
|
|
5
6
|
declare const RangeInput_base: (new (...args: any[]) => WheelNudgeConsumerType<LitElement>) & typeof LitElement;
|
|
6
7
|
declare class RangeInput extends RangeInput_base {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range-input.d.ts","names":[],"sources":["../src/range-input/range-input.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"range-input.d.ts","names":[],"sources":["../src/range-input/range-input.ts"],"mappings":";;;;;cAgEqD,eAAA;cAYxC,UAAA,SAAmB,eAAA;EACF,GAAA;EACA,GAAA;EACA,KAAA;EACA,IAAA;EACe,WAAA;EACC,SAAA;EACf,OAAA;EACiC,kBAAA,EAAoB,mBAAA;EAClD,cAAA,IAAkB,QAAA,UAAkB,WAAA;EAGpE,QAAA,EAAW,gBAAA;EAGX,UAAA,GAAa,cAAA;EA0KgB;EAAA,QAvKrB,cAAA;EAEC,iBAAA;EAQA,oBAAA;EAAA,QASD,iBAAA;EAAA,QAWA,gBAAA;EAAA,QASA,cAAA;EAAA,QASA,cAAA;EAAA,QAMA,eAAA;EAAA,QAQA,eAAA;EAAA,QAOA,kBAAA;EAOC,OAAA,CAAQ,iBAAA,EAAmB,GAAA;EAgBpC,YAAA,GAAgB,CAAA,EAAG,KAAA;EAUnB,mBAAA;EAQA,aAAA;;;;;;;;;;EAcS,gBAAA,CAAiB,SAAA,EAAW,cAAA,EAAgB,MAAA,EAAQ,UAAA;EAepD,MAAA,kBAAM,cAAA;EAAA,OA4BR,MAAA,EAAQ,cAAA;AAAA;AAAA,QA2RT,MAAA;EAAA,UACI,qBAAA;IACR,kBAAA,EAAoB,UAAU;EAAA;AAAA"}
|
package/dist/range-input.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
3
|
-
import { t as WheelNudgeMixin } from "./wheel-nudge-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
|
+
import { t as WheelNudgeMixin } from "./wheel-nudge-Dhzi5nHc.js";
|
|
4
4
|
import { t as tooltipValueStyles } from "./tooltip-CJt3WLmN.js";
|
|
5
5
|
import { LitElement, css, html, nothing } from "lit";
|
|
6
6
|
import { property, query } from "lit/decorators.js";
|
package/dist/range-input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range-input.js","names":["customElement"],"sources":["../src/range-input/range-input.ts"],"sourcesContent":["/**\n * <ixfx-range-input> — styled range input with no label.\n *\n * A thin wrapper around <input type=\"range\"> that adds the same\n * fancy track/thumb/fill styling as the linear-value components,\n * without the label display.\n *\n * Supports horizontal (default) and vertical orientation in a single element.\n * Set orientation=\"vertical\" attribute to switch.\n *\n * CSS Variables:\n * --track-thickness Track cross-axis size (default 1.5em)\n * --thumb-color Thumb fill (default var(--surface-2-text))\n * --thumb-color-active Thumb fill on hover/active (default var(--accent))\n * --thumb-size Thumb cross-axis size (default var(--track-thickness))\n * --thumb-thickness Thumb inline size (default 2em)\n * --thumb-radius Thumb border-radius (default 0)\n * --thumb-border Thumb border (default none)\n * --thumb-shadow Thumb box-shadow (default none)\n * --background-track Unfilled track background (default var(--surface-4))\n * --background-track-hover Unfilled track on hover (default --background-track)\n * --background-track-value Filled track color (default var(--surface-6))\n * --background-track-value-hover Filled track on hover (default var(--accent))\n * --background-track-value-active Filled track on active (default var(--accent))\n *\n * Optional vertical-specific overrides (fall back to horizontal vars when unset):\n * --background-track-vertical\n * --background-track-value-vertical\n * --background-track-value-hover-vertical\n * --background-track-value-active-vertical\n *\n * Tooltip:\n * tooltip Boolean attribute — enables value tooltip on hover/focus\n * tooltip-orientation 'top' (default) | 'right'\n * labelFormatter Function property (not attribute): (rawValue: number, scaledValue: number) => string\n * rawValue = native input value within min..max\n * scaledValue = normalised 0..1 position\n *\n * Swipeable mode:\n * swipeable Boolean attribute — enables swipe-to-draw gesture.\n * When active, pressing down on the slider or entering it while the\n * pointer is pressed sets the value from the cursor coordinate.\n * Pointer capture is NOT held, so the cursor can move to adjacent\n * swipeable sliders and update them too (step-sequencer style).\n * Kill-axis exit (above/below for horizontal, left/right for vertical)\n * freezes the value; re-entering re-engages.\n *\n * Wheel:\n * lighttouch Boolean attribute — wheel adjusts the value on hover instead\n * of requiring focus. The native `<input type=\"range\">` inside\n * already responds to wheel when focused; the host listener\n * fires under `lighttouch` (or when focus is on the host) and\n * synthesises a value change via `input`/`change` events.\n * See `docs/infra-mousewheel.md`.\n *\n * Events:\n * input — CustomEvent<{ value: number }>\n * change — CustomEvent<{ value: number }>\n * In swipeable mode fires on pointerleave (or pointerup if released\n * while still inside). In normal mode delegates to native change.\n */\nimport type { CSSResultGroup } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { TooltipElement, TooltipOrientations } from '../util/tooltip.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { tooltipValueStyles } from '../styles/tooltip.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nfunction normalize(value: number, min: number, max: number): number {\n return max === min ? 0 : (value - min) / (max - min);\n}\n\n@customElement(`ixfx-range-input`)\nexport class RangeInput extends WheelNudgeMixin(LitElement) {\n @property({ type: Number }) min = 0;\n @property({ type: Number }) max = 1;\n @property({ type: Number }) value = 0;\n @property({ type: Number }) step = 0.01;\n @property({ type: String, reflect: true }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Boolean, reflect: true }) swipeable = false;\n @property({ type: Boolean }) tooltip = false;\n @property({ type: String, attribute: `tooltip-orientation` }) tooltipOrientation: TooltipOrientations = `top`;\n @property({ attribute: false }) labelFormatter?: (rawValue: number, scaledValue: number) => string;\n\n @query(`input`)\n _inputEl!: HTMLInputElement;\n\n @query(`ixfx-tooltip`)\n _tooltipEl?: TooltipElement | null;\n\n /** True if this slider changed its value during the current pointer visit. */\n private _swipeModified = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerdown`, this._onPointerDown);\n this.addEventListener(`pointermove`, this._onPointerMove);\n this.addEventListener(`pointerenter`, this._onPointerEnter);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerdown`, this._onPointerDown);\n this.removeEventListener(`pointermove`, this._onPointerMove);\n this.removeEventListener(`pointerenter`, this._onPointerEnter);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n window.removeEventListener(`pointerup`, this._onWindowPointerUp);\n }\n\n private _valueFromPointer(e: PointerEvent): number {\n const rect = this.getBoundingClientRect();\n // vertical: top = max, bottom = min (writing-mode: vertical-rl; direction: rtl)\n const normalized = this.orientation === `vertical`\n ? Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n : Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const raw = this.min + normalized * (this.max - this.min);\n const snapped = Math.round((raw - this.min) / this.step) * this.step + this.min;\n return Math.max(this.min, Math.min(this.max, snapped));\n }\n\n private _applySwipeValue(value: number): void {\n this.value = value;\n if (this._inputEl)\n this._inputEl.value = String(value);\n this.style.setProperty(`--value`, String(normalize(value, this.min, this.max)));\n this.dispatchEvent(new CustomEvent(`input`, { detail: { value }, bubbles: true, composed: true }));\n this._swipeModified = true;\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n if (!this.swipeable)\n return;\n e.preventDefault();\n this._swipeModified = false;\n this._applySwipeValue(this._valueFromPointer(e));\n window.addEventListener(`pointerup`, this._onWindowPointerUp, { once: true });\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this.swipeable || e.buttons === 0)\n return;\n this._applySwipeValue(this._valueFromPointer(e));\n };\n\n private _onPointerEnter = (e: PointerEvent): void => {\n if (!this.swipeable || e.buttons === 0)\n return;\n this._swipeModified = false;\n this._applySwipeValue(this._valueFromPointer(e));\n window.addEventListener(`pointerup`, this._onWindowPointerUp, { once: true });\n };\n\n private _onPointerLeave = (_e: PointerEvent): void => {\n if (!this.swipeable || !this._swipeModified)\n return;\n this._swipeModified = false;\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value: this.value }, bubbles: true, composed: true }));\n };\n\n private _onWindowPointerUp = (): void => {\n if (!this._swipeModified)\n return;\n this._swipeModified = false;\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value: this.value }, bubbles: true, composed: true }));\n };\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n if (changedProperties.has(`value`) || changedProperties.has(`min`) || changedProperties.has(`max`)) {\n this.style.setProperty(`--value`, String(normalize(this.value, this.min, this.max)));\n }\n if (this._tooltipEl) {\n this._tooltipEl.valueFormatTooltip = (v: unknown) => {\n const num = typeof v === `number` ? v : Number(v);\n if (this.labelFormatter)\n return this.labelFormatter(num, normalize(num, this.min, this.max));\n const decimals = this.step >= 1 ? 0 : this.step >= 0.1 ? 1 : 2;\n return num.toFixed(decimals);\n };\n }\n }\n\n _handleInput = (e: Event): void => {\n e.preventDefault();\n e.stopImmediatePropagation();\n const target = e.target as HTMLInputElement;\n const value = Number.parseFloat(target.value);\n this.value = value;\n this.style.setProperty(`--value`, String(normalize(value, this.min, this.max)));\n this.dispatchEvent(new CustomEvent(`input`, { detail: { value }, bubbles: true, composed: true }));\n };\n\n _formatTooltipLabel(): string {\n const normalized = normalize(this.value, this.min, this.max);\n if (this.labelFormatter)\n return this.labelFormatter(this.value, normalized);\n const decimals = this.step >= 1 ? 0 : this.step >= 0.1 ? 1 : 2;\n return this.value.toFixed(decimals);\n }\n\n _handleChange = (): void => {\n const value = Number.parseFloat(this._inputEl.value);\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value }, bubbles: true, composed: true }));\n };\n\n /**\n * Wheel handler — installed by WheelNudgeMixin on the host. Synthesises a\n * value change by writing to the inner `<input type=\"range\">` and dispatching\n * `input` + `change`, so the existing `_handleInput` and `_handleChange`\n * handlers run unchanged and re-bubble the events to listeners.\n *\n * Native wheel handling is left intact for the focused-inner-input case;\n * the host listener fires under `lighttouch` or when focus is on the host.\n */\n override _applyWheelDelta(direction: WheelDirection, _event: WheelEvent): void {\n const input = this._inputEl;\n if (!input)\n return;\n const step = this.step > 0 ? this.step : Math.max((this.max - this.min) / 100, 0.01);\n const candidate = this.value + direction * step;\n const clamped = Math.min(this.max, Math.max(this.min, candidate));\n if (clamped === this.value)\n return;\n\n input.value = String(clamped);\n input.dispatchEvent(new Event(`input`, { bubbles: true }));\n input.dispatchEvent(new Event(`change`, { bubbles: true }));\n }\n\n override render() {\n const tooltipEl = this.tooltip\n ? html`\n <ixfx-tooltip\n style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\"\n .orientation=${this.tooltipOrientation}\n anchor=\"--ixfx-ri-thumb\"\n .value=${this.value}\n ></ixfx-tooltip>\n `\n : nothing;\n\n return html`\n <div class=\"wrap\">\n <div class=\"range-bg\"></div>\n <input\n type=\"range\"\n .min=${String(this.min)}\n .max=${String(this.max)}\n .step=${String(this.step)}\n .value=${String(this.value)}\n @input=${this._handleInput}\n @change=${this._handleChange}\n >${tooltipEl}\n </div>\n `;\n }\n\n static styles: CSSResultGroup = [themeFallbacks, tooltipValueStyles, css`\n :host {\n display: block;\n container-type: size;\n user-select: none;\n touch-action: none;\n -webkit-touch-action: none;\n width: var(--width, 200px);\n height: var(--height, 2em);\n\n /*\n * Internal resolved vars — read public vars and apply defaults here.\n * Public vars are NOT defined in :host {}, only read via fallback.\n * This lets inherited values from ancestor elements flow through.\n */\n --_track-thickness: var(--track-thickness, 100%);\n --_thumb-thickness: var(--thumb-thickness, 2em);\n --_thumb-color: var(--thumb-color, var(--surface-2-text));\n --_thumb-color-active: var(--thumb-color-active, var(--surface-2-text));\n --_thumb-opacity: var(--thumb-opacity, 0.7);\n --_thumb-opacity-hover: var(--thumb-opacity-hover, 0.8);\n --_thumb-opacity-active: var(--thumb-opacity-active, 1); \n --_thumb-size: var(--thumb-size, var(--_track-thickness));\n --_thumb-radius: var(--thumb-radius, 0);\n --_thumb-border: var(--thumb-border, none);\n --_thumb-shadow: var(--thumb-shadow, none);\n --_track-radius: var(--track-radius, none);\n --_track-corner-shape: var(--track-corner-shape, none);\n --_bg-track: var(--background-track, var(--surface-4));\n --_bg-track-hover: var(--background-track-hover, var(--_bg-track));\n --_bg-track-value: var(--background-track-value, var(--surface-6));\n --_bg-track-value-hover: var(--background-track-value-hover, var(--accent));\n --_bg-track-value-active: var(--background-track-value-active, var(--accent));\n\n --value: 0;\n --sx1: calc(var(--_thumb-thickness) + var(--value) * (100% - var(--_thumb-thickness)));\n --track-avail: calc(100% - var(--_thumb-thickness));\n --sx: calc(var(--_thumb-thickness) + (var(--value) * var(--track-avail)));\n --track-mask: linear-gradient(to right, rgba(0,0,0,1) var(--sx), rgba(0,0,0,0) var(--sx) 100%);\n --track-mask-vertical: linear-gradient(to top, rgba(0,0,0,1) var(--sx), rgba(0,0,0,0) var(--sx) 100%);\n }\n\n :host([orientation=\"vertical\"]) {\n width: var(--width, 2em);\n height: var(--height, 200px);\n }\n\n .wrap {\n display: grid;\n width: 100%;\n height: 100%;\n }\n\n .wrap > * {\n grid-area: 1 / 1;\n }\n\n .range-bg {\n background: var(--_bg-track);\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n border-radius: var(--_track-radius);\n corner-shape: var(--_track-corner-shape);\n }\n\n .wrap:hover .range-bg {\n background: var(--_bg-track-hover);\n }\n\n input[type=range] {\n margin: 0;\n padding: 0;\n -webkit-appearance: none;\n background: unset;\n box-shadow: none;\n width: 100%;\n height: var(--_track-thickness);\n align-self: center;\n }\n\n input[type=range]:focus {\n outline: none;\n }\n\n /* Vertical layout */\n :host([orientation=\"vertical\"]) .range-bg {\n background: var(--background-track-vertical, var(--_bg-track));\n width: var(--_track-thickness);\n height: 100%;\n justify-self: center;\n }\n\n :host([orientation=\"vertical\"]) .wrap:hover .range-bg {\n background: var(--background-track-hover-vertical, var(--_bg-track-hover));\n }\n\n :host([orientation=\"vertical\"]) input[type=range] {\n writing-mode: vertical-rl;\n direction: rtl;\n width: var(--_track-thickness);\n height: 100%;\n justify-self: center;\n }\n\n /* ── Webkit thumb ── */\n input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n opacity: var(--_thumb-opacity);\n box-sizing: border-box;\n anchor-name: --ixfx-ri-thumb;\n width: var(--_thumb-thickness);\n height: var(--_thumb-size);\n border-radius: var(--_thumb-radius);\n background: var(--_thumb-color);\n border: var(--_thumb-border);\n box-shadow: var(--_thumb-shadow);\n margin-top: calc(max((var(--_thumb-thickness) - 1px - 1px) * 0.5, 0px) - var(--_thumb-thickness) * 0.5);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-webkit-slider-thumb {\n width: var(--_thumb-size);\n height: var(--_thumb-thickness);\n margin-top: 0;\n margin-left: calc(max((1em - 1px - 1px) * 0.5, 0px) - 1.2em * 0.5);\n }\n\n input[type=range]::-webkit-slider-thumb:hover {\n opacity: var(--_thumb-opacity-hover);\n }\n\n input[type=range]::-webkit-slider-thumb:active {\n opacity: var(--_thumb-opacity-active);\n }\n input[type=range]::-webkit-slider-thumb:hover,\n input[type=range]::-webkit-slider-thumb:active {\n background: var(--_thumb-color-active);\n }\n\n /* ── Webkit track ── */\n input[type=range]::-webkit-slider-runnable-track {\n height: var(--_track-thickness);\n background: var(--_bg-track-value);\n mask-image: var(--track-mask);\n box-shadow: none;\n margin: 0;\n padding: 0;\n border-radius: var(--_track-radius);\n corner-shape: var(--_track-corner-shape);\n }\n\n input[type=range]:hover::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-hover);\n mask-image: var(--track-mask);\n }\n\n input[type=range]:active::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-active);\n mask-image: var(--track-mask);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-webkit-slider-runnable-track {\n background: var(--background-track-value-vertical, var(--_bg-track-value));\n mask-image: var(--track-mask-vertical);\n width: var(--_track-thickness);\n height: unset;\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:hover::-webkit-slider-runnable-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n mask-image: var(--track-mask-vertical);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:active::-webkit-slider-runnable-track {\n background: var(--background-track-value-active-vertical, var(--_bg-track-value-active));\n mask-image: var(--track-mask-vertical);\n }\n\n /* ── Mozilla thumb ── */\n input[type=range]::-moz-range-thumb {\n box-sizing: border-box;\n width: var(--_thumb-thickness);\n height: var(--_thumb-size);\n border-radius: var(--_thumb-radius);\n background: var(--_thumb-color);\n border: var(--_thumb-border);\n box-shadow: var(--_thumb-shadow);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-moz-range-thumb {\n width: var(--_thumb-size);\n height: var(--_thumb-thickness);\n }\n\n input[type=range]::-moz-range-thumb:hover,\n input[type=range]::-moz-range-thumb:active {\n background: var(--_thumb-color-active);\n }\n\n /* ── Mozilla track ── */\n input[type=range]::-moz-range-track {\n height: var(--_track-thickness);\n background: var(--_bg-track-value);\n mask-image: var(--track-mask);\n box-shadow: none;\n margin: 0;\n padding: 0;\n }\n\n input[type=range]:hover::-moz-range-track {\n background: var(--_bg-track-value-hover);\n mask-image: var(--track-mask);\n }\n\n input[type=range]:active::-moz-range-track {\n background: var(--_bg-track-value-active);\n mask-image: var(--track-mask);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-moz-range-track {\n background: var(--background-track-value-vertical, var(--_bg-track-value));\n mask-image: var(--track-mask-vertical);\n height: unset;\n width: var(--_track-thickness);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:hover::-moz-range-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n mask-image: var(--track-mask-vertical);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:active::-moz-range-track {\n background: var(--background-track-value-active-vertical, var(--_bg-track-value-active));\n mask-image: var(--track-mask-vertical);\n }\n\n /* ── Swipeable mode ── */\n /* Disable native pointer capture so the cursor can move freely between sliders */\n :host([swipeable]) input {\n pointer-events: none;\n }\n\n /* In swipeable mode, disable pointer events on wrap so host receives hover */\n :host([swipeable]) .wrap {\n pointer-events: none;\n }\n\n /* In swipeable mode, use host hover to trigger track/thumb hover styles */\n :host([swipeable]):hover input[type=range]::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-hover);\n }\n\n :host([swipeable]):hover input[type=range]::-webkit-slider-thumb {\n background: var(--_thumb-color-active);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover input[type=range]::-webkit-slider-runnable-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n }\n\n :host([swipeable]):hover input[type=range]::-moz-range-track {\n background: var(--_bg-track-value-hover);\n }\n\n :host([swipeable]):hover input[type=range]::-moz-range-thumb {\n background: var(--_thumb-color-active);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover input[type=range]::-moz-range-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n }\n\n :host([swipeable]):hover .range-bg {\n background: var(--_bg-track-hover);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover .range-bg {\n background: var(--background-track-hover-vertical, var(--_bg-track-hover));\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-range-input': RangeInput;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"range-input.js","names":["customElement"],"sources":["../src/range-input/range-input.ts"],"sourcesContent":["/**\n * <ixfx-range-input> — styled range input with no label.\n *\n * A thin wrapper around <input type=\"range\"> that adds the same\n * fancy track/thumb/fill styling as the linear-value components,\n * without the label display.\n *\n * Supports horizontal (default) and vertical orientation in a single element.\n * Set orientation=\"vertical\" attribute to switch.\n *\n * CSS Variables:\n * --track-thickness Track cross-axis size (default 1.5em)\n * --thumb-color Thumb fill (default var(--surface-2-text))\n * --thumb-color-active Thumb fill on hover/active (default var(--accent))\n * --thumb-size Thumb cross-axis size (default var(--track-thickness))\n * --thumb-thickness Thumb inline size (default 2em)\n * --thumb-radius Thumb border-radius (default 0)\n * --thumb-border Thumb border (default none)\n * --thumb-shadow Thumb box-shadow (default none)\n * --background-track Unfilled track background (default var(--surface-4))\n * --background-track-hover Unfilled track on hover (default --background-track)\n * --background-track-value Filled track color (default var(--surface-6))\n * --background-track-value-hover Filled track on hover (default var(--accent))\n * --background-track-value-active Filled track on active (default var(--accent))\n *\n * Optional vertical-specific overrides (fall back to horizontal vars when unset):\n * --background-track-vertical\n * --background-track-value-vertical\n * --background-track-value-hover-vertical\n * --background-track-value-active-vertical\n *\n * Tooltip:\n * tooltip Boolean attribute — enables value tooltip on hover/focus\n * tooltip-orientation 'top' (default) | 'right'\n * labelFormatter Function property (not attribute): (rawValue: number, scaledValue: number) => string\n * rawValue = native input value within min..max\n * scaledValue = normalised 0..1 position\n *\n * Swipeable mode:\n * swipeable Boolean attribute — enables swipe-to-draw gesture.\n * When active, pressing down on the slider or entering it while the\n * pointer is pressed sets the value from the cursor coordinate.\n * Pointer capture is NOT held, so the cursor can move to adjacent\n * swipeable sliders and update them too (step-sequencer style).\n * Kill-axis exit (above/below for horizontal, left/right for vertical)\n * freezes the value; re-entering re-engages.\n *\n * Wheel:\n * lighttouch Boolean attribute — wheel adjusts the value on hover instead\n * of requiring focus. The native `<input type=\"range\">` inside\n * already responds to wheel when focused; the host listener\n * fires under `lighttouch` (or when focus is on the host) and\n * synthesises a value change via `input`/`change` events.\n * See `docs/infra-mousewheel.md`.\n *\n * Events:\n * input — CustomEvent<{ value: number }>\n * change — CustomEvent<{ value: number }>\n * In swipeable mode fires on pointerleave (or pointerup if released\n * while still inside). In normal mode delegates to native change.\n */\nimport type { CSSResultGroup } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { TooltipElement, TooltipOrientations } from '../util/tooltip.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { tooltipValueStyles } from '../styles/tooltip.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nfunction normalize(value: number, min: number, max: number): number {\n return max === min ? 0 : (value - min) / (max - min);\n}\n\n@customElement(`ixfx-range-input`)\nexport class RangeInput extends WheelNudgeMixin(LitElement) {\n @property({ type: Number }) min = 0;\n @property({ type: Number }) max = 1;\n @property({ type: Number }) value = 0;\n @property({ type: Number }) step = 0.01;\n @property({ type: String, reflect: true }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Boolean, reflect: true }) swipeable = false;\n @property({ type: Boolean }) tooltip = false;\n @property({ type: String, attribute: `tooltip-orientation` }) tooltipOrientation: TooltipOrientations = `top`;\n @property({ attribute: false }) labelFormatter?: (rawValue: number, scaledValue: number) => string;\n\n @query(`input`)\n _inputEl!: HTMLInputElement;\n\n @query(`ixfx-tooltip`)\n _tooltipEl?: TooltipElement | null;\n\n /** True if this slider changed its value during the current pointer visit. */\n private _swipeModified = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerdown`, this._onPointerDown);\n this.addEventListener(`pointermove`, this._onPointerMove);\n this.addEventListener(`pointerenter`, this._onPointerEnter);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerdown`, this._onPointerDown);\n this.removeEventListener(`pointermove`, this._onPointerMove);\n this.removeEventListener(`pointerenter`, this._onPointerEnter);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n window.removeEventListener(`pointerup`, this._onWindowPointerUp);\n }\n\n private _valueFromPointer(e: PointerEvent): number {\n const rect = this.getBoundingClientRect();\n // vertical: top = max, bottom = min (writing-mode: vertical-rl; direction: rtl)\n const normalized = this.orientation === `vertical`\n ? Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n : Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const raw = this.min + normalized * (this.max - this.min);\n const snapped = Math.round((raw - this.min) / this.step) * this.step + this.min;\n return Math.max(this.min, Math.min(this.max, snapped));\n }\n\n private _applySwipeValue(value: number): void {\n this.value = value;\n if (this._inputEl)\n this._inputEl.value = String(value);\n this.style.setProperty(`--value`, String(normalize(value, this.min, this.max)));\n this.dispatchEvent(new CustomEvent(`input`, { detail: { value }, bubbles: true, composed: true }));\n this._swipeModified = true;\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n if (!this.swipeable)\n return;\n e.preventDefault();\n this._swipeModified = false;\n this._applySwipeValue(this._valueFromPointer(e));\n window.addEventListener(`pointerup`, this._onWindowPointerUp, { once: true });\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this.swipeable || e.buttons === 0)\n return;\n this._applySwipeValue(this._valueFromPointer(e));\n };\n\n private _onPointerEnter = (e: PointerEvent): void => {\n if (!this.swipeable || e.buttons === 0)\n return;\n this._swipeModified = false;\n this._applySwipeValue(this._valueFromPointer(e));\n window.addEventListener(`pointerup`, this._onWindowPointerUp, { once: true });\n };\n\n private _onPointerLeave = (_e: PointerEvent): void => {\n if (!this.swipeable || !this._swipeModified)\n return;\n this._swipeModified = false;\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value: this.value }, bubbles: true, composed: true }));\n };\n\n private _onWindowPointerUp = (): void => {\n if (!this._swipeModified)\n return;\n this._swipeModified = false;\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value: this.value }, bubbles: true, composed: true }));\n };\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n if (changedProperties.has(`value`) || changedProperties.has(`min`) || changedProperties.has(`max`)) {\n this.style.setProperty(`--value`, String(normalize(this.value, this.min, this.max)));\n }\n if (this._tooltipEl) {\n this._tooltipEl.valueFormatTooltip = (v: unknown) => {\n const num = typeof v === `number` ? v : Number(v);\n if (this.labelFormatter)\n return this.labelFormatter(num, normalize(num, this.min, this.max));\n const decimals = this.step >= 1 ? 0 : this.step >= 0.1 ? 1 : 2;\n return num.toFixed(decimals);\n };\n }\n }\n\n _handleInput = (e: Event): void => {\n e.preventDefault();\n e.stopImmediatePropagation();\n const target = e.target as HTMLInputElement;\n const value = Number.parseFloat(target.value);\n this.value = value;\n this.style.setProperty(`--value`, String(normalize(value, this.min, this.max)));\n this.dispatchEvent(new CustomEvent(`input`, { detail: { value }, bubbles: true, composed: true }));\n };\n\n _formatTooltipLabel(): string {\n const normalized = normalize(this.value, this.min, this.max);\n if (this.labelFormatter)\n return this.labelFormatter(this.value, normalized);\n const decimals = this.step >= 1 ? 0 : this.step >= 0.1 ? 1 : 2;\n return this.value.toFixed(decimals);\n }\n\n _handleChange = (): void => {\n const value = Number.parseFloat(this._inputEl.value);\n this.dispatchEvent(new CustomEvent(`change`, { detail: { value }, bubbles: true, composed: true }));\n };\n\n /**\n * Wheel handler — installed by WheelNudgeMixin on the host. Synthesises a\n * value change by writing to the inner `<input type=\"range\">` and dispatching\n * `input` + `change`, so the existing `_handleInput` and `_handleChange`\n * handlers run unchanged and re-bubble the events to listeners.\n *\n * Native wheel handling is left intact for the focused-inner-input case;\n * the host listener fires under `lighttouch` or when focus is on the host.\n */\n override _applyWheelDelta(direction: WheelDirection, _event: WheelEvent): void {\n const input = this._inputEl;\n if (!input)\n return;\n const step = this.step > 0 ? this.step : Math.max((this.max - this.min) / 100, 0.01);\n const candidate = this.value + direction * step;\n const clamped = Math.min(this.max, Math.max(this.min, candidate));\n if (clamped === this.value)\n return;\n\n input.value = String(clamped);\n input.dispatchEvent(new Event(`input`, { bubbles: true }));\n input.dispatchEvent(new Event(`change`, { bubbles: true }));\n }\n\n override render() {\n const tooltipEl = this.tooltip\n ? html`\n <ixfx-tooltip\n style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\"\n .orientation=${this.tooltipOrientation}\n anchor=\"--ixfx-ri-thumb\"\n .value=${this.value}\n ></ixfx-tooltip>\n `\n : nothing;\n\n return html`\n <div class=\"wrap\">\n <div class=\"range-bg\"></div>\n <input\n type=\"range\"\n .min=${String(this.min)}\n .max=${String(this.max)}\n .step=${String(this.step)}\n .value=${String(this.value)}\n @input=${this._handleInput}\n @change=${this._handleChange}\n >${tooltipEl}\n </div>\n `;\n }\n\n static styles: CSSResultGroup = [themeFallbacks, tooltipValueStyles, css`\n :host {\n display: block;\n container-type: size;\n user-select: none;\n touch-action: none;\n -webkit-touch-action: none;\n width: var(--width, 200px);\n height: var(--height, 2em);\n\n /*\n * Internal resolved vars — read public vars and apply defaults here.\n * Public vars are NOT defined in :host {}, only read via fallback.\n * This lets inherited values from ancestor elements flow through.\n */\n --_track-thickness: var(--track-thickness, 100%);\n --_thumb-thickness: var(--thumb-thickness, 2em);\n --_thumb-color: var(--thumb-color, var(--surface-2-text));\n --_thumb-color-active: var(--thumb-color-active, var(--surface-2-text));\n --_thumb-opacity: var(--thumb-opacity, 0.7);\n --_thumb-opacity-hover: var(--thumb-opacity-hover, 0.8);\n --_thumb-opacity-active: var(--thumb-opacity-active, 1); \n --_thumb-size: var(--thumb-size, var(--_track-thickness));\n --_thumb-radius: var(--thumb-radius, 0);\n --_thumb-border: var(--thumb-border, none);\n --_thumb-shadow: var(--thumb-shadow, none);\n --_track-radius: var(--track-radius, none);\n --_track-corner-shape: var(--track-corner-shape, none);\n --_bg-track: var(--background-track, var(--surface-4));\n --_bg-track-hover: var(--background-track-hover, var(--_bg-track));\n --_bg-track-value: var(--background-track-value, var(--surface-6));\n --_bg-track-value-hover: var(--background-track-value-hover, var(--accent));\n --_bg-track-value-active: var(--background-track-value-active, var(--accent));\n\n --value: 0;\n --sx1: calc(var(--_thumb-thickness) + var(--value) * (100% - var(--_thumb-thickness)));\n --track-avail: calc(100% - var(--_thumb-thickness));\n --sx: calc(var(--_thumb-thickness) + (var(--value) * var(--track-avail)));\n --track-mask: linear-gradient(to right, rgba(0,0,0,1) var(--sx), rgba(0,0,0,0) var(--sx) 100%);\n --track-mask-vertical: linear-gradient(to top, rgba(0,0,0,1) var(--sx), rgba(0,0,0,0) var(--sx) 100%);\n }\n\n :host([orientation=\"vertical\"]) {\n width: var(--width, 2em);\n height: var(--height, 200px);\n }\n\n .wrap {\n display: grid;\n width: 100%;\n height: 100%;\n }\n\n .wrap > * {\n grid-area: 1 / 1;\n }\n\n .range-bg {\n background: var(--_bg-track);\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n border-radius: var(--_track-radius);\n corner-shape: var(--_track-corner-shape);\n }\n\n .wrap:hover .range-bg {\n background: var(--_bg-track-hover);\n }\n\n input[type=range] {\n margin: 0;\n padding: 0;\n -webkit-appearance: none;\n background: unset;\n box-shadow: none;\n width: 100%;\n height: var(--_track-thickness);\n align-self: center;\n }\n\n input[type=range]:focus {\n outline: none;\n }\n\n /* Vertical layout */\n :host([orientation=\"vertical\"]) .range-bg {\n background: var(--background-track-vertical, var(--_bg-track));\n width: var(--_track-thickness);\n height: 100%;\n justify-self: center;\n }\n\n :host([orientation=\"vertical\"]) .wrap:hover .range-bg {\n background: var(--background-track-hover-vertical, var(--_bg-track-hover));\n }\n\n :host([orientation=\"vertical\"]) input[type=range] {\n writing-mode: vertical-rl;\n direction: rtl;\n width: var(--_track-thickness);\n height: 100%;\n justify-self: center;\n }\n\n /* ── Webkit thumb ── */\n input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n opacity: var(--_thumb-opacity);\n box-sizing: border-box;\n anchor-name: --ixfx-ri-thumb;\n width: var(--_thumb-thickness);\n height: var(--_thumb-size);\n border-radius: var(--_thumb-radius);\n background: var(--_thumb-color);\n border: var(--_thumb-border);\n box-shadow: var(--_thumb-shadow);\n margin-top: calc(max((var(--_thumb-thickness) - 1px - 1px) * 0.5, 0px) - var(--_thumb-thickness) * 0.5);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-webkit-slider-thumb {\n width: var(--_thumb-size);\n height: var(--_thumb-thickness);\n margin-top: 0;\n margin-left: calc(max((1em - 1px - 1px) * 0.5, 0px) - 1.2em * 0.5);\n }\n\n input[type=range]::-webkit-slider-thumb:hover {\n opacity: var(--_thumb-opacity-hover);\n }\n\n input[type=range]::-webkit-slider-thumb:active {\n opacity: var(--_thumb-opacity-active);\n }\n input[type=range]::-webkit-slider-thumb:hover,\n input[type=range]::-webkit-slider-thumb:active {\n background: var(--_thumb-color-active);\n }\n\n /* ── Webkit track ── */\n input[type=range]::-webkit-slider-runnable-track {\n height: var(--_track-thickness);\n background: var(--_bg-track-value);\n mask-image: var(--track-mask);\n box-shadow: none;\n margin: 0;\n padding: 0;\n border-radius: var(--_track-radius);\n corner-shape: var(--_track-corner-shape);\n }\n\n input[type=range]:hover::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-hover);\n mask-image: var(--track-mask);\n }\n\n input[type=range]:active::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-active);\n mask-image: var(--track-mask);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-webkit-slider-runnable-track {\n background: var(--background-track-value-vertical, var(--_bg-track-value));\n mask-image: var(--track-mask-vertical);\n width: var(--_track-thickness);\n height: unset;\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:hover::-webkit-slider-runnable-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n mask-image: var(--track-mask-vertical);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:active::-webkit-slider-runnable-track {\n background: var(--background-track-value-active-vertical, var(--_bg-track-value-active));\n mask-image: var(--track-mask-vertical);\n }\n\n /* ── Mozilla thumb ── */\n input[type=range]::-moz-range-thumb {\n box-sizing: border-box;\n width: var(--_thumb-thickness);\n height: var(--_thumb-size);\n border-radius: var(--_thumb-radius);\n background: var(--_thumb-color);\n border: var(--_thumb-border);\n box-shadow: var(--_thumb-shadow);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-moz-range-thumb {\n width: var(--_thumb-size);\n height: var(--_thumb-thickness);\n }\n\n input[type=range]::-moz-range-thumb:hover,\n input[type=range]::-moz-range-thumb:active {\n background: var(--_thumb-color-active);\n }\n\n /* ── Mozilla track ── */\n input[type=range]::-moz-range-track {\n height: var(--_track-thickness);\n background: var(--_bg-track-value);\n mask-image: var(--track-mask);\n box-shadow: none;\n margin: 0;\n padding: 0;\n }\n\n input[type=range]:hover::-moz-range-track {\n background: var(--_bg-track-value-hover);\n mask-image: var(--track-mask);\n }\n\n input[type=range]:active::-moz-range-track {\n background: var(--_bg-track-value-active);\n mask-image: var(--track-mask);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]::-moz-range-track {\n background: var(--background-track-value-vertical, var(--_bg-track-value));\n mask-image: var(--track-mask-vertical);\n height: unset;\n width: var(--_track-thickness);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:hover::-moz-range-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n mask-image: var(--track-mask-vertical);\n }\n\n :host([orientation=\"vertical\"]) input[type=range]:active::-moz-range-track {\n background: var(--background-track-value-active-vertical, var(--_bg-track-value-active));\n mask-image: var(--track-mask-vertical);\n }\n\n /* ── Swipeable mode ── */\n /* Disable native pointer capture so the cursor can move freely between sliders */\n :host([swipeable]) input {\n pointer-events: none;\n }\n\n /* In swipeable mode, disable pointer events on wrap so host receives hover */\n :host([swipeable]) .wrap {\n pointer-events: none;\n }\n\n /* In swipeable mode, use host hover to trigger track/thumb hover styles */\n :host([swipeable]):hover input[type=range]::-webkit-slider-runnable-track {\n background: var(--_bg-track-value-hover);\n }\n\n :host([swipeable]):hover input[type=range]::-webkit-slider-thumb {\n background: var(--_thumb-color-active);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover input[type=range]::-webkit-slider-runnable-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n }\n\n :host([swipeable]):hover input[type=range]::-moz-range-track {\n background: var(--_bg-track-value-hover);\n }\n\n :host([swipeable]):hover input[type=range]::-moz-range-thumb {\n background: var(--_thumb-color-active);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover input[type=range]::-moz-range-track {\n background: var(--background-track-value-hover-vertical, var(--_bg-track-value-hover));\n }\n\n :host([swipeable]):hover .range-bg {\n background: var(--_bg-track-hover);\n }\n\n :host([swipeable][orientation=\"vertical\"]):hover .range-bg {\n background: var(--background-track-hover-vertical, var(--_bg-track-hover));\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-range-input': RangeInput;\n }\n}\n"],"mappings":"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"}
|
package/dist/range.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-
|
|
2
|
-
import { r as TooltipOrientations } from "./tooltip-
|
|
1
|
+
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-C-ra_1os.js";
|
|
2
|
+
import { r as TooltipOrientations } from "./tooltip-BMTSUPBU.js";
|
|
3
3
|
import { LitElement } from "lit";
|
|
4
|
+
|
|
4
5
|
//#region src/range/range.d.ts
|
|
5
6
|
declare const RangeElement_base: (new (...args: any[]) => WheelNudgeConsumerType<LitElement>) & typeof LitElement;
|
|
6
7
|
declare class RangeElement extends RangeElement_base {
|
package/dist/range.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.d.ts","names":[],"sources":["../src/range/range.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"range.d.ts","names":[],"sources":["../src/range/range.ts"],"mappings":";;;;;cAEqD,iBAAA;cASxC,YAAA,SAAqB,iBAAA;EAAA;EAEhC,OAAA;EAGA,kBAAA,EAAoB,mBAAA;EAGpB,WAAA;EAGA,QAAA;EAGA,GAAA;EAGA,GAAA;EAAA,IAGI,KAAA,CAAM,CAAA;EAAA,IAIN,KAAA;EAOJ,IAAA;EAEA,YAAA,CAAa,KAAA,EAAO,UAAA;;;;AAlCtB;;;;;;EA0DW,gBAAA,CAAiB,SAAA,EAAW,cAAA,EAAgB,MAAA,EAAQ,UAAA;EAAA,UAenD,MAAA;EAAA,OAiBH,MAAA,gBAAM,SAAA;AAAA;AAAA,QAmEP,MAAA;EAAA,UACI,cAAA;IACR,YAAA,EAAc,YAAY;EAAA;AAAA"}
|
package/dist/range.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
3
|
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
4
|
-
import { t as WheelNudgeMixin } from "./wheel-nudge-
|
|
4
|
+
import { t as WheelNudgeMixin } from "./wheel-nudge-Dhzi5nHc.js";
|
|
5
5
|
import { t as tooltipValueStyles } from "./tooltip-CJt3WLmN.js";
|
|
6
6
|
import { LitElement, css, html, nothing } from "lit";
|
|
7
7
|
import { property } from "lit/decorators.js";
|
package/dist/range.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"range.js","names":["#value","customElement"],"sources":["../src/range/range.ts"],"sourcesContent":["import type { WheelDirection } from \"../mixins/wheel-nudge.js\";\nimport type { TooltipOrientations } from \"../util/tooltip.js\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { WheelNudgeMixin } from \"../mixins/wheel-nudge.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { tooltipValueStyles } from \"../styles/tooltip.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-range`)\nexport class RangeElement extends WheelNudgeMixin(LitElement) {\n @property({ type: Boolean })\n tooltip = true;\n\n @property({ type: String, attribute: `tooltip-orientation` })\n tooltipOrientation: TooltipOrientations = `top`;\n\n @property({ type: String, reflect: true })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Boolean, attribute: true })\n disabled = false;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n set value(v: number) {\n this.#value = v;\n }\n\n get value() {\n return this.#value;\n }\n\n #value = 0;\n\n @property({ type: Number })\n step = 0;\n\n onRangeInput(event: InputEvent) {\n const valueNum = (event.target as HTMLInputElement).valueAsNumber;\n const valueStr = (event.target as HTMLInputElement).value;\n this.#value = valueNum;\n\n if (this.tooltip) {\n const o = this.shadowRoot?.querySelector(`output`);\n if (o) {\n o.value = valueStr;\n } else {\n console.warn(`Output element not found`);\n }\n }\n }\n\n /**\n * Wheel handler — installed by WheelNudgeMixin on the host. Synthesises a\n * value change by writing to the inner `<input type=\"range\">` and dispatching\n * `input` + `change`, so the existing `onRangeInput` handler runs unchanged.\n *\n * The native input still responds to wheel when focused (focus rule wins by\n * default). The host handler fires when `lighttouch` is set or when the host\n * itself has focus, ensuring Shift-aware step math and consistent event firing.\n */\n override _applyWheelDelta(direction: WheelDirection, _event: WheelEvent): void {\n const input = this.renderRoot?.querySelector(`input[type=range]`) as HTMLInputElement | null;\n if (!input)\n return;\n const step = this.step > 0 ? this.step : Math.max((this.max - this.min) / 100, 0.01);\n const candidate = this.#value + direction * step;\n const clamped = Math.min(this.max, Math.max(this.min, candidate));\n if (clamped === this.#value)\n return;\n\n input.value = String(clamped);\n input.dispatchEvent(new Event(`input`, { bubbles: true }));\n input.dispatchEvent(new Event(`change`, { bubbles: true }));\n }\n\n protected render(): unknown {\n const tt = this.tooltip\n ? html`<ixfx-tooltip\n style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\"\n .orientation=${this.tooltipOrientation}\n anchor=\"--thumb-tooltip\"\n .value=${this.value}></ixfx-tooltip>`\n : nothing;\n const verticalStyle = this.orientation === `vertical`\n ? `writing-mode: vertical-lr; direction: rtl;`\n : nothing;\n return html`\n <input ?disabled=${this.disabled} step=${this.step} min=${this.min} max=${this.max} value=${this.value} @input=${this.onRangeInput} type=\"range\" style=${verticalStyle}>\n ${tt}\n `;\n }\n\n static styles = [\n themeFallbacks,\n prominenceStyles,\n tooltipValueStyles,\n css`\n :host {\n display: inline-block;\n --value-label-color: unset;\n --thumb-background: ButtonFace;\n --thumb-radius: 50%;\n --thumb-width: 1em;\n --thumb-height: 1em;\n }\n\n :host([orientation=\"vertical\"]) {\n display: block;\n width: 1.5em;\n height: 200px;\n }\n\n [type=\"range\"] {\n width: 100%;\n height: 1.5em;\n accent-color: var(--accent, AccentColor);\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"] {\n writing-mode: vertical-lr;\n direction: rtl;\n width: 1.5em;\n height: 100%;\n }\n\n [type=\"range\"]::-webkit-slider-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n background: var(--thumb-background);\n anchor-name: --thumb-tooltip;\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"]::-webkit-slider-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n }\n\n [type=\"range\"]::-moz-range-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n background: var(--thumb-background);\n box-shadow: var(--shadow-m);\n anchor-name: --thumb-tooltip;\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"]::-moz-range-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n }\n\n [type=\"range\"]:focus {\n outline: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementMap {\n \"ixfx-range\": RangeElement;\n }\n}\n"],"mappings":";;;;;;;;AAWO,
|
|
1
|
+
{"version":3,"file":"range.js","names":["#value","customElement"],"sources":["../src/range/range.ts"],"sourcesContent":["import type { WheelDirection } from \"../mixins/wheel-nudge.js\";\nimport type { TooltipOrientations } from \"../util/tooltip.js\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { WheelNudgeMixin } from \"../mixins/wheel-nudge.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { tooltipValueStyles } from \"../styles/tooltip.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-range`)\nexport class RangeElement extends WheelNudgeMixin(LitElement) {\n @property({ type: Boolean })\n tooltip = true;\n\n @property({ type: String, attribute: `tooltip-orientation` })\n tooltipOrientation: TooltipOrientations = `top`;\n\n @property({ type: String, reflect: true })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Boolean, attribute: true })\n disabled = false;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n set value(v: number) {\n this.#value = v;\n }\n\n get value() {\n return this.#value;\n }\n\n #value = 0;\n\n @property({ type: Number })\n step = 0;\n\n onRangeInput(event: InputEvent) {\n const valueNum = (event.target as HTMLInputElement).valueAsNumber;\n const valueStr = (event.target as HTMLInputElement).value;\n this.#value = valueNum;\n\n if (this.tooltip) {\n const o = this.shadowRoot?.querySelector(`output`);\n if (o) {\n o.value = valueStr;\n } else {\n console.warn(`Output element not found`);\n }\n }\n }\n\n /**\n * Wheel handler — installed by WheelNudgeMixin on the host. Synthesises a\n * value change by writing to the inner `<input type=\"range\">` and dispatching\n * `input` + `change`, so the existing `onRangeInput` handler runs unchanged.\n *\n * The native input still responds to wheel when focused (focus rule wins by\n * default). The host handler fires when `lighttouch` is set or when the host\n * itself has focus, ensuring Shift-aware step math and consistent event firing.\n */\n override _applyWheelDelta(direction: WheelDirection, _event: WheelEvent): void {\n const input = this.renderRoot?.querySelector(`input[type=range]`) as HTMLInputElement | null;\n if (!input)\n return;\n const step = this.step > 0 ? this.step : Math.max((this.max - this.min) / 100, 0.01);\n const candidate = this.#value + direction * step;\n const clamped = Math.min(this.max, Math.max(this.min, candidate));\n if (clamped === this.#value)\n return;\n\n input.value = String(clamped);\n input.dispatchEvent(new Event(`input`, { bubbles: true }));\n input.dispatchEvent(new Event(`change`, { bubbles: true }));\n }\n\n protected render(): unknown {\n const tt = this.tooltip\n ? html`<ixfx-tooltip\n style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\"\n .orientation=${this.tooltipOrientation}\n anchor=\"--thumb-tooltip\"\n .value=${this.value}></ixfx-tooltip>`\n : nothing;\n const verticalStyle = this.orientation === `vertical`\n ? `writing-mode: vertical-lr; direction: rtl;`\n : nothing;\n return html`\n <input ?disabled=${this.disabled} step=${this.step} min=${this.min} max=${this.max} value=${this.value} @input=${this.onRangeInput} type=\"range\" style=${verticalStyle}>\n ${tt}\n `;\n }\n\n static styles = [\n themeFallbacks,\n prominenceStyles,\n tooltipValueStyles,\n css`\n :host {\n display: inline-block;\n --value-label-color: unset;\n --thumb-background: ButtonFace;\n --thumb-radius: 50%;\n --thumb-width: 1em;\n --thumb-height: 1em;\n }\n\n :host([orientation=\"vertical\"]) {\n display: block;\n width: 1.5em;\n height: 200px;\n }\n\n [type=\"range\"] {\n width: 100%;\n height: 1.5em;\n accent-color: var(--accent, AccentColor);\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"] {\n writing-mode: vertical-lr;\n direction: rtl;\n width: 1.5em;\n height: 100%;\n }\n\n [type=\"range\"]::-webkit-slider-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n background: var(--thumb-background);\n anchor-name: --thumb-tooltip;\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"]::-webkit-slider-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n }\n\n [type=\"range\"]::-moz-range-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n background: var(--thumb-background);\n box-shadow: var(--shadow-m);\n anchor-name: --thumb-tooltip;\n }\n\n :host([orientation=\"vertical\"]) [type=\"range\"]::-moz-range-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n }\n\n [type=\"range\"]:focus {\n outline: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementMap {\n \"ixfx-range\": RangeElement;\n }\n}\n"],"mappings":";;;;;;;;AAWO,IAAA,eAAA,MAAM,qBAAqB,gBAAgB,UAAU,EAAE;;;iBAElD;4BAGgC;qBAGD;kBAG9B;aAGL;aAGA;gBAWG;cAGF;;CAZP,IACI,MAAM,GAAW;EACnB,KAAKA,SAAS;CAChB;CAEA,IAAI,QAAQ;EACV,OAAO,KAAKA;CACd;CAEA;CAKA,aAAa,OAAmB;EAC9B,MAAM,WAAY,MAAM,OAA4B;EACpD,MAAM,WAAY,MAAM,OAA4B;EACpD,KAAKA,SAAS;EAEd,IAAI,KAAK,SAAS;GAChB,MAAM,IAAI,KAAK,YAAY,cAAc,QAAQ;GACjD,IAAI,GACF,EAAE,QAAQ;QAEV,QAAQ,KAAK,0BAA0B;EAE3C;CACF;;;;;;;;;;CAWA,iBAA0B,WAA2B,QAA0B;EAC7E,MAAM,QAAQ,KAAK,YAAY,cAAc,mBAAmB;EAChE,IAAI,CAAC,OACH;EACF,MAAM,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,GAAI;EACnF,MAAM,YAAY,KAAKA,SAAS,YAAY;EAC5C,MAAM,UAAU,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;EAChE,IAAI,YAAY,KAAKA,QACnB;EAEF,MAAM,QAAQ,OAAO,OAAO;EAC5B,MAAM,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;EACzD,MAAM,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;CAC5D;CAEA,SAA4B;EAC1B,MAAM,KAAK,KAAK,UACZ,IAAI;;yBAEa,KAAK,mBAAmB;;mBAE9B,KAAK,MAAM,oBACtB;EACJ,MAAM,gBAAgB,KAAK,gBAAgB,aACvC,+CACA;EACJ,OAAO,IAAI;yBACU,KAAK,SAAS,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI,SAAS,KAAK,MAAM,UAAU,KAAK,aAAa,sBAAsB,cAAc;QACrK,GAAG;;CAET;;gBAEgB;GACd;GACA;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DL;;AACF;YAzJG,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,WAAA,KAAA,CAAA;YAG1B,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAsB,CAAC,CAAA,GAAA,aAAA,WAAA,sBAAA,KAAA,CAAA;YAG3D,SAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;YAGxC,SAAS;CAAE,MAAM;CAAS,WAAW;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;YAG3C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,OAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,OAAA,KAAA,CAAA;YAGzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,IAAA;YAWzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,QAAA,KAAA,CAAA;2BA/B3BC,kBAAc,YAAY,CAAA,GAAA,YAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
+
|
|
2
3
|
//#region src/selecthorizontal.d.ts
|
|
3
4
|
declare class SelectHorizontalElement extends LitElement {
|
|
4
5
|
editMode: boolean;
|
|
@@ -9,7 +10,7 @@ declare global {
|
|
|
9
10
|
interface HTMLElementTagNameMap {
|
|
10
11
|
"ixfx-selecthorizontal-element": SelectHorizontalElement;
|
|
11
12
|
}
|
|
12
|
-
}
|
|
13
|
+
} //# sourceMappingURL=selecthorizontal.d.ts.map
|
|
13
14
|
//#endregion
|
|
14
15
|
export { SelectHorizontalElement };
|
|
15
16
|
//# sourceMappingURL=selecthorizontal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selecthorizontal.d.ts","names":[],"sources":["../src/selecthorizontal.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"selecthorizontal.d.ts","names":[],"sources":["../src/selecthorizontal.ts"],"mappings":";;;cAMa,uBAAA,SAAgC,UAAU;EAErD,QAAA;EAEA,MAAA,kBAAM,cAAA;EAAA,OASC,MAAA,gBAAM,SAAA;AAAA;AAAA,QAkBP,MAAA;EAAA,UACI,qBAAA;IACR,+BAAA,EAAiC,uBAAuB;EAAA;AAAA"}
|
package/dist/selecthorizontal.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
3
|
import { LitElement, css, html } from "lit";
|
|
4
4
|
import { property } from "lit/decorators.js";
|
|
5
5
|
//#region src/selecthorizontal.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selecthorizontal.js","names":["customElement"],"sources":["../src/selecthorizontal.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"./styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"./util/custom-elements.js\";\n\n@customElement(`ixfx-selecthorizontal-element`)\nexport class SelectHorizontalElement extends LitElement {\n @property({ type: Boolean })\n editMode = false;\n\n render() {\n console.log(`render`);\n return html`\n <option>pre</option>\n <slot></slot>\n <option>post</option>\n `;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n display: flex;\n overflow: scroll;\n width: 100%;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n }\n \n ::slotted(*),option {\n user-select: none;\n scroll-snap-align: start;\n border: var(--border);\n color: var(--accent);\n }\n`];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-selecthorizontal-element\": SelectHorizontalElement;\n }\n}\n"],"mappings":";;;;;AAMO,
|
|
1
|
+
{"version":3,"file":"selecthorizontal.js","names":["customElement"],"sources":["../src/selecthorizontal.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"./styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"./util/custom-elements.js\";\n\n@customElement(`ixfx-selecthorizontal-element`)\nexport class SelectHorizontalElement extends LitElement {\n @property({ type: Boolean })\n editMode = false;\n\n render() {\n console.log(`render`);\n return html`\n <option>pre</option>\n <slot></slot>\n <option>post</option>\n `;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n display: flex;\n overflow: scroll;\n width: 100%;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n }\n \n ::slotted(*),option {\n user-select: none;\n scroll-snap-align: start;\n border: var(--border);\n color: var(--accent);\n }\n`];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-selecthorizontal-element\": SelectHorizontalElement;\n }\n}\n"],"mappings":";;;;;AAMO,IAAA,0BAAA,MAAM,gCAAgC,WAAW;;;kBAE3C;;CAEX,SAAS;EACP,QAAQ,IAAI,QAAQ;EACpB,OAAO,IAAI;;;;;CAKb;;gBAEgB,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;CAerC;;AACD;YA5BG,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,wBAAA,WAAA,YAAA,KAAA,CAAA;sCAF5BA,kBAAc,+BAA+B,CAAA,GAAA,uBAAA"}
|