ngwr 15.0.1 → 15.2.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 (420) hide show
  1. package/anchor/styles/_index.scss +13 -2
  2. package/bits/aurora/styles/_rules.scss +11 -0
  3. package/bits/dot-grid/dot-grid.scss +1 -0
  4. package/bits/dot-grid/styles/_index.scss +8 -0
  5. package/bits/dot-grid/styles/_rules.scss +54 -0
  6. package/bits/iridescence/iridescence.scss +1 -0
  7. package/bits/iridescence/styles/_index.scss +8 -0
  8. package/bits/iridescence/styles/_rules.scss +72 -0
  9. package/bits/marquee/styles/_rules.scss +7 -3
  10. package/bits/ripple-grid/ripple-grid.scss +1 -0
  11. package/bits/ripple-grid/styles/_index.scss +8 -0
  12. package/bits/ripple-grid/styles/_rules.scss +63 -0
  13. package/bits/spotlight-card/styles/_rules.scss +7 -4
  14. package/bits/star-border/styles/_rules.scss +5 -2
  15. package/bits/threads/styles/_index.scss +8 -0
  16. package/bits/threads/styles/_rules.scss +76 -0
  17. package/bits/threads/threads.scss +1 -0
  18. package/bits/waves/styles/_rules.scss +8 -1
  19. package/charts/bar-chart/styles/_index.scss +607 -7
  20. package/charts/boxplot-chart/styles/_index.scss +297 -0
  21. package/charts/bullet-chart/styles/_index.scss +268 -0
  22. package/charts/calendar-heatmap/styles/_index.scss +25 -3
  23. package/charts/candlestick-chart/styles/_index.scss +307 -0
  24. package/charts/chart-legend/styles/_index.scss +143 -0
  25. package/charts/core/styles/_index.scss +30 -0
  26. package/charts/donut-chart/styles/_index.scss +39 -3
  27. package/charts/funnel-chart/styles/_index.scss +237 -0
  28. package/charts/gauge/styles/_index.scss +4 -2
  29. package/charts/heatmap-chart/styles/_index.scss +329 -0
  30. package/charts/line-chart/styles/_index.scss +141 -8
  31. package/charts/meter-group/styles/_index.scss +44 -13
  32. package/charts/radar-chart/styles/_index.scss +206 -0
  33. package/charts/scatter-chart/styles/_index.scss +245 -0
  34. package/charts/sparkline/styles/_index.scss +10 -1
  35. package/charts/treemap-chart/styles/_index.scss +215 -0
  36. package/charts/waterfall-chart/styles/_index.scss +321 -0
  37. package/collapse/styles/_index.scss +6 -1
  38. package/fesm2022/ngwr-affix.mjs +3 -3
  39. package/fesm2022/ngwr-alert.mjs +3 -3
  40. package/fesm2022/ngwr-anchor.mjs +3 -3
  41. package/fesm2022/ngwr-avatar.mjs +3 -3
  42. package/fesm2022/ngwr-back-top.mjs +3 -3
  43. package/fesm2022/ngwr-badge.mjs +6 -6
  44. package/fesm2022/ngwr-bits-aurora.mjs +30 -38
  45. package/fesm2022/ngwr-bits-aurora.mjs.map +1 -1
  46. package/fesm2022/ngwr-bits-blur-text.mjs +3 -3
  47. package/fesm2022/ngwr-bits-border-glow-testing.mjs.map +1 -1
  48. package/fesm2022/ngwr-bits-border-glow.mjs +11 -5
  49. package/fesm2022/ngwr-bits-border-glow.mjs.map +1 -1
  50. package/fesm2022/ngwr-bits-circular-text.mjs +3 -3
  51. package/fesm2022/ngwr-bits-click-spark.mjs +3 -3
  52. package/fesm2022/ngwr-bits-confetti.mjs +3 -3
  53. package/fesm2022/ngwr-bits-decrypt-text.mjs +3 -3
  54. package/fesm2022/ngwr-bits-dot-grid-testing.mjs +40 -0
  55. package/fesm2022/ngwr-bits-dot-grid-testing.mjs.map +1 -0
  56. package/fesm2022/ngwr-bits-dot-grid.mjs +482 -0
  57. package/fesm2022/ngwr-bits-dot-grid.mjs.map +1 -0
  58. package/fesm2022/ngwr-bits-falling-text.mjs +3 -3
  59. package/fesm2022/ngwr-bits-fuzzy-text.mjs +3 -3
  60. package/fesm2022/ngwr-bits-glitch-text.mjs +3 -3
  61. package/fesm2022/ngwr-bits-gradient-text.mjs +3 -3
  62. package/fesm2022/ngwr-bits-iridescence-testing.mjs +31 -0
  63. package/fesm2022/ngwr-bits-iridescence-testing.mjs.map +1 -0
  64. package/fesm2022/ngwr-bits-iridescence.mjs +591 -0
  65. package/fesm2022/ngwr-bits-iridescence.mjs.map +1 -0
  66. package/fesm2022/ngwr-bits-marquee-testing.mjs +1 -1
  67. package/fesm2022/ngwr-bits-marquee-testing.mjs.map +1 -1
  68. package/fesm2022/ngwr-bits-marquee.mjs +7 -7
  69. package/fesm2022/ngwr-bits-marquee.mjs.map +1 -1
  70. package/fesm2022/ngwr-bits-ripple-grid-testing.mjs +40 -0
  71. package/fesm2022/ngwr-bits-ripple-grid-testing.mjs.map +1 -0
  72. package/fesm2022/ngwr-bits-ripple-grid.mjs +805 -0
  73. package/fesm2022/ngwr-bits-ripple-grid.mjs.map +1 -0
  74. package/fesm2022/ngwr-bits-rotating-text.mjs +3 -3
  75. package/fesm2022/ngwr-bits-shiny-text.mjs +6 -6
  76. package/fesm2022/ngwr-bits-splash-cursor.mjs +3 -3
  77. package/fesm2022/ngwr-bits-split-text.mjs +3 -3
  78. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs +1 -1
  79. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs.map +1 -1
  80. package/fesm2022/ngwr-bits-spotlight-card.mjs +10 -10
  81. package/fesm2022/ngwr-bits-spotlight-card.mjs.map +1 -1
  82. package/fesm2022/ngwr-bits-star-border-testing.mjs +1 -1
  83. package/fesm2022/ngwr-bits-star-border-testing.mjs.map +1 -1
  84. package/fesm2022/ngwr-bits-star-border.mjs +7 -7
  85. package/fesm2022/ngwr-bits-star-border.mjs.map +1 -1
  86. package/fesm2022/ngwr-bits-threads-testing.mjs +41 -0
  87. package/fesm2022/ngwr-bits-threads-testing.mjs.map +1 -0
  88. package/fesm2022/ngwr-bits-threads.mjs +482 -0
  89. package/fesm2022/ngwr-bits-threads.mjs.map +1 -0
  90. package/fesm2022/ngwr-bits-tilt-card.mjs +6 -6
  91. package/fesm2022/ngwr-bits-typewriter.mjs +3 -3
  92. package/fesm2022/ngwr-bits-waves-testing.mjs.map +1 -1
  93. package/fesm2022/ngwr-bits-waves.mjs +60 -41
  94. package/fesm2022/ngwr-bits-waves.mjs.map +1 -1
  95. package/fesm2022/ngwr-breadcrumbs.mjs +8 -8
  96. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  97. package/fesm2022/ngwr-burger.mjs +3 -3
  98. package/fesm2022/ngwr-button.mjs +6 -6
  99. package/fesm2022/ngwr-calendar.mjs +3 -3
  100. package/fesm2022/ngwr-card.mjs +9 -9
  101. package/fesm2022/ngwr-carousel.mjs +6 -6
  102. package/fesm2022/ngwr-cascader.mjs +5 -5
  103. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  104. package/fesm2022/ngwr-charts-bar-chart-testing.mjs +127 -3
  105. package/fesm2022/ngwr-charts-bar-chart-testing.mjs.map +1 -1
  106. package/fesm2022/ngwr-charts-bar-chart.mjs +683 -49
  107. package/fesm2022/ngwr-charts-bar-chart.mjs.map +1 -1
  108. package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs +161 -0
  109. package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs.map +1 -0
  110. package/fesm2022/ngwr-charts-boxplot-chart.mjs +517 -0
  111. package/fesm2022/ngwr-charts-boxplot-chart.mjs.map +1 -0
  112. package/fesm2022/ngwr-charts-bullet-chart-testing.mjs +68 -0
  113. package/fesm2022/ngwr-charts-bullet-chart-testing.mjs.map +1 -0
  114. package/fesm2022/ngwr-charts-bullet-chart.mjs +459 -0
  115. package/fesm2022/ngwr-charts-bullet-chart.mjs.map +1 -0
  116. package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs +27 -0
  117. package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-charts-calendar-heatmap.mjs +96 -17
  119. package/fesm2022/ngwr-charts-calendar-heatmap.mjs.map +1 -1
  120. package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs +107 -0
  121. package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs.map +1 -0
  122. package/fesm2022/ngwr-charts-candlestick-chart.mjs +508 -0
  123. package/fesm2022/ngwr-charts-candlestick-chart.mjs.map +1 -0
  124. package/fesm2022/ngwr-charts-chart-legend-testing.mjs +126 -0
  125. package/fesm2022/ngwr-charts-chart-legend-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-charts-chart-legend.mjs +251 -0
  127. package/fesm2022/ngwr-charts-chart-legend.mjs.map +1 -0
  128. package/fesm2022/ngwr-charts-core.mjs +383 -0
  129. package/fesm2022/ngwr-charts-core.mjs.map +1 -0
  130. package/fesm2022/ngwr-charts-donut-chart-testing.mjs +10 -1
  131. package/fesm2022/ngwr-charts-donut-chart-testing.mjs.map +1 -1
  132. package/fesm2022/ngwr-charts-donut-chart.mjs +187 -31
  133. package/fesm2022/ngwr-charts-donut-chart.mjs.map +1 -1
  134. package/fesm2022/ngwr-charts-funnel-chart-testing.mjs +100 -0
  135. package/fesm2022/ngwr-charts-funnel-chart-testing.mjs.map +1 -0
  136. package/fesm2022/ngwr-charts-funnel-chart.mjs +415 -0
  137. package/fesm2022/ngwr-charts-funnel-chart.mjs.map +1 -0
  138. package/fesm2022/ngwr-charts-gauge-testing.mjs +9 -3
  139. package/fesm2022/ngwr-charts-gauge-testing.mjs.map +1 -1
  140. package/fesm2022/ngwr-charts-gauge.mjs +9 -15
  141. package/fesm2022/ngwr-charts-gauge.mjs.map +1 -1
  142. package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs +120 -0
  143. package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs.map +1 -0
  144. package/fesm2022/ngwr-charts-heatmap-chart.mjs +519 -0
  145. package/fesm2022/ngwr-charts-heatmap-chart.mjs.map +1 -0
  146. package/fesm2022/ngwr-charts-line-chart-testing.mjs +43 -1
  147. package/fesm2022/ngwr-charts-line-chart-testing.mjs.map +1 -1
  148. package/fesm2022/ngwr-charts-line-chart.mjs +436 -122
  149. package/fesm2022/ngwr-charts-line-chart.mjs.map +1 -1
  150. package/fesm2022/ngwr-charts-meter-group-testing.mjs +14 -2
  151. package/fesm2022/ngwr-charts-meter-group-testing.mjs.map +1 -1
  152. package/fesm2022/ngwr-charts-meter-group.mjs +101 -32
  153. package/fesm2022/ngwr-charts-meter-group.mjs.map +1 -1
  154. package/fesm2022/ngwr-charts-radar-chart-testing.mjs +98 -0
  155. package/fesm2022/ngwr-charts-radar-chart-testing.mjs.map +1 -0
  156. package/fesm2022/ngwr-charts-radar-chart.mjs +720 -0
  157. package/fesm2022/ngwr-charts-radar-chart.mjs.map +1 -0
  158. package/fesm2022/ngwr-charts-scatter-chart-testing.mjs +132 -0
  159. package/fesm2022/ngwr-charts-scatter-chart-testing.mjs.map +1 -0
  160. package/fesm2022/ngwr-charts-scatter-chart.mjs +545 -0
  161. package/fesm2022/ngwr-charts-scatter-chart.mjs.map +1 -0
  162. package/fesm2022/ngwr-charts-sparkline-testing.mjs.map +1 -1
  163. package/fesm2022/ngwr-charts-sparkline.mjs +14 -16
  164. package/fesm2022/ngwr-charts-sparkline.mjs.map +1 -1
  165. package/fesm2022/ngwr-charts-treemap-chart-testing.mjs +103 -0
  166. package/fesm2022/ngwr-charts-treemap-chart-testing.mjs.map +1 -0
  167. package/fesm2022/ngwr-charts-treemap-chart.mjs +535 -0
  168. package/fesm2022/ngwr-charts-treemap-chart.mjs.map +1 -0
  169. package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs +131 -0
  170. package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs.map +1 -0
  171. package/fesm2022/ngwr-charts-waterfall-chart.mjs +462 -0
  172. package/fesm2022/ngwr-charts-waterfall-chart.mjs.map +1 -0
  173. package/fesm2022/ngwr-checkbox.mjs +6 -6
  174. package/fesm2022/ngwr-clipboard.mjs +3 -3
  175. package/fesm2022/ngwr-collapse.mjs +9 -9
  176. package/fesm2022/ngwr-color-picker.mjs +6 -6
  177. package/fesm2022/ngwr-command-palette.mjs +3 -3
  178. package/fesm2022/ngwr-compare.mjs +3 -3
  179. package/fesm2022/ngwr-context-menu.mjs +12 -12
  180. package/fesm2022/ngwr-cookie.mjs +3 -3
  181. package/fesm2022/ngwr-counter.mjs +6 -6
  182. package/fesm2022/ngwr-date-picker.mjs +21 -21
  183. package/fesm2022/ngwr-date.mjs +6 -6
  184. package/fesm2022/ngwr-density.mjs +6 -6
  185. package/fesm2022/ngwr-descriptions.mjs +6 -6
  186. package/fesm2022/ngwr-dialog.mjs +15 -15
  187. package/fesm2022/ngwr-directives.mjs +12 -12
  188. package/fesm2022/ngwr-divider.mjs +3 -3
  189. package/fesm2022/ngwr-drawer.mjs +18 -18
  190. package/fesm2022/ngwr-dropdown.mjs +9 -9
  191. package/fesm2022/ngwr-editor.mjs +3 -3
  192. package/fesm2022/ngwr-empty.mjs +3 -3
  193. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  194. package/fesm2022/ngwr-file-upload.mjs +3 -3
  195. package/fesm2022/ngwr-form.mjs +9 -9
  196. package/fesm2022/ngwr-graph.mjs +6 -6
  197. package/fesm2022/ngwr-hotkey.mjs +6 -6
  198. package/fesm2022/ngwr-i18n-ar.mjs +90 -4
  199. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  200. package/fesm2022/ngwr-i18n-cs.mjs +90 -4
  201. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  202. package/fesm2022/ngwr-i18n-de.mjs +90 -4
  203. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  204. package/fesm2022/ngwr-i18n-en.mjs +90 -4
  205. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  206. package/fesm2022/ngwr-i18n-es.mjs +90 -4
  207. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  208. package/fesm2022/ngwr-i18n-fr.mjs +90 -4
  209. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  210. package/fesm2022/ngwr-i18n-he.mjs +90 -4
  211. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  212. package/fesm2022/ngwr-i18n-hi.mjs +90 -4
  213. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  214. package/fesm2022/ngwr-i18n-id.mjs +90 -4
  215. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  216. package/fesm2022/ngwr-i18n-it.mjs +90 -4
  217. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  218. package/fesm2022/ngwr-i18n-ja.mjs +90 -4
  219. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  220. package/fesm2022/ngwr-i18n-ko.mjs +90 -4
  221. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  222. package/fesm2022/ngwr-i18n-nl.mjs +90 -4
  223. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  224. package/fesm2022/ngwr-i18n-pl.mjs +90 -4
  225. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  226. package/fesm2022/ngwr-i18n-pt.mjs +90 -4
  227. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  228. package/fesm2022/ngwr-i18n-ru.mjs +90 -4
  229. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  230. package/fesm2022/ngwr-i18n-sv.mjs +90 -4
  231. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  232. package/fesm2022/ngwr-i18n-tr.mjs +90 -4
  233. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  234. package/fesm2022/ngwr-i18n-uk.mjs +90 -4
  235. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  236. package/fesm2022/ngwr-i18n-vi.mjs +90 -4
  237. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  238. package/fesm2022/ngwr-i18n-zh-tw.mjs +90 -4
  239. package/fesm2022/ngwr-i18n-zh-tw.mjs.map +1 -1
  240. package/fesm2022/ngwr-i18n-zh.mjs +90 -4
  241. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  242. package/fesm2022/ngwr-i18n.mjs +9 -9
  243. package/fesm2022/ngwr-icon.mjs +6 -6
  244. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  245. package/fesm2022/ngwr-input-number.mjs +3 -3
  246. package/fesm2022/ngwr-input-otp.mjs +3 -3
  247. package/fesm2022/ngwr-input.mjs +15 -15
  248. package/fesm2022/ngwr-keyboard.mjs +3 -3
  249. package/fesm2022/ngwr-knob.mjs +3 -3
  250. package/fesm2022/ngwr-layout.mjs +15 -15
  251. package/fesm2022/ngwr-lightbox.mjs +5 -5
  252. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  253. package/fesm2022/ngwr-list.mjs +8 -8
  254. package/fesm2022/ngwr-list.mjs.map +1 -1
  255. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  256. package/fesm2022/ngwr-mention.mjs +6 -6
  257. package/fesm2022/ngwr-meta.mjs +6 -6
  258. package/fesm2022/ngwr-overlay.mjs +6 -6
  259. package/fesm2022/ngwr-page-header.mjs +3 -3
  260. package/fesm2022/ngwr-pagination.mjs +3 -3
  261. package/fesm2022/ngwr-pipes.mjs +21 -21
  262. package/fesm2022/ngwr-platform.mjs +6 -6
  263. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  264. package/fesm2022/ngwr-popover.mjs +43 -20
  265. package/fesm2022/ngwr-popover.mjs.map +1 -1
  266. package/fesm2022/ngwr-progress.mjs +3 -3
  267. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  268. package/fesm2022/ngwr-qr.mjs +4 -3
  269. package/fesm2022/ngwr-qr.mjs.map +1 -1
  270. package/fesm2022/ngwr-radio.mjs +6 -6
  271. package/fesm2022/ngwr-rating.mjs +3 -3
  272. package/fesm2022/ngwr-result.mjs +12 -12
  273. package/fesm2022/ngwr-schema-form.mjs +3 -3
  274. package/fesm2022/ngwr-scroll.mjs +3 -3
  275. package/fesm2022/ngwr-segmented.mjs +3 -3
  276. package/fesm2022/ngwr-select.mjs +12 -12
  277. package/fesm2022/ngwr-sidebar.mjs +3 -3
  278. package/fesm2022/ngwr-skeleton.mjs +3 -3
  279. package/fesm2022/ngwr-slider.mjs +3 -3
  280. package/fesm2022/ngwr-sortable-list.mjs +11 -11
  281. package/fesm2022/ngwr-sortable-list.mjs.map +1 -1
  282. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  283. package/fesm2022/ngwr-spinner.mjs +3 -3
  284. package/fesm2022/ngwr-splitter.mjs +3 -3
  285. package/fesm2022/ngwr-statistic.mjs +9 -9
  286. package/fesm2022/ngwr-stepper.mjs +6 -6
  287. package/fesm2022/ngwr-storage.mjs +3 -3
  288. package/fesm2022/ngwr-switch.mjs +3 -3
  289. package/fesm2022/ngwr-table.mjs +18 -18
  290. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  291. package/fesm2022/ngwr-tabs.mjs +6 -6
  292. package/fesm2022/ngwr-textarea.mjs +3 -3
  293. package/fesm2022/ngwr-theme.mjs +3 -3
  294. package/fesm2022/ngwr-timeline.mjs +6 -6
  295. package/fesm2022/ngwr-toast-testing.mjs +2 -1
  296. package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
  297. package/fesm2022/ngwr-toast.mjs +34 -15
  298. package/fesm2022/ngwr-toast.mjs.map +1 -1
  299. package/fesm2022/ngwr-toolbar.mjs +3 -3
  300. package/fesm2022/ngwr-tour.mjs +6 -6
  301. package/fesm2022/ngwr-transfer.mjs +3 -3
  302. package/fesm2022/ngwr-tree.mjs +3 -3
  303. package/fesm2022/ngwr-typography.mjs +3 -3
  304. package/fesm2022/ngwr-utils.mjs +31 -1
  305. package/fesm2022/ngwr-utils.mjs.map +1 -1
  306. package/fesm2022/ngwr-version.mjs +1 -1
  307. package/fesm2022/ngwr-version.mjs.map +1 -1
  308. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  309. package/fesm2022/ngwr-window-testing.mjs +61 -5
  310. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  311. package/fesm2022/ngwr-window.mjs +1538 -895
  312. package/fesm2022/ngwr-window.mjs.map +1 -1
  313. package/fesm2022/ngwr.mjs.map +1 -1
  314. package/i18n/ar.json +84 -4
  315. package/i18n/cs.json +84 -4
  316. package/i18n/de.json +84 -4
  317. package/i18n/en.json +84 -4
  318. package/i18n/es.json +84 -4
  319. package/i18n/fr.json +84 -4
  320. package/i18n/he.json +84 -4
  321. package/i18n/hi.json +84 -4
  322. package/i18n/id.json +84 -4
  323. package/i18n/it.json +84 -4
  324. package/i18n/ja.json +84 -4
  325. package/i18n/ko.json +84 -4
  326. package/i18n/nl.json +84 -4
  327. package/i18n/pl.json +84 -4
  328. package/i18n/pt.json +84 -4
  329. package/i18n/ru.json +84 -4
  330. package/i18n/sv.json +84 -4
  331. package/i18n/tr.json +84 -4
  332. package/i18n/uk.json +84 -4
  333. package/i18n/vi.json +84 -4
  334. package/i18n/zh-TW.json +84 -4
  335. package/i18n/zh.json +84 -4
  336. package/llms-full.txt +266 -9
  337. package/llms.txt +30 -7
  338. package/mcp/api.js +69 -1
  339. package/mcp/catalog.js +10 -1
  340. package/mcp/server.js +15 -1
  341. package/mcp/tools.js +122 -26
  342. package/package.json +132 -1
  343. package/popover/styles/_index.scss +75 -7
  344. package/schematics/component-style/index.js +3 -0
  345. package/schematics/migrations/v15/index.js +3 -26
  346. package/schematics/ng-add/index.js +2 -2
  347. package/schematics/use/symbol-map.json +14 -0
  348. package/schematics/utility/global-styles.js +19 -4
  349. package/schematics/utility/v15-moves.js +55 -0
  350. package/skills/ngwr/SKILL.md +8 -2
  351. package/skills/ngwr/references/catalog.md +28 -0
  352. package/skills/ngwr/references/setup.md +5 -4
  353. package/theme/styles/_focus.scss +8 -0
  354. package/toast/styles/_index.scss +103 -12
  355. package/types/ngwr-bits-aurora.d.ts +11 -0
  356. package/types/ngwr-bits-border-glow-testing.d.ts +5 -6
  357. package/types/ngwr-bits-border-glow.d.ts +5 -1
  358. package/types/ngwr-bits-dot-grid-testing.d.ts +92 -0
  359. package/types/ngwr-bits-dot-grid.d.ts +158 -0
  360. package/types/ngwr-bits-iridescence-testing.d.ts +85 -0
  361. package/types/ngwr-bits-iridescence.d.ts +244 -0
  362. package/types/ngwr-bits-ripple-grid-testing.d.ts +96 -0
  363. package/types/ngwr-bits-ripple-grid.d.ts +294 -0
  364. package/types/ngwr-bits-splash-cursor.d.ts +0 -1
  365. package/types/ngwr-bits-spotlight-card-testing.d.ts +3 -1
  366. package/types/ngwr-bits-star-border-testing.d.ts +7 -7
  367. package/types/ngwr-bits-threads-testing.d.ts +97 -0
  368. package/types/ngwr-bits-threads.d.ts +216 -0
  369. package/types/ngwr-bits-waves-testing.d.ts +1 -1
  370. package/types/ngwr-bits-waves.d.ts +20 -3
  371. package/types/ngwr-charts-bar-chart-testing.d.ts +193 -14
  372. package/types/ngwr-charts-bar-chart.d.ts +546 -38
  373. package/types/ngwr-charts-boxplot-chart-testing.d.ts +165 -0
  374. package/types/ngwr-charts-boxplot-chart.d.ts +308 -0
  375. package/types/ngwr-charts-bullet-chart-testing.d.ts +99 -0
  376. package/types/ngwr-charts-bullet-chart.d.ts +262 -0
  377. package/types/ngwr-charts-calendar-heatmap-testing.d.ts +32 -1
  378. package/types/ngwr-charts-calendar-heatmap.d.ts +55 -6
  379. package/types/ngwr-charts-candlestick-chart-testing.d.ts +135 -0
  380. package/types/ngwr-charts-candlestick-chart.d.ts +361 -0
  381. package/types/ngwr-charts-chart-legend-testing.d.ts +84 -0
  382. package/types/ngwr-charts-chart-legend.d.ts +178 -0
  383. package/types/ngwr-charts-core.d.ts +391 -0
  384. package/types/ngwr-charts-donut-chart-testing.d.ts +28 -5
  385. package/types/ngwr-charts-donut-chart.d.ts +124 -12
  386. package/types/ngwr-charts-funnel-chart-testing.d.ts +130 -0
  387. package/types/ngwr-charts-funnel-chart.d.ts +296 -0
  388. package/types/ngwr-charts-gauge-testing.d.ts +5 -0
  389. package/types/ngwr-charts-gauge.d.ts +6 -4
  390. package/types/ngwr-charts-heatmap-chart-testing.d.ts +148 -0
  391. package/types/ngwr-charts-heatmap-chart.d.ts +359 -0
  392. package/types/ngwr-charts-line-chart-testing.d.ts +72 -11
  393. package/types/ngwr-charts-line-chart.d.ts +291 -67
  394. package/types/ngwr-charts-meter-group-testing.d.ts +16 -2
  395. package/types/ngwr-charts-meter-group.d.ts +71 -11
  396. package/types/ngwr-charts-radar-chart-testing.d.ts +162 -0
  397. package/types/ngwr-charts-radar-chart.d.ts +461 -0
  398. package/types/ngwr-charts-scatter-chart-testing.d.ts +147 -0
  399. package/types/ngwr-charts-scatter-chart.d.ts +396 -0
  400. package/types/ngwr-charts-sparkline-testing.d.ts +4 -1
  401. package/types/ngwr-charts-sparkline.d.ts +8 -6
  402. package/types/ngwr-charts-treemap-chart-testing.d.ts +131 -0
  403. package/types/ngwr-charts-treemap-chart.d.ts +295 -0
  404. package/types/ngwr-charts-waterfall-chart-testing.d.ts +149 -0
  405. package/types/ngwr-charts-waterfall-chart.d.ts +338 -0
  406. package/types/ngwr-color-picker.d.ts +0 -21
  407. package/types/ngwr-dropdown.d.ts +0 -52
  408. package/types/ngwr-editor.d.ts +2 -84
  409. package/types/ngwr-i18n.d.ts +0 -15
  410. package/types/ngwr-mention.d.ts +0 -13
  411. package/types/ngwr-popconfirm.d.ts +0 -33
  412. package/types/ngwr-popover.d.ts +29 -53
  413. package/types/ngwr-toast-testing.d.ts +6 -1
  414. package/types/ngwr-tour.d.ts +0 -2
  415. package/types/ngwr-utils.d.ts +49 -7
  416. package/types/ngwr-version.d.ts +1 -1
  417. package/types/ngwr-window-testing.d.ts +65 -7
  418. package/types/ngwr-window.d.ts +831 -207
  419. package/types/ngwr.d.ts +1 -0
  420. package/window/styles/_index.scss +528 -82
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-charts-meter-group.mjs","names":[],"sources":["../../../projects/lib/charts/meter-group/meter-group.ts","../../../projects/lib/charts/meter-group/meter-group.html"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n type ElementRef,\n LOCALE_ID,\n ViewEncapsulation,\n computed,\n inject,\n input,\n viewChildren,\n} from '@angular/core';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport { useChartTooltip } from 'ngwr/popover';\n\nimport type { WrMeterSegment } from './types';\n\n/**\n * Default series colours, in order.\n *\n * Four intents and the neutral role, and `info` is deliberately absent: it is the\n * same blue as `primary` to every reader (1.061:1 apart in light, 1.004:1 in\n * dark, and the same hue), so two adjacent series would be one series with a\n * seam. The neutral closes the list because it is the one tone here that no\n * intent is near — it used to be the `medium` intent, which v15 removed, and the\n * role resolves to the same step of the gray ramp.\n */\nconst FALLBACK_COLORS = [\n 'var(--wr-color-primary)',\n 'var(--wr-color-success)',\n 'var(--wr-color-warning)',\n 'var(--wr-color-danger)',\n 'var(--wr-color-on-surface-muted)',\n];\n\n/**\n * Stacked-segment progress bar. Visualises a breakdown of a total —\n * disk usage, budget, vote share, etc. Each segment contributes a slice\n * proportional to its `value` relative to the sum (or the explicit `max`).\n *\n * @example\n * ```html\n * <wr-meter-group\n * [segments]=\"[\n * { label: 'Used', value: 60 },\n * { label: 'Reserved', value: 25, color: 'var(--wr-color-warning)' }\n * ]\"\n * [max]=\"100\"\n * />\n * ```\n *\n * @see https://ngwr.dev/charts/meter-group\n */\n@Component({\n selector: 'wr-meter-group',\n templateUrl: './meter-group.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-meter-group' },\n})\nexport class WrMeterGroup {\n /** Accessible name — the role needs one. Falls back to `meterGroup.label`. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'meterGroup.label', 'Meter');\n\n /**\n * The parts of the bar, in order. Values are summed and each segment is drawn\n * as its share of that total, so they need not add up to anything in particular.\n */\n readonly segments = input<readonly WrMeterSegment[]>([]);\n\n /** Explicit total. When `0` (default), `max = sum(values)`. @default 0 */\n readonly max = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Show the labelled legend under the bar. @default true */\n readonly showLegend = input(true, { transform: coerceBooleanProperty });\n\n /** Show each segment's value in the legend, next to its label. @default true */\n readonly showValues = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Show a tooltip with the segment's label and value on hover. It replaces the\n * band's `title`, which is written only while this is off — or the browser would\n * open a second copy a moment later. @default true\n */\n readonly tooltip = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Writes every value in the legend and the tooltip, and the total the bar announces\n * as `aria-valuetext`. `null` uses `Intl.NumberFormat` in `LOCALE_ID`.\n * `aria-valuenow` stays a number.\n */\n readonly valueFormat = input<((value: number) => string) | null>(null);\n\n private readonly locale = inject(LOCALE_ID);\n private readonly numbers = new Intl.NumberFormat(this.locale);\n /** Below one, by significant digits, which keep 0.0004 from rounding to `0`. */\n private readonly smallNumbers = new Intl.NumberFormat(this.locale, { maximumSignificantDigits: 3 });\n\n private formatValue(value: number): string {\n const custom = this.valueFormat();\n if (custom) return custom(value);\n return (value !== 0 && Math.abs(value) < 1 ? this.smallNumbers : this.numbers).format(value);\n }\n\n private readonly sliceEls = viewChildren<ElementRef<HTMLElement>>('slice');\n\n /**\n * A segment's contribution, floored at `0` and with anything non-finite read\n * as `0`. One `NaN` used to poison the whole bar: the sum is `NaN` as soon as\n * one value is, so the total fell back to `1` and every OTHER segment was\n * asked for a width of `value * 100`%, while `aria-valuenow` announced `NaN`.\n */\n private static amount(raw: number): number {\n return Number.isFinite(raw) ? Math.max(0, raw) : 0;\n }\n\n protected readonly resolvedMax = computed(() => {\n const explicit = this.max();\n if (explicit > 0) return explicit;\n const sum = this.segments().reduce((acc, s) => acc + WrMeterGroup.amount(s.value), 0);\n return sum > 0 ? sum : 1;\n });\n\n /**\n * Sum of the segments, for `aria-valuenow`. `role=\"progressbar\"` without it\n * announces no value at all, so the bar was invisible to assistive tech.\n *\n * Capped at the total, because segments summing past an explicit `max` used\n * to announce a value outside the range they were announced against.\n */\n protected readonly totalValue = computed(() =>\n Math.min(\n this.resolvedMax(),\n this.segments().reduce((acc, s) => acc + WrMeterGroup.amount(s.value), 0)\n )\n );\n\n /**\n * The total as the bar announces it — `aria-valuetext`, written the way the legend\n * writes each figure — so a `valueFormat` that adds a unit reaches a screen reader\n * too, rather than a bare percentage of `aria-valuemax`. The gauge does the same.\n */\n protected readonly totalText = computed(() => this.formatValue(this.totalValue()));\n\n protected readonly slices = computed(() =>\n this.segments().map((segment, i) => ({\n label: segment.label,\n // The legend keeps a negative value visible — it is data the caller gave\n // us — but not a non-finite one, which reads as the literal text `NaN`.\n text: this.formatValue(Number.isFinite(segment.value) ? segment.value : 0),\n color: segment.color ?? FALLBACK_COLORS[i % FALLBACK_COLORS.length],\n percent: (WrMeterGroup.amount(segment.value) / this.resolvedMax()) * 100,\n }))\n );\n\n /**\n * One tooltip for the whole bar, pointing at the hovered band, with the value as\n * the legend prints it.\n */\n protected readonly tip = useChartTooltip(this.tooltip, index => {\n const slice = this.slices()[index];\n const el = this.sliceEls()[index]?.nativeElement;\n if (!slice || !el) return null;\n return { datum: { label: slice.label, value: slice.text, color: slice.color }, anchor: el };\n });\n}\n","<div\n class=\"wr-meter-group__bar\"\n role=\"progressbar\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"resolvedMax()\"\n [attr.aria-valuenow]=\"totalValue()\"\n [attr.aria-valuetext]=\"totalText()\"\n>\n @for (slice of slices(); track $index) {\n <!-- `data-label` is what the harness reads a band's label from; the `title` it\n used to read is only written while the tooltip is off. -->\n <span\n #slice\n class=\"wr-meter-group__slice\"\n [attr.title]=\"tooltip() ? null : slice.label\"\n [attr.data-label]=\"slice.label\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"\n (mouseenter)=\"tip.enter($index)\"\n (mouseleave)=\"tip.leave($event)\"\n ></span>\n }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n <ul class=\"wr-meter-group__legend\">\n @for (slice of slices(); track $index) {\n <li class=\"wr-meter-group__legend-item\">\n <span class=\"wr-meter-group__swatch\" aria-hidden=\"true\" [style.background]=\"slice.color\"></span>\n <span class=\"wr-meter-group__legend-label\">{{ slice.label }}</span>\n @if (showValues()) {\n <span class=\"wr-meter-group__legend-value\">{{ slice.text }}</span>\n }\n </li>\n }\n </ul>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-charts-meter-group.mjs","names":[],"sources":["../../../projects/lib/charts/meter-group/meter-group.ts","../../../projects/lib/charts/meter-group/meter-group.html"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { Component, type ElementRef, ViewEncapsulation, computed, input, model, viewChildren } from '@angular/core';\n\nimport { WR_CHART_LEGEND_BLOCK, WrChartLegend, type WrChartLegendItem } from 'ngwr/charts/chart-legend';\nimport { chartColor, useChartNumbers } from 'ngwr/charts/core';\nimport { useI18nText } from 'ngwr/i18n';\nimport { useChartTooltip } from 'ngwr/popover';\n\nimport type { WrMeterSegment } from './types';\n\n/**\n * Stacked-segment progress bar. Visualises a breakdown of a total —\n * disk usage, budget, vote share, etc. Each segment contributes a slice\n * proportional to its `value` relative to the sum of the segments shown (or the\n * explicit `max`).\n *\n * @example\n * ```html\n * <wr-meter-group\n * [segments]=\"[\n * { label: 'Used', value: 60 },\n * { label: 'Reserved', value: 25, color: 'var(--wr-color-warning)' }\n * ]\"\n * [max]=\"100\"\n * />\n * ```\n *\n * The legend is a `ul[wr-chart-legend]` (`ngwr/charts/chart-legend`), and with\n * `toggleableLegend` its rows show and hide their segments through `hiddenSegments`.\n *\n * @see https://ngwr.dev/charts/meter-group\n */\n@Component({\n selector: 'wr-meter-group',\n templateUrl: './meter-group.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-meter-group' },\n imports: [WrChartLegend],\n // The legend's rows keep the classes this chart drew before it drew them through\n // `WrChartLegend`: `.wr-meter-group__legend-item`, `__swatch`, `__legend-label` and\n // `__legend-value`.\n viewProviders: [{ provide: WR_CHART_LEGEND_BLOCK, useValue: 'wr-meter-group' }],\n})\nexport class WrMeterGroup {\n /** Accessible name — the role needs one. Falls back to `meterGroup.label`. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'meterGroup.label', 'Meter');\n\n /**\n * The parts of the bar, in order. Each segment is drawn as its share of `max` when\n * set, else of the sum of the segments shown, so they need not add up to anything in\n * particular.\n */\n readonly segments = input<readonly WrMeterSegment[]>([]);\n\n /** Explicit total, a capacity the segments fill. `0` (default) uses the sum of the segments shown. @default 0 */\n readonly max = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Show the labelled legend under the bar. @default true */\n readonly showLegend = input(true, { transform: coerceBooleanProperty });\n\n /** Show each segment's value in the legend, next to its label. @default true */\n readonly showValues = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Make each legend row a toggle button that shows and hides its segment, through\n * `hiddenSegments`. A row is a `<button aria-pressed>`, pressed while its segment is\n * shown, so the legend becomes one tab stop per segment. @default false\n */\n readonly toggleableLegend = input(false, { transform: coerceBooleanProperty });\n\n /**\n * The positions in `segments` of the segments that are hidden. Positions rather than\n * labels, since two segments may share a label. A toggleable legend writes it, and a\n * host may bind it with or without one: `[(hiddenSegments)]`.\n *\n * A hidden segment is left out of the bar and out of the sum. With no `max`, the\n * segments still shown share the whole bar between them, each at its share of their\n * own total, as `wr-donut-chart`'s slices do: the bar is the whole of what it draws.\n * An explicit `max` is a capacity rather than a sum, so it stays, and the hidden\n * segment's share becomes empty track. Either way the bar announces the total of the\n * segments shown (`aria-valuenow`, `aria-valuetext`), since that is what it draws, and\n * the tooltip cannot open on a segment that is not drawn. The legend keeps the hidden\n * segment's row, struck through and with its own value, so it can be shown again; the\n * row says \"hidden\" to a screen reader as well, through `aria-pressed` on a toggle and\n * a visually hidden word otherwise. A position past the end of `segments` is kept and\n * ignored.\n */\n readonly hiddenSegments = model<readonly number[]>([]);\n\n /**\n * Show a tooltip with the segment's label and value on hover. It replaces the\n * band's `title`, which is written only while this is off — or the browser would\n * open a second copy a moment later. @default true\n */\n readonly tooltip = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Writes every value in the legend and the tooltip, and the total the bar announces\n * as `aria-valuetext`. `null` uses `Intl.NumberFormat` in `LOCALE_ID`.\n * `aria-valuenow` stays a number.\n */\n readonly valueFormat = input<((value: number) => string) | null>(null);\n\n /** Each value as the legend, the tooltip and the bar print it: never compact, in `LOCALE_ID` unless `valueFormat` is given. */\n private readonly numbers = useChartNumbers(this.valueFormat);\n\n private readonly sliceEls = viewChildren<ElementRef<HTMLElement>>('slice');\n\n /**\n * A segment's contribution, floored at `0` and with anything non-finite read\n * as `0`. One `NaN` used to poison the whole bar: the sum is `NaN` as soon as\n * one value is, so the total fell back to `1` and every OTHER segment was\n * asked for a width of `value * 100`%, while `aria-valuenow` announced `NaN`.\n */\n private static amount(raw: number): number {\n return Number.isFinite(raw) ? Math.max(0, raw) : 0;\n }\n\n private readonly hidden = computed(() => new Set(this.hiddenSegments()));\n\n /** What the segments still shown add up to (see `hiddenSegments`). */\n private readonly shownSum = computed(() => {\n const hidden = this.hidden();\n return this.segments().reduce((acc, s, i) => acc + (hidden.has(i) ? 0 : WrMeterGroup.amount(s.value)), 0);\n });\n\n protected readonly resolvedMax = computed(() => {\n const explicit = this.max();\n if (explicit > 0) return explicit;\n const sum = this.shownSum();\n return sum > 0 ? sum : 1;\n });\n\n /**\n * Sum of the segments, for `aria-valuenow`. `role=\"progressbar\"` without it\n * announces no value at all, so the bar was invisible to assistive tech.\n *\n * Capped at the total, because segments summing past an explicit `max` used\n * to announce a value outside the range they were announced against.\n */\n protected readonly totalValue = computed(() => Math.min(this.resolvedMax(), this.shownSum()));\n\n /**\n * The total as the bar announces it — `aria-valuetext`, written the way the legend\n * writes each figure — so a `valueFormat` that adds a unit reaches a screen reader\n * too, rather than a bare percentage of `aria-valuemax`. The gauge does the same.\n */\n protected readonly totalText = computed(() => this.numbers.value(this.totalValue()));\n\n protected readonly slices = computed(() => {\n const hidden = this.hidden();\n const max = this.resolvedMax();\n return this.segments().map((segment, i) => ({\n index: i,\n label: segment.label,\n // The legend keeps a negative value visible — it is data the caller gave\n // us — but not a non-finite one, which reads as the literal text `NaN`.\n text: this.numbers.value(Number.isFinite(segment.value) ? segment.value : 0),\n color: segment.color ?? chartColor(i),\n hidden: hidden.has(i),\n percent: hidden.has(i) ? 0 : (WrMeterGroup.amount(segment.value) / max) * 100,\n }));\n });\n\n /**\n * The bands drawn, in order: every segment but the hidden ones. A hidden band is left\n * out rather than drawn at zero width, since a zero band still lays its gap over the\n * boundary and would leave a double one.\n */\n protected readonly bands = computed(() => this.slices().filter(slice => !slice.hidden));\n\n /** The legend's rows: every segment, hidden ones included, with its value unless `showValues` is off. */\n protected readonly legendItems = computed<readonly WrChartLegendItem[]>(() => {\n const values = this.showValues();\n return this.slices().map(({ label, color, text }) => ({ label, color, value: values ? text : null }));\n });\n\n /**\n * One tooltip for the whole bar, pointing at the hovered band, with the value as\n * the legend prints it. Asked by the segment's own position, and the drawn bands are\n * only the shown ones, so the band is found among them by that position.\n */\n protected readonly tip = useChartTooltip(this.tooltip, index => {\n const slice = this.slices()[index];\n if (!slice || slice.hidden) return null;\n const el = this.sliceEls()[this.bands().indexOf(slice)]?.nativeElement;\n if (!el) return null;\n return { datum: { label: slice.label, value: slice.text, color: slice.color }, anchor: el };\n });\n}\n","<div\n class=\"wr-meter-group__bar\"\n role=\"progressbar\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"resolvedMax()\"\n [attr.aria-valuenow]=\"totalValue()\"\n [attr.aria-valuetext]=\"totalText()\"\n>\n <!-- Only the shown segments draw a band; each keeps its segment's own position, which\n is what the tooltip looks it up by. `data-label` is what the harness reads a band's\n label from; the `title` it used to read is only written while the tooltip is off. -->\n @for (slice of bands(); track slice.index) {\n <span\n #slice\n class=\"wr-meter-group__slice\"\n [attr.title]=\"tooltip() ? null : slice.label\"\n [attr.data-label]=\"slice.label\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"\n (mouseenter)=\"tip.enter(slice.index)\"\n (mouseleave)=\"tip.leave($event)\"\n ></span>\n }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n <ul\n wr-chart-legend\n class=\"wr-meter-group__legend\"\n [items]=\"legendItems()\"\n [toggleable]=\"toggleableLegend()\"\n [(hiddenSeries)]=\"hiddenSegments\"\n ></ul>\n}\n"],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { ComponentHarness, HarnessPredicate } from "@angular/cdk/testing";
2
+ import { WrChartLegendHarness } from "ngwr/charts/chart-legend/testing";
3
+ /**
4
+ * @license
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
8
+ */
9
+ var TableRowHarness = class extends ComponentHarness {
10
+ static hostSelector = ".wr-chart-table tbody tr";
11
+ async read() {
12
+ const header = await this.locatorFor("th[scope=\"row\"]")();
13
+ const cells = await this.locatorForAll("td")();
14
+ return {
15
+ header: await header.text(),
16
+ cells: await Promise.all(cells.map((cell) => cell.text()))
17
+ };
18
+ }
19
+ };
20
+ var WrRadarChartHarness = class WrRadarChartHarness extends ComponentHarness {
21
+ static hostSelector = "wr-radar-chart";
22
+ static with(options = {}) {
23
+ return new HarnessPredicate(WrRadarChartHarness, options).addOption("ariaLabel", options.ariaLabel, (harness, label) => HarnessPredicate.stringMatches(harness.getAccessibleName(), label)).addOption("axisLabel", options.axisLabel, async (harness, label) => {
24
+ for (const axis of await harness.getAxisLabels()) if (await HarnessPredicate.stringMatches(axis, label)) return true;
25
+ return false;
26
+ });
27
+ }
28
+ async getAccessibleName() {
29
+ return (await this.locatorFor(".wr-radar-chart__svg")()).getAttribute("aria-label");
30
+ }
31
+ async getVariant() {
32
+ const host = await this.host();
33
+ if (await host.hasClass("wr-radar-chart--polar-area")) return "polar-area";
34
+ if (await host.hasClass("wr-radar-chart--polygon")) return "polygon";
35
+ throw new Error("WrRadarChartHarness.getVariant(): the host carries neither .wr-radar-chart--polygon nor .wr-radar-chart--polar-area. The component writes one unconditionally, so its absence is the bug.");
36
+ }
37
+ async getAxisLabels() {
38
+ const labels = await this.locatorForAll(".wr-radar-chart__axis-label")();
39
+ return Promise.all(labels.map((label) => label.text()));
40
+ }
41
+ async getRingLabels() {
42
+ const labels = await this.locatorForAll(".wr-radar-chart__ring-label")();
43
+ return Promise.all(labels.map((label) => label.text()));
44
+ }
45
+ async hasGrid() {
46
+ return await this.locatorForOptional(".wr-radar-chart__ring")() !== null;
47
+ }
48
+ async getPolygonCount() {
49
+ return (await this.locatorForAll(".wr-radar-chart__line")()).length;
50
+ }
51
+ async getPolygons() {
52
+ const lines = await this.locatorForAll(".wr-radar-chart__line")();
53
+ return Promise.all(lines.map(async (line) => ({
54
+ color: await line.getAttribute("stroke"),
55
+ dash: await line.getAttribute("stroke-dasharray") ?? "",
56
+ closed: /Z\s*$/i.test(await line.getAttribute("d") ?? "")
57
+ })));
58
+ }
59
+ async getAreaCount() {
60
+ return (await this.locatorForAll(".wr-radar-chart__area")()).length;
61
+ }
62
+ async getDotCount() {
63
+ return (await this.locatorForAll(".wr-radar-chart__dot")()).length;
64
+ }
65
+ async hasLegend() {
66
+ return await this.locatorForOptional(".wr-radar-chart__legend")() !== null;
67
+ }
68
+ async getLegendHarness() {
69
+ const legend = await this.locatorForOptional(WrChartLegendHarness)();
70
+ if (!legend) throw new Error("WrRadarChartHarness.getLegendHarness(): the chart draws no legend — `showLegend` is off or there are no series. Ask hasLegend() first.");
71
+ return legend;
72
+ }
73
+ async hasDataTable() {
74
+ return await this.locatorForOptional(".wr-chart-table")() !== null;
75
+ }
76
+ async getTableColumns() {
77
+ await this.assertDataTable("getTableColumns");
78
+ const headings = await this.locatorForAll(".wr-chart-table thead th[scope=\"col\"]")();
79
+ return Promise.all(headings.map((heading) => heading.text()));
80
+ }
81
+ async getTableRows() {
82
+ await this.assertDataTable("getTableRows");
83
+ const rows = await this.locatorForAll(TableRowHarness)();
84
+ return Promise.all(rows.map((row) => row.read()));
85
+ }
86
+ async getSize() {
87
+ const style = await (await this.locatorFor(".wr-radar-chart__surface")()).getAttribute("style");
88
+ const match = /width:\s*([\d.]+)px/.exec(style ?? "");
89
+ if (!match) throw new Error(`WrRadarChartHarness.getSize(): no inline width on .wr-radar-chart__surface (style: "${style ?? ""}"). The component writes one unconditionally, so its absence is the bug rather than a zero.`);
90
+ return Number.parseFloat(match[1]);
91
+ }
92
+ async assertDataTable(method) {
93
+ if (!await this.hasDataTable()) throw new Error(`WrRadarChartHarness.${method}(): the chart renders no data table — \`dataTable\` is off. Ask hasDataTable() first.`);
94
+ }
95
+ };
96
+ export { WrRadarChartHarness };
97
+
98
+ //# sourceMappingURL=ngwr-charts-radar-chart-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngwr-charts-radar-chart-testing.mjs","names":[],"sources":["../../../projects/lib/charts/radar-chart/testing/wr-radar-chart-harness.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\n\nimport { WrChartLegendHarness } from 'ngwr/charts/chart-legend/testing';\nimport type { WrRadarVariant } from 'ngwr/charts/radar-chart';\n\nimport type { WrRadarChartHarnessFilters, WrRadarChartPolygon, WrRadarChartTableRow } from './types';\n\n/**\n * One body row of the chart's data table, so its header and cells are read off the row\n * they sit in rather than matched up by position across the whole table.\n */\nclass TableRowHarness extends ComponentHarness {\n static hostSelector = '.wr-chart-table tbody tr';\n\n async read(): Promise<WrRadarChartTableRow> {\n const header = await this.locatorFor('th[scope=\"row\"]')();\n const cells = await this.locatorForAll('td')();\n return { header: await header.text(), cells: await Promise.all(cells.map(cell => cell.text())) };\n }\n}\n\n/**\n * Test harness for `<wr-radar-chart>`.\n *\n * **The polygons' geometry is not read.** Where a vertex lands moves with the scale and\n * the drawing's box, so this harness counts what was drawn and reads what is TEXT: the\n * axis names, the ring values, the legend and the data table. Those are what a reader\n * gets, and they are what breaks when the data wiring does. The one thing it does read off\n * a path is whether the outline CLOSES ({@link getPolygons}): a series with a missing\n * value is drawn open across the gap and never filled, and an outline closed across a\n * value the series does not have is exactly the defect worth catching.\n *\n * **The tooltip cannot be opened from a spec.** It follows the pointer by its angle from\n * the drawing's centre, measured off the drawing's box, which jsdom reports as 0×0 — so\n * there is deliberately no `hoverAxis()`. The numbers it would show are in the data table\n * (`dataTable`), which {@link getTableRows} reads, and which is where a screen reader\n * finds them too.\n *\n * Labels are positioned by the stylesheet from numbers the component writes; with no\n * layout in jsdom there is no method for where a label sits or whether it was ellipsised.\n *\n * @example\n * ```ts\n * const chart = await loader.getHarness(WrRadarChartHarness);\n *\n * expect(await chart.getAxisLabels()).toEqual(['Speed', 'Power', 'Range']);\n * expect(await chart.getPolygonCount()).toBe(2);\n * expect((await chart.getPolygons()).every(p => p.closed)).toBe(true);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrRadarChartHarness extends ComponentHarness {\n static hostSelector = 'wr-radar-chart';\n\n /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */\n static with(options: WrRadarChartHarnessFilters = {}): HarnessPredicate<WrRadarChartHarness> {\n return new HarnessPredicate(WrRadarChartHarness, options)\n .addOption('ariaLabel', options.ariaLabel, (harness, label) =>\n HarnessPredicate.stringMatches(harness.getAccessibleName(), label)\n )\n .addOption('axisLabel', options.axisLabel, async (harness, label) => {\n for (const axis of await harness.getAxisLabels()) {\n if (await HarnessPredicate.stringMatches(axis, label)) return true;\n }\n return false;\n });\n }\n\n /**\n * The drawing's accessible name — the only name it has. Read off the `<svg>`, which\n * carries the `img` role, rather than off the surface round it: a name on the wrapper\n * would take the axis names beside the drawing out of the accessibility tree.\n */\n async getAccessibleName(): Promise<string | null> {\n return (await this.locatorFor('.wr-radar-chart__svg')()).getAttribute('aria-label');\n }\n\n /**\n * How the chart draws its series (`variant`): `'polygon'` or `'polar-area'`, read off\n * the host's BEM modifier, which the component writes for either one.\n *\n * Throws when the host carries neither modifier rather than answering `'polygon'` by\n * default: a chart that lost its variant binding would otherwise read as the default\n * exactly when the binding is what broke.\n */\n async getVariant(): Promise<WrRadarVariant> {\n const host = await this.host();\n if (await host.hasClass('wr-radar-chart--polar-area')) return 'polar-area';\n if (await host.hasClass('wr-radar-chart--polygon')) return 'polygon';\n throw new Error(\n 'WrRadarChartHarness.getVariant(): the host carries neither .wr-radar-chart--polygon nor ' +\n '.wr-radar-chart--polar-area. The component writes one unconditionally, so its absence is the bug.'\n );\n }\n\n /** The axis names round the drawing, clockwise from twelve o'clock, as given — the full text, ellipsised or not. */\n async getAxisLabels(): Promise<string[]> {\n const labels = await this.locatorForAll('.wr-radar-chart__axis-label')();\n return Promise.all(labels.map(label => label.text()));\n }\n\n /** The ring values beside the first axis, from the outer ring in. `[]` with `showGrid` off. */\n async getRingLabels(): Promise<string[]> {\n const labels = await this.locatorForAll('.wr-radar-chart__ring-label')();\n return Promise.all(labels.map(label => label.text()));\n }\n\n /** Whether the web is drawn (`showGrid`): the rings and the spokes. */\n async hasGrid(): Promise<boolean> {\n return (await this.locatorForOptional('.wr-radar-chart__ring')()) !== null;\n }\n\n /**\n * How many series outlines were drawn: one per series shown that has at least one\n * value, and none at all with fewer than three axes. In the polar-area variant a\n * series' outline is the one silhouette round its wedges, so this still counts series,\n * not wedges.\n *\n * Worth comparing with the legend: both come from the same list, so a mismatch is a\n * series filtered out of one of them. The difference by design is a series hidden\n * through `hiddenSeries`, which keeps its legend row and draws no outline — the legend\n * harness's `getHidden()` names those.\n */\n async getPolygonCount(): Promise<number> {\n return (await this.locatorForAll('.wr-radar-chart__line')()).length;\n }\n\n /**\n * Every outline drawn, in order: the colour and dash the component wrote on it, and\n * whether it closes. Closed is read off the path's own closing command, which is what\n * makes a browser close the shape. In the polar-area variant the outline is the\n * silhouette round the series' wedges, which always closes, and a missing value is a\n * missing wedge — which {@link getDotCount} and the data table show instead.\n */\n async getPolygons(): Promise<WrRadarChartPolygon[]> {\n const lines = await this.locatorForAll('.wr-radar-chart__line')();\n return Promise.all(\n lines.map(async line => ({\n color: await line.getAttribute('stroke'),\n dash: (await line.getAttribute('stroke-dasharray')) ?? '',\n closed: /Z\\s*$/i.test((await line.getAttribute('d')) ?? ''),\n }))\n );\n }\n\n /**\n * How many polygons are filled (`fill`). Only a closed outline is ever filled, so with\n * `fill` on this is the number of closed outlines in {@link getPolygons}; anything more\n * is a fill drawn across a missing value. In the polar-area variant it is one per\n * series drawn, each fill covering that series' wedges.\n */\n async getAreaCount(): Promise<number> {\n return (await this.locatorForAll('.wr-radar-chart__area')()).length;\n }\n\n /** How many value dots were drawn across every series (`showDots`). A missing value has none. */\n async getDotCount(): Promise<number> {\n return (await this.locatorForAll('.wr-radar-chart__dot')()).length;\n }\n\n /** Whether the legend is rendered (`showLegend`, and at least one series). */\n async hasLegend(): Promise<boolean> {\n return (await this.locatorForOptional('.wr-radar-chart__legend')()) !== null;\n }\n\n /**\n * The legend, as a {@link WrChartLegendHarness}: each row's name, its key and its hidden\n * state and, with `toggleableLegend`, the toggles that show and hide a series.\n *\n * Throws when the chart draws no legend (`showLegend` off, or no series) rather than\n * answering with an empty one: {@link hasLegend} is the question for that.\n */\n async getLegendHarness(): Promise<WrChartLegendHarness> {\n const legend = await this.locatorForOptional(WrChartLegendHarness)();\n if (!legend) {\n throw new Error(\n 'WrRadarChartHarness.getLegendHarness(): the chart draws no legend — `showLegend` is off or there are no ' +\n 'series. Ask hasLegend() first.'\n );\n }\n return legend;\n }\n\n /** Whether the hidden data table is rendered (`dataTable`). */\n async hasDataTable(): Promise<boolean> {\n return (await this.locatorForOptional('.wr-chart-table')()) !== null;\n }\n\n /**\n * The data table's column headings: one per series shown, in order. Hidden series\n * leave the table.\n *\n * Throws when the chart renders no table (`dataTable` off) rather than answering with\n * no columns, which is also what a table of fully hidden series answers.\n */\n async getTableColumns(): Promise<string[]> {\n await this.assertDataTable('getTableColumns');\n const headings = await this.locatorForAll('.wr-chart-table thead th[scope=\"col\"]')();\n return Promise.all(headings.map(heading => heading.text()));\n }\n\n /**\n * The data table's rows, one per axis: its name and each series' own value, as a screen\n * reader walks them. A value outside a fixed `max` is drawn on the edge and tabulated as\n * itself, and a missing one is `''`.\n *\n * Throws when the chart renders no table (`dataTable` off), for the reason\n * {@link getTableColumns} gives.\n */\n async getTableRows(): Promise<WrRadarChartTableRow[]> {\n await this.assertDataTable('getTableRows');\n const rows = await this.locatorForAll(TableRowHarness)();\n return Promise.all(rows.map(row => row.read()));\n }\n\n /**\n * The drawing's diameter in pixels — `size` as the component wrote it — read off the\n * `style` ATTRIBUTE of the surface.\n *\n * NOT `getCssValue()`, which is `getComputedStyle()`: a computed read answers from the\n * LAID-OUT box, which agrees with the inline value in jsdom and disagrees in a browser,\n * where the drawing shrinks in a narrow container and sub-pixel rounding moves the rest.\n * A harness that answers differently in the two places it runs is worse than one that\n * refuses.\n */\n async getSize(): Promise<number> {\n const style = await (await this.locatorFor('.wr-radar-chart__surface')()).getAttribute('style');\n const match = /width:\\s*([\\d.]+)px/.exec(style ?? '');\n if (!match) {\n throw new Error(\n `WrRadarChartHarness.getSize(): no inline width on .wr-radar-chart__surface (style: \"${style ?? ''}\"). ` +\n 'The component writes one unconditionally, so its absence is the bug rather than a zero.'\n );\n }\n return Number.parseFloat(match[1]);\n }\n\n private async assertDataTable(method: string): Promise<void> {\n if (!(await this.hasDataTable())) {\n throw new Error(\n `WrRadarChartHarness.${method}(): the chart renders no data table — \\`dataTable\\` is off. Ask hasDataTable() first.`\n );\n }\n }\n}\n"],"mappings":"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"}