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
@@ -146,10 +146,11 @@ bootstrapApplication(App, {
146
146
  - `withTheme({ defaultMode: 'dark' })` from `ngwr/theme` — the default
147
147
  scheme and its storage key, and `WrTheme` created at boot.
148
148
  - `withToast({ … })` from `ngwr/toast`, `withStorage({ … })` from
149
- `ngwr/storage` and `withMeta({ … })` from `ngwr/meta` — toast defaults,
150
- the storage engine, prefix and TTL, and `<head>` defaults for every route.
151
- Like density and theme they configure a root service, so they belong at
152
- bootstrap.
149
+ `ngwr/storage`, `withMeta({ … })` from `ngwr/meta` and
150
+ `withWindows({ bounds })` from `ngwr/window` — toast defaults, the storage
151
+ engine, prefix and TTL, `<head>` defaults for every route, and the work area
152
+ floating windows keep inside. Like density and theme they configure a root
153
+ service, so they belong at bootstrap.
153
154
  - A `validation` namespace in your own i18n catalog — ngwr ships no validation
154
155
  copy. `<wr-form-field>` reads `validation.<key>` for an error whose validator
155
156
  carries no `{ message }`, with the error payload as params.
@@ -199,6 +199,14 @@
199
199
  @include focus-ring;
200
200
  }
201
201
 
202
+ // Chart legend rows — with `toggleable` each row is a `<button aria-pressed>`, in
203
+ // a standalone `ul[wr-chart-legend]` and in the legend every chart draws with one.
204
+ // Safe as an OUTSET ring: neither the legend nor the charts that render it set
205
+ // `overflow` on anything around the rows.
206
+ .wr-chart-legend__toggle:focus-visible {
207
+ @include focus-ring;
208
+ }
209
+
202
210
  // Pull to refresh — the host is the scroller, and a list of plain rows leaves
203
211
  // it the only thing a keyboard user can focus to scroll. An element's own
204
212
  // `overflow` does not clip its outline, so the ring stays OUTSET.
@@ -82,9 +82,33 @@ $toast-colors: (
82
82
  opacity: 0;
83
83
  pointer-events: none;
84
84
  }
85
+
86
+ // Only the front card shows its content while the stack is collapsed,
87
+ // and the cards behind take its height, so what peeks out under it is an
88
+ // even edge per level. Not an 8px one: each card behind is moved 8px per
89
+ // level and scaled by 5% per level about its anchored edge, so the edge
90
+ // is 8px less 5% of the front card's height — about 6px under a one-line
91
+ // toast, and nothing once the front card is 160px tall. Each card used to
92
+ // keep its own height, so a
93
+ // short front toast — a title alone, a one-line message — left the taller
94
+ // card behind it hanging past its bottom edge, with that card's last line
95
+ // reading through underneath at 70% opacity. The front toast is the last
96
+ // one in the DOM, whichever way the stack grows, and the host measures it
97
+ // into `--wr-toast-front-height`; until it has, each card keeps its own.
98
+ &:not(:last-of-type) {
99
+ block-size: var(--wr-toast-front-height, auto);
100
+
101
+ > * {
102
+ opacity: 0;
103
+ }
104
+ }
85
105
  }
86
106
  }
87
107
 
108
+ &--stack .wr-toast > * {
109
+ transition: opacity 240ms ease;
110
+ }
111
+
88
112
  // Bottom-anchored hosts: stack grows UPWARD (newest at the bottom).
89
113
  &--stack:not(.wr-toast-host--expanded).wr-toast-host--bottom,
90
114
  &--stack:not(.wr-toast-host--expanded).wr-toast-host--bottom-start,
