@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.
Files changed (291) hide show
  1. package/LICENSE +1 -1
  2. package/bundle/chunk-pbuEa-1d.js +13 -0
  3. package/bundle/index.d.ts +4702 -569
  4. package/bundle/index.d.ts.map +1 -1
  5. package/bundle/index.js +34929 -2800
  6. package/bundle/index.js.map +1 -1
  7. package/bundle/style.css +133 -0
  8. package/dist/ac-text.d.ts +97 -0
  9. package/dist/ac-text.d.ts.map +1 -0
  10. package/dist/ac-text.js +484 -0
  11. package/dist/ac-text.js.map +1 -0
  12. package/dist/button-DgKUzE5o.js +121 -0
  13. package/dist/button-DgKUzE5o.js.map +1 -0
  14. package/dist/button.d.ts +21 -0
  15. package/dist/button.d.ts.map +1 -0
  16. package/dist/button.js +3 -0
  17. package/dist/checkbox.d.ts +34 -0
  18. package/dist/checkbox.d.ts.map +1 -0
  19. package/dist/checkbox.js +251 -0
  20. package/dist/checkbox.js.map +1 -0
  21. package/dist/chunk-pbuEa-1d.js +13 -0
  22. package/dist/colour-C3MQIjFJ-BJV-QC-3.js +4138 -0
  23. package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -0
  24. package/dist/colour-picker-Bw-AZoWx.js +922 -0
  25. package/dist/colour-picker-Bw-AZoWx.js.map +1 -0
  26. package/dist/colour-picker.d.ts +2 -0
  27. package/dist/colour-picker.js +2 -0
  28. package/dist/crumbs.d.ts +92 -0
  29. package/dist/crumbs.d.ts.map +1 -0
  30. package/dist/crumbs.js +789 -0
  31. package/dist/crumbs.js.map +1 -0
  32. package/dist/data-display.d.ts +24 -12
  33. package/dist/data-display.d.ts.map +1 -1
  34. package/dist/data-display.js +96 -105
  35. package/dist/data-display.js.map +1 -1
  36. package/dist/decorate-BZbkqIhA.js +9 -0
  37. package/dist/defaults-FEZaGiYZ.js +38 -0
  38. package/dist/defaults-FEZaGiYZ.js.map +1 -0
  39. package/dist/dist-By5URG0Y.js +1290 -0
  40. package/dist/dist-By5URG0Y.js.map +1 -0
  41. package/dist/dist-D7kJgnSE.js +1039 -0
  42. package/dist/dist-D7kJgnSE.js.map +1 -0
  43. package/dist/editable-label.d.ts +71 -0
  44. package/dist/editable-label.d.ts.map +1 -0
  45. package/dist/editable-label.js +279 -0
  46. package/dist/editable-label.js.map +1 -0
  47. package/dist/hex-editor-Gib1Grg2.d.ts +131 -0
  48. package/dist/hex-editor-Gib1Grg2.d.ts.map +1 -0
  49. package/dist/hex-editor-Wd6ZtZA2.js +1147 -0
  50. package/dist/hex-editor-Wd6ZtZA2.js.map +1 -0
  51. package/dist/hex.d.ts +2 -0
  52. package/dist/hex.js +2 -0
  53. package/dist/highlight-CAjwQ4GE.js +50 -0
  54. package/dist/highlight-CAjwQ4GE.js.map +1 -0
  55. package/dist/icon-BR5aTIiP.js +100 -0
  56. package/dist/icon-BR5aTIiP.js.map +1 -0
  57. package/dist/icon-DQKdfR7U.d.ts +36 -0
  58. package/dist/icon-DQKdfR7U.d.ts.map +1 -0
  59. package/dist/icons.d.ts +3 -0
  60. package/dist/icons.js +9 -0
  61. package/dist/icons.js.map +1 -0
  62. package/dist/incr-search-BjCNClnC.js +311 -0
  63. package/dist/incr-search-BjCNClnC.js.map +1 -0
  64. package/dist/incr-search.d.ts +2 -0
  65. package/dist/incr-search.js +3 -0
  66. package/dist/index-B1hNR7Z9.d.ts +36 -0
  67. package/dist/index-B1hNR7Z9.d.ts.map +1 -0
  68. package/dist/index-C5dK8RZa.d.ts +23 -0
  69. package/dist/index-C5dK8RZa.d.ts.map +1 -0
  70. package/dist/index-C9iBN908.d.ts +160 -0
  71. package/dist/index-C9iBN908.d.ts.map +1 -0
  72. package/dist/index-CPVcTTXo.d.ts +396 -0
  73. package/dist/index-CPVcTTXo.d.ts.map +1 -0
  74. package/dist/index-CQxanqXF.d.ts +183 -0
  75. package/dist/index-CQxanqXF.d.ts.map +1 -0
  76. package/dist/index-CpbBI3n7.d.ts +1239 -0
  77. package/dist/index-CpbBI3n7.d.ts.map +1 -0
  78. package/dist/index.d.ts +422 -13
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +5729 -14
  81. package/dist/index.js.map +1 -1
  82. package/dist/interaction-CQDQJf2Q.js +1 -0
  83. package/dist/keyboard-De_vOHLg.js +20 -0
  84. package/dist/keyboard-De_vOHLg.js.map +1 -0
  85. package/dist/labelled-input-base-DS6-6C0r.js +155 -0
  86. package/dist/labelled-input-base-DS6-6C0r.js.map +1 -0
  87. package/dist/labelled-input-base-DnRh4reU.d.ts +43 -0
  88. package/dist/labelled-input-base-DnRh4reU.d.ts.map +1 -0
  89. package/dist/labelled-radial-input.d.ts +34 -0
  90. package/dist/labelled-radial-input.d.ts.map +1 -0
  91. package/dist/labelled-radial-input.js +188 -0
  92. package/dist/labelled-radial-input.js.map +1 -0
  93. package/dist/labelled-range-input.d.ts +2 -0
  94. package/dist/labelled-range-input.js +132 -0
  95. package/dist/labelled-range-input.js.map +1 -0
  96. package/dist/led.d.ts +25 -0
  97. package/dist/led.d.ts.map +1 -0
  98. package/dist/led.js +92 -0
  99. package/dist/led.js.map +1 -0
  100. package/dist/menu-BV6UFx_z.js +813 -0
  101. package/dist/menu-BV6UFx_z.js.map +1 -0
  102. package/dist/menu-item-Cikacp4F.d.ts +128 -0
  103. package/dist/menu-item-Cikacp4F.d.ts.map +1 -0
  104. package/dist/menu-item-DEzL_Yjk.js +766 -0
  105. package/dist/menu-item-DEzL_Yjk.js.map +1 -0
  106. package/dist/menu.d.ts +3 -0
  107. package/dist/menu.js +3 -0
  108. package/dist/miller.d.ts +324 -0
  109. package/dist/miller.d.ts.map +1 -0
  110. package/dist/miller.js +1343 -0
  111. package/dist/miller.js.map +1 -0
  112. package/dist/narrowed-text.d.ts +72 -0
  113. package/dist/narrowed-text.d.ts.map +1 -0
  114. package/dist/narrowed-text.js +571 -0
  115. package/dist/narrowed-text.js.map +1 -0
  116. package/dist/panel.d.ts +43 -0
  117. package/dist/panel.d.ts.map +1 -0
  118. package/dist/panel.js +408 -0
  119. package/dist/panel.js.map +1 -0
  120. package/dist/plots.d.ts +2 -0
  121. package/dist/plots.js +2 -0
  122. package/dist/polar-pad.d.ts +67 -0
  123. package/dist/polar-pad.d.ts.map +1 -0
  124. package/dist/polar-pad.js +537 -0
  125. package/dist/polar-pad.js.map +1 -0
  126. package/dist/popup-Ddx9LCzY.js +24 -0
  127. package/dist/popup-Ddx9LCzY.js.map +1 -0
  128. package/dist/prominence-CreDBdCs.js +98 -0
  129. package/dist/prominence-CreDBdCs.js.map +1 -0
  130. package/dist/radial-input-CNJ8asY2.js +849 -0
  131. package/dist/radial-input-CNJ8asY2.js.map +1 -0
  132. package/dist/radial-input-xSTd4kEz.d.ts +70 -0
  133. package/dist/radial-input-xSTd4kEz.d.ts.map +1 -0
  134. package/dist/radial-input.d.ts +2 -0
  135. package/dist/radial-input.js +2 -0
  136. package/dist/range-input.d.ts +43 -0
  137. package/dist/range-input.d.ts.map +1 -0
  138. package/dist/range-input.js +459 -0
  139. package/dist/range-input.js.map +1 -0
  140. package/dist/range.d.ts +28 -0
  141. package/dist/range.d.ts.map +1 -0
  142. package/dist/range.js +136 -0
  143. package/dist/range.js.map +1 -0
  144. package/dist/registry-CZEB1YI9.js +21 -0
  145. package/dist/registry-CZEB1YI9.js.map +1 -0
  146. package/dist/selecthorizontal.d.ts +13 -8
  147. package/dist/selecthorizontal.d.ts.map +1 -1
  148. package/dist/selecthorizontal.js +21 -25
  149. package/dist/selecthorizontal.js.map +1 -1
  150. package/dist/snap-container.d.ts +50 -0
  151. package/dist/snap-container.d.ts.map +1 -0
  152. package/dist/snap-container.js +297 -0
  153. package/dist/snap-container.js.map +1 -0
  154. package/dist/split-layout.d.ts +56 -0
  155. package/dist/split-layout.d.ts.map +1 -0
  156. package/dist/split-layout.js +545 -0
  157. package/dist/split-layout.js.map +1 -0
  158. package/dist/style.css +133 -0
  159. package/dist/swipe.d.ts +48 -0
  160. package/dist/swipe.d.ts.map +1 -0
  161. package/dist/swipe.js +204 -0
  162. package/dist/swipe.js.map +1 -0
  163. package/dist/tab-list-CFF7uSYH.d.ts +66 -0
  164. package/dist/tab-list-CFF7uSYH.d.ts.map +1 -0
  165. package/dist/tabs.d.ts +2 -0
  166. package/dist/tabs.js +203 -0
  167. package/dist/tabs.js.map +1 -0
  168. package/dist/tickled-controller-Cq1Va0rR.d.ts +218 -0
  169. package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -0
  170. package/dist/tickled-styles-Bg3QbcrD.js +327 -0
  171. package/dist/tickled-styles-Bg3QbcrD.js.map +1 -0
  172. package/dist/timeline-DBWJsSjd.js +1748 -0
  173. package/dist/timeline-DBWJsSjd.js.map +1 -0
  174. package/dist/timeline.d.ts +2 -0
  175. package/dist/timeline.js +2 -0
  176. package/dist/tooltip-DMxmBNky.js +104 -0
  177. package/dist/tooltip-DMxmBNky.js.map +1 -0
  178. package/dist/tooltip-kfUBWYVB.d.ts +26 -0
  179. package/dist/tooltip-kfUBWYVB.d.ts.map +1 -0
  180. package/dist/tree-component-CQpoPo4s.d.ts +326 -0
  181. package/dist/tree-component-CQpoPo4s.d.ts.map +1 -0
  182. package/dist/tree-data-model-DGvRVOFY.js +190 -0
  183. package/dist/tree-data-model-DGvRVOFY.js.map +1 -0
  184. package/dist/tree.d.ts +100 -0
  185. package/dist/tree.d.ts.map +1 -0
  186. package/dist/tree.js +1144 -0
  187. package/dist/tree.js.map +1 -0
  188. package/dist/types-BKaqnpwx.d.ts +8 -0
  189. package/dist/types-BKaqnpwx.d.ts.map +1 -0
  190. package/dist/xy-axis-BANbgrI5.js +6243 -0
  191. package/dist/xy-axis-BANbgrI5.js.map +1 -0
  192. package/dist/xy-axis-CIFok7MF.d.ts +141 -0
  193. package/dist/xy-axis-CIFok7MF.d.ts.map +1 -0
  194. package/dist/xy-pad.d.ts +81 -0
  195. package/dist/xy-pad.d.ts.map +1 -0
  196. package/dist/xy-pad.js +435 -0
  197. package/dist/xy-pad.js.map +1 -0
  198. package/package.json +48 -39
  199. package/README.md +0 -14
  200. package/dist/charts/frequency-histogram-plot.d.ts +0 -33
  201. package/dist/charts/frequency-histogram-plot.d.ts.map +0 -1
  202. package/dist/charts/frequency-histogram-plot.js +0 -54
  203. package/dist/charts/frequency-histogram-plot.js.map +0 -1
  204. package/dist/charts/histogram-vis.d.ts +0 -57
  205. package/dist/charts/histogram-vis.d.ts.map +0 -1
  206. package/dist/charts/histogram-vis.js +0 -222
  207. package/dist/charts/histogram-vis.js.map +0 -1
  208. package/dist/charts/plot.d.ts +0 -199
  209. package/dist/charts/plot.d.ts.map +0 -1
  210. package/dist/charts/plot.js +0 -914
  211. package/dist/charts/plot.js.map +0 -1
  212. package/dist/crumb-nav.d.ts +0 -41
  213. package/dist/crumb-nav.d.ts.map +0 -1
  214. package/dist/crumb-nav.js +0 -198
  215. package/dist/crumb-nav.js.map +0 -1
  216. package/dist/crumb-navigation.d.ts +0 -30
  217. package/dist/crumb-navigation.d.ts.map +0 -1
  218. package/dist/crumb-navigation.js +0 -307
  219. package/dist/crumb-navigation.js.map +0 -1
  220. package/dist/dial.d.ts +0 -89
  221. package/dist/dial.d.ts.map +0 -1
  222. package/dist/dial.js +0 -506
  223. package/dist/dial.js.map +0 -1
  224. package/dist/my-element.d.ts +0 -14
  225. package/dist/my-element.d.ts.map +0 -1
  226. package/dist/my-element.js +0 -44
  227. package/dist/my-element.js.map +0 -1
  228. package/dist/split-layout/split-layout.d.ts +0 -35
  229. package/dist/split-layout/split-layout.d.ts.map +0 -1
  230. package/dist/split-layout/split-layout.js +0 -220
  231. package/dist/split-layout/split-layout.js.map +0 -1
  232. package/dist/svg-edit-label.d.ts +0 -2
  233. package/dist/svg-edit-label.d.ts.map +0 -1
  234. package/dist/svg-edit-label.js +0 -110
  235. package/dist/svg-edit-label.js.map +0 -1
  236. package/dist/tabs/tab-layout-item.d.ts +0 -10
  237. package/dist/tabs/tab-layout-item.d.ts.map +0 -1
  238. package/dist/tabs/tab-layout-item.js +0 -20
  239. package/dist/tabs/tab-layout-item.js.map +0 -1
  240. package/dist/tabs/tab-layout.d.ts +0 -10
  241. package/dist/tabs/tab-layout.d.ts.map +0 -1
  242. package/dist/tabs/tab-layout.js +0 -25
  243. package/dist/tabs/tab-layout.js.map +0 -1
  244. package/dist/tabs/tab-list-item.d.ts +0 -18
  245. package/dist/tabs/tab-list-item.d.ts.map +0 -1
  246. package/dist/tabs/tab-list-item.js +0 -63
  247. package/dist/tabs/tab-list-item.js.map +0 -1
  248. package/dist/tabs/tab-list.d.ts +0 -21
  249. package/dist/tabs/tab-list.d.ts.map +0 -1
  250. package/dist/tabs/tab-list.js +0 -148
  251. package/dist/tabs/tab-list.js.map +0 -1
  252. package/dist/tabs/tab-panel.d.ts +0 -11
  253. package/dist/tabs/tab-panel.d.ts.map +0 -1
  254. package/dist/tabs/tab-panel.js +0 -30
  255. package/dist/tabs/tab-panel.js.map +0 -1
  256. package/dist/tabs/tab-panels.d.ts +0 -30
  257. package/dist/tabs/tab-panels.d.ts.map +0 -1
  258. package/dist/tabs/tab-panels.js +0 -80
  259. package/dist/tabs/tab-panels.js.map +0 -1
  260. package/dist/util/circle-arc.d.ts +0 -34
  261. package/dist/util/circle-arc.d.ts.map +0 -1
  262. package/dist/util/circle-arc.js +0 -77
  263. package/dist/util/circle-arc.js.map +0 -1
  264. package/dist/util/compare.d.ts +0 -53
  265. package/dist/util/compare.d.ts.map +0 -1
  266. package/dist/util/compare.js +0 -91
  267. package/dist/util/compare.js.map +0 -1
  268. package/dist/util/content-editable.d.ts +0 -2
  269. package/dist/util/content-editable.d.ts.map +0 -1
  270. package/dist/util/content-editable.js +0 -13
  271. package/dist/util/content-editable.js.map +0 -1
  272. package/dist/util/drag-controller.d.ts +0 -13
  273. package/dist/util/drag-controller.d.ts.map +0 -1
  274. package/dist/util/drag-controller.js +0 -21
  275. package/dist/util/drag-controller.js.map +0 -1
  276. package/dist/util/key-value.d.ts +0 -5
  277. package/dist/util/key-value.d.ts.map +0 -1
  278. package/dist/util/key-value.js +0 -30
  279. package/dist/util/key-value.js.map +0 -1
  280. package/dist/util/primitive-types.d.ts +0 -6
  281. package/dist/util/primitive-types.d.ts.map +0 -1
  282. package/dist/util/primitive-types.js +0 -2
  283. package/dist/util/primitive-types.js.map +0 -1
  284. package/dist/util/svg-editable-text.d.ts +0 -22
  285. package/dist/util/svg-editable-text.d.ts.map +0 -1
  286. package/dist/util/svg-editable-text.js +0 -121
  287. package/dist/util/svg-editable-text.js.map +0 -1
  288. package/dist/util/time.d.ts +0 -2
  289. package/dist/util/time.d.ts.map +0 -1
  290. package/dist/util/time.js +0 -2
  291. 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"}
@@ -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