@fusion.dev/helix-headless 0.145.0 → 0.146.0

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 (278) hide show
  1. package/custom-elements.json +7373 -3849
  2. package/dist/accordion/item/accordion-item.d.ts +14 -0
  3. package/dist/accordion/item/accordion-item.js +16 -6
  4. package/dist/accordion/root/accordion-root.d.ts +8 -5
  5. package/dist/announcement/root/announcement-root.d.ts +3 -2
  6. package/dist/announcement/root/announcement-root.js +3 -1
  7. package/dist/app-header/root/app-header-root.d.ts +7 -2
  8. package/dist/app-header/root/app-header-root.js +9 -1
  9. package/dist/app-header/sectioning.d.ts +3 -1
  10. package/dist/app-header/sectioning.js +3 -2
  11. package/dist/avatar/group/avatar-group.d.ts +20 -14
  12. package/dist/avatar/group/avatar-group.js +17 -19
  13. package/dist/badge/root/badge-root.d.ts +3 -1
  14. package/dist/badge/root/badge-root.js +2 -2
  15. package/dist/bar-chart/root/bar-chart-root.d.ts +18 -1
  16. package/dist/bar-chart/root/bar-chart-root.js +52 -15
  17. package/dist/bar-chart/stack.d.ts +15 -0
  18. package/dist/bar-chart/stack.js +19 -0
  19. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +25 -0
  20. package/dist/breadcrumbs/root/breadcrumbs-root.js +50 -3
  21. package/dist/button/root/button-root.d.ts +26 -0
  22. package/dist/button/root/button-root.js +38 -18
  23. package/dist/button-group/root/button-group-root.d.ts +2 -1
  24. package/dist/button-group/root/button-group-root.js +5 -1
  25. package/dist/canvas/node/canvas-node.d.ts +4 -3
  26. package/dist/canvas/node/canvas-node.js +3 -2
  27. package/dist/canvas/root/canvas-root.js +2 -2
  28. package/dist/card/root/card-root.d.ts +24 -3
  29. package/dist/card/root/card-root.js +20 -8
  30. package/dist/carousel/root/carousel-root.d.ts +43 -4
  31. package/dist/carousel/root/carousel-root.js +40 -12
  32. package/dist/carousel/stops.d.ts +20 -0
  33. package/dist/carousel/stops.js +30 -0
  34. package/dist/chat/message/chat-message.js +5 -4
  35. package/dist/chat/naming.d.ts +5 -1
  36. package/dist/chat/naming.js +4 -2
  37. package/dist/chat/root/chat-root.d.ts +25 -3
  38. package/dist/chat/root/chat-root.js +22 -5
  39. package/dist/checkbox/root/checkbox-root.d.ts +20 -0
  40. package/dist/checkbox/root/checkbox-root.js +14 -1
  41. package/dist/checkbox-group/root/checkbox-group-root.d.ts +8 -2
  42. package/dist/checkbox-group/root/checkbox-group-root.js +12 -10
  43. package/dist/checkbox-group/select-all.d.ts +27 -0
  44. package/dist/checkbox-group/select-all.js +12 -0
  45. package/dist/code-block/highlight.d.ts +15 -0
  46. package/dist/code-block/highlight.js +4 -0
  47. package/dist/code-block/root/code-block-root.d.ts +49 -1
  48. package/dist/code-block/root/code-block-root.js +58 -3
  49. package/dist/color-input/root/color-input-root.d.ts +3 -0
  50. package/dist/color-input/root/color-input-root.js +6 -3
  51. package/dist/color-picker/root/color-picker-root.d.ts +33 -4
  52. package/dist/color-picker/root/color-picker-root.js +80 -21
  53. package/dist/color-picker/swatches.d.ts +12 -0
  54. package/dist/color-picker/swatches.js +26 -0
  55. package/dist/combobox/root/combobox-root.d.ts +43 -0
  56. package/dist/combobox/root/combobox-root.js +79 -15
  57. package/dist/command/root/command-root.d.ts +16 -1
  58. package/dist/command/root/command-root.js +22 -4
  59. package/dist/copy-button/root/copy-button-root.d.ts +5 -0
  60. package/dist/copy-button/root/copy-button-root.js +10 -3
  61. package/dist/data-table/index.d.ts +1 -1
  62. package/dist/data-table/index.js +1 -1
  63. package/dist/data-table/keys.d.ts +24 -0
  64. package/dist/data-table/keys.js +24 -0
  65. package/dist/data-table/root/data-table-root.d.ts +27 -18
  66. package/dist/data-table/root/data-table-root.js +20 -52
  67. package/dist/data-table/tree.d.ts +16 -1
  68. package/dist/data-table/tree.js +2 -3
  69. package/dist/date-input/root/date-input-root.d.ts +3 -1
  70. package/dist/date-input/root/date-input-root.js +18 -7
  71. package/dist/date-picker/root/date-picker-root.js +12 -6
  72. package/dist/dialog/description.js +15 -1
  73. package/dist/dialog/root/dialog-root.d.ts +8 -2
  74. package/dist/dialog/root/dialog-root.js +16 -1
  75. package/dist/divider/root/divider-root.d.ts +3 -0
  76. package/dist/divider/root/divider-root.js +2 -1
  77. package/dist/donut-chart/root/donut-chart-root.d.ts +31 -0
  78. package/dist/donut-chart/root/donut-chart-root.js +48 -1
  79. package/dist/drawer/reveal.d.ts +8 -0
  80. package/dist/drawer/reveal.js +1 -0
  81. package/dist/drawer/root/drawer-root.d.ts +59 -0
  82. package/dist/drawer/root/drawer-root.js +63 -4
  83. package/dist/drilldown/item/drilldown-item.js +1 -1
  84. package/dist/drilldown/root/drilldown-root.d.ts +21 -3
  85. package/dist/drilldown/root/drilldown-root.js +21 -3
  86. package/dist/element-events.generated.js +31 -5
  87. package/dist/empty/root/empty-root.d.ts +3 -1
  88. package/dist/empty/root/empty-root.js +3 -2
  89. package/dist/file-input/root/file-input-root.d.ts +69 -6
  90. package/dist/file-input/root/file-input-root.js +82 -19
  91. package/dist/file-input/screen.d.ts +2 -1
  92. package/dist/filter-input/menu/filter-menu.d.ts +2 -0
  93. package/dist/filter-input/menu/filter-menu.js +12 -4
  94. package/dist/filter-input/root/filter-input-root.d.ts +30 -6
  95. package/dist/filter-input/root/filter-input-root.js +1 -1
  96. package/dist/filter-input/suggest.d.ts +28 -3
  97. package/dist/filter-input/suggest.js +18 -8
  98. package/dist/format-date/root/format-date-root.d.ts +9 -16
  99. package/dist/format-date/root/format-date-root.js +10 -27
  100. package/dist/heatmap/root/heatmap-root.d.ts +24 -13
  101. package/dist/heatmap/root/heatmap-root.js +34 -12
  102. package/dist/icon/root/icon-root.d.ts +12 -1
  103. package/dist/icon/root/icon-root.js +21 -10
  104. package/dist/icon/settle.d.ts +7 -0
  105. package/dist/icon/settle.js +10 -0
  106. package/dist/icon-button/root/icon-button-root.d.ts +2 -0
  107. package/dist/image/root/image-root.d.ts +5 -1
  108. package/dist/image/root/image-root.js +1 -1
  109. package/dist/input/root/input-root.d.ts +12 -2
  110. package/dist/input/root/input-root.js +11 -2
  111. package/dist/kbd/root/kbd-root.d.ts +35 -1
  112. package/dist/kbd/root/kbd-root.js +23 -4
  113. package/dist/legend/root/legend-root.d.ts +55 -8
  114. package/dist/legend/root/legend-root.js +55 -13
  115. package/dist/lightbox/root/lightbox-root.d.ts +49 -6
  116. package/dist/lightbox/root/lightbox-root.js +86 -19
  117. package/dist/lightbox/zoom-controller.d.ts +59 -0
  118. package/dist/lightbox/zoom-controller.js +128 -0
  119. package/dist/lightbox/zoom.d.ts +22 -0
  120. package/dist/lightbox/zoom.js +16 -0
  121. package/dist/line-chart/root/line-chart-root.d.ts +22 -1
  122. package/dist/line-chart/root/line-chart-root.js +21 -1
  123. package/dist/list/item/list-item.d.ts +2 -0
  124. package/dist/list/item/list-item.js +11 -2
  125. package/dist/list/root/list-root.d.ts +62 -13
  126. package/dist/list/root/list-root.js +70 -13
  127. package/dist/list/selection.d.ts +37 -7
  128. package/dist/list/selection.js +16 -7
  129. package/dist/listbox/root/listbox-root.d.ts +37 -1
  130. package/dist/listbox/root/listbox-root.js +49 -3
  131. package/dist/loader/busy.d.ts +10 -0
  132. package/dist/loader/busy.js +11 -0
  133. package/dist/loader/root/loader-root.d.ts +9 -2
  134. package/dist/loader/root/loader-root.js +23 -3
  135. package/dist/megamenu/root/megamenu-root.d.ts +51 -10
  136. package/dist/megamenu/root/megamenu-root.js +76 -5
  137. package/dist/menu/item/menu-item.d.ts +51 -2
  138. package/dist/menu/item/menu-item.js +47 -23
  139. package/dist/menu/root/menu-root.d.ts +14 -0
  140. package/dist/menu/root/menu-root.js +2 -2
  141. package/dist/meter/root/meter-root.d.ts +20 -1
  142. package/dist/meter/root/meter-root.js +11 -15
  143. package/dist/navigation/root/navigation-root.d.ts +2 -1
  144. package/dist/navigation/root/navigation-root.js +2 -2
  145. package/dist/notifications/root/notifications-root.d.ts +10 -3
  146. package/dist/notifications/root/notifications-root.js +19 -7
  147. package/dist/number-input/root/number-input-root.d.ts +17 -8
  148. package/dist/number-input/root/number-input-root.js +2 -7
  149. package/dist/object-inspector/root/object-inspector-root.d.ts +75 -27
  150. package/dist/object-inspector/root/object-inspector-root.js +117 -76
  151. package/dist/object-inspector/rows.d.ts +18 -0
  152. package/dist/object-inspector/rows.js +33 -0
  153. package/dist/option/root/option-root.d.ts +5 -3
  154. package/dist/outline/root/outline-root.d.ts +18 -0
  155. package/dist/outline/root/outline-root.js +23 -5
  156. package/dist/pagination/size/pagination-size.d.ts +1 -0
  157. package/dist/pagination/size/pagination-size.js +1 -1
  158. package/dist/pin-input/code.d.ts +10 -0
  159. package/dist/pin-input/code.js +13 -0
  160. package/dist/pin-input/root/pin-input-root.d.ts +25 -1
  161. package/dist/pin-input/root/pin-input-root.js +10 -11
  162. package/dist/popover/hide-outside.d.ts +14 -0
  163. package/dist/popover/hide-outside.js +41 -0
  164. package/dist/popover/root/popover-root.d.ts +57 -7
  165. package/dist/popover/root/popover-root.js +58 -3
  166. package/dist/progress/root/progress-root.d.ts +20 -0
  167. package/dist/progress/root/progress-root.js +15 -15
  168. package/dist/qr-code/export.d.ts +26 -1
  169. package/dist/qr-code/export.js +14 -0
  170. package/dist/qr-code/root/qr-code-root.d.ts +19 -5
  171. package/dist/qr-code/root/qr-code-root.js +58 -9
  172. package/dist/quote/marks.d.ts +8 -0
  173. package/dist/quote/marks.js +5 -0
  174. package/dist/quote/root/quote-root.d.ts +14 -2
  175. package/dist/quote/root/quote-root.js +23 -1
  176. package/dist/radio/root/radio-root.d.ts +6 -2
  177. package/dist/radio/root/radio-root.js +6 -1
  178. package/dist/rating/root/rating-root.d.ts +9 -4
  179. package/dist/rating/root/rating-root.js +31 -7
  180. package/dist/rating/steps.d.ts +7 -0
  181. package/dist/rating/steps.js +9 -0
  182. package/dist/scatter-chart/fit.d.ts +15 -0
  183. package/dist/scatter-chart/fit.js +35 -0
  184. package/dist/scatter-chart/root/scatter-chart-root.d.ts +21 -1
  185. package/dist/scatter-chart/root/scatter-chart-root.js +30 -17
  186. package/dist/scroll-area/root/scroll-area-root.d.ts +22 -51
  187. package/dist/scroll-area/root/scroll-area-root.js +57 -173
  188. package/dist/scroll-area/scrollbar-controller.d.ts +111 -0
  189. package/dist/scroll-area/scrollbar-controller.js +172 -0
  190. package/dist/scroll-area/scrollbar.d.ts +27 -0
  191. package/dist/scroll-area/scrollbar.js +9 -0
  192. package/dist/select/root/select-root.d.ts +15 -0
  193. package/dist/select/root/select-root.js +18 -6
  194. package/dist/skeleton/root/skeleton-root.d.ts +3 -0
  195. package/dist/skeleton/root/skeleton-root.js +4 -2
  196. package/dist/skip-link/root/skip-link-root.js +2 -2
  197. package/dist/slider/root/slider-root.d.ts +41 -4
  198. package/dist/slider/root/slider-root.js +23 -3
  199. package/dist/sparkline/readings.d.ts +18 -0
  200. package/dist/sparkline/readings.js +19 -0
  201. package/dist/sparkline/root/sparkline-root.d.ts +78 -7
  202. package/dist/sparkline/root/sparkline-root.js +118 -23
  203. package/dist/speed-dial/root/speed-dial-root.js +2 -2
  204. package/dist/splitter/root/splitter-root.d.ts +7 -12
  205. package/dist/splitter/root/splitter-root.js +209 -204
  206. package/dist/stat/root/stat-root.d.ts +14 -5
  207. package/dist/stat/root/stat-root.js +21 -5
  208. package/dist/steps/reach.d.ts +5 -0
  209. package/dist/steps/reach.js +3 -0
  210. package/dist/steps/root/steps-root.d.ts +49 -3
  211. package/dist/steps/root/steps-root.js +44 -5
  212. package/dist/steps/step/step.d.ts +7 -0
  213. package/dist/steps/step/step.js +7 -2
  214. package/dist/switch/root/switch-root.d.ts +10 -0
  215. package/dist/table/column/table-column.d.ts +0 -10
  216. package/dist/table/column/table-column.js +3 -19
  217. package/dist/table/root/table-root.d.ts +31 -10
  218. package/dist/table/root/table-root.js +2 -13
  219. package/dist/tabs/panel/tab-panel.d.ts +16 -3
  220. package/dist/tabs/panel/tab-panel.js +34 -5
  221. package/dist/tabs/root/tabs-root.d.ts +12 -0
  222. package/dist/tabs/root/tabs-root.js +1 -1
  223. package/dist/tabs/tab/tab.d.ts +5 -0
  224. package/dist/tabs/tab/tab.js +5 -2
  225. package/dist/tag/group/tag-group.d.ts +31 -4
  226. package/dist/tag/group/tag-group.js +46 -7
  227. package/dist/tag/root/tag-root.js +9 -2
  228. package/dist/textarea/root/textarea-root.d.ts +28 -1
  229. package/dist/textarea/root/textarea-root.js +40 -1
  230. package/dist/time-input/root/time-input-root.d.ts +5 -1
  231. package/dist/time-input/root/time-input-root.js +16 -8
  232. package/dist/time-picker/root/time-picker-root.d.ts +18 -4
  233. package/dist/time-picker/root/time-picker-root.js +7 -10
  234. package/dist/time-picker/wheel-name.d.ts +9 -0
  235. package/dist/time-picker/wheel-name.js +15 -0
  236. package/dist/timeline/group/timeline-group.js +2 -2
  237. package/dist/toast/item/toast-item.d.ts +14 -1
  238. package/dist/toast/item/toast-item.js +22 -5
  239. package/dist/toast/root/toast-root.d.ts +6 -0
  240. package/dist/toast/root/toast-root.js +16 -1
  241. package/dist/toggle/group/toggle-group.d.ts +24 -3
  242. package/dist/toggle/group/toggle-group.js +34 -5
  243. package/dist/tooltip/root/tooltip-root.d.ts +13 -2
  244. package/dist/tooltip/root/tooltip-root.js +9 -1
  245. package/dist/tour/back.d.ts +10 -0
  246. package/dist/tour/back.js +8 -0
  247. package/dist/tour/root/tour-root.d.ts +30 -2
  248. package/dist/tour/root/tour-root.js +34 -8
  249. package/dist/tree/item/tree-item.d.ts +7 -3
  250. package/dist/tree/item/tree-item.js +3 -0
  251. package/dist/tree/root/tree-root.d.ts +24 -3
  252. package/dist/tree/root/tree-root.js +32 -13
  253. package/dist/tree/selection.js +2 -15
  254. package/dist/trend/root/trend-root.d.ts +43 -18
  255. package/dist/trend/root/trend-root.js +31 -6
  256. package/dist/video/media-events.d.ts +13 -18
  257. package/dist/video/media-events.js +1 -5
  258. package/dist/video/root/video-root.d.ts +18 -5
  259. package/dist/video/root/video-root.js +19 -10
  260. package/dist/video-playlist/menu/video-playlist-menu.d.ts +2 -0
  261. package/dist/video-playlist/menu/video-playlist-menu.js +2 -1
  262. package/dist/video-playlist/root/video-playlist-root.d.ts +7 -1
  263. package/dist/virtual-list/fill.d.ts +0 -8
  264. package/dist/virtual-list/fill.js +1 -17
  265. package/dist/virtual-list/plan.d.ts +49 -0
  266. package/dist/virtual-list/plan.js +16 -0
  267. package/dist/virtual-list/root/virtual-list-root.d.ts +114 -13
  268. package/dist/virtual-list/root/virtual-list-root.js +183 -40
  269. package/lint.json +1 -1
  270. package/package.json +8 -8
  271. package/types/jsx.d.ts +4577 -835
  272. package/types/vue.d.ts +926 -168
  273. package/dist/chat/relative-clock.d.ts +0 -39
  274. package/dist/chat/relative-clock.js +0 -31
  275. package/dist/data-table/root/order.d.ts +0 -141
  276. package/dist/data-table/root/order.js +0 -76
  277. package/dist/tag/selection.d.ts +0 -10
  278. package/dist/tag/selection.js +0 -12
