@ixfx/components 0.2.3 → 0.2.5
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/LICENSE +1 -1
- package/bundle/chunk-pbuEa-1d.js +13 -0
- package/bundle/index.d.ts +4702 -569
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +34929 -2800
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +133 -0
- package/dist/ac-text.d.ts +97 -0
- package/dist/ac-text.d.ts.map +1 -0
- package/dist/ac-text.js +484 -0
- package/dist/ac-text.js.map +1 -0
- package/dist/button-DgKUzE5o.js +121 -0
- package/dist/button-DgKUzE5o.js.map +1 -0
- package/dist/button.d.ts +21 -0
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +3 -0
- package/dist/checkbox.d.ts +34 -0
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +251 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-pbuEa-1d.js +13 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js +4138 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -0
- package/dist/colour-picker-Bw-AZoWx.js +922 -0
- package/dist/colour-picker-Bw-AZoWx.js.map +1 -0
- package/dist/colour-picker.d.ts +2 -0
- package/dist/colour-picker.js +2 -0
- package/dist/crumbs.d.ts +92 -0
- package/dist/crumbs.d.ts.map +1 -0
- package/dist/crumbs.js +789 -0
- package/dist/crumbs.js.map +1 -0
- package/dist/data-display.d.ts +24 -12
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +96 -105
- package/dist/data-display.js.map +1 -1
- package/dist/decorate-BZbkqIhA.js +9 -0
- package/dist/defaults-FEZaGiYZ.js +38 -0
- package/dist/defaults-FEZaGiYZ.js.map +1 -0
- package/dist/dist-By5URG0Y.js +1290 -0
- package/dist/dist-By5URG0Y.js.map +1 -0
- package/dist/dist-D7kJgnSE.js +1039 -0
- package/dist/dist-D7kJgnSE.js.map +1 -0
- package/dist/editable-label.d.ts +71 -0
- package/dist/editable-label.d.ts.map +1 -0
- package/dist/editable-label.js +279 -0
- package/dist/editable-label.js.map +1 -0
- package/dist/hex-editor-Gib1Grg2.d.ts +131 -0
- package/dist/hex-editor-Gib1Grg2.d.ts.map +1 -0
- package/dist/hex-editor-Wd6ZtZA2.js +1147 -0
- package/dist/hex-editor-Wd6ZtZA2.js.map +1 -0
- package/dist/hex.d.ts +2 -0
- package/dist/hex.js +2 -0
- package/dist/highlight-CAjwQ4GE.js +50 -0
- package/dist/highlight-CAjwQ4GE.js.map +1 -0
- package/dist/icon-BR5aTIiP.js +100 -0
- package/dist/icon-BR5aTIiP.js.map +1 -0
- package/dist/icon-DQKdfR7U.d.ts +36 -0
- package/dist/icon-DQKdfR7U.d.ts.map +1 -0
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +9 -0
- package/dist/icons.js.map +1 -0
- package/dist/incr-search-BjCNClnC.js +311 -0
- package/dist/incr-search-BjCNClnC.js.map +1 -0
- package/dist/incr-search.d.ts +2 -0
- package/dist/incr-search.js +3 -0
- package/dist/index-B1hNR7Z9.d.ts +36 -0
- package/dist/index-B1hNR7Z9.d.ts.map +1 -0
- package/dist/index-C5dK8RZa.d.ts +23 -0
- package/dist/index-C5dK8RZa.d.ts.map +1 -0
- package/dist/index-C9iBN908.d.ts +160 -0
- package/dist/index-C9iBN908.d.ts.map +1 -0
- package/dist/index-CPVcTTXo.d.ts +396 -0
- package/dist/index-CPVcTTXo.d.ts.map +1 -0
- package/dist/index-CQxanqXF.d.ts +183 -0
- package/dist/index-CQxanqXF.d.ts.map +1 -0
- package/dist/index-CpbBI3n7.d.ts +1239 -0
- package/dist/index-CpbBI3n7.d.ts.map +1 -0
- package/dist/index.d.ts +422 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5729 -14
- package/dist/index.js.map +1 -1
- package/dist/interaction-CQDQJf2Q.js +1 -0
- package/dist/keyboard-De_vOHLg.js +20 -0
- package/dist/keyboard-De_vOHLg.js.map +1 -0
- package/dist/labelled-input-base-DS6-6C0r.js +155 -0
- package/dist/labelled-input-base-DS6-6C0r.js.map +1 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts +43 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +34 -0
- package/dist/labelled-radial-input.d.ts.map +1 -0
- package/dist/labelled-radial-input.js +188 -0
- package/dist/labelled-radial-input.js.map +1 -0
- package/dist/labelled-range-input.d.ts +2 -0
- package/dist/labelled-range-input.js +132 -0
- package/dist/labelled-range-input.js.map +1 -0
- package/dist/led.d.ts +25 -0
- package/dist/led.d.ts.map +1 -0
- package/dist/led.js +92 -0
- package/dist/led.js.map +1 -0
- package/dist/menu-BV6UFx_z.js +813 -0
- package/dist/menu-BV6UFx_z.js.map +1 -0
- package/dist/menu-item-Cikacp4F.d.ts +128 -0
- package/dist/menu-item-Cikacp4F.d.ts.map +1 -0
- package/dist/menu-item-DEzL_Yjk.js +766 -0
- package/dist/menu-item-DEzL_Yjk.js.map +1 -0
- package/dist/menu.d.ts +3 -0
- package/dist/menu.js +3 -0
- package/dist/miller.d.ts +324 -0
- package/dist/miller.d.ts.map +1 -0
- package/dist/miller.js +1343 -0
- package/dist/miller.js.map +1 -0
- package/dist/narrowed-text.d.ts +72 -0
- package/dist/narrowed-text.d.ts.map +1 -0
- package/dist/narrowed-text.js +571 -0
- package/dist/narrowed-text.js.map +1 -0
- package/dist/panel.d.ts +43 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +408 -0
- package/dist/panel.js.map +1 -0
- package/dist/plots.d.ts +2 -0
- package/dist/plots.js +2 -0
- package/dist/polar-pad.d.ts +67 -0
- package/dist/polar-pad.d.ts.map +1 -0
- package/dist/polar-pad.js +537 -0
- package/dist/polar-pad.js.map +1 -0
- package/dist/popup-Ddx9LCzY.js +24 -0
- package/dist/popup-Ddx9LCzY.js.map +1 -0
- package/dist/prominence-CreDBdCs.js +98 -0
- package/dist/prominence-CreDBdCs.js.map +1 -0
- package/dist/radial-input-CNJ8asY2.js +849 -0
- package/dist/radial-input-CNJ8asY2.js.map +1 -0
- package/dist/radial-input-xSTd4kEz.d.ts +70 -0
- package/dist/radial-input-xSTd4kEz.d.ts.map +1 -0
- package/dist/radial-input.d.ts +2 -0
- package/dist/radial-input.js +2 -0
- package/dist/range-input.d.ts +43 -0
- package/dist/range-input.d.ts.map +1 -0
- package/dist/range-input.js +459 -0
- package/dist/range-input.js.map +1 -0
- package/dist/range.d.ts +28 -0
- package/dist/range.d.ts.map +1 -0
- package/dist/range.js +136 -0
- package/dist/range.js.map +1 -0
- package/dist/registry-CZEB1YI9.js +21 -0
- package/dist/registry-CZEB1YI9.js.map +1 -0
- package/dist/selecthorizontal.d.ts +13 -8
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +21 -25
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts +50 -0
- package/dist/snap-container.d.ts.map +1 -0
- package/dist/snap-container.js +297 -0
- package/dist/snap-container.js.map +1 -0
- package/dist/split-layout.d.ts +56 -0
- package/dist/split-layout.d.ts.map +1 -0
- package/dist/split-layout.js +545 -0
- package/dist/split-layout.js.map +1 -0
- package/dist/style.css +133 -0
- package/dist/swipe.d.ts +48 -0
- package/dist/swipe.d.ts.map +1 -0
- package/dist/swipe.js +204 -0
- package/dist/swipe.js.map +1 -0
- package/dist/tab-list-CFF7uSYH.d.ts +66 -0
- package/dist/tab-list-CFF7uSYH.d.ts.map +1 -0
- package/dist/tabs.d.ts +2 -0
- package/dist/tabs.js +203 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts +218 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -0
- package/dist/tickled-styles-Bg3QbcrD.js +327 -0
- package/dist/tickled-styles-Bg3QbcrD.js.map +1 -0
- package/dist/timeline-DBWJsSjd.js +1748 -0
- package/dist/timeline-DBWJsSjd.js.map +1 -0
- package/dist/timeline.d.ts +2 -0
- package/dist/timeline.js +2 -0
- package/dist/tooltip-DMxmBNky.js +104 -0
- package/dist/tooltip-DMxmBNky.js.map +1 -0
- package/dist/tooltip-kfUBWYVB.d.ts +26 -0
- package/dist/tooltip-kfUBWYVB.d.ts.map +1 -0
- package/dist/tree-component-CQpoPo4s.d.ts +326 -0
- package/dist/tree-component-CQpoPo4s.d.ts.map +1 -0
- package/dist/tree-data-model-DGvRVOFY.js +190 -0
- package/dist/tree-data-model-DGvRVOFY.js.map +1 -0
- package/dist/tree.d.ts +100 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +1144 -0
- package/dist/tree.js.map +1 -0
- package/dist/types-BKaqnpwx.d.ts +8 -0
- package/dist/types-BKaqnpwx.d.ts.map +1 -0
- package/dist/xy-axis-BANbgrI5.js +6243 -0
- package/dist/xy-axis-BANbgrI5.js.map +1 -0
- package/dist/xy-axis-CIFok7MF.d.ts +141 -0
- package/dist/xy-axis-CIFok7MF.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +81 -0
- package/dist/xy-pad.d.ts.map +1 -0
- package/dist/xy-pad.js +435 -0
- package/dist/xy-pad.js.map +1 -0
- package/package.json +48 -39
- package/README.md +0 -14
- package/dist/charts/frequency-histogram-plot.d.ts +0 -33
- package/dist/charts/frequency-histogram-plot.d.ts.map +0 -1
- package/dist/charts/frequency-histogram-plot.js +0 -54
- package/dist/charts/frequency-histogram-plot.js.map +0 -1
- package/dist/charts/histogram-vis.d.ts +0 -57
- package/dist/charts/histogram-vis.d.ts.map +0 -1
- package/dist/charts/histogram-vis.js +0 -222
- package/dist/charts/histogram-vis.js.map +0 -1
- package/dist/charts/plot.d.ts +0 -199
- package/dist/charts/plot.d.ts.map +0 -1
- package/dist/charts/plot.js +0 -914
- package/dist/charts/plot.js.map +0 -1
- package/dist/crumb-nav.d.ts +0 -41
- package/dist/crumb-nav.d.ts.map +0 -1
- package/dist/crumb-nav.js +0 -198
- package/dist/crumb-nav.js.map +0 -1
- package/dist/crumb-navigation.d.ts +0 -30
- package/dist/crumb-navigation.d.ts.map +0 -1
- package/dist/crumb-navigation.js +0 -307
- package/dist/crumb-navigation.js.map +0 -1
- package/dist/dial.d.ts +0 -89
- package/dist/dial.d.ts.map +0 -1
- package/dist/dial.js +0 -506
- package/dist/dial.js.map +0 -1
- package/dist/my-element.d.ts +0 -14
- package/dist/my-element.d.ts.map +0 -1
- package/dist/my-element.js +0 -44
- package/dist/my-element.js.map +0 -1
- package/dist/split-layout/split-layout.d.ts +0 -35
- package/dist/split-layout/split-layout.d.ts.map +0 -1
- package/dist/split-layout/split-layout.js +0 -220
- package/dist/split-layout/split-layout.js.map +0 -1
- package/dist/svg-edit-label.d.ts +0 -2
- package/dist/svg-edit-label.d.ts.map +0 -1
- package/dist/svg-edit-label.js +0 -110
- package/dist/svg-edit-label.js.map +0 -1
- package/dist/tabs/tab-layout-item.d.ts +0 -10
- package/dist/tabs/tab-layout-item.d.ts.map +0 -1
- package/dist/tabs/tab-layout-item.js +0 -20
- package/dist/tabs/tab-layout-item.js.map +0 -1
- package/dist/tabs/tab-layout.d.ts +0 -10
- package/dist/tabs/tab-layout.d.ts.map +0 -1
- package/dist/tabs/tab-layout.js +0 -25
- package/dist/tabs/tab-layout.js.map +0 -1
- package/dist/tabs/tab-list-item.d.ts +0 -18
- package/dist/tabs/tab-list-item.d.ts.map +0 -1
- package/dist/tabs/tab-list-item.js +0 -63
- package/dist/tabs/tab-list-item.js.map +0 -1
- package/dist/tabs/tab-list.d.ts +0 -21
- package/dist/tabs/tab-list.d.ts.map +0 -1
- package/dist/tabs/tab-list.js +0 -148
- package/dist/tabs/tab-list.js.map +0 -1
- package/dist/tabs/tab-panel.d.ts +0 -11
- package/dist/tabs/tab-panel.d.ts.map +0 -1
- package/dist/tabs/tab-panel.js +0 -30
- package/dist/tabs/tab-panel.js.map +0 -1
- package/dist/tabs/tab-panels.d.ts +0 -30
- package/dist/tabs/tab-panels.d.ts.map +0 -1
- package/dist/tabs/tab-panels.js +0 -80
- package/dist/tabs/tab-panels.js.map +0 -1
- package/dist/util/circle-arc.d.ts +0 -34
- package/dist/util/circle-arc.d.ts.map +0 -1
- package/dist/util/circle-arc.js +0 -77
- package/dist/util/circle-arc.js.map +0 -1
- package/dist/util/compare.d.ts +0 -53
- package/dist/util/compare.d.ts.map +0 -1
- package/dist/util/compare.js +0 -91
- package/dist/util/compare.js.map +0 -1
- package/dist/util/content-editable.d.ts +0 -2
- package/dist/util/content-editable.d.ts.map +0 -1
- package/dist/util/content-editable.js +0 -13
- package/dist/util/content-editable.js.map +0 -1
- package/dist/util/drag-controller.d.ts +0 -13
- package/dist/util/drag-controller.d.ts.map +0 -1
- package/dist/util/drag-controller.js +0 -21
- package/dist/util/drag-controller.js.map +0 -1
- package/dist/util/key-value.d.ts +0 -5
- package/dist/util/key-value.d.ts.map +0 -1
- package/dist/util/key-value.js +0 -30
- package/dist/util/key-value.js.map +0 -1
- package/dist/util/primitive-types.d.ts +0 -6
- package/dist/util/primitive-types.d.ts.map +0 -1
- package/dist/util/primitive-types.js +0 -2
- package/dist/util/primitive-types.js.map +0 -1
- package/dist/util/svg-editable-text.d.ts +0 -22
- package/dist/util/svg-editable-text.d.ts.map +0 -1
- package/dist/util/svg-editable-text.js +0 -121
- package/dist/util/svg-editable-text.js.map +0 -1
- package/dist/util/time.d.ts +0 -2
- package/dist/util/time.d.ts.map +0 -1
- package/dist/util/time.js +0 -2
- package/dist/util/time.js.map +0 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as _$lit from "lit";
|
|
2
|
+
import { LitElement, PropertyValues } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/plots/colour-map.d.ts
|
|
5
|
+
type ColourMode = `fixed` | `opacity` | `hue` | `saturation` | `lightness` | `scale`;
|
|
6
|
+
type ColourMapConfig = {
|
|
7
|
+
mode: ColourMode; /** Parsed colours for 'scale' mode. Must have ≥ 2 entries. */
|
|
8
|
+
palette: string[]; /** ixfx easing name — applied before the colour mode mapping. Takes precedence over valueMap. */
|
|
9
|
+
easingName: string; /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */
|
|
10
|
+
valueMap: ((v: number) => number) | null;
|
|
11
|
+
};
|
|
12
|
+
type ColourResult = {
|
|
13
|
+
fill: string;
|
|
14
|
+
opacity: number;
|
|
15
|
+
};
|
|
16
|
+
/** Read the resolved --plot-color CSS variable from an element. */
|
|
17
|
+
declare function readBaseColour(el: Element): string;
|
|
18
|
+
/** Parse a comma-separated colour string attribute into an array. Falls back to default palette. */
|
|
19
|
+
declare function parseColourScaleAttr(attr: string): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Compute the fill colour and opacity for a single data point.
|
|
22
|
+
* @param scaledValue Normalised value in 0..1 (data range for single-axis; age fraction for xy).
|
|
23
|
+
* @param baseColour Resolved base colour string (from --plot-color).
|
|
24
|
+
* @param config Colour map configuration.
|
|
25
|
+
*/
|
|
26
|
+
declare function computeColour(scaledValue: number, baseColour: string, config: ColourMapConfig): ColourResult;
|
|
27
|
+
/**
|
|
28
|
+
* Apply xy-axis age-style modification on top of a base ColourResult.
|
|
29
|
+
* 'size' is not handled here — the caller adjusts the radius separately.
|
|
30
|
+
*/
|
|
31
|
+
declare function applyAgeModification(base: ColourResult, ageFraction: number, ageStyle: string): ColourResult;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/plots/data.d.ts
|
|
34
|
+
type PlotDataSeriesOptions = {
|
|
35
|
+
/**
|
|
36
|
+
* Limit of how many data points to store.
|
|
37
|
+
* Default: 100
|
|
38
|
+
*/
|
|
39
|
+
capacityLimit: number;
|
|
40
|
+
/**
|
|
41
|
+
* If _true_, it maintains the same scale over its lifetime.
|
|
42
|
+
* If _false_, scale adjusts based on items in its cache.
|
|
43
|
+
*
|
|
44
|
+
* Default: true
|
|
45
|
+
*/
|
|
46
|
+
persistentScaling: boolean;
|
|
47
|
+
};
|
|
48
|
+
declare class PlotDataSeries {
|
|
49
|
+
#private;
|
|
50
|
+
values: number[];
|
|
51
|
+
range: {
|
|
52
|
+
min: number;
|
|
53
|
+
max: number;
|
|
54
|
+
};
|
|
55
|
+
constructor(options?: Partial<PlotDataSeriesOptions>);
|
|
56
|
+
add(value: number): void;
|
|
57
|
+
set(values: number[]): void;
|
|
58
|
+
clear(): void;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/plots/single-axis.d.ts
|
|
62
|
+
type SingleAxisDrawStyle = `line-sharp` | `line-round` | `circles` | `squares` | `vbar` | `hbar` | `hist-bottom` | `hist-top` | `hist-middle`;
|
|
63
|
+
type SingleAxisAgeStyle = `none` | `opacity` | `desaturation` | `size`;
|
|
64
|
+
declare class PlotSingleAxis extends LitElement {
|
|
65
|
+
#private;
|
|
66
|
+
drawStyle: SingleAxisDrawStyle;
|
|
67
|
+
ageStyle: SingleAxisAgeStyle;
|
|
68
|
+
title: string;
|
|
69
|
+
precise: boolean;
|
|
70
|
+
tooltips: boolean;
|
|
71
|
+
capacity: number;
|
|
72
|
+
persistentScale: boolean;
|
|
73
|
+
paused: boolean;
|
|
74
|
+
clickPauses: boolean;
|
|
75
|
+
shaded: boolean;
|
|
76
|
+
areaColor: string;
|
|
77
|
+
colorMode: ColourMode;
|
|
78
|
+
colorEasing: string;
|
|
79
|
+
colorScale: string;
|
|
80
|
+
/** Custom value-mapping function (0..1 → 0..1). Ignored when color-easing is set. */
|
|
81
|
+
colorValueMap: ((v: number) => number) | null;
|
|
82
|
+
private _width;
|
|
83
|
+
private _height;
|
|
84
|
+
/** Override to customize tooltip label. */
|
|
85
|
+
valueFormat: (v: number | undefined) => string;
|
|
86
|
+
add(v: number): void;
|
|
87
|
+
set(values: number[]): void;
|
|
88
|
+
clear(): void;
|
|
89
|
+
protected firstUpdated(_changed: PropertyValues): void;
|
|
90
|
+
protected updated(changed: PropertyValues): void;
|
|
91
|
+
render(): _$lit.TemplateResult<1>;
|
|
92
|
+
static styles: _$lit.CSSResult;
|
|
93
|
+
}
|
|
94
|
+
declare global {
|
|
95
|
+
interface HTMLElementTagNameMap {
|
|
96
|
+
'ixfx-plot-single-axis': PlotSingleAxis;
|
|
97
|
+
}
|
|
98
|
+
} //# sourceMappingURL=single-axis.d.ts.map
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/plots/xy-axis.d.ts
|
|
101
|
+
type XyDrawStyle = `circles` | `squares`;
|
|
102
|
+
type XyAgeStyle = `none` | `opacity` | `desaturation` | `size`;
|
|
103
|
+
declare class PlotXyAxis extends LitElement {
|
|
104
|
+
#private;
|
|
105
|
+
drawStyle: XyDrawStyle;
|
|
106
|
+
ageStyle: XyAgeStyle;
|
|
107
|
+
title: string;
|
|
108
|
+
precise: boolean;
|
|
109
|
+
tooltips: boolean;
|
|
110
|
+
capacity: number;
|
|
111
|
+
persistentScale: boolean;
|
|
112
|
+
paused: boolean;
|
|
113
|
+
clickPauses: boolean;
|
|
114
|
+
colorMode: ColourMode;
|
|
115
|
+
colorEasing: string;
|
|
116
|
+
colorScale: string;
|
|
117
|
+
/**
|
|
118
|
+
* Custom value-mapping fn (0..1 → 0..1). For xy-axis the input is the point's ageFraction
|
|
119
|
+
* (0 = oldest, 1 = newest). Ignored when color-easing is set.
|
|
120
|
+
*/
|
|
121
|
+
colorValueMap: ((v: number) => number) | null;
|
|
122
|
+
private _width;
|
|
123
|
+
private _height;
|
|
124
|
+
/** Override to customize tooltip label. */
|
|
125
|
+
valueFormat: (x: number, y: number) => string;
|
|
126
|
+
add(x: number, y: number): void;
|
|
127
|
+
setXY(xs: number[], ys: number[]): void;
|
|
128
|
+
clear(): void;
|
|
129
|
+
protected firstUpdated(_changed: PropertyValues): void;
|
|
130
|
+
protected updated(changed: PropertyValues): void;
|
|
131
|
+
render(): _$lit.TemplateResult<1>;
|
|
132
|
+
static styles: _$lit.CSSResult;
|
|
133
|
+
}
|
|
134
|
+
declare global {
|
|
135
|
+
interface HTMLElementTagNameMap {
|
|
136
|
+
'ixfx-plot-xy-axis': PlotXyAxis;
|
|
137
|
+
}
|
|
138
|
+
} //# sourceMappingURL=xy-axis.d.ts.map
|
|
139
|
+
//#endregion
|
|
140
|
+
export { SingleAxisAgeStyle as a, PlotDataSeriesOptions as c, ColourResult as d, applyAgeModification as f, readBaseColour as h, PlotSingleAxis as i, ColourMapConfig as l, parseColourScaleAttr as m, XyAgeStyle as n, SingleAxisDrawStyle as o, computeColour as p, XyDrawStyle as r, PlotDataSeries as s, PlotXyAxis as t, ColourMode as u };
|
|
141
|
+
//# sourceMappingURL=xy-axis-CIFok7MF.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xy-axis-CIFok7MF.d.ts","names":[],"sources":["../src/plots/colour-map.ts","../src/plots/data.ts","../src/plots/single-axis.ts","../src/plots/xy-axis.ts"],"mappings":";;;;KAeY,UAAA;AAAA,KAEA,eAAA;EACV,IAAA,EAAM,UAAA;EAEN,OAAA,YALoB;EAOpB,UAAA,UAPoB;EASpB,QAAA,IAAY,CAAA;AAAA;AAAA,KAGF,YAAA;EAAiB,IAAA;EAAc,OAAA;AAAA;;iBA2C3B,cAAA,CAAe,EAAA,EAAI,OAAA;;iBAMnB,oBAAA,CAAqB,IAAA;;;;AAjDrC;;;iBAwFgB,aAAA,CAAc,WAAA,UAAqB,UAAA,UAAoB,MAAA,EAAQ,eAAA,GAAkB,YAAA;;AA7CjG;;;iBA+FgB,oBAAA,CAAqB,IAAA,EAAM,YAAA,EAAc,WAAA,UAAqB,QAAA,WAAmB,YAAA;;;KCnKrF,qBAAA;;;;ADaZ;ECRE,aAAA;;;;ADUF;;;ECHE,iBAAA;AAAA;AAAA,cAGW,cAAA;EAAA;EACX,MAAA;EAEA,KAAA;IAAS,GAAA;IAAa,GAAA;EAAA;cAIV,OAAA,GAAS,OAAA,CAAQ,qBAAA;EAQ7B,GAAA,CAAI,KAAA;EAoBJ,GAAA,CAAI,MAAA;EAQJ,KAAA,CAAA;AAAA;;;KCpDU,mBAAA;AAAA,KAWA,kBAAA;AAAA,cAgHC,cAAA,SAAuB,UAAA;EAAA;EAElC,SAAA,EAAW,mBAAA;EAGX,QAAA,EAAU,kBAAA;EAEE,KAAA;EAEiB,OAAA;EACA,QAAA;EACD,QAAA;EAG5B,eAAA;EAE4C,MAAA;EACY,WAAA;EAGxD,MAAA;EAGA,SAAA;EAGuC,SAAA,EAAW,UAAA;EACT,WAAA;EACD,UAAA;EFpI9B;EEsIV,aAAA,IAAiB,CAAA;EAAA,QAEA,MAAA;EAAA,QACA,OAAA;EFzI+B;EEuJhD,WAAA,GAAc,CAAA;EAKd,GAAA,CAAI,CAAA;EASJ,GAAA,CAAI,MAAA;EASJ,KAAA,CAAA;EAAA,UAKmB,YAAA,CAAa,QAAA,EAAU,cAAA;EAAA,UAkBvB,OAAA,CAAQ,OAAA,EAAS,cAAA;EAmH3B,MAAA,CAAA,GAnHyC,KAAA,CAmHnC,cAAA;EAAA,OA8EC,MAAA,EA9ED,KAAA,CA8EO,SAAA;AAAA;AAAA,QAwBhB,MAAA;EAAA,UACI,qBAAA;IACR,uBAAA,EAAyB,cAAA;EAAA;AAAA;;;KCnbjB,WAAA;AAAA,KACA,UAAA;AAAA,cAOC,UAAA,SAAmB,UAAA;EAAA;EAE9B,SAAA,EAAW,WAAA;EAGX,QAAA,EAAU,UAAA;EAEE,KAAA;EACiB,OAAA;EACA,QAAA;EACD,QAAA;EAG5B,eAAA;EAE4C,MAAA;EACY,WAAA;EAGjB,SAAA,EAAW,UAAA;EACT,WAAA;EACD,UAAA;EHbnB;;AAGvB;;EGeE,aAAA,IAAiB,CAAA;EAAA,QAEA,MAAA;EAAA,QACA,OAAA;EHyBH;EGnBd,WAAA,GAAc,CAAA,UAAW,CAAA;EAEzB,GAAA,CAAI,CAAA,UAAW,CAAA;EASf,KAAA,CAAM,EAAA,YAAc,EAAA;EASpB,KAAA,CAAA;EAAA,UAMmB,YAAA,CAAa,QAAA,EAAU,cAAA;EAAA,UAWvB,OAAA,CAAQ,OAAA,EAAS,cAAA;EA8G3B,MAAA,CAAA,GA9GyC,KAAA,CA8GnC,cAAA;EAAA,OAkEC,MAAA,EAlED,KAAA,CAkEO,SAAA;AAAA;AAAA,QAuBhB,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,UAAA;EAAA;AAAA"}
|
package/dist/xy-pad.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as _$lit from "lit";
|
|
2
|
+
import { LitElement, PropertyValues, html } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/xy-pad.d.ts
|
|
5
|
+
declare class XyPad extends LitElement {
|
|
6
|
+
static styles: _$lit.CSSResult[];
|
|
7
|
+
xMin: number;
|
|
8
|
+
xMax: number;
|
|
9
|
+
x: number;
|
|
10
|
+
yMin: number;
|
|
11
|
+
yMax: number;
|
|
12
|
+
y: number;
|
|
13
|
+
xScale: string;
|
|
14
|
+
yScale: string;
|
|
15
|
+
xSnapStep?: number;
|
|
16
|
+
ySnapStep?: number;
|
|
17
|
+
xLabel: string;
|
|
18
|
+
yLabel: string;
|
|
19
|
+
showCrosshairs: boolean;
|
|
20
|
+
showGrid: boolean;
|
|
21
|
+
hideCursor: boolean;
|
|
22
|
+
disabled: boolean;
|
|
23
|
+
/** Number of quantised stops for both axes. Overridden by stops-x/stops-y if set. */
|
|
24
|
+
stops?: number;
|
|
25
|
+
/** Number of quantised stops for X axis. If set, overrides the stops setting for X. */
|
|
26
|
+
stopsX?: number;
|
|
27
|
+
/** Number of quantised stops for Y axis. If set, overrides the stops setting for Y. */
|
|
28
|
+
stopsY?: number;
|
|
29
|
+
private _dragging;
|
|
30
|
+
private _dragStartX;
|
|
31
|
+
private _dragStartY;
|
|
32
|
+
private _pressedKeys;
|
|
33
|
+
private _onKeyDown;
|
|
34
|
+
private _onKeyUp;
|
|
35
|
+
private _handleKeyboardMove;
|
|
36
|
+
private _onPointerDown;
|
|
37
|
+
private _onPointerMove;
|
|
38
|
+
private _onPointerUp;
|
|
39
|
+
private _updateFromPointer;
|
|
40
|
+
private _setPctVars;
|
|
41
|
+
/**
|
|
42
|
+
* Returns X position as a 0–1 fraction.
|
|
43
|
+
*/
|
|
44
|
+
getRelativeX(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Returns Y position as a 0–1 fraction.
|
|
47
|
+
*/
|
|
48
|
+
getRelativeY(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Returns polar coordinates.
|
|
51
|
+
* - radius: 0–1 distance from center
|
|
52
|
+
* - angle: radians, 0 = right, clockwise (0 to 2π)
|
|
53
|
+
*/
|
|
54
|
+
getPolar(): {
|
|
55
|
+
radius: number;
|
|
56
|
+
angle: number;
|
|
57
|
+
};
|
|
58
|
+
updated(_changed: PropertyValues): void;
|
|
59
|
+
disconnectedCallback(): void;
|
|
60
|
+
render(): ReturnType<typeof html>;
|
|
61
|
+
}
|
|
62
|
+
type XyPadInputDetail = {
|
|
63
|
+
readonly x: number;
|
|
64
|
+
readonly y: number;
|
|
65
|
+
};
|
|
66
|
+
type XyPadInputEvent = CustomEvent<XyPadInputDetail>;
|
|
67
|
+
declare global {
|
|
68
|
+
interface HTMLElementTagNameMap {
|
|
69
|
+
'ixfx-xy-pad': XyPad;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
interface XyPadEventMap {
|
|
73
|
+
input: XyPadInputEvent;
|
|
74
|
+
change: XyPadInputEvent;
|
|
75
|
+
}
|
|
76
|
+
interface XyPad {
|
|
77
|
+
addEventListener: (<K extends keyof XyPadEventMap>(type: K, listener: (this: XyPad, event: XyPadEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { XyPad, XyPadEventMap, XyPadInputDetail, XyPadInputEvent };
|
|
81
|
+
//# sourceMappingURL=xy-pad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xy-pad.d.ts","names":[],"sources":["../src/xy-pad.ts"],"mappings":";;;;cAuEa,KAAA,SAAc,UAAA;EAAA,OACT,MAAA,EADC,KAAA,CACK,SAAA;EAoHM,IAAA;EACA,IAAA;EACA,CAAA;EAEA,IAAA;EACA,IAAA;EACA,CAAA;EAEA,MAAA;EACA,MAAA;EAC0B,SAAA;EACA,SAAA;EAE1B,MAAA;EACA,MAAA;EAE8C,cAAA;EACN,QAAA;EACE,UAAA;EAC1B,QAAA;EAqNH;EAlNb,KAAA;EAmOlB;EAhOwC,MAAA;;EAGA,MAAA;EAAA,QAE1C,SAAA;EAAA,QACA,WAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAAA,QAEA,UAAA;EAAA,QAuBA,QAAA;EAAA,QAIA,mBAAA;EAAA,QA2CA,cAAA;EAAA,QAeA,cAAA;EAAA,QAOA,YAAA;EAAA,QAeA,kBAAA;EAAA,QA+BA,WAAA;EAqFN;;;EAjEF,YAAA,CAAA;EAiEsB;AAIxB;;EA7DE,YAAA,CAAA;EA+DuB;;;;;EArDvB,QAAA,CAAA;IAAc,MAAA;IAAgB,KAAA;EAAA;EAUrB,OAAA,CAAQ,QAAA,EAAU,cAAA;EAKlB,oBAAA,CAAA;EAMA,MAAA,CAAA,GAAU,UAAA,QAAkB,IAAA;AAAA;AAAA,KAiB3B,gBAAA;EAAA,SACD,CAAA;EAAA,SACA,CAAA;AAAA;AAAA,KAGC,eAAA,GAAkB,WAAA,CAAY,gBAAA;AAAA,QAElC,MAAA;EAAA,UACI,qBAAA;IACR,aAAA,EAAe,KAAA;EAAA;AAAA;AAAA,UAIF,aAAA;EACf,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,eAAA;AAAA;AAAA,UAGO,KAAA;EACf,gBAAA,oBAAoC,aAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,CAAA,YAC7C,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA"}
|
package/dist/xy-pad.js
ADDED
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { t as __decorate } from "./decorate-BZbkqIhA.js";
|
|
2
|
+
import { t as prominenceStyles } from "./prominence-CreDBdCs.js";
|
|
3
|
+
import { t as resolveStep } from "./keyboard-De_vOHLg.js";
|
|
4
|
+
import { LitElement, css, html } from "lit";
|
|
5
|
+
import { customElement, property } from "lit/decorators.js";
|
|
6
|
+
//#region src/xy-pad.ts
|
|
7
|
+
/**
|
|
8
|
+
* <x-xy-pad> — 2D touch-friendly XY pad for controlling two parameters.
|
|
9
|
+
*
|
|
10
|
+
* Generic pad that accepts min/max/value for both axes with configurable labels.
|
|
11
|
+
* Each axis can independently use logarithmic or linear scaling.
|
|
12
|
+
* Y axis is inverted (top = high value).
|
|
13
|
+
*
|
|
14
|
+
* Properties
|
|
15
|
+
* xMin, xMax, x – horizontal range and current value
|
|
16
|
+
* yMin, yMax, y – vertical range and current value
|
|
17
|
+
* xScale, yScale – 'log' (default) or 'linear'
|
|
18
|
+
* xSnapStep, ySnapStep – snap granularity for pointer and keyboard moves (defaults: 1 / 0.01)
|
|
19
|
+
* xLabel, yLabel – axis labels (displayed in corners)
|
|
20
|
+
* showCrosshairs – show X/Y axis lines (default: false)
|
|
21
|
+
* showGrid – show background grid (default: false)
|
|
22
|
+
*
|
|
23
|
+
* CSS variables:
|
|
24
|
+
* --marker-size – size of the position marker (default: 10cqb)
|
|
25
|
+
* --crosshair-color – colour of both crosshair lines (default: surface-hh)
|
|
26
|
+
* --crosshair-width – thickness of both crosshair lines (default: 2px)
|
|
27
|
+
* --crosshair-x-color – colour of the vertical (X) crosshair line; falls back to --crosshair-color
|
|
28
|
+
* --crosshair-x-width – thickness of the vertical (X) crosshair line; falls back to --crosshair-width
|
|
29
|
+
* --crosshair-y-color – colour of the horizontal (Y) crosshair line; falls back to --crosshair-color
|
|
30
|
+
* --crosshair-y-width – thickness of the horizontal (Y) crosshair line; falls back to --crosshair-width
|
|
31
|
+
* --grid-color – colour of grid lines (default: surface-hh)
|
|
32
|
+
* --grid-width – thickness of grid lines (default: 1px)
|
|
33
|
+
* --x-pct – current X position as unitless number (0–100), set on host so external styles can use it
|
|
34
|
+
* --y-pct – current Y position as unitless number (0–100), set on host so external styles can use it
|
|
35
|
+
* --radius-pct – distance from center as unitless number (0–100), set on host so external styles can use it
|
|
36
|
+
* hide-cursor – boolean, hide cursor during drag and hover (default: false)
|
|
37
|
+
*
|
|
38
|
+
* Events
|
|
39
|
+
* input – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires continuously during drag
|
|
40
|
+
* change – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires when drag ends
|
|
41
|
+
*
|
|
42
|
+
* Methods
|
|
43
|
+
* getRelativeX() – returns X position as 0–1 fraction
|
|
44
|
+
* getRelativeY() – returns Y position as 0–1 fraction
|
|
45
|
+
* getPolar() – returns { radius: number, angle: number } where radius is 0–1 and angle is in radians (0 to 2π, 0 = right, clockwise)
|
|
46
|
+
*/
|
|
47
|
+
function valueToFrac(value, min, max, scale) {
|
|
48
|
+
if (scale === `linear`) return (value - min) / (max - min);
|
|
49
|
+
return Math.log(value / min) / Math.log(max / min);
|
|
50
|
+
}
|
|
51
|
+
function fracToValue(frac, min, max, scale) {
|
|
52
|
+
if (scale === `linear`) return min + frac * (max - min);
|
|
53
|
+
return min * (max / min) ** frac;
|
|
54
|
+
}
|
|
55
|
+
function quantise(value, min, max, stops) {
|
|
56
|
+
if (!stops || stops <= 1) return value;
|
|
57
|
+
const step = (max - min) / stops;
|
|
58
|
+
return Math.round((value - min) / step) * step + min;
|
|
59
|
+
}
|
|
60
|
+
let XyPad = class XyPad extends LitElement {
|
|
61
|
+
constructor(..._args) {
|
|
62
|
+
super(..._args);
|
|
63
|
+
this.xMin = 1;
|
|
64
|
+
this.xMax = 100;
|
|
65
|
+
this.x = 50;
|
|
66
|
+
this.yMin = 1;
|
|
67
|
+
this.yMax = 100;
|
|
68
|
+
this.y = 50;
|
|
69
|
+
this.xScale = `linear`;
|
|
70
|
+
this.yScale = `linear`;
|
|
71
|
+
this.xLabel = `X`;
|
|
72
|
+
this.yLabel = `Y`;
|
|
73
|
+
this.showCrosshairs = false;
|
|
74
|
+
this.showGrid = false;
|
|
75
|
+
this.hideCursor = false;
|
|
76
|
+
this.disabled = false;
|
|
77
|
+
this._dragging = false;
|
|
78
|
+
this._dragStartX = 0;
|
|
79
|
+
this._dragStartY = 0;
|
|
80
|
+
this._pressedKeys = /* @__PURE__ */ new Set();
|
|
81
|
+
this._onKeyDown = (e) => {
|
|
82
|
+
if (this.disabled) return;
|
|
83
|
+
if ([
|
|
84
|
+
`ArrowLeft`,
|
|
85
|
+
`ArrowRight`,
|
|
86
|
+
`ArrowUp`,
|
|
87
|
+
`ArrowDown`
|
|
88
|
+
].includes(e.key)) {
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
this._pressedKeys.add(e.key);
|
|
91
|
+
this._handleKeyboardMove(e.shiftKey);
|
|
92
|
+
} else if (e.key === `Home` || e.key === `End`) {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
const newX = e.key === `Home` ? this.xMin : this.xMax;
|
|
95
|
+
const newY = e.key === `Home` ? this.yMin : this.yMax;
|
|
96
|
+
if (newX !== this.x || newY !== this.y) {
|
|
97
|
+
this.x = newX;
|
|
98
|
+
this.y = newY;
|
|
99
|
+
this.dispatchEvent(new CustomEvent(`input`, {
|
|
100
|
+
detail: {
|
|
101
|
+
x: this.x,
|
|
102
|
+
y: this.y
|
|
103
|
+
},
|
|
104
|
+
bubbles: true,
|
|
105
|
+
composed: true
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
this._onKeyUp = (e) => {
|
|
111
|
+
this._pressedKeys.delete(e.key);
|
|
112
|
+
};
|
|
113
|
+
this._handleKeyboardMove = (shiftKey) => {
|
|
114
|
+
const shiftDivisor = shiftKey ? 10 : 1;
|
|
115
|
+
const xRange = this.xMax - this.xMin;
|
|
116
|
+
const yRange = this.yMax - this.yMin;
|
|
117
|
+
const effectiveStopsX = this.stopsX ?? this.stops;
|
|
118
|
+
const effectiveStopsY = this.stopsY ?? this.stops;
|
|
119
|
+
const xStep = resolveStep(xRange, effectiveStopsX, void 0) / shiftDivisor;
|
|
120
|
+
const yStep = resolveStep(yRange, effectiveStopsY, void 0) / shiftDivisor;
|
|
121
|
+
let newX = this.x;
|
|
122
|
+
let newY = this.y;
|
|
123
|
+
if (this._pressedKeys.has(`ArrowLeft`)) newX = Math.max(this.xMin, this.x - xStep);
|
|
124
|
+
if (this._pressedKeys.has(`ArrowRight`)) newX = Math.min(this.xMax, this.x + xStep);
|
|
125
|
+
if (this._pressedKeys.has(`ArrowUp`)) newY = Math.min(this.yMax, this.y + yStep);
|
|
126
|
+
if (this._pressedKeys.has(`ArrowDown`)) newY = Math.max(this.yMin, this.y - yStep);
|
|
127
|
+
if (newX !== this.x || newY !== this.y) {
|
|
128
|
+
let finalX = this.xSnapStep && this.xSnapStep > 0 ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;
|
|
129
|
+
let finalY = this.ySnapStep && this.ySnapStep > 0 ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;
|
|
130
|
+
finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);
|
|
131
|
+
finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);
|
|
132
|
+
this.x = finalX;
|
|
133
|
+
this.y = finalY;
|
|
134
|
+
this.dispatchEvent(new CustomEvent(`input`, {
|
|
135
|
+
detail: {
|
|
136
|
+
x: this.x,
|
|
137
|
+
y: this.y
|
|
138
|
+
},
|
|
139
|
+
bubbles: true,
|
|
140
|
+
composed: true
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
this._onPointerDown = (e) => {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
const pad = this.renderRoot.querySelector(`.xy-pad-area`);
|
|
147
|
+
pad?.focus();
|
|
148
|
+
if (pad) pad.setPointerCapture(e.pointerId);
|
|
149
|
+
this._dragging = true;
|
|
150
|
+
this._dragStartX = this.x;
|
|
151
|
+
this._dragStartY = this.y;
|
|
152
|
+
this.setAttribute(`dragging`, ``);
|
|
153
|
+
this._updateFromPointer(e);
|
|
154
|
+
globalThis.addEventListener(`pointermove`, this._onPointerMove);
|
|
155
|
+
globalThis.addEventListener(`pointerup`, this._onPointerUp);
|
|
156
|
+
};
|
|
157
|
+
this._onPointerMove = (e) => {
|
|
158
|
+
if (!this._dragging) return;
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
this._updateFromPointer(e);
|
|
161
|
+
};
|
|
162
|
+
this._onPointerUp = () => {
|
|
163
|
+
const hasChanged = this.x !== this._dragStartX || this.y !== this._dragStartY;
|
|
164
|
+
this._dragging = false;
|
|
165
|
+
this.removeAttribute(`dragging`);
|
|
166
|
+
globalThis.removeEventListener(`pointermove`, this._onPointerMove);
|
|
167
|
+
globalThis.removeEventListener(`pointerup`, this._onPointerUp);
|
|
168
|
+
if (hasChanged) this.dispatchEvent(new CustomEvent(`change`, {
|
|
169
|
+
detail: {
|
|
170
|
+
x: this.x,
|
|
171
|
+
y: this.y
|
|
172
|
+
},
|
|
173
|
+
bubbles: true,
|
|
174
|
+
composed: true
|
|
175
|
+
}));
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
static {
|
|
179
|
+
this.styles = [prominenceStyles, css`
|
|
180
|
+
:host {
|
|
181
|
+
display: block;
|
|
182
|
+
width: 200px;
|
|
183
|
+
height: 200px;
|
|
184
|
+
touch-action: none;
|
|
185
|
+
user-select: none;
|
|
186
|
+
container-type: size;
|
|
187
|
+
--marker-size: 10cqb;
|
|
188
|
+
--crosshair-color: var(--surface-6);
|
|
189
|
+
--crosshair-width: 2px;
|
|
190
|
+
--crosshair-x-color: var(--crosshair-color);
|
|
191
|
+
--crosshair-x-width: var(--crosshair-width);
|
|
192
|
+
--crosshair-y-color: var(--crosshair-color);
|
|
193
|
+
--crosshair-y-width: var(--crosshair-width);
|
|
194
|
+
--grid-color: var(--surface-6);
|
|
195
|
+
--grid-width: 1px;
|
|
196
|
+
--_space-s: var(--space-s, 4px);
|
|
197
|
+
--_space-m: var(--space-m, 8px);
|
|
198
|
+
}
|
|
199
|
+
.xy-pad-area {
|
|
200
|
+
position: relative;
|
|
201
|
+
width: 100%;
|
|
202
|
+
height: 100%;
|
|
203
|
+
background: var(--xy-pad-bg, var(--surface-3));
|
|
204
|
+
border: var(--border);
|
|
205
|
+
border-radius: var(--radius-m);
|
|
206
|
+
overflow: hidden;
|
|
207
|
+
box-shadow: var(--deboss-3);
|
|
208
|
+
cursor: var(--cursor-display, crosshair);
|
|
209
|
+
}
|
|
210
|
+
:host([dragging]) .xy-pad-area {
|
|
211
|
+
cursor: none;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.xy-pad-area:focus {
|
|
215
|
+
outline: none;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.xy-pad-area:focus-visible {
|
|
219
|
+
outline: 2px solid var(--accent);
|
|
220
|
+
outline-offset: 2px;
|
|
221
|
+
}
|
|
222
|
+
.xy-pad-area::before,
|
|
223
|
+
.xy-pad-area::after {
|
|
224
|
+
content: '';
|
|
225
|
+
position: absolute;
|
|
226
|
+
pointer-events: none;
|
|
227
|
+
opacity: var(--show-crosshairs, 0);
|
|
228
|
+
}
|
|
229
|
+
:host([show-crosshairs]) {
|
|
230
|
+
--show-crosshairs: 1;
|
|
231
|
+
}
|
|
232
|
+
.xy-pad-area::before {
|
|
233
|
+
left: 0;
|
|
234
|
+
right: 0;
|
|
235
|
+
top: calc(100% - var(--y-pct, 50) * 1%);
|
|
236
|
+
height: var(--crosshair-y-width);
|
|
237
|
+
background: var(--crosshair-y-color);
|
|
238
|
+
}
|
|
239
|
+
.xy-pad-area::after {
|
|
240
|
+
top: 0;
|
|
241
|
+
bottom: 0;
|
|
242
|
+
left: calc(var(--x-pct, 50) * 1%);
|
|
243
|
+
width: var(--crosshair-x-width);
|
|
244
|
+
background: var(--crosshair-x-color);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.xy-pad-grid {
|
|
248
|
+
position: absolute;
|
|
249
|
+
inset: 0;
|
|
250
|
+
background-image:
|
|
251
|
+
linear-gradient(to right, var(--grid-color) var(--grid-width), transparent var(--grid-width)),
|
|
252
|
+
linear-gradient(to bottom, var(--grid-color) var(--grid-width), transparent var(--grid-width));
|
|
253
|
+
background-size: 10cqb 10cqb;
|
|
254
|
+
pointer-events: none;
|
|
255
|
+
opacity: var(--show-grid, 0);
|
|
256
|
+
}
|
|
257
|
+
:host([show-grid]) {
|
|
258
|
+
--show-grid: 1;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.xy-pad-marker {
|
|
262
|
+
position: absolute;
|
|
263
|
+
width: var(--marker-size, 10cqb);
|
|
264
|
+
height: var(--marker-size, 10cqb);
|
|
265
|
+
border-radius: 50%;
|
|
266
|
+
background: var(--surface-2-accent, var(--accent));
|
|
267
|
+
top: calc(100% - var(--y-pct, 50) * 1%);
|
|
268
|
+
left: calc(var(--x-pct, 50) * 1%);
|
|
269
|
+
transform: translate(-50%, -50%);
|
|
270
|
+
pointer-events: none;
|
|
271
|
+
z-index: 2;
|
|
272
|
+
}
|
|
273
|
+
.xy-pad-label-x {
|
|
274
|
+
position: absolute;
|
|
275
|
+
bottom: var(--_space-s);
|
|
276
|
+
color: var(--surface-muted-text);
|
|
277
|
+
font-size: var(--text-s, 12px);
|
|
278
|
+
pointer-events: none;
|
|
279
|
+
width: 100%;
|
|
280
|
+
text-align: center;
|
|
281
|
+
}
|
|
282
|
+
.xy-pad-label-y {
|
|
283
|
+
position: absolute;
|
|
284
|
+
top: var(--_space-s);
|
|
285
|
+
left: var(--_space-m);
|
|
286
|
+
color: var(--surface-muted-text);
|
|
287
|
+
font-size: var(--text-s, 12px);
|
|
288
|
+
pointer-events: none;
|
|
289
|
+
writing-mode: sideways-lr;
|
|
290
|
+
height:100%;
|
|
291
|
+
text-align:center;
|
|
292
|
+
}
|
|
293
|
+
`];
|
|
294
|
+
}
|
|
295
|
+
_updateFromPointer(e) {
|
|
296
|
+
const pad = this.renderRoot.querySelector(`.xy-pad-area`);
|
|
297
|
+
if (!pad) return;
|
|
298
|
+
const rect = pad.getBoundingClientRect();
|
|
299
|
+
const xFrac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
|
|
300
|
+
const yFrac = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height));
|
|
301
|
+
const newX = fracToValue(xFrac, this.xMin, this.xMax, this.xScale);
|
|
302
|
+
const newY = fracToValue(yFrac, this.yMin, this.yMax, this.yScale);
|
|
303
|
+
let finalX = this.xSnapStep && this.xSnapStep > 0 ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;
|
|
304
|
+
let finalY = this.ySnapStep && this.ySnapStep > 0 ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;
|
|
305
|
+
const effectiveStopsX = this.stopsX ?? this.stops;
|
|
306
|
+
const effectiveStopsY = this.stopsY ?? this.stops;
|
|
307
|
+
finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);
|
|
308
|
+
finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);
|
|
309
|
+
this.x = finalX;
|
|
310
|
+
this.y = finalY;
|
|
311
|
+
this.dispatchEvent(new CustomEvent(`input`, {
|
|
312
|
+
detail: {
|
|
313
|
+
x: this.x,
|
|
314
|
+
y: this.y
|
|
315
|
+
},
|
|
316
|
+
bubbles: true,
|
|
317
|
+
composed: true
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
_setPctVars() {
|
|
321
|
+
const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));
|
|
322
|
+
const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));
|
|
323
|
+
const xPct = valueToFrac(cx, this.xMin, this.xMax, this.xScale) * 100;
|
|
324
|
+
const yPct = valueToFrac(cy, this.yMin, this.yMax, this.yScale) * 100;
|
|
325
|
+
this.style.setProperty(`--x-pct`, `${xPct}`);
|
|
326
|
+
this.style.setProperty(`--y-pct`, `${yPct}`);
|
|
327
|
+
const dx = xPct - 50;
|
|
328
|
+
const dy = yPct - 50;
|
|
329
|
+
const radiusPct = Math.sqrt(dx * dx + dy * dy);
|
|
330
|
+
this.style.setProperty(`--radius-pct`, `${radiusPct}`);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Returns X position as a 0–1 fraction.
|
|
334
|
+
*/
|
|
335
|
+
getRelativeX() {
|
|
336
|
+
return valueToFrac(Math.max(this.xMin, Math.min(this.xMax, this.x)), this.xMin, this.xMax, this.xScale);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Returns Y position as a 0–1 fraction.
|
|
340
|
+
*/
|
|
341
|
+
getRelativeY() {
|
|
342
|
+
return valueToFrac(Math.max(this.yMin, Math.min(this.yMax, this.y)), this.yMin, this.yMax, this.yScale);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Returns polar coordinates.
|
|
346
|
+
* - radius: 0–1 distance from center
|
|
347
|
+
* - angle: radians, 0 = right, clockwise (0 to 2π)
|
|
348
|
+
*/
|
|
349
|
+
getPolar() {
|
|
350
|
+
const xRel = this.getRelativeX() - .5;
|
|
351
|
+
const yRel = this.getRelativeY() - .5;
|
|
352
|
+
const radius = Math.sqrt(xRel * xRel + yRel * yRel) * 2;
|
|
353
|
+
let angle = Math.atan2(yRel, xRel);
|
|
354
|
+
if (angle < 0) angle += 2 * Math.PI;
|
|
355
|
+
return {
|
|
356
|
+
radius,
|
|
357
|
+
angle
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
updated(_changed) {
|
|
361
|
+
super.updated(_changed);
|
|
362
|
+
this._setPctVars();
|
|
363
|
+
}
|
|
364
|
+
disconnectedCallback() {
|
|
365
|
+
super.disconnectedCallback();
|
|
366
|
+
this._onPointerUp();
|
|
367
|
+
this._pressedKeys.clear();
|
|
368
|
+
}
|
|
369
|
+
render() {
|
|
370
|
+
return html`
|
|
371
|
+
<div class="xy-pad-area"
|
|
372
|
+
tabindex=${this.disabled ? -1 : 0}
|
|
373
|
+
@pointerdown=${this._onPointerDown}
|
|
374
|
+
@keydown=${this._onKeyDown}
|
|
375
|
+
@keyup=${this._onKeyUp}
|
|
376
|
+
@blur=${() => this._pressedKeys.clear()}>
|
|
377
|
+
${this.showGrid ? html`<div class="xy-pad-grid"></div>` : ``}
|
|
378
|
+
<div class="xy-pad-marker"></div>
|
|
379
|
+
<div class="xy-pad-label-x">${this.xLabel}</div>
|
|
380
|
+
<div class="xy-pad-label-y">${this.yLabel}</div>
|
|
381
|
+
</div>
|
|
382
|
+
`;
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
__decorate([property({ type: Number })], XyPad.prototype, "xMin", void 0);
|
|
386
|
+
__decorate([property({ type: Number })], XyPad.prototype, "xMax", void 0);
|
|
387
|
+
__decorate([property({ type: Number })], XyPad.prototype, "x", void 0);
|
|
388
|
+
__decorate([property({ type: Number })], XyPad.prototype, "yMin", void 0);
|
|
389
|
+
__decorate([property({ type: Number })], XyPad.prototype, "yMax", void 0);
|
|
390
|
+
__decorate([property({ type: Number })], XyPad.prototype, "y", void 0);
|
|
391
|
+
__decorate([property({ type: String })], XyPad.prototype, "xScale", void 0);
|
|
392
|
+
__decorate([property({ type: String })], XyPad.prototype, "yScale", void 0);
|
|
393
|
+
__decorate([property({
|
|
394
|
+
type: Number,
|
|
395
|
+
attribute: `x-snap-step`
|
|
396
|
+
})], XyPad.prototype, "xSnapStep", void 0);
|
|
397
|
+
__decorate([property({
|
|
398
|
+
type: Number,
|
|
399
|
+
attribute: `y-snap-step`
|
|
400
|
+
})], XyPad.prototype, "ySnapStep", void 0);
|
|
401
|
+
__decorate([property({ type: String })], XyPad.prototype, "xLabel", void 0);
|
|
402
|
+
__decorate([property({ type: String })], XyPad.prototype, "yLabel", void 0);
|
|
403
|
+
__decorate([property({
|
|
404
|
+
type: Boolean,
|
|
405
|
+
reflect: true,
|
|
406
|
+
attribute: `show-crosshairs`
|
|
407
|
+
})], XyPad.prototype, "showCrosshairs", void 0);
|
|
408
|
+
__decorate([property({
|
|
409
|
+
type: Boolean,
|
|
410
|
+
reflect: true,
|
|
411
|
+
attribute: `show-grid`
|
|
412
|
+
})], XyPad.prototype, "showGrid", void 0);
|
|
413
|
+
__decorate([property({
|
|
414
|
+
type: Boolean,
|
|
415
|
+
reflect: true,
|
|
416
|
+
attribute: `hide-cursor`
|
|
417
|
+
})], XyPad.prototype, "hideCursor", void 0);
|
|
418
|
+
__decorate([property({
|
|
419
|
+
type: Boolean,
|
|
420
|
+
reflect: true
|
|
421
|
+
})], XyPad.prototype, "disabled", void 0);
|
|
422
|
+
__decorate([property({ type: Number })], XyPad.prototype, "stops", void 0);
|
|
423
|
+
__decorate([property({
|
|
424
|
+
type: Number,
|
|
425
|
+
attribute: `stops-x`
|
|
426
|
+
})], XyPad.prototype, "stopsX", void 0);
|
|
427
|
+
__decorate([property({
|
|
428
|
+
type: Number,
|
|
429
|
+
attribute: `stops-y`
|
|
430
|
+
})], XyPad.prototype, "stopsY", void 0);
|
|
431
|
+
XyPad = __decorate([customElement(`ixfx-xy-pad`)], XyPad);
|
|
432
|
+
//#endregion
|
|
433
|
+
export { XyPad };
|
|
434
|
+
|
|
435
|
+
//# sourceMappingURL=xy-pad.js.map
|