@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 @@
1
+ {"version":3,"file":"xy-pad.js","names":[],"sources":["../src/xy-pad.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\n/**\n * <x-xy-pad> — 2D touch-friendly XY pad for controlling two parameters.\n *\n * Generic pad that accepts min/max/value for both axes with configurable labels.\n * Each axis can independently use logarithmic or linear scaling.\n * Y axis is inverted (top = high value).\n *\n * Properties\n * xMin, xMax, x – horizontal range and current value\n * yMin, yMax, y – vertical range and current value\n * xScale, yScale – 'log' (default) or 'linear'\n * xSnapStep, ySnapStep – snap granularity for pointer and keyboard moves (defaults: 1 / 0.01)\n * xLabel, yLabel – axis labels (displayed in corners)\n * showCrosshairs – show X/Y axis lines (default: false)\n * showGrid – show background grid (default: false)\n *\n * CSS variables:\n * --marker-size – size of the position marker (default: 10cqb)\n * --crosshair-color – colour of both crosshair lines (default: surface-hh)\n * --crosshair-width – thickness of both crosshair lines (default: 2px)\n * --crosshair-x-color – colour of the vertical (X) crosshair line; falls back to --crosshair-color\n * --crosshair-x-width – thickness of the vertical (X) crosshair line; falls back to --crosshair-width\n * --crosshair-y-color – colour of the horizontal (Y) crosshair line; falls back to --crosshair-color\n * --crosshair-y-width – thickness of the horizontal (Y) crosshair line; falls back to --crosshair-width\n * --grid-color – colour of grid lines (default: surface-hh)\n * --grid-width – thickness of grid lines (default: 1px)\n * --x-pct – current X position as unitless number (0–100), set on host so external styles can use it\n * --y-pct – current Y position as unitless number (0–100), set on host so external styles can use it\n * --radius-pct – distance from center as unitless number (0–100), set on host so external styles can use it\n * hide-cursor – boolean, hide cursor during drag and hover (default: false)\n *\n * Events\n * input – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires continuously during drag\n * change – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires when drag ends\n *\n * Methods\n * getRelativeX() – returns X position as 0–1 fraction\n * getRelativeY() – returns Y position as 0–1 fraction\n * getPolar() – returns { radius: number, angle: number } where radius is 0–1 and angle is in radians (0 to 2π, 0 = right, clockwise)\n */\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, resolveStep } from './keyboard.js';\nimport { prominenceStyles } from './styles/prominence.js';\n\n// ---------------------------------------------------------------------------\n// Scale helpers — log or linear, selected per-axis\n// ---------------------------------------------------------------------------\n\nfunction valueToFrac(value: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return (value - min) / (max - min);\n return Math.log(value / min) / Math.log(max / min);\n}\n\nfunction fracToValue(frac: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return min + frac * (max - min);\n return min * (max / min) ** frac;\n}\n\nfunction quantise(value: number, min: number, max: number, stops?: number): number {\n if (!stops || stops <= 1)\n return value;\n const range = max - min;\n const step = range / stops;\n return Math.round((value - min) / step) * step + min;\n}\n\n@customElement(`ixfx-xy-pad`)\nexport class XyPad extends LitElement {\n static override styles = [prominenceStyles, css`\n :host {\n display: block;\n width: 200px;\n height: 200px;\n touch-action: none;\n user-select: none;\n container-type: size;\n --marker-size: 10cqb;\n --crosshair-color: var(--surface-6);\n --crosshair-width: 2px;\n --crosshair-x-color: var(--crosshair-color);\n --crosshair-x-width: var(--crosshair-width);\n --crosshair-y-color: var(--crosshair-color);\n --crosshair-y-width: var(--crosshair-width);\n --grid-color: var(--surface-6);\n --grid-width: 1px;\n --_space-s: var(--space-s, 4px);\n --_space-m: var(--space-m, 8px);\n }\n .xy-pad-area {\n position: relative;\n width: 100%;\n height: 100%;\n background: var(--xy-pad-bg, var(--surface-3));\n border: var(--border);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-shadow: var(--deboss-3);\n cursor: var(--cursor-display, crosshair);\n }\n :host([dragging]) .xy-pad-area {\n cursor: none;\n }\n\n .xy-pad-area:focus {\n outline: none;\n }\n\n .xy-pad-area:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n .xy-pad-area::before,\n .xy-pad-area::after {\n content: '';\n position: absolute;\n pointer-events: none;\n opacity: var(--show-crosshairs, 0);\n }\n :host([show-crosshairs]) {\n --show-crosshairs: 1;\n }\n .xy-pad-area::before {\n left: 0;\n right: 0;\n top: calc(100% - var(--y-pct, 50) * 1%);\n height: var(--crosshair-y-width);\n background: var(--crosshair-y-color);\n }\n .xy-pad-area::after {\n top: 0;\n bottom: 0;\n left: calc(var(--x-pct, 50) * 1%);\n width: var(--crosshair-x-width);\n background: var(--crosshair-x-color);\n }\n\n .xy-pad-grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(to right, var(--grid-color) var(--grid-width), transparent var(--grid-width)),\n linear-gradient(to bottom, var(--grid-color) var(--grid-width), transparent var(--grid-width));\n background-size: 10cqb 10cqb;\n pointer-events: none;\n opacity: var(--show-grid, 0);\n }\n :host([show-grid]) {\n --show-grid: 1;\n }\n \n .xy-pad-marker {\n position: absolute;\n width: var(--marker-size, 10cqb);\n height: var(--marker-size, 10cqb);\n border-radius: 50%;\n background: var(--surface-2-accent, var(--accent));\n top: calc(100% - var(--y-pct, 50) * 1%);\n left: calc(var(--x-pct, 50) * 1%);\n transform: translate(-50%, -50%);\n pointer-events: none;\n z-index: 2;\n }\n .xy-pad-label-x {\n position: absolute;\n bottom: var(--_space-s);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n width: 100%;\n text-align: center;\n }\n .xy-pad-label-y {\n position: absolute;\n top: var(--_space-s);\n left: var(--_space-m);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n writing-mode: sideways-lr;\n height:100%;\n text-align:center;\n }\n `];\n\n @property({ type: Number }) xMin = 1;\n @property({ type: Number }) xMax = 100;\n @property({ type: Number }) x = 50;\n\n @property({ type: Number }) yMin = 1;\n @property({ type: Number }) yMax = 100;\n @property({ type: Number }) y = 50;\n\n @property({ type: String }) xScale = `linear`;\n @property({ type: String }) yScale = `linear`;\n @property({ type: Number, attribute: `x-snap-step` }) xSnapStep?: number;\n @property({ type: Number, attribute: `y-snap-step` }) ySnapStep?: number;\n\n @property({ type: String }) xLabel = `X`;\n @property({ type: String }) yLabel = `Y`;\n\n @property({ type: Boolean, reflect: true, attribute: `show-crosshairs` }) showCrosshairs = false;\n @property({ type: Boolean, reflect: true, attribute: `show-grid` }) showGrid = false;\n @property({ type: Boolean, reflect: true, attribute: `hide-cursor` }) hideCursor = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Number of quantised stops for both axes. Overridden by stops-x/stops-y if set. */\n @property({ type: Number }) stops?: number;\n\n /** Number of quantised stops for X axis. If set, overrides the stops setting for X. */\n @property({ type: Number, attribute: `stops-x` }) stopsX?: number;\n\n /** Number of quantised stops for Y axis. If set, overrides the stops setting for Y. */\n @property({ type: Number, attribute: `stops-y` }) stopsY?: number;\n\n private _dragging = false;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _pressedKeys = new Set<string>();\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled)\n return;\n if ([`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key)) {\n e.preventDefault();\n this._pressedKeys.add(e.key);\n this._handleKeyboardMove(e.shiftKey);\n } else if (e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n const newX = e.key === `Home` ? this.xMin : this.xMax;\n const newY = e.key === `Home` ? this.yMin : this.yMax;\n if (newX !== this.x || newY !== this.y) {\n this.x = newX;\n this.y = newY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n this._pressedKeys.delete(e.key);\n };\n\n private _handleKeyboardMove = (shiftKey: boolean): void => {\n const shiftDivisor = shiftKey ? KEY_STEP_DIVISOR : 1;\n const xRange = this.xMax - this.xMin;\n const yRange = this.yMax - this.yMin;\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n const xStep = resolveStep(xRange, effectiveStopsX, undefined) / shiftDivisor;\n const yStep = resolveStep(yRange, effectiveStopsY, undefined) / shiftDivisor;\n\n let newX = this.x;\n let newY = this.y;\n\n if (this._pressedKeys.has(`ArrowLeft`)) {\n newX = Math.max(this.xMin, this.x - xStep);\n }\n if (this._pressedKeys.has(`ArrowRight`)) {\n newX = Math.min(this.xMax, this.x + xStep);\n }\n if (this._pressedKeys.has(`ArrowUp`)) {\n newY = Math.min(this.yMax, this.y + yStep);\n }\n if (this._pressedKeys.has(`ArrowDown`)) {\n newY = Math.max(this.yMin, this.y - yStep);\n }\n\n if (newX !== this.x || newY !== this.y) {\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n const pad = this.renderRoot.querySelector(`.xy-pad-area`) as HTMLElement | undefined;\n pad?.focus();\n if (pad)\n pad.setPointerCapture(e.pointerId);\n this._dragging = true;\n this._dragStartX = this.x;\n this._dragStartY = this.y;\n this.setAttribute(`dragging`, ``);\n this._updateFromPointer(e);\n globalThis.addEventListener(`pointermove`, this._onPointerMove);\n globalThis.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n e.preventDefault();\n this._updateFromPointer(e);\n };\n\n private _onPointerUp = (): void => {\n const hasChanged = this.x !== this._dragStartX || this.y !== this._dragStartY;\n this._dragging = false;\n this.removeAttribute(`dragging`);\n globalThis.removeEventListener(`pointermove`, this._onPointerMove);\n globalThis.removeEventListener(`pointerup`, this._onPointerUp);\n if (hasChanged) {\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`change`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _updateFromPointer(e: PointerEvent): void {\n const pad = this.renderRoot.querySelector(`.xy-pad-area`);\n if (!pad)\n return;\n\n const rect = pad.getBoundingClientRect();\n const xFrac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const yFrac = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height));\n\n const newX = fracToValue(xFrac, this.xMin, this.xMax, this.xScale);\n const newY = fracToValue(yFrac, this.yMin, this.yMax, this.yScale);\n\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _setPctVars(): void {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n const xPct = valueToFrac(cx, this.xMin, this.xMax, this.xScale) * 100;\n const yPct = valueToFrac(cy, this.yMin, this.yMax, this.yScale) * 100;\n this.style.setProperty(`--x-pct`, `${xPct}`);\n this.style.setProperty(`--y-pct`, `${yPct}`);\n\n // Calculate radius from center (50, 50) - distance as 0-100\n const dx = xPct - 50;\n const dy = yPct - 50;\n const radiusPct = Math.sqrt(dx * dx + dy * dy);\n this.style.setProperty(`--radius-pct`, `${radiusPct}`);\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns X position as a 0–1 fraction.\n */\n getRelativeX(): number {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n return valueToFrac(cx, this.xMin, this.xMax, this.xScale);\n }\n\n /**\n * Returns Y position as a 0–1 fraction.\n */\n getRelativeY(): number {\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n return valueToFrac(cy, this.yMin, this.yMax, this.yScale);\n }\n\n /**\n * Returns polar coordinates.\n * - radius: 0–1 distance from center\n * - angle: radians, 0 = right, clockwise (0 to 2π)\n */\n getPolar(): { radius: number; angle: number } {\n const xRel = this.getRelativeX() - 0.5; // -0.5 to 0.5\n const yRel = this.getRelativeY() - 0.5; // -0.5 to 0.5\n const radius = Math.sqrt(xRel * xRel + yRel * yRel) * 2; // 0 to 1\n let angle = Math.atan2(yRel, xRel); // -π to π\n if (angle < 0)\n angle += 2 * Math.PI; // 0 to 2π\n return { radius, angle };\n }\n\n override updated(_changed: PropertyValues): void {\n super.updated(_changed);\n this._setPctVars();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._onPointerUp();\n this._pressedKeys.clear();\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div class=\"xy-pad-area\"\n tabindex=${this.disabled ? -1 : 0}\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n @keyup=${this._onKeyUp}\n @blur=${() => this._pressedKeys.clear()}>\n ${this.showGrid ? html`<div class=\"xy-pad-grid\"></div>` : ``}\n <div class=\"xy-pad-marker\"></div>\n <div class=\"xy-pad-label-x\">${this.xLabel}</div>\n <div class=\"xy-pad-label-y\">${this.yLabel}</div>\n </div>\n `;\n }\n}\n\nexport type XyPadInputDetail = {\n readonly x: number;\n readonly y: number;\n};\n\nexport type XyPadInputEvent = CustomEvent<XyPadInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-xy-pad': XyPad;\n }\n}\n\nexport interface XyPadEventMap {\n input: XyPadInputEvent;\n change: XyPadInputEvent;\n}\n\nexport interface XyPad {\n addEventListener: (<K extends keyof XyPadEventMap>(\n type: K,\n listener: (this: XyPad, event: XyPadEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAS,YAAY,OAAe,KAAa,KAAa,OAAuB;AACnF,KAAI,UAAU,SACZ,SAAQ,QAAQ,QAAQ,MAAM;AAChC,QAAO,KAAK,IAAI,QAAQ,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI;;AAGpD,SAAS,YAAY,MAAc,KAAa,KAAa,OAAuB;AAClF,KAAI,UAAU,SACZ,QAAO,MAAM,QAAQ,MAAM;AAC7B,QAAO,OAAO,MAAM,QAAQ;;AAG9B,SAAS,SAAS,OAAe,KAAa,KAAa,OAAwB;AACjF,KAAI,CAAC,SAAS,SAAS,EACrB,QAAO;CAET,MAAM,QADQ,MAAM,OACC;AACrB,QAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG,OAAO;;AAI5C,IAAA,QAAA,MAAM,cAAc,WAAW;;;cAqHD;cACA;WACH;cAEG;cACA;WACH;gBAEK;gBACA;gBAIA;gBACA;wBAEsD;kBACZ;oBACI;kBAC5B;mBAWnC;qBACE;qBACA;sCACC,IAAI,KAAa;qBAElB,MAA2B;AAC/C,OAAI,KAAK,SACP;AACF,OAAI;IAAC;IAAa;IAAc;IAAW;IAAY,CAAC,SAAS,EAAE,IAAI,EAAE;AACvE,MAAE,gBAAgB;AAClB,SAAK,aAAa,IAAI,EAAE,IAAI;AAC5B,SAAK,oBAAoB,EAAE,SAAS;cAC3B,EAAE,QAAQ,UAAU,EAAE,QAAQ,OAAO;AAC9C,MAAE,gBAAgB;IAClB,MAAM,OAAO,EAAE,QAAQ,SAAS,KAAK,OAAO,KAAK;IACjD,MAAM,OAAO,EAAE,QAAQ,SAAS,KAAK,OAAO,KAAK;AACjD,QAAI,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;AACtC,UAAK,IAAI;AACT,UAAK,IAAI;AACT,UAAK,cAAc,IAAI,YAA8B,SAAS;MAC5D,QAAQ;OAAE,GAAG,KAAK;OAAG,GAAG,KAAK;OAAG;MAChC,SAAS;MACT,UAAU;MACX,CAAC,CAAC;;;;mBAKW,MAA2B;AAC7C,QAAK,aAAa,OAAO,EAAE,IAAI;;8BAGF,aAA4B;GACzD,MAAM,eAAe,WAAA,KAA8B;GACnD,MAAM,SAAS,KAAK,OAAO,KAAK;GAChC,MAAM,SAAS,KAAK,OAAO,KAAK;GAChC,MAAM,kBAAkB,KAAK,UAAU,KAAK;GAC5C,MAAM,kBAAkB,KAAK,UAAU,KAAK;GAE5C,MAAM,QAAQ,YAAY,QAAQ,iBAAiB,KAAA,EAAU,GAAG;GAChE,MAAM,QAAQ,YAAY,QAAQ,iBAAiB,KAAA,EAAU,GAAG;GAEhE,IAAI,OAAO,KAAK;GAChB,IAAI,OAAO,KAAK;AAEhB,OAAI,KAAK,aAAa,IAAI,YAAY,CACpC,QAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM;AAE5C,OAAI,KAAK,aAAa,IAAI,aAAa,CACrC,QAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM;AAE5C,OAAI,KAAK,aAAa,IAAI,UAAU,CAClC,QAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM;AAE5C,OAAI,KAAK,aAAa,IAAI,YAAY,CACpC,QAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM;AAG5C,OAAI,SAAS,KAAK,KAAK,SAAS,KAAK,GAAG;IACtC,IAAI,SAAU,KAAK,aAAa,KAAK,YAAY,IAAK,KAAK,MAAM,OAAO,KAAK,UAAU,GAAG,KAAK,YAAY;IAC3G,IAAI,SAAU,KAAK,aAAa,KAAK,YAAY,IAAK,KAAK,MAAM,OAAO,KAAK,UAAU,GAAG,KAAK,YAAY;AAE3G,aAAS,SAAS,QAAQ,KAAK,MAAM,KAAK,MAAM,gBAAgB;AAChE,aAAS,SAAS,QAAQ,KAAK,MAAM,KAAK,MAAM,gBAAgB;AAEhE,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,cAAc,IAAI,YAA8B,SAAS;KAC5D,QAAQ;MAAE,GAAG,KAAK;MAAG,GAAG,KAAK;MAAG;KAChC,SAAS;KACT,UAAU;KACX,CAAC,CAAC;;;yBAImB,MAA0B;AAClD,KAAE,gBAAgB;GAClB,MAAM,MAAM,KAAK,WAAW,cAAc,eAAe;AACzD,QAAK,OAAO;AACZ,OAAI,IACF,KAAI,kBAAkB,EAAE,UAAU;AACpC,QAAK,YAAY;AACjB,QAAK,cAAc,KAAK;AACxB,QAAK,cAAc,KAAK;AACxB,QAAK,aAAa,YAAY,GAAG;AACjC,QAAK,mBAAmB,EAAE;AAC1B,cAAW,iBAAiB,eAAe,KAAK,eAAe;AAC/D,cAAW,iBAAiB,aAAa,KAAK,aAAa;;yBAGnC,MAA0B;AAClD,OAAI,CAAC,KAAK,UACR;AACF,KAAE,gBAAgB;AAClB,QAAK,mBAAmB,EAAE;;4BAGO;GACjC,MAAM,aAAa,KAAK,MAAM,KAAK,eAAe,KAAK,MAAM,KAAK;AAClE,QAAK,YAAY;AACjB,QAAK,gBAAgB,WAAW;AAChC,cAAW,oBAAoB,eAAe,KAAK,eAAe;AAClE,cAAW,oBAAoB,aAAa,KAAK,aAAa;AAC9D,OAAI,WACF,MAAK,cAAc,IAAI,YAA8B,UAAU;IAC7D,QAAQ;KAAE,GAAG,KAAK;KAAG,GAAG,KAAK;KAAG;IAChC,SAAS;IACT,UAAU;IACX,CAAC,CAAC;;;;gBA9PkB,CAAC,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkH7C;;CAgJF,mBAA2B,GAAuB;EAChD,MAAM,MAAM,KAAK,WAAW,cAAc,eAAe;AACzD,MAAI,CAAC,IACH;EAEF,MAAM,OAAO,IAAI,uBAAuB;EACxC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,KAAK,QAAQ,KAAK,MAAM,CAAC;EAC5E,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,EAAE,UAAU,KAAK,OAAO,KAAK,OAAO,CAAC;EAEhF,MAAM,OAAO,YAAY,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;EAClE,MAAM,OAAO,YAAY,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;EAElE,IAAI,SAAU,KAAK,aAAa,KAAK,YAAY,IAAK,KAAK,MAAM,OAAO,KAAK,UAAU,GAAG,KAAK,YAAY;EAC3G,IAAI,SAAU,KAAK,aAAa,KAAK,YAAY,IAAK,KAAK,MAAM,OAAO,KAAK,UAAU,GAAG,KAAK,YAAY;EAE3G,MAAM,kBAAkB,KAAK,UAAU,KAAK;EAC5C,MAAM,kBAAkB,KAAK,UAAU,KAAK;AAE5C,WAAS,SAAS,QAAQ,KAAK,MAAM,KAAK,MAAM,gBAAgB;AAChE,WAAS,SAAS,QAAQ,KAAK,MAAM,KAAK,MAAM,gBAAgB;AAEhE,OAAK,IAAI;AACT,OAAK,IAAI;AAET,OAAK,cAAc,IAAI,YAA8B,SAAS;GAC5D,QAAQ;IAAE,GAAG,KAAK;IAAG,GAAG,KAAK;IAAG;GAChC,SAAS;GACT,UAAU;GACX,CAAC,CAAC;;CAGL,cAA4B;EAC1B,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,EAAE,CAAC;EAC3D,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,EAAE,CAAC;EAC3D,MAAM,OAAO,YAAY,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG;EAClE,MAAM,OAAO,YAAY,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG;AAClE,OAAK,MAAM,YAAY,WAAW,GAAG,OAAO;AAC5C,OAAK,MAAM,YAAY,WAAW,GAAG,OAAO;EAG5C,MAAM,KAAK,OAAO;EAClB,MAAM,KAAK,OAAO;EAClB,MAAM,YAAY,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC9C,OAAK,MAAM,YAAY,gBAAgB,GAAG,YAAY;;;;;CAQxD,eAAuB;AAErB,SAAO,YADI,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,EAAE,CACrC,EAAE,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;;;;;CAM3D,eAAuB;AAErB,SAAO,YADI,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,EAAE,CACrC,EAAE,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;;;;;;;CAQ3D,WAA8C;EAC5C,MAAM,OAAO,KAAK,cAAc,GAAG;EACnC,MAAM,OAAO,KAAK,cAAc,GAAG;EACnC,MAAM,SAAS,KAAK,KAAK,OAAO,OAAO,OAAO,KAAK,GAAG;EACtD,IAAI,QAAQ,KAAK,MAAM,MAAM,KAAK;AAClC,MAAI,QAAQ,EACV,UAAS,IAAI,KAAK;AACpB,SAAO;GAAE;GAAQ;GAAO;;CAG1B,QAAiB,UAAgC;AAC/C,QAAM,QAAQ,SAAS;AACvB,OAAK,aAAa;;CAGpB,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,OAAK,cAAc;AACnB,OAAK,aAAa,OAAO;;CAG3B,SAA2C;AACzC,SAAO,IAAI;;sBAEO,KAAK,WAAW,KAAK,EAAE;0BACnB,KAAK,eAAe;sBACxB,KAAK,WAAW;oBAClB,KAAK,SAAS;yBACT,KAAK,aAAa,OAAO,CAAC;UACzC,KAAK,WAAW,IAAI,oCAAoC,GAAG;;sCAE/B,KAAK,OAAO;sCACZ,KAAK,OAAO;;;;;YAnP/C,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,QAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,QAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,KAAA,KAAA,EAAA;YAE1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,QAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,QAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,KAAA,KAAA,EAAA;YAE1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;YAC1B,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,MAAA,WAAA,aAAA,KAAA,EAAA;YACpD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,MAAA,WAAA,aAAA,KAAA,EAAA;YAEpD,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;YAC1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;YAE1B,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAmB,CAAC,CAAA,EAAA,MAAA,WAAA,kBAAA,KAAA,EAAA;YACxE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAa,CAAC,CAAA,EAAA,MAAA,WAAA,YAAA,KAAA,EAAA;YAClE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAe,CAAC,CAAA,EAAA,MAAA,WAAA,cAAA,KAAA,EAAA;YACpE,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,MAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,MAAA,WAAA,SAAA,KAAA,EAAA;YAG1B,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;YAGhD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,CAAC,CAAA,EAAA,MAAA,WAAA,UAAA,KAAA,EAAA;oBAlJlD,cAAc,cAAc,CAAA,EAAA,MAAA"}
package/package.json CHANGED
@@ -1,57 +1,66 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
- "version": "0.2.3",
4
- "description": "",
5
- "scripts": {
6
- "lint": "tsc",
7
- "dev": "vite --port=5174",
8
- "build": "tsc",
9
- "rebuild": "rm -rf dist && npm run build",
10
- "bundle": "tsdown",
11
- "build-test": "tsc && vite build",
12
- "publish-prepare": "npm run rebuild && npm run bundle",
13
- "preview": "vite preview",
14
- "knip": "knip --config ./config/knip.json"
15
- },
16
3
  "type": "module",
17
- "main": "dist/index.js",
4
+ "version": "0.2.5",
5
+ "description": "",
6
+ "author": "",
7
+ "license": "ISC",
8
+ "keywords": [],
18
9
  "exports": {
19
10
  ".": {
20
11
  "types": "./dist/index.d.ts",
21
12
  "import": "./dist/index.js"
22
13
  },
23
- "./charts/*": {
24
- "types": "./dist/charts/*.d.ts",
25
- "import": "./dist/charts/*.js"
26
- },
27
- "./chart/plot": {
28
- "types": "./dist/charts/plot.d.ts",
29
- "import": "./dist/charts/plot.js"
30
- },
31
- "./bundle.js": {
14
+ "./bundle": {
32
15
  "types": "./bundle/index.d.ts",
33
16
  "import": "./bundle/index.js"
17
+ },
18
+ "./*": {
19
+ "types": "./dist/*.d.ts",
20
+ "import": "./dist/*.js"
34
21
  }
35
22
  },
23
+ "main": "dist/index.js",
36
24
  "files": [
37
- "dist",
38
- "bundle"
25
+ "bundle",
26
+ "dist"
39
27
  ],
40
- "keywords": [],
41
- "author": "",
42
- "license": "ISC",
28
+ "scripts": {
29
+ "typecheck": "tsc --noEmit",
30
+ "start": "vite serve",
31
+ "lint": "eslint",
32
+ "lint:fix": "eslint --fix",
33
+ "build": "tsdown",
34
+ "rebuild": "rm -rf dist bundle && npm run build",
35
+ "publish-prepare": "npm run rebuild",
36
+ "preview": "vite preview",
37
+ "knip": "knip --config ./config/knip.json"
38
+ },
43
39
  "dependencies": {
44
- "lit": "3.3.1",
45
- "tsdown": "0.13.2"
40
+ "@clinth/ui-commands": "1.0.3",
41
+ "@clinth/vcanvas": "0.0.3",
42
+ "fzf": "0.5.2",
43
+ "lit": "3.3.2"
46
44
  },
47
45
  "devDependencies": {
48
- "@eslint/js": "9.32.0",
49
- "eslint": "9.32.0",
50
- "globals": "16.3.0",
51
- "ixfx": "1.7.0",
52
- "knip": "5.62.0",
53
- "typescript": "5.9.2",
54
- "typescript-eslint": "8.38.0",
55
- "vite": "5.4.6"
46
+ "@antfu/eslint-config": "^8.2.0",
47
+ "@ixfx/arrays": "0.56.12",
48
+ "@ixfx/collections": "0.56.12",
49
+ "@ixfx/core": "0.56.12",
50
+ "@ixfx/dom": "0.56.12",
51
+ "@ixfx/flow": "0.56.12",
52
+ "@ixfx/geometry": "0.56.12",
53
+ "@ixfx/modulation": "0.56.12",
54
+ "@ixfx/numbers": "0.56.12",
55
+ "@ixfx/visual": "0.56.12",
56
+ "@tsdown/css": "0.21.10",
57
+ "eslint": "10.3.0",
58
+ "eslint-plugin-format": "2.0.1",
59
+ "globals": "17.6.0",
60
+ "knip": "6.12.0",
61
+ "tsdown": "0.21.10",
62
+ "typescript": "6.0.3",
63
+ "typescript-eslint": "8.59.2",
64
+ "vite": "8.0.10"
56
65
  }
57
- }
66
+ }
package/README.md DELETED
@@ -1,14 +0,0 @@
1
- # components
2
-
3
- ## Importing Lit
4
-
5
- ```html
6
- <script type="importmap">
7
- {
8
- "imports": {
9
- "lit":"https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js",
10
- "lit/decorators.js":"https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js"
11
- }
12
- }
13
- </script>
14
- ```
@@ -1,33 +0,0 @@
1
- import type { HistogramVis } from "./histogram-vis.js";
2
- /**
3
- * Creates and drives a HistogramVis instance.
4
- * Data should be an outer array containing two-element arrays for each
5
- * data point. The first element of the inner array is expected to be the key, the second the frequency.
6
- * For example, `[`apples`, 2]` means the key `apples` was counted twice.
7
- *
8
- * Usage:
9
- * .sortBy() automatically sorts prior to visualisation. By default off.
10
- * .update(data) full set of data to plot
11
- * .clear() empties plot - same as calling `update([])`
12
- * .el - The `HistogramVis` instance, or undefined if not created/disposed
13
- *
14
- * ```
15
- * const plot = new FrequencyHistogramPlot(document.getElementById('histogram'));
16
- * plot.sortBy('key'); // Automatically sort by key
17
- * ...
18
- * plot.update([[`apples`, 2], [`oranges', 0], [`bananas`, 5]])
19
- * ```
20
- *
21
- * @export
22
- * @class FrequencyHistogramPlot
23
- */
24
- export declare class FrequencyHistogramPlot {
25
- #private;
26
- readonly el: HistogramVis | undefined;
27
- constructor(el: HistogramVis);
28
- setAutoSort(sortStyle: `value` | `value-reverse` | `key` | `key-reverse`): void;
29
- clear(): void;
30
- dispose(): void;
31
- update(data: readonly (readonly [key: string, count: number])[]): void;
32
- }
33
- //# sourceMappingURL=frequency-histogram-plot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"frequency-histogram-plot.d.ts","sourceRoot":"","sources":["../../src/charts/frequency-histogram-plot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,sBAAsB;;IAClC,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,SAAS,CAAC;gBAE1B,EAAE,EAAE,YAAY;IAI5B,WAAW,CACV,SAAS,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,aAAa,GAC1D,IAAI;IAIP,KAAK;IAKL,OAAO;IAMP,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;CAW/D"}
@@ -1,54 +0,0 @@
1
- import { getSorter } from "../util/key-value.js";
2
- /**
3
- * Creates and drives a HistogramVis instance.
4
- * Data should be an outer array containing two-element arrays for each
5
- * data point. The first element of the inner array is expected to be the key, the second the frequency.
6
- * For example, `[`apples`, 2]` means the key `apples` was counted twice.
7
- *
8
- * Usage:
9
- * .sortBy() automatically sorts prior to visualisation. By default off.
10
- * .update(data) full set of data to plot
11
- * .clear() empties plot - same as calling `update([])`
12
- * .el - The `HistogramVis` instance, or undefined if not created/disposed
13
- *
14
- * ```
15
- * const plot = new FrequencyHistogramPlot(document.getElementById('histogram'));
16
- * plot.sortBy('key'); // Automatically sort by key
17
- * ...
18
- * plot.update([[`apples`, 2], [`oranges', 0], [`bananas`, 5]])
19
- * ```
20
- *
21
- * @export
22
- * @class FrequencyHistogramPlot
23
- */
24
- export class FrequencyHistogramPlot {
25
- #sorter;
26
- constructor(el) {
27
- this.el = el;
28
- }
29
- setAutoSort(sortStyle) {
30
- this.#sorter = getSorter(sortStyle);
31
- }
32
- clear() {
33
- if (this.el === undefined)
34
- return;
35
- this.el.data = [];
36
- }
37
- dispose() {
38
- const el = this.el;
39
- if (el === undefined)
40
- return; // already disposed
41
- el.remove();
42
- }
43
- update(data) {
44
- if (this.el === undefined) {
45
- console.warn(`FrequencyHistogramPlot this.el undefined`);
46
- return;
47
- }
48
- this.el.data =
49
- this.#sorter === undefined
50
- ? [...data]
51
- : this.#sorter(data);
52
- }
53
- }
54
- //# sourceMappingURL=frequency-histogram-plot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"frequency-histogram-plot.js","sourceRoot":"","sources":["../../src/charts/frequency-histogram-plot.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,sBAAsB;IAElC,OAAO,CAA6B;IACpC,YAAY,EAAgB;QAC3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;IAED,WAAW,CACV,SAA4D;QAE5D,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO;QAClC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,CAAC,mBAAmB;QACjD,EAAE,CAAC,MAAM,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,IAAwD;QAC9D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACzD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,IAAI;YACX,IAAI,CAAC,OAAO,KAAK,SAAS;gBACzB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACD"}
@@ -1,57 +0,0 @@
1
- import { LitElement } from "lit";
2
- import { type KeyValue } from "../util/primitive-types.js";
3
- type Bar = {
4
- readonly percentage: number;
5
- readonly data: KeyValue;
6
- };
7
- /**
8
- * Usage in HTML:
9
- * ```html
10
- * <style>
11
- * histogram-vis {
12
- * display: block;
13
- * height: 7em;
14
- * --histogram-bar-color: pink;
15
- * }
16
- * </style>
17
- * <histogram-vis>
18
- * [
19
- * ["apples", 5],
20
- * ["oranges", 3],
21
- * ["pineapple", 0],
22
- * ["limes", 9]
23
- * ]
24
- * </histogram-vis>
25
- * ```
26
- *
27
- * CSS colour theming:
28
- * --histogram-bar-color
29
- * --histogram-label-color
30
- *
31
- * HTML tag attributes
32
- * showXAxis (boolean)
33
- * showDataLabels (boolean)
34
- *
35
- * @export
36
- * @class HistogramVis
37
- * @extends {LitElement}
38
- **/
39
- export declare class HistogramVis extends LitElement {
40
- static readonly styles: import("lit").CSSResult;
41
- data: readonly KeyValue[];
42
- showDataLabels: boolean;
43
- height: string;
44
- showXAxis: boolean;
45
- json: readonly KeyValue[] | undefined;
46
- constructor();
47
- connectedCallback(): void;
48
- barTemplate(bar: Bar, index: number, _totalBars: number): import("lit-html").TemplateResult<1>;
49
- render(): import("lit-html").TemplateResult<1>;
50
- }
51
- declare global {
52
- interface HTMLElementTagNameMap {
53
- readonly "histogram-vis": HistogramVis;
54
- }
55
- }
56
- export {};
57
- //# sourceMappingURL=histogram-vis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"histogram-vis.d.ts","sourceRoot":"","sources":["../../src/charts/histogram-vis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,KAAK,GAAG,GAAG;IACV,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACxB,CAAC;AA+CF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+BI;AACJ,qBACa,YAAa,SAAQ,UAAU;IAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,0BA2CnB;IAGK,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IAG1B,cAAc,EAAE,OAAO,CAAC;IAGxB,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,EAAE,OAAO,CAAC;IAGnB,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;;IAW9C,iBAAiB;IAOjB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IA+BvD,MAAM;CAyCN;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,QAAQ,CAAC,eAAe,EAAE,YAAY,CAAC;KACvC;CACD"}
@@ -1,222 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { LitElement, css, html } from "lit";
8
- import { customElement } from "lit/decorators/custom-element.js";
9
- import { property } from "lit/decorators/property.js";
10
- import { repeat } from "lit/directives/repeat.js";
11
- import {} from "../util/primitive-types.js";
12
- const jsonData = (object) => {
13
- if (object === null || object === undefined || object === `undefined`)
14
- return;
15
- try {
16
- if (typeof object === `string`) {
17
- if (object.length === 0)
18
- return;
19
- const o = JSON.parse(object);
20
- if (!Array.isArray(o)) {
21
- console.error(`Histogram innerText should be JSON array`);
22
- return;
23
- }
24
- for (const [index, element] of o.entries()) {
25
- if (!Array.isArray(element)) {
26
- console.error(`Histogram array should consist of inner arrays`);
27
- return;
28
- }
29
- if (element.length !== 2) {
30
- console.error(`Histogram inner arrays should consist of two elements`);
31
- return;
32
- }
33
- if (typeof element[0] !== `string`) {
34
- console.error(`First element of inner array should be a string (index ${index})`);
35
- return;
36
- }
37
- if (typeof element[1] !== `number`) {
38
- console.error(`Second element of inner array should be a number (index ${index})`);
39
- return;
40
- }
41
- }
42
- return o;
43
- }
44
- }
45
- catch (error) {
46
- console.log(object);
47
- console.error(error);
48
- }
49
- return;
50
- };
51
- /**
52
- * Usage in HTML:
53
- * ```html
54
- * <style>
55
- * histogram-vis {
56
- * display: block;
57
- * height: 7em;
58
- * --histogram-bar-color: pink;
59
- * }
60
- * </style>
61
- * <histogram-vis>
62
- * [
63
- * ["apples", 5],
64
- * ["oranges", 3],
65
- * ["pineapple", 0],
66
- * ["limes", 9]
67
- * ]
68
- * </histogram-vis>
69
- * ```
70
- *
71
- * CSS colour theming:
72
- * --histogram-bar-color
73
- * --histogram-label-color
74
- *
75
- * HTML tag attributes
76
- * showXAxis (boolean)
77
- * showDataLabels (boolean)
78
- *
79
- * @export
80
- * @class HistogramVis
81
- * @extends {LitElement}
82
- **/
83
- let HistogramVis = class HistogramVis extends LitElement {
84
- static { this.styles = css `
85
- :host {
86
- }
87
- div.container {
88
- display: flex;
89
- flex-direction: column;
90
- height: 100%;
91
- }
92
- div.chart {
93
- display: grid;
94
- flex: 1;
95
- grid-template-rows: 1fr 1px min-content;
96
- justify-items: center;
97
- }
98
- div.bar {
99
- display: flex;
100
- flex-direction: column-reverse;
101
- align-items: center;
102
- justify-self: normal;
103
- padding-left: 0.3vw;
104
- padding-right: 0.3vw;
105
- }
106
- div.bar > div.barTrack {
107
- background-color: var(--histogram-bar-color, gray);
108
- align-self: stretch;
109
- }
110
- div.xAxisLabels,
111
- div.data {
112
- font-size: min(1vw, 1em);
113
- color: var(--histogram-label-color, currentColor);
114
- }
115
- div.xAxisLabels {
116
- width: 100%;
117
- text-overflow: ellipsis;
118
- overflow: hidden;
119
- white-space: nowrap;
120
- text-align: center;
121
- }
122
- div.xAxis {
123
- background-color: var(--histogram-axis-color, silver);
124
- width: 100%;
125
- height: 100%;
126
- }
127
- `; }
128
- constructor() {
129
- super();
130
- this.data = [];
131
- this.showDataLabels = true;
132
- this.height = `100%`;
133
- this.showXAxis = true;
134
- this.json = undefined;
135
- }
136
- connectedCallback() {
137
- if (!this.hasAttribute(`json`)) {
138
- this.setAttribute(`json`, this.innerText);
139
- }
140
- super.connectedCallback();
141
- }
142
- barTemplate(bar, index, _totalBars) {
143
- const { percentage } = bar;
144
- const [key, freq] = bar.data;
145
- // grid-area: rowStart / gridColStart / gridRowEnd / gridColEnd
146
- const rowStart = 1;
147
- const rowEnd = 2;
148
- const colStart = index + 1;
149
- const colEnd = colStart + 1;
150
- const dataLabel = html `<div class="data">${freq}</div>`;
151
- const xAxis = html `${key}`;
152
- return html `
153
- <div
154
- class="bar"
155
- style="grid-area: ${rowStart} / ${colStart} / ${rowEnd} / ${colEnd}"
156
- >
157
- <div class="barTrack" style="height: ${(percentage ?? 0) * 100}%"></div>
158
- ${this.showDataLabels ? dataLabel : ``}
159
- </div>
160
- <div
161
- class="xAxisLabels"
162
- style="grid-area: ${rowStart + 2} / ${colStart} / ${rowEnd + 2} / ${colEnd}"
163
- >
164
- ${this.showXAxis ? xAxis : ``}
165
- </div>
166
- `;
167
- }
168
- render() {
169
- if ((this.data === undefined || this.data.length === 0) &&
170
- this.json === undefined) {
171
- return html ``;
172
- }
173
- const d = this.data ?? this.json;
174
- const length = d.length;
175
- const highestCount = Math.max(...d.map((d) => d[1]));
176
- const bars = d.map((kv) => ({
177
- data: kv,
178
- percentage: kv[1] / highestCount,
179
- }));
180
- const xAxis = html `
181
- <div
182
- class="xAxis"
183
- style="grid-area: 2 / 1 / 3 / ${d.length + 1}"
184
- ></div>
185
- `;
186
- const height = this.height ? `height: ${this.height};` : ``;
187
- const h = html `
188
- <style>
189
- div.chart {
190
- grid-template-columns: repeat(${d.length}, minmax(2px, 1fr));
191
- }
192
- </style>
193
- <div class="container" style="${height}">
194
- <div class="chart">
195
- ${repeat(bars, (bar) => bar.data[0], (b, index) => this.barTemplate(b, index, length))}
196
- ${this.showXAxis ? xAxis : ``}
197
- </div>
198
- </div>
199
- `;
200
- return h;
201
- }
202
- };
203
- __decorate([
204
- property()
205
- ], HistogramVis.prototype, "data", void 0);
206
- __decorate([
207
- property()
208
- ], HistogramVis.prototype, "showDataLabels", void 0);
209
- __decorate([
210
- property()
211
- ], HistogramVis.prototype, "height", void 0);
212
- __decorate([
213
- property()
214
- ], HistogramVis.prototype, "showXAxis", void 0);
215
- __decorate([
216
- property({ converter: jsonData, type: Object })
217
- ], HistogramVis.prototype, "json", void 0);
218
- HistogramVis = __decorate([
219
- customElement(`histogram-vis`)
220
- ], HistogramVis);
221
- export { HistogramVis };
222
- //# sourceMappingURL=histogram-vis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"histogram-vis.js","sourceRoot":"","sources":["../../src/charts/histogram-vis.ts"],"names":[],"mappings":"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"}