@@ -10,6 +10,18 @@ import { property } from 'lit/decorators.js';
10
10
  import { encode } from 'uqr';
11
11
  import { qrSvg } from '../export.js';
12
12
  const QUIET = 4;
13
+ const pixelsOf = (image) => {
14
+ try {
15
+ const canvas = document.createElement('canvas');
16
+ canvas.width = image.naturalWidth;
17
+ canvas.height = image.naturalHeight;
18
+ canvas.getContext('2d')?.drawImage(image, 0, 0);
19
+ return canvas.toDataURL('image/png');
20
+ }
21
+ catch {
22
+ return image.currentSrc || image.src;
23
+ }
24
+ };
13
25
  const isFinder = (x, y, size) => {
14
26
  const near = (a, b) => a < 8 && b < 8;
15
27
  return near(x, y) || near(size - 1 - x, y) || near(x, size - 1 - y);
@@ -96,7 +108,9 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
96
108
  updated(changed) {
97
109
  super.updated(changed);
98
110
  const key = `${this.level}:${this.value}`;
99
- if (this.value !== '' && this.encoded() === undefined) {
111
+ const overflow = this.value !== '' && this.encoded() === undefined;
112
+ this.toggleState('overflow', overflow);
113
+ if (overflow) {
100
114
  if (this.overflowed !== key) {
101
115
  this.overflowed = key;
102
116
  this.dispatchEvent(new Event('error', { bubbles: false, cancelable: false, composed: false }));
@@ -115,16 +129,53 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
115
129
  }
116
130
  const ground = getComputedStyle(this).backgroundColor;
117
131
  const clear = ground === '' || ground === 'transparent' || /^rgba\(.*,\s*0\)$/.test(ground);
132
+ const background = clear ? '#ffffff' : rgbOf(ground);
133
+ const box = Number(code.getAttribute('viewBox')?.split(' ')[2] ?? 0);
134
+ const logo = this.logoDrawing(code, box, background);
118
135
  return qrSvg({
119
- background: clear ? '#ffffff' : rgbOf(ground),
120
- box: Number(code.getAttribute('viewBox')?.split(' ')[2] ?? 0),
136
+ background,
137
+ box,
121
138
  finderColor: rgbOf(getComputedStyle(finders).fill || '#000000'),
122
139
  finders: finders.getAttribute('d') ?? '',
123
140
  moduleColor: rgbOf(getComputedStyle(modules).fill || '#000000'),
124
141
  modules: modules.getAttribute('d') ?? '',
125
142
  quiet: QUIET,
143
+ ...(logo ? { logo } : {}),
126
144
  }, size);
127
145
  }
146
+ logoDrawing(code, box, background) {
147
+ const holder = this.renderRoot.querySelector('[part="logo"]');
148
+ const mark = this.knownChildren.find((child) => child.slot === 'logo');
149
+ const area = code.getBoundingClientRect();
150
+ if (!holder || holder.hidden || !mark || area.width === 0) {
151
+ return undefined;
152
+ }
153
+ const scale = box / area.width;
154
+ const at = (rect) => [
155
+ (rect.left - area.left) * scale,
156
+ (rect.top - area.top) * scale,
157
+ rect.width * scale,
158
+ rect.height * scale,
159
+ ];
160
+ const frame = at(holder.getBoundingClientRect());
161
+ if (frame[0] < 0 || frame[1] < 0 || frame[0] + frame[2] > box || frame[1] + frame[3] > box) {
162
+ return undefined;
163
+ }
164
+ const fill = getComputedStyle(holder).backgroundColor;
165
+ const ground = fill === '' || fill === 'transparent' || /^rgba\(.*,\s*0\)$/.test(fill);
166
+ const logo = {
167
+ frame,
168
+ ground: ground ? background : rgbOf(fill),
169
+ mark: at(mark.getBoundingClientRect()),
170
+ };
171
+ if (mark instanceof HTMLImageElement) {
172
+ return { ...logo, href: pixelsOf(mark) };
173
+ }
174
+ if (mark instanceof SVGSVGElement) {
175
+ return { ...logo, svg: new XMLSerializer().serializeToString(mark) };
176
+ }
177
+ return undefined;
178
+ }
128
179
  async toPng(size = 512) {
129
180
  const markup = this.toSvg(size);
130
181
  if (markup === '') {
@@ -151,11 +202,7 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
151
202
  link.click();
152
203
  setTimeout(() => URL.revokeObjectURL(url));
153
204
  }
154
- renderCode() {
155
- if (this.value === '') {
156
- return nothing;
157
- }
158
- const result = this.encoded();
205
+ renderCode(result) {
159
206
  if (result === undefined) {
160
207
  return nothing;
161
208
  }
@@ -186,7 +233,9 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
186
233
  </svg>`;
187
234
  }
188
235
  render() {
189
- return html `${this.renderCode()}
236
+ const result = this.value === '' ? undefined : this.encoded();
237
+ const overflow = this.value !== '' && result === undefined;
238
+ return html `${this.renderCode(result)}${overflow ? html `<span part="fallback"><slot name="fallback"></slot></span>` : nothing}
190
239
  <span ?hidden=${!this.logo} part="logo">
191
240
  <slot
192
241
  name="logo"
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Whether quoted text starts or ends with a quotation mark someone typed.
3
+ *
4
+ * A Quote renders a `<q>`, which sets the marks itself, so typed ones show
5
+ * twice: “"like this"”. Only the ends are read, since a mark inside the text
6
+ * is a quotation within it, which a nested Quote should set.
7
+ */
8
+ export declare const typedMarks: (text: string) => boolean;
@@ -0,0 +1,5 @@
1
+ const MARKS = new Set(['"', "'", '“', '”', '‘', '’', '„', '«', '»', '‹', '›', '「', '」']);
2
+ export const typedMarks = (text) => {
3
+ const trimmed = text.trim();
4
+ return trimmed !== '' && (MARKS.has(trimmed[0] ?? '') || MARKS.has(trimmed.at(-1) ?? ''));
5
+ };
@@ -1,5 +1,5 @@
1
1
  import { HelixElement } from '@fusion.dev/helix-core';
2
- import { type TemplateResult } from 'lit';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
3
  /**
4
4
  * @summary A short quotation, set inline with the text around it.
5
5
  *
@@ -7,7 +7,10 @@ import { type TemplateResult } from 'lit';
7
7
  * Renders a real `<q>`, so the browser supplies the quotation marks. It inserts
8
8
  * the correct marks for the document's language and nests them correctly when
9
9
  * one quotation sits inside another. Do not type quotation marks into the
10
- * content.
10
+ * content: one that starts or ends with a typed mark warns once, with the
11
+ * runtime kind `typed-marks`. A quotation in a language other than the page's takes `lang` on the
12
+ * element, and its marks follow it: `lang="de"` sets „…“ and `lang="fr"` «…»
13
+ * inside an English page.
11
14
  *
12
15
  * For a passage set off from the surrounding text, use a blockquote.
13
16
  *
@@ -26,6 +29,15 @@ export declare class HelixHeadlessQuote extends HelixElement {
26
29
  * URL identifying where the quotation came from.
27
30
  */
28
31
  cite: string;
32
+ /** Whether this quote has said its text carries typed marks, so it says so once. */
33
+ private warned;
34
+ /**
35
+ * Reads the quoted text as it first renders and as it changes, for marks the
36
+ * `<q>` would double. On the shadow root rather than in the template, so the
37
+ * served markup is the `<q>` and its slot and nothing else.
38
+ */
39
+ private readonly readText;
40
+ protected firstUpdated(changed: PropertyValues): void;
29
41
  protected render(): TemplateResult;
30
42
  }
31
43
  declare global {
@@ -4,13 +4,35 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixElement } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixElement, reportRuntime } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
+ import { typedMarks } from '../marks.js';
10
11
  let HelixHeadlessQuote = class HelixHeadlessQuote extends HelixElement {
11
12
  constructor() {
12
13
  super(...arguments);
13
14
  this.cite = '';
15
+ this.warned = false;
16
+ this.readText = () => {
17
+ const text = [...this.childNodes]
18
+ .filter((node) => !(node instanceof Element) || !node.slot)
19
+ .map((node) => node.textContent ?? '')
20
+ .join('');
21
+ if (this.warned || !typedMarks(text)) {
22
+ return;
23
+ }
24
+ this.warned = true;
25
+ reportRuntime({
26
+ kind: 'typed-marks',
27
+ message: `<${this.localName}> starts or ends with a typed quotation mark, and the browser sets its own, so the marks show twice. Take the typed marks out.`,
28
+ tag: this.localName,
29
+ });
30
+ };
31
+ }
32
+ firstUpdated(changed) {
33
+ super.firstUpdated(changed);
34
+ this.readText();
35
+ this.renderRoot.addEventListener('slotchange', this.readText);
14
36
  }
15
37
  render() {
16
38
  return html `<q part="quote" cite=${this.cite || nothing}><slot></slot></q>`;
@@ -29,15 +29,19 @@ declare const HelixHeadlessRadio_base: (new (...args: any[]) => import("@fusion.
29
29
  * replaces the visible label, and the label becomes the name read by screen
30
30
  * readers. The icon has its own slot so the chip can hide the label and show
31
31
  * the icon.
32
+ * @slot indicator - An icon drawn inside the circle in place of the dot, such
33
+ * as a check mark.
32
34
  *
33
35
  * @event {HelixSelectEvent} helix-select - Fired when the radio is chosen. Cancelable: call `preventDefault()` to keep the current choice.
34
36
  *
35
37
  * @csspart box - The circle. Draw the dot inside it with `::part(box)::after` in
36
- * your stylesheet. This tier ships no CSS, so it renders no separate element for
37
- * the dot, which would add an empty child to your layout.
38
+ * your stylesheet, or slot an icon into `indicator`. This tier ships no CSS, so
39
+ * it renders no separate element for the dot, which would add an empty child to
40
+ * your layout.
38
41
  * @csspart item - The button, which covers the whole row.
39
42
  * @csspart label - The label beside the circle.
40
43
  *
44
+ * @cssstate has-indicator - An icon is slotted into `indicator`.
41
45
  * @cssstate selected - The radio is chosen.
42
46
  */
43
47
  export declare class HelixHeadlessRadio extends HelixHeadlessRadio_base {
@@ -32,7 +32,12 @@ let HelixHeadlessRadio = class HelixHeadlessRadio extends MixinSelectableItem(He
32
32
  tabindex=${(this.focusable ?? this.selected) || !this.childrenKnown ? '0' : '-1'}
33
33
  @click=${() => this.select()}
34
34
  >
35
- <span part="box"></span>
35
+ <span part="box" aria-hidden="true"
36
+ ><slot
37
+ name="indicator"
38
+ @slotchange=${(event) => this.toggleState('has-indicator', event.target.assignedNodes().length > 0)}
39
+ ></slot
40
+ ></span>
36
41
  <slot name="icon"></slot>
37
42
  <span part="label"><slot></slot></span>
38
43
  </button>`;
@@ -24,6 +24,7 @@ declare const HelixHeadlessRating_base: (new (...args: any[]) => import("@fusion
24
24
  * @aliases Stars, Score, Review score
25
25
  * @documentation https://fusion.dev/helix/components/rating
26
26
  *
27
+ * @slot empty-mark - The shape of an unfilled mark, copied into every position of the track, such as an outlined star beside a filled `mark`. Without it, the track copies `mark`.
27
28
  * @slot feedback - The message that says what is wrong, for content richer than a string. It shows while there is a message.
28
29
  * @slot hint - Help under the control, for content richer than the `hint` text.
29
30
  * @slot label - The label, for content richer than the `label` text.
@@ -32,6 +33,7 @@ declare const HelixHeadlessRating_base: (new (...args: any[]) => import("@fusion
32
33
  * @event {Event} change - The score was chosen. Sent together with `input`, because each choice commits the score.
33
34
  * @event {HelixBeforeChangeEvent} helix-before-change - The score is about to change. Cancelable: cancel it to keep the current score.
34
35
  * @event {HelixClearEvent} helix-clear - The rating went back to unrated, under `clearable`. Sent after `input` and `change`.
36
+ * @event {HelixPreviewEvent} helix-preview - The score under the pointer, shown before it is chosen, or `''` once the marks show the score again. Sent once each time the preview changes.
35
37
  * @event {Event} input - The score changed.
36
38
  *
37
39
  * @csspart feedback - The message that says what is wrong.
@@ -223,6 +225,8 @@ export declare class HelixHeadlessRating extends HelixHeadlessRating_base {
223
225
  /** The shape for one place, or nothing when the stylesheet is drawing it. */
224
226
  private markFor;
225
227
  private readonly handleMarkSlot;
228
+ /** The element slotted into `empty-mark`, which the track copies. */
229
+ private emptySource;
226
230
  /**
227
231
  * The step under a point on the row, or the nearest one to it.
228
232
  *
@@ -297,10 +301,11 @@ export declare class HelixHeadlessRating extends HelixHeadlessRating_base {
297
301
  /** The name of one score, as `optionLabel` writes it. */
298
302
  private nameFor;
299
303
  /**
300
- * The option holding the tab stop: the chosen one, or for a score between
301
- * steps, such as an average of 3.5 on whole marks, the step below it, and
302
- * the first while nothing is chosen. Between steps no option matched, and
303
- * the rating left the tab order.
304
+ * The option that is checked and holds the tab stop: the chosen one, or for
305
+ * a score between steps, such as an average of 3.4 on whole marks, the
306
+ * nearest step, and the first while nothing is chosen. Between steps no
307
+ * option matched, so no option was checked and the rating left the tab
308
+ * order.
304
309
  */
305
310
  private stopAt;
306
311
  protected render(): TemplateResult;
@@ -4,9 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AriaForwardController, valueAsNumber as asNumber, customElement, fillTemplate, numberAsValue as fromNumber, HelixClearEvent, HelixFormElement, KeyboardNavigationController, MixinControllerValue, MixinField, reportRuntime, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, valueAsNumber as asNumber, customElement, fillTemplate, numberAsValue as fromNumber, HelixClearEvent, HelixFormElement, HelixPreviewEvent, KeyboardNavigationController, MixinControllerValue, MixinField, reportRuntime, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
+ import { nearestStep } from '../steps.js';
10
11
  let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue(MixinField(HelixFormElement)) {
11
12
  constructor() {
12
13
  super(...arguments);
@@ -33,9 +34,17 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
33
34
  this.dragging = undefined;
34
35
  this.clones = new Map();
35
36
  this.handleMarkSlot = (event) => {
37
+ const slot = event.target;
38
+ const source = slot.assignedElements({ flatten: true })[0];
36
39
  this.clones.clear();
37
- this.markSource = event.target.assignedElements({ flatten: true })[0];
40
+ if (slot.name === 'empty-mark') {
41
+ this.emptySource = source;
42
+ }
43
+ else {
44
+ this.markSource = source;
45
+ }
38
46
  };
47
+ this.emptySource = undefined;
39
48
  this.handleDragStart = (event) => {
40
49
  if (this.isDisabled || this.readOnly || event.button !== 0) {
41
50
  return;
@@ -158,7 +167,8 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
158
167
  }));
159
168
  }
160
169
  markFor(layer, index) {
161
- if (!this.markSource) {
170
+ const source = layer === 'track' ? (this.emptySource ?? this.markSource) : this.markSource;
171
+ if (!source) {
162
172
  return undefined;
163
173
  }
164
174
  const key = `${layer}:${index}`;
@@ -166,7 +176,7 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
166
176
  if (held) {
167
177
  return held;
168
178
  }
169
- const clone = this.markSource.cloneNode(true);
179
+ const clone = source.cloneNode(true);
170
180
  this.clones.set(key, clone);
171
181
  return clone;
172
182
  }
@@ -208,6 +218,11 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
208
218
  }
209
219
  updated(changed) {
210
220
  super.updated?.(changed);
221
+ if (changed.has('previewing')) {
222
+ this.dispatchEvent(new HelixPreviewEvent({
223
+ value: this.previewing === undefined ? '' : String(this.previewing),
224
+ }));
225
+ }
211
226
  this.sync();
212
227
  if (this.floor !== this.min && !this.warned) {
213
228
  this.warned = true;
@@ -225,6 +240,7 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
225
240
  if (!this.markRead && this.childrenKnown) {
226
241
  this.markRead = true;
227
242
  this.markSource = this.knownChildren.find((child) => child.slot === 'mark');
243
+ this.emptySource = this.knownChildren.find((child) => child.slot === 'empty-mark');
228
244
  }
229
245
  }
230
246
  firstUpdated(changed) {
@@ -239,8 +255,7 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
239
255
  if (!answered) {
240
256
  return first;
241
257
  }
242
- const below = this.steps.filter((score) => score <= this.score);
243
- return below.at(-1) ?? first;
258
+ return nearestStep(this.steps, this.score) ?? first;
244
259
  }
245
260
  render() {
246
261
  const showing = this.previewing ?? this.score;
@@ -276,9 +291,15 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
276
291
  hidden
277
292
  @slotchange=${this.handleMarkSlot}
278
293
  ></slot>
294
+ <slot
295
+ name="empty-mark"
296
+ hidden
297
+ @slotchange=${this.handleMarkSlot}
298
+ ></slot>
279
299
  <span
280
300
  part="track"
281
301
  aria-hidden="true"
302
+ data-slotted=${this.emptySource ? '' : nothing}
282
303
  >${marksIn('track')}</span
283
304
  >
284
305
  <span
@@ -295,7 +316,7 @@ let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue
295
316
  part="option"
296
317
  role="radio"
297
318
  type="button"
298
- aria-checked=${answered && this.score === score ? 'true' : 'false'}
319
+ aria-checked=${answered && score === stop ? 'true' : 'false'}
299
320
  aria-label=${this.nameFor(score)}
300
321
  data-score=${String(score)}
301
322
  style=${`--rating-step: ${index + 1}`}
@@ -352,6 +373,9 @@ __decorate([
352
373
  __decorate([
353
374
  state()
354
375
  ], HelixHeadlessRating.prototype, "previewing", void 0);
376
+ __decorate([
377
+ state()
378
+ ], HelixHeadlessRating.prototype, "emptySource", void 0);
355
379
  HelixHeadlessRating = __decorate([
356
380
  customElement('helix-headless-rating')
357
381
  ], HelixHeadlessRating);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The step a score stands at: the step itself, or for a score between steps,
3
+ * such as an average of 3.4 on whole marks, the nearest one. Halfway between
4
+ * two goes to the lower, so a score is never read as more than it is.
5
+ * `undefined` for a row with no steps.
6
+ */
7
+ export declare const nearestStep: (steps: readonly number[], score: number) => number | undefined;
@@ -0,0 +1,9 @@
1
+ export const nearestStep = (steps, score) => {
2
+ let nearest;
3
+ for (const step of steps) {
4
+ if (nearest === undefined || Math.abs(step - score) < Math.abs(nearest - score)) {
5
+ nearest = step;
6
+ }
7
+ }
8
+ return nearest;
9
+ };
@@ -0,0 +1,15 @@
1
+ /** Pearson's r, or nothing where there are too few points or no spread to have one. */
2
+ export declare const correlation: (pairs: ReadonlyArray<readonly [number, number]>) => number | undefined;
3
+ /** A straight line, as the measure up at any measure across. */
4
+ export interface Fit {
5
+ /** The measure up where the measure across is zero. */
6
+ intercept: number;
7
+ /** How far up the line goes for each step across. */
8
+ slope: number;
9
+ }
10
+ /**
11
+ * The straight line nearest the points, by least squares, or nothing where
12
+ * there are fewer than two points or they share one measure across, which no
13
+ * line up the page can be fitted to.
14
+ */
15
+ export declare const leastSquares: (pairs: ReadonlyArray<readonly [number, number]>) => Fit | undefined;
@@ -0,0 +1,35 @@
1
+ const mean = (values) => values.reduce((sum, one) => sum + one, 0) / values.length;
2
+ export const correlation = (pairs) => {
3
+ if (pairs.length < 3) {
4
+ return undefined;
5
+ }
6
+ const across = mean(pairs.map(([x]) => x));
7
+ const up = mean(pairs.map(([, y]) => y));
8
+ let both = 0;
9
+ let xs = 0;
10
+ let ys = 0;
11
+ for (const [x, y] of pairs) {
12
+ both += (x - across) * (y - up);
13
+ xs += (x - across) ** 2;
14
+ ys += (y - up) ** 2;
15
+ }
16
+ return xs === 0 || ys === 0 ? undefined : both / Math.sqrt(xs * ys);
17
+ };
18
+ export const leastSquares = (pairs) => {
19
+ if (pairs.length < 2) {
20
+ return undefined;
21
+ }
22
+ const across = mean(pairs.map(([x]) => x));
23
+ const up = mean(pairs.map(([, y]) => y));
24
+ let both = 0;
25
+ let xs = 0;
26
+ for (const [x, y] of pairs) {
27
+ both += (x - across) * (y - up);
28
+ xs += (x - across) ** 2;
29
+ }
30
+ if (xs === 0) {
31
+ return undefined;
32
+ }
33
+ const slope = both / xs;
34
+ return { intercept: up - slope * across, slope };
35
+ };
@@ -32,6 +32,9 @@ declare const HelixHeadlessScatterChart_base: typeof HelixElement & (new (...arg
32
32
  * Both axes are labeled, because both positions are values. The ticks sit at
33
33
  * round numbers, and the range extends to them.
34
34
  *
35
+ * `trend` draws each series' line of best fit, by least squares, across the
36
+ * plot in the series' color.
37
+ *
35
38
  * The summary gives each series' correlation coefficient and its number of
36
39
  * points. The table has every number, and the drawing is hidden from screen
37
40
  * readers.
@@ -66,7 +69,7 @@ declare const HelixHeadlessScatterChart_base: typeof HelixElement & (new (...arg
66
69
  * @csspart point - One row, as a point.
67
70
  * @csspart point-active - A point in the row under the pointer. Set alongside `point`.
68
71
  * @csspart summary - The text that says how strongly the measures relate, for people who cannot see the points.
69
- * @csspart svg - The drawing surface the gridlines sit on.
72
+ * @csspart svg - The drawing surface the gridlines and the trend lines sit on.
70
73
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
71
74
  * @csspart tooltip-anchor - The `Tooltip` element itself.
72
75
  * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
@@ -83,6 +86,7 @@ declare const HelixHeadlessScatterChart_base: typeof HelixElement & (new (...arg
83
86
  * @csspart tooltip-right - The bubble while it is right of the reading. Set alongside `tooltip`.
84
87
  * @csspart tooltip-top - The bubble while it is above the reading. Set alongside `tooltip`.
85
88
  * @csspart tooltip-value - A column's value inside the tooltip.
89
+ * @csspart trend - One series' line of best fit, under `trend`. Carries its series color as `--chart-series`.
86
90
  * @csspart x-axis - The values along the horizontal axis, under the plot.
87
91
  * @csspart x-name - The name of the horizontal measure.
88
92
  * @csspart x-tick - One labeled value on the horizontal axis. Each axis has its own tick part, because `::part()` cannot tell which axis a tick is on.
@@ -112,6 +116,16 @@ export declare class HelixHeadlessScatterChart extends HelixHeadlessScatterChart
112
116
  * The word the summary uses for a row when it counts them.
113
117
  */
114
118
  pointsLabel: string;
119
+ /**
120
+ * Draws each series' line of best fit across the plot, by least squares, in
121
+ * the series' color: the regression line a reader would otherwise draw by
122
+ * eye.
123
+ *
124
+ * Absent draws none. A series with fewer than two points, or with every
125
+ * point at one measure across, has no line to draw. The summary already
126
+ * gives each series' correlation, which says how near the points are to it.
127
+ */
128
+ trend: boolean;
115
129
  /** The points as last drawn, which the pointer searches. */
116
130
  private drawn;
117
131
  /** The point a pointer is resting nearest, which the tooltip sits on. */
@@ -150,6 +164,12 @@ export declare class HelixHeadlessScatterChart extends HelixHeadlessScatterChart
150
164
  protected render(): TemplateResult;
151
165
  /** The rules and the points, behind a seam the styled tier can move. */
152
166
  protected renderPlot(field: ScatterField, along: (value: number) => number, up: (value: number) => number): TemplateResult;
167
+ /**
168
+ * Each shown series' line of best fit, from one end of the measure across
169
+ * to the other, under `trend`. The drawing clips a line that leaves the
170
+ * plot.
171
+ */
172
+ protected renderTrends(field: ScatterField, along: (value: number) => number, up: (value: number) => number): TemplateResult[] | typeof nothing;
153
173
  /**
154
174
  * What a reader who cannot see the points is told.
155
175
  *
@@ -8,6 +8,7 @@ import { CHART_PLOT, customElement, drawTooltip, extent, formatNumbers, HelixEle
8
8
  import { html, nothing, svg } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import '../../tooltip/index.js';
11
+ import { correlation, leastSquares } from '../fit.js';
11
12
  const REACH = 24;
12
13
  const COEFFICIENTS = new Map();
13
14
  const coefficientIn = (locale) => {
@@ -31,28 +32,12 @@ const nice = ([low, high]) => {
31
32
  const round = (value) => Number(value.toPrecision(12));
32
33
  return [round(Math.floor(low / step) * step), round(Math.ceil(high / step) * step)];
33
34
  };
34
- const correlation = (pairs) => {
35
- if (pairs.length < 3) {
36
- return undefined;
37
- }
38
- const mean = (values) => values.reduce((sum, one) => sum + one, 0) / values.length;
39
- const across = mean(pairs.map(([x]) => x));
40
- const up = mean(pairs.map(([, y]) => y));
41
- let both = 0;
42
- let xs = 0;
43
- let ys = 0;
44
- for (const [x, y] of pairs) {
45
- both += (x - across) * (y - up);
46
- xs += (x - across) ** 2;
47
- ys += (y - up) ** 2;
48
- }
49
- return xs === 0 || ys === 0 ? undefined : both / Math.sqrt(xs * ys);
50
- };
51
35
  let HelixHeadlessScatterChart = class HelixHeadlessScatterChart extends MixinChartSource(HelixElement) {
52
36
  constructor() {
53
37
  super(...arguments);
54
38
  this.correlationLabel = 'correlation';
55
39
  this.pointsLabel = 'points';
40
+ this.trend = false;
56
41
  this.drawn = [];
57
42
  this.nearest = undefined;
58
43
  this.handleMove = (event) => {
@@ -180,6 +165,7 @@ let HelixHeadlessScatterChart = class HelixHeadlessScatterChart extends MixinCha
180
165
  ${this.rulesY
181
166
  ? ticks(field.y).map((level) => svg `<line part="gridline" x1="0" x2=${PLOT_WIDTH} y1=${up(level)} y2=${up(level)} />`)
182
167
  : nothing}
168
+ ${this.renderTrends(field, along, up)}
183
169
  </svg>
184
170
  ${field.points.map((point) => {
185
171
  const index = seriesIndex(point.depth);
@@ -194,6 +180,30 @@ let HelixHeadlessScatterChart = class HelixHeadlessScatterChart extends MixinCha
194
180
  ${this.renderTooltip()}
195
181
  </div>`;
196
182
  }
183
+ renderTrends(field, along, up) {
184
+ if (!this.trend) {
185
+ return nothing;
186
+ }
187
+ const [start, end] = field.x;
188
+ return field.yNames.flatMap((name, depth) => {
189
+ const fit = this.showsSeries(name) ? leastSquares(field.pairs[depth] ?? []) : undefined;
190
+ if (fit === undefined) {
191
+ return [];
192
+ }
193
+ const index = seriesIndex(depth);
194
+ return [
195
+ svg `<line
196
+ data-series=${index}
197
+ part="trend"
198
+ style="--chart-series: var(--chart-series-${index})"
199
+ x1=${along(start)}
200
+ x2=${along(end)}
201
+ y1=${up(fit.intercept + fit.slope * start)}
202
+ y2=${up(fit.intercept + fit.slope * end)}
203
+ />`,
204
+ ];
205
+ });
206
+ }
197
207
  renderSummary(field) {
198
208
  const clauses = field.yNames.map((name, depth) => {
199
209
  const pairs = field.pairs[depth] ?? [];
@@ -233,6 +243,9 @@ __decorate([
233
243
  __decorate([
234
244
  property({ attribute: 'points-label' })
235
245
  ], HelixHeadlessScatterChart.prototype, "pointsLabel", void 0);
246
+ __decorate([
247
+ property({ reflect: true, type: Boolean })
248
+ ], HelixHeadlessScatterChart.prototype, "trend", void 0);
236
249
  HelixHeadlessScatterChart = __decorate([
237
250
  customElement('helix-headless-scatter-chart')
238
251
  ], HelixHeadlessScatterChart);