@@ -148,6 +172,10 @@ $toast-colors: (
148
172
  --wr-toast-title-margin-bottom: var(--wr-space-xs);
149
173
  --wr-toast-title-font-size: var(--wr-text-sm);
150
174
  --wr-toast-title-font-weight: var(--wr-font-weight-semibold);
175
+ // The two line heights take a LENGTH. The glyph's offset and the actions
176
+ // row's height are `calc()`s over them, and a unitless value — valid for
177
+ // `line-height` itself — makes both invalid when the browser computes them:
178
+ // the glyph drops to the top of the line and the row to its buttons' height.
151
179
  --wr-toast-title-line-height: var(--wr-text-sm-leading);
152
180
  --wr-toast-message-font-size: var(--wr-text-sm);
153
181
  --wr-toast-message-line-height: var(--wr-text-sm-leading);
@@ -171,14 +199,18 @@ $toast-colors: (
171
199
  animation: wr-toast-in 0.18s ease-out;
172
200
  overflow: hidden;
173
201
 
174
- // The status glyph. Sized off the title's line box so it reads as part of the
175
- // first line rather than floating above it, and inked with the accent the
202
+ // The status glyph. Centred on the first line's box so it reads as part of
203
+ // that line rather than floating above it, and inked with the accent the
176
204
  // type already carries — the SHAPE is the channel, the colour reinforces it.
205
+ // The offset is derived from the line height rather than written as the 1px
206
+ // it comes to by default, so a toast whose first line is the message (see
207
+ // `--untitled` below) or whose line height was re-hooked to another length
208
+ // still lines up. A unitless one does not; see the hooks above.
177
209
  &__icon {
178
210
  flex: 0 0 auto;
179
211
  width: 1.125rem;
180
212
  height: 1.125rem;
181
- margin-block-start: 0.0625rem;
213
+ margin-block-start: calc((var(--wr-toast-title-line-height) - 1.125rem) / 2);
182
214
  color: var(--wr-toast-accent);
183
215
  }
184
216
 
@@ -193,6 +225,17 @@ $toast-colors: (
193
225
  font-size: var(--wr-toast-title-font-size);
194
226
  font-weight: var(--wr-toast-title-font-weight);
195
227
  line-height: var(--wr-toast-title-line-height);
228
+ // A filename or a URL as a title wraps, the way it does as a message.
229
+ // Without it the word ran on under the copy and close buttons and was cut
230
+ // off at the card's edge by its `overflow: hidden`.
231
+ overflow-wrap: break-word;
232
+
233
+ // The margin separates the title FROM the message, so a title with nothing
234
+ // under it carries none — left in, the card was 4px deeper below its one
235
+ // line than above it.
236
+ &:last-child {
237
+ margin-block-end: 0;
238
+ }
196
239
  }
197
240
 
198
241
  &__message {
@@ -203,21 +246,50 @@ $toast-colors: (
203
246
  overflow-wrap: break-word;
204
247
  }
205
248
 
249
+ // The buttons sit on the FIRST line: the row is exactly one line box tall and
250
+ // the buttons are centred in it, overflowing into the padding when they are
251
+ // taller than the line. Before, the row took the buttons' own height, so a
252
+ // one-line toast grew from 46px to 56.5px, its text sat 13px from the top and
253
+ // 23.5px from the bottom, and the × hung 5px below the line it closes.
206
254
  &__actions {
207
255
  flex: 0 0 auto;
208
256
  display: inline-flex;
209
257
  align-items: center;
210
258
  gap: var(--wr-toast-actions-gap);
259
+ block-size: var(--wr-toast-title-line-height);
260
+ }
261
+
262
+ // A toast with no title opens on its message, so that is the line the glyph
263
+ // and the buttons centre on.
264
+ &--untitled &__icon {
265
+ margin-block-start: calc((var(--wr-toast-message-line-height) - 1.125rem) / 2);
211
266
  }
212
267
 
268
+ &--untitled &__actions {
269
+ block-size: var(--wr-toast-message-line-height);
270
+ }
271
+
272
+ // A square, the way the alert's, dialog's and drawer's × are: the glyph plus
273
+ // the padding on every side, centred by flex. As an inline box the button
274
+ // took its height from the line box around an inline `<svg>` — glyph, strut
275
+ // and descender — and measured 23x30.5, so its hover tint was a tall pill.
276
+ // The 1.5rem floor is WCAG 2.5.8's 24px target, which the glyph alone missed
277
+ // by a pixel on a 15px page.
213
278
  &__action {
214
279
  appearance: none;
280
+ display: inline-flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ flex: 0 0 auto;
284
+ min-inline-size: 1.5rem;
285
+ min-block-size: 1.5rem;
215
286
  background: transparent;
216
287
  border: 0;
217
288
  padding: var(--wr-toast-action-padding);
218
289
  color: var(--wr-color-on-surface-muted);
219
290
  cursor: pointer;
220
291
  border-radius: var(--wr-toast-action-radius);
292
+ line-height: 0;
221
293
  transition:
222
294
  color var(--wr-transition-base),
223
295
  background var(--wr-transition-base);
@@ -231,10 +303,25 @@ $toast-colors: (
231
303
  // pill from 12px to 20px when it was tried there.
232
304
  font-size: inherit;
233
305
 
306
+ // A 44px hit area on a coarse pointer, from the shared mixin the alert's,
307
+ // dialog's and drawer's × use. The pair stays clear of each other through
308
+ // the touch gap at the end of this file.
309
+ @include theme.touch-target;
310
+
234
311
  &:hover {
235
312
  color: var(--wr-color-on-surface);
236
313
  background: var(--wr-color-hover);
237
314
  }
315
+
316
+ // The shared ring, as on the alert's, dialog's and drawer's ×. These two
317
+ // had no focus style at all, so a keyboard user landing on Close — which
318
+ // the host does on purpose after a dismissal — saw whatever the UA drew.
319
+ // OUTSET is safe: the button sits inside the toast's padding, which is
320
+ // wider than the ring's reach, so the toast's `overflow: hidden` does not
321
+ // cut it.
322
+ &:focus-visible {
323
+ @include theme.focus-ring;
324
+ }
238
325
  }
239
326
 
240
327
  &__progress {
@@ -359,19 +446,23 @@ $toast-colors: (
359
446
  align-self: stretch;
360
447
  }
361
448
 
362
- // Touch pointers: grow the per-toast action buttons (copy / dismiss) to ~32px
363
- // with a wider gap so the pair no longer sits 2px apart, and give the
364
- // dismiss-all bar a taller hit area. Fine pointers keep the compact desktop
365
- // sizing above.
449
+ // Touch pointers: grow the per-toast action buttons (copy / dismiss) to 32px,
450
+ // each with the shared 44px hit area, and give the dismiss-all bar a taller
451
+ // one. Fine pointers keep the compact desktop sizing above.
452
+ //
453
+ // The gap defaults to 0.75rem because that is what keeps two 44px halos on
454
+ // 32px buttons from overlapping: centres 44px apart, so at rest they abut
455
+ // exactly. It is the HOOK's default that moves, not the row's `gap`, so an
456
+ // app's own `--wr-toast-actions-gap` still applies on a touch screen. Before,
457
+ // this block re-declared the hook as the 4px it already was, under a comment
458
+ // promising a wider gap, and there was no halo at all: the hit area was the
459
+ // 32px button.
366
460
  @media (pointer: coarse) {
367
- .wr-toast__actions {
368
- gap: var(--wr-toast-actions-gap);
461
+ .wr-toast {
462
+ --wr-toast-actions-gap: 0.75rem;
369
463
  }
370
464
 
371
465
  .wr-toast__action {
372
- display: inline-flex;
373
- align-items: center;
374
- justify-content: center;
375
466
  width: 2rem;
376
467
  height: 2rem;
377
468
  padding: 0;
@@ -7,6 +7,10 @@ import * as i0 from "@angular/core";
7
7
  * Under `prefers-reduced-motion` a single static frame is drawn, and drawn
8
8
  * again in the new colours when the page's colour scheme switches.
9
9
  *
10
+ * Under forced colours the canvas is hidden and its loop stops with it, leaving the
11
+ * box on the palette's own ground, which is what forced text and marks are chosen
12
+ * against. The loop also stops off screen and with no box to draw on.
13
+ *
10
14
  * @example
11
15
  * ```html
12
16
  * <div style="position: relative; min-height: 24rem; overflow: hidden">
@@ -40,10 +44,17 @@ export declare class WrAurora {
40
44
  private gl;
41
45
  private uniforms;
42
46
  private rafId;
47
+ /** The shader time last drawn, so a resize can repaint the frame it just cleared. */
48
+ private time;
43
49
  /** Flips once `boot()` has a context and a program — the loop waits for it. */
44
50
  private readonly booted;
45
51
  /** Whether the host is in the viewport; stays `true` without an observer. */
46
52
  private readonly onScreen;
53
+ /**
54
+ * Whether the box has an area. The intersection observer calls a zero-area canvas
55
+ * intersecting and sends no entry when it gains a size, so this reads the box instead.
56
+ */
57
+ private readonly hasBox;
47
58
  constructor();
48
59
  private boot;
49
60
  private pushUniforms;
@@ -32,11 +32,10 @@ interface WrBorderGlowHarnessFilters extends BaseHarnessFilters {
32
32
  * {@link parseInlineDeclarations} for why a computed read would be a different, and
33
33
  * wrong, question.
34
34
  *
35
- * **A colour getter answering `null` means the component has never written that
36
- * variable**, which is the contract when the input is unset: the stylesheet's per-theme
37
- * default takes over. Note that it does not un-write them either — setting `[glowColor]`
38
- * and then putting it back to `null` leaves the last value on the host — so `null` is
39
- * "never set", not "not set now".
35
+ * **A colour getter answering `null` means that variable is not on the host now**, which
36
+ * is the contract when the input is unset or its value was refused: the stylesheet's
37
+ * per-theme default takes over. An input set and then put back to `null` comes off the
38
+ * host, so `null` says nothing about whether it was ever set.
40
39
  *
41
40
  * There is deliberately no `getGlowOpacity()`, `isGlowVisible()` or `isHovered()`: the
42
41
  * visible strength is a `calc()` in the stylesheet gated behind `:not(:hover)`, and
@@ -103,7 +102,7 @@ export declare class WrBorderGlowHarness extends ComponentHarness {
103
102
  getGlowColor(): Promise<string | null>;
104
103
  /**
105
104
  * The seven halo alphas in percent, brightest first, or `null` when no glow colour
106
- * was ever set.
105
+ * is set.
107
106
  *
108
107
  * This is the whole of `[glowIntensity]`: the steps are `[100, 60, 50, 40, 30, 20,
109
108
  * 10]` multiplied by the intensity and clamped at 100, so `0.5` gives
@@ -23,7 +23,11 @@ import * as i0 from "@angular/core";
23
23
  * @see https://www.reactbits.dev/components/border-glow (visual reference)
24
24
  */
25
25
  export declare class WrBorderGlow {
26
- /** Card background fill. When unset, uses the theme surface token. */
26
+ /**
27
+ * Card background fill. When unset, uses the theme surface token. A hook set inline on
28
+ * the same element is replaced by this input and does not come back when it is unset,
29
+ * so set it from a stylesheet rule. The same goes for `glowColor` and `colors`.
30
+ */
27
31
  readonly backgroundColor: import("@angular/core").InputSignal<string | null>;
28
32
  /** Corner radius in pixels. @default 28 */
29
33
  readonly borderRadius: import("@angular/core").InputSignalWithTransform<number, unknown>;
@@ -0,0 +1,92 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from "@angular/cdk/testing";
2
+ /** Narrows which `<wr-dot-grid>` a harness query matches. */
3
+ interface WrDotGridHarnessFilters extends BaseHarnessFilters {
4
+ /**
5
+ * Match only grids whose canvas has drawn (`true`) or only grids still showing the
6
+ * stand-in dots (`false`). A dot grid has no name of its own, so this is the one
7
+ * state that tells two of them apart — see `WrDotGridHarness.isPainted`, which
8
+ * explains why the answer is always `false` in a unit test.
9
+ */
10
+ readonly painted?: boolean;
11
+ }
12
+ /**
13
+ * Test harness for `<wr-dot-grid>` — a field of dots that light up and move aside
14
+ * near the pointer.
15
+ *
16
+ * **The dots themselves are unreadable and always will be.** They are fills on a 2D
17
+ * canvas, laid out from the host's measured box; a unit test has no box and no
18
+ * drawing context, so there is nothing to count and nothing to compare. What the
19
+ * component publishes to the DOM is small and deliberate: the handover flag
20
+ * {@link isPainted}, the pitch {@link getGapPx} and size {@link getDotSizePx} the CSS
21
+ * stand-in grid draws at before the canvas takes over, and the surface itself.
22
+ *
23
+ * Both numbers are read from the host's inline declaration, never computed: the
24
+ * stylesheet declares `--wr-dot-grid-gap` and `--wr-dot-grid-dot-size` too, as the
25
+ * stand-in's own defaults, so a computed read would answer `24` and `3` on a
26
+ * component that had stopped publishing anything — the break the methods exist to
27
+ * catch.
28
+ *
29
+ * There is no `getDotCount()`, `getDotPositions()` or `getCanvasSize()`: the grid is
30
+ * laid out from `getBoundingClientRect()`, which is 0×0 here, and what falls out of
31
+ * that describes nothing. No `getDotColor()` or `getActiveColor()` — they are canvas
32
+ * fills resolved from themed custom properties that only a stylesheet supplies. No
33
+ * `hover()` or `moveTo()`: the pointer listeners go on only once a context exists,
34
+ * and what they move is canvas pixels. And no `isReducedMotion()`: the still grid is
35
+ * drawn through the same code and sets the same flag, so the DOM is identical either
36
+ * way and any answer would be a guess.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const grid = await loader.getHarness(WrDotGridHarness);
41
+ *
42
+ * expect(await grid.hasCanvas()).toBe(true);
43
+ * expect(await grid.isDecorative()).toBe(true);
44
+ * expect(await grid.getGapPx()).toBe(24);
45
+ * ```
46
+ *
47
+ * @see https://ngwr.dev/guides/testing
48
+ */
49
+ export declare class WrDotGridHarness extends ComponentHarness {
50
+ static hostSelector: string;
51
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
52
+ static with(options?: WrDotGridHarnessFilters): HarnessPredicate<WrDotGridHarness>;
53
+ private readonly canvas;
54
+ /**
55
+ * Whether the canvas has drawn a frame and retired the CSS stand-in grid.
56
+ *
57
+ * **In a unit test this is always `false`, and asserting exactly that is the point.**
58
+ * jsdom hands back no 2D context, so the component must leave the stand-in up rather
59
+ * than declare itself painted over a blank box — the flag is set inside the draw for
60
+ * that reason, not at the end of the boot. A spec that waits for this to turn `true`
61
+ * waits forever.
62
+ */
63
+ isPainted(): Promise<boolean>;
64
+ /**
65
+ * The distance between dot centres, in pixels, as the component publishes it —
66
+ * `[gap]`, floored at the 4px the canvas lays the grid out at.
67
+ *
68
+ * The canvas half of `[gap]` is invisible here, but the stand-in half is not, and a
69
+ * stand-in drawing at one pitch while the canvas arrives at another changes the
70
+ * grid under the reader on hydration.
71
+ */
72
+ getGapPx(): Promise<number>;
73
+ /** The dot diameter, in pixels, as the component publishes it for the stand-in — `[dotSize]`. */
74
+ getDotSizePx(): Promise<number>;
75
+ /**
76
+ * Whether the grid is hidden from assistive tech.
77
+ *
78
+ * A background canvas has nothing to announce, so losing this leaves a screen reader
79
+ * stopping on a nameless graphic in front of the section's actual content.
80
+ */
81
+ isDecorative(): Promise<boolean>;
82
+ /**
83
+ * Whether the drawing surface is in the markup.
84
+ *
85
+ * It is there in every state, including the ones where nothing is ever drawn on it —
86
+ * prerendered, no 2D context, reduced motion — so the stand-in has something to sit
87
+ * behind and {@link isPainted} has something to answer about.
88
+ */
89
+ hasCanvas(): Promise<boolean>;
90
+ private publishedPx;
91
+ }
92
+ export type { WrDotGridHarnessFilters };
@@ -0,0 +1,158 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Dot-grid background — evenly spaced dots on a 2D canvas that light up in the
4
+ * active colour near the pointer and are pushed away from it, both by the same
5
+ * falloff, then spring back. Fills its nearest positioned ancestor; put it
6
+ * behind hero copy or section content.
7
+ *
8
+ * The pointer is followed on the host's PARENT, with passive listeners, so the
9
+ * dots answer a pointer that is over the content in front of them rather than
10
+ * over the canvas — the host itself takes no pointer events and never steals a
11
+ * click. Placed directly in a shadow root, where it has no parent element, it
12
+ * follows the pointer on the shadow host; with neither it listens nowhere and
13
+ * the grid stays unlit. Content placed after it needs `position: relative` (or
14
+ * any z-index) to paint above it, as with any absolutely positioned layer.
15
+ *
16
+ * The grid is laid out in the host's own box, before transforms, so one that
17
+ * boots inside a scaling-in panel (a dialog opening) is not stretched when the
18
+ * animation ends, and the pointer is mapped back through the transform.
19
+ *
20
+ * Decorative: the canvas is `aria-hidden`, the host has no role and nothing in
21
+ * it takes focus. The frame loop runs only while something moves — a still
22
+ * grid asks for no frames at all — and never while the host is off screen.
23
+ *
24
+ * Under `prefers-reduced-motion` one still grid is drawn, in the resting
25
+ * colour, and nothing follows the pointer; it is drawn again when the colours
26
+ * or the page's colour scheme change. The preference is read live.
27
+ *
28
+ * Colours are theme tokens by default — the dots `--wr-border-strong`, the lit
29
+ * ones `--wr-color-primary` — through the `--wr-dot-grid-dot-color` and
30
+ * `--wr-dot-grid-active-color` hooks, and resolved before they reach the
31
+ * canvas, which reads neither a `var()` nor a `light-dark()`.
32
+ *
33
+ * @example
34
+ * ```html
35
+ * <section style="position: relative; min-height: 24rem; overflow: hidden">
36
+ * <wr-dot-grid />
37
+ * <h1 style="position: relative">Hero copy above the dots</h1>
38
+ * </section>
39
+ * ```
40
+ *
41
+ * @see https://ngwr.dev/bits/dot-grid
42
+ */
43
+ export declare class WrDotGrid {
44
+ /** Dot diameter in px. @default 3 */
45
+ readonly dotSize: import("@angular/core").InputSignalWithTransform<number, unknown>;
46
+ /** Distance between dot centres in px, never under 4. @default 24 */
47
+ readonly gap: import("@angular/core").InputSignalWithTransform<number, unknown>;
48
+ /** Resting dot colour, any CSS colour. When unset, empty or blank, `--wr-dot-grid-dot-color` decides. */
49
+ readonly dotColor: import("@angular/core").InputSignal<string | null>;
50
+ /** Colour a dot takes near the pointer, any CSS colour. When unset, empty or blank, `--wr-dot-grid-active-color` decides. */
51
+ readonly activeColor: import("@angular/core").InputSignal<string | null>;
52
+ /** How far from the pointer a dot still reacts, in px. @default 120 */
53
+ readonly radius: import("@angular/core").InputSignalWithTransform<number, unknown>;
54
+ /**
55
+ * How far a dot right by the pointer is pushed, in px; the push fades out
56
+ * toward `radius`. `0` keeps the dots in place and only lights them, and a
57
+ * negative value pulls them in. @default 12
58
+ */
59
+ readonly strength: import("@angular/core").InputSignalWithTransform<number, unknown>;
60
+ /** The pitch the grid is laid out at: `gap`, floored. */
61
+ protected readonly pitch: import("@angular/core").Signal<number>;
62
+ /** The dot diameter drawn: `dotSize`, never negative. */
63
+ protected readonly size: import("@angular/core").Signal<number>;
64
+ /** A colour the author chose, published so the stand-in draws in it too; `null` while the hook decides. */
65
+ protected readonly standInColor: import("@angular/core").Signal<string | null>;
66
+ /** The colours the canvas resolves: an input that is unset, empty or blank leaves the hook in charge. */
67
+ private readonly dotExpression;
68
+ private readonly activeExpression;
69
+ /**
70
+ * Flips once the canvas has drawn, which retires the CSS stand-in grid.
71
+ *
72
+ * A canvas cannot be prerendered, so on an SSR'd page it is blank until the
73
+ * bundle has loaded and hydrated. The stylesheet paints the same dots at the
74
+ * same pitch from the prerendered HTML in the meantime, and this hands over.
75
+ */
76
+ protected readonly painted: import("@angular/core").WritableSignal<boolean>;
77
+ private readonly canvasRef;
78
+ private readonly host;
79
+ private readonly zone;
80
+ private readonly destroyRef;
81
+ private readonly platform;
82
+ private readonly isBrowser;
83
+ private ctx;
84
+ /** The host's layout box, in CSS pixels before any transform: what the grid is laid out in. */
85
+ private box;
86
+ /** Bitmap pixels per CSS pixel the canvas is backed at; 0 until the first fit. */
87
+ private ratio;
88
+ private dots;
89
+ /** Lit dots by alpha step, reused frame to frame. */
90
+ private readonly lit;
91
+ /** The pointer, in viewport coordinates, and whether it is over the parent at all. */
92
+ private readonly pointer;
93
+ private rafId;
94
+ private lastTime;
95
+ /** Schedules a frame while motion is allowed; `null` under reduced motion. */
96
+ private wake;
97
+ /** Flips once `boot()` has a context and a grid — everything after waits for it. */
98
+ private readonly booted;
99
+ constructor();
100
+ private boot;
101
+ /** Follow the pointer and draw on demand; returns what stops both. */
102
+ private interact;
103
+ /** Draw the grid as it should look now: a frame while motion is allowed, at once under reduced motion. */
104
+ private requestDraw;
105
+ /** Fit the canvas to a new box or pixel ratio and, when that cleared it, repaint at once. */
106
+ private resize;
107
+ /**
108
+ * Back the canvas for a `width` × `height` box, in CSS pixels, at the screen's
109
+ * pixel ratio. Returns whether anything changed: writing `canvas.width` clears
110
+ * the bitmap even to the value it already has, so an unchanged box is left alone.
111
+ */
112
+ private fit;
113
+ /** Lay the dots out over the box, every one at rest. */
114
+ private placeDots;
115
+ /** Positions along one side of `length`: the centre, then every `gap` out to one step past each edge. */
116
+ private axis;
117
+ /** Every dot back at rest and unlit, and the pointer gone. */
118
+ private rest;
119
+ private tick;
120
+ /** Advance every dot by `step` frames; returns whether any is still moving. */
121
+ private move;
122
+ private draw;
123
+ /** One path for every dot in `dots`, filled once. */
124
+ private fillDots;
125
+ static ɵfac: i0.ɵɵFactoryDeclaration<WrDotGrid, never>;
126
+ static ɵcmp: i0.ɵɵComponentDeclaration<WrDotGrid, "wr-dot-grid", never, {
127
+ "dotSize": {
128
+ "alias": "dotSize";
129
+ "required": false;
130
+ "isSignal": true;
131
+ };
132
+ "gap": {
133
+ "alias": "gap";
134
+ "required": false;
135
+ "isSignal": true;
136
+ };
137
+ "dotColor": {
138
+ "alias": "dotColor";
139
+ "required": false;
140
+ "isSignal": true;
141
+ };
142
+ "activeColor": {
143
+ "alias": "activeColor";
144
+ "required": false;
145
+ "isSignal": true;
146
+ };
147
+ "radius": {
148
+ "alias": "radius";
149
+ "required": false;
150
+ "isSignal": true;
151
+ };
152
+ "strength": {
153
+ "alias": "strength";
154
+ "required": false;
155
+ "isSignal": true;
156
+ };
157
+ }, {}, never, never, true, never>;
158
+ }
@@ -0,0 +1,85 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from "@angular/cdk/testing";
2
+ /** Narrows which `<wr-iridescence>` a harness query matches. */
3
+ interface WrIridescenceHarnessFilters extends BaseHarnessFilters {
4
+ /**
5
+ * Match only hosts whose canvas has drawn (`true`) or only hosts still showing the
6
+ * stand-in alone (`false`). The background has no name of its own, so this is the one
7
+ * state that tells two of them apart — see `WrIridescenceHarness.isPainted`, which
8
+ * says when each answer is the right one in a unit test.
9
+ */
10
+ readonly painted?: boolean;
11
+ }
12
+ /**
13
+ * Test harness for `<wr-iridescence>` — folded silk on a WebGL2 canvas.
14
+ *
15
+ * **The picture is unreadable and always will be.** It is a fragment shader's output,
16
+ * and jsdom has no WebGL2 to run one. What the component publishes to the DOM is small
17
+ * and deliberate: the handover flag {@link isPainted}, the colour {@link getColor} it
18
+ * hands the CSS stand-in, and the surface itself.
19
+ *
20
+ * The colour is read from the host's inline declaration, a variable of the component's
21
+ * own. The `--wr-iridescence-color` hook belongs to the author and the stylesheet, so it
22
+ * says nothing about what the component published.
23
+ *
24
+ * There is no `getPhase()`: the phases live in a frame loop, step by the real frame
25
+ * delta and leave the component only as a uniform, so any number would be a stale copy
26
+ * of an implementation detail. No pixel reads: a stub context paints nothing, and with
27
+ * no stub there is no context. No `isAnimating()`: a loop that is running and a loop
28
+ * that was never started look the same from the DOM, and a frame that would repeat the
29
+ * last one draws nothing either way. And no `stir()`: the pointer's easing runs on
30
+ * frames and its result goes to a uniform, so a method that moved it could report
31
+ * nothing it had done.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const silk = await loader.getHarness(WrIridescenceHarness);
36
+ *
37
+ * expect(await silk.hasCanvas()).toBe(true);
38
+ * expect(await silk.isDecorative()).toBe(true);
39
+ * expect(await silk.getColor()).toBe('var(--wr-color-primary)');
40
+ * ```
41
+ *
42
+ * @see https://ngwr.dev/guides/testing
43
+ */
44
+ export declare class WrIridescenceHarness extends ComponentHarness {
45
+ static hostSelector: string;
46
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
47
+ static with(options?: WrIridescenceHarnessFilters): HarnessPredicate<WrIridescenceHarness>;
48
+ private readonly canvas;
49
+ /**
50
+ * Whether the canvas has drawn a frame and is fading in over the CSS stand-in.
51
+ *
52
+ * **In a plain unit test this is `false`, and asserting exactly that is the point.**
53
+ * jsdom hands back no WebGL2 context, so the component must leave the stand-in up
54
+ * rather than declare itself painted over a blank box: the flag is set inside the draw
55
+ * for that reason, not at the end of the boot. A spec that stubs a context and runs a
56
+ * frame gets `true`, and a lost context takes it back to `false`.
57
+ */
58
+ isPainted(): Promise<boolean>;
59
+ /**
60
+ * The colour published on the host's own `--wr-iridescence-input-color` for the stand-in,
61
+ * or `null` when none is: `[color]` unset, empty or blank, which leaves the stylesheet's
62
+ * value in charge.
63
+ *
64
+ * It is the input as authored, a `var()` or a `light-dark()` included, not what it
65
+ * resolves to: what reaches the shader is a uniform, which the DOM does not carry. A
66
+ * stand-in tinted one colour while the canvas arrives in another is what this catches.
67
+ */
68
+ getColor(): Promise<string | null>;
69
+ /**
70
+ * Whether the background is hidden from assistive tech.
71
+ *
72
+ * A background canvas has nothing to announce, so losing this leaves a screen reader
73
+ * stopping on a nameless graphic in front of the section's actual content.
74
+ */
75
+ isDecorative(): Promise<boolean>;
76
+ /**
77
+ * Whether the drawing surface is in the markup.
78
+ *
79
+ * It is there in every state, including the ones where nothing is ever drawn on it
80
+ * (prerendered, no WebGL2, a shader the driver refused), so the stand-in has something
81
+ * to sit behind and {@link isPainted} has something to answer about.
82
+ */
83
+ hasCanvas(): Promise<boolean>;
84
+ }
85
+ export type { WrIridescenceHarnessFilters };