ngwr 10.2.0 → 11.0.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 (471) hide show
  1. package/README.md +39 -19
  2. package/anchor/styles/_index.scss +4 -4
  3. package/back-top/styles/_index.scss +6 -1
  4. package/blur-text/styles/_index.scss +13 -0
  5. package/button/styles/_index.scss +11 -6
  6. package/carousel/styles/_index.scss +13 -2
  7. package/cascader/styles/_index.scss +2 -2
  8. package/circular-text/styles/_index.scss +2 -0
  9. package/collapse/styles/_index.scss +1 -1
  10. package/color-picker/styles/_index.scss +6 -1
  11. package/compare/styles/_index.scss +1 -2
  12. package/context-menu/styles/_index.scss +6 -1
  13. package/descriptions/styles/_index.scss +2 -2
  14. package/dialog/styles/_index.scss +38 -0
  15. package/drawer/styles/_index.scss +20 -1
  16. package/dropdown/styles/_index.scss +19 -5
  17. package/empty/styles/_index.scss +10 -0
  18. package/fesm2022/ngwr-action-sheet.mjs +15 -5
  19. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  20. package/fesm2022/ngwr-affix.mjs +43 -16
  21. package/fesm2022/ngwr-affix.mjs.map +1 -1
  22. package/fesm2022/ngwr-alert.mjs +3 -3
  23. package/fesm2022/ngwr-anchor.mjs +20 -8
  24. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  25. package/fesm2022/ngwr-aurora.mjs +4 -4
  26. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  27. package/fesm2022/ngwr-avatar.mjs +33 -9
  28. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  29. package/fesm2022/ngwr-back-top.mjs +8 -4
  30. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  31. package/fesm2022/ngwr-badge.mjs +6 -6
  32. package/fesm2022/ngwr-badge.mjs.map +1 -1
  33. package/fesm2022/ngwr-bar-chart.mjs +32 -11
  34. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  35. package/fesm2022/ngwr-blur-text.mjs +4 -4
  36. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  37. package/fesm2022/ngwr-border-glow.mjs +4 -4
  38. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  39. package/fesm2022/ngwr-breadcrumbs.mjs +9 -8
  40. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  41. package/fesm2022/ngwr-burger.mjs +11 -6
  42. package/fesm2022/ngwr-burger.mjs.map +1 -1
  43. package/fesm2022/ngwr-button-testing.mjs +96 -0
  44. package/fesm2022/ngwr-button-testing.mjs.map +1 -0
  45. package/fesm2022/ngwr-button.mjs +89 -24
  46. package/fesm2022/ngwr-button.mjs.map +1 -1
  47. package/fesm2022/ngwr-calendar-heatmap.mjs +42 -10
  48. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  49. package/fesm2022/ngwr-calendar.mjs +108 -9
  50. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  51. package/fesm2022/ngwr-card.mjs +10 -10
  52. package/fesm2022/ngwr-card.mjs.map +1 -1
  53. package/fesm2022/ngwr-carousel-testing.mjs +377 -0
  54. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -0
  55. package/fesm2022/ngwr-carousel.mjs +72 -18
  56. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  57. package/fesm2022/ngwr-cascader-testing.mjs +534 -0
  58. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -0
  59. package/fesm2022/ngwr-cascader.mjs +4 -4
  60. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  61. package/fesm2022/ngwr-checkbox-testing.mjs +90 -0
  62. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -0
  63. package/fesm2022/ngwr-checkbox.mjs +15 -9
  64. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  65. package/fesm2022/ngwr-circular-text.mjs +4 -4
  66. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  67. package/fesm2022/ngwr-click-spark.mjs +4 -4
  68. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  69. package/fesm2022/ngwr-clipboard.mjs +18 -4
  70. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  71. package/fesm2022/ngwr-collapse-testing.mjs +368 -0
  72. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -0
  73. package/fesm2022/ngwr-collapse.mjs +9 -9
  74. package/fesm2022/ngwr-color-picker.mjs +139 -19
  75. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  76. package/fesm2022/ngwr-command-palette-testing.mjs +589 -0
  77. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -0
  78. package/fesm2022/ngwr-command-palette.mjs +60 -10
  79. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  80. package/fesm2022/ngwr-compare.mjs +105 -15
  81. package/fesm2022/ngwr-compare.mjs.map +1 -1
  82. package/fesm2022/ngwr-confetti.mjs +3 -3
  83. package/fesm2022/ngwr-config.mjs +106 -0
  84. package/fesm2022/ngwr-config.mjs.map +1 -0
  85. package/fesm2022/ngwr-context-menu-testing.mjs +631 -0
  86. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -0
  87. package/fesm2022/ngwr-context-menu.mjs +104 -18
  88. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  89. package/fesm2022/ngwr-cookie.mjs +8 -4
  90. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  91. package/fesm2022/ngwr-counter.mjs +17 -9
  92. package/fesm2022/ngwr-counter.mjs.map +1 -1
  93. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  94. package/fesm2022/ngwr-date-adapter-luxon.mjs +55 -7
  95. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -1
  96. package/fesm2022/ngwr-date-adapter.mjs +57 -11
  97. package/fesm2022/ngwr-date-adapter.mjs.map +1 -1
  98. package/fesm2022/ngwr-date-picker-testing.mjs +766 -0
  99. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -0
  100. package/fesm2022/ngwr-date-picker.mjs +409 -57
  101. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  102. package/fesm2022/ngwr-decrypt-text.mjs +30 -12
  103. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  104. package/fesm2022/ngwr-density.mjs +6 -6
  105. package/fesm2022/ngwr-descriptions.mjs +6 -6
  106. package/fesm2022/ngwr-dialog-testing.mjs +89 -0
  107. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -0
  108. package/fesm2022/ngwr-dialog.mjs +33 -17
  109. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  110. package/fesm2022/ngwr-directives.mjs +48 -24
  111. package/fesm2022/ngwr-directives.mjs.map +1 -1
  112. package/fesm2022/ngwr-divider.mjs +3 -3
  113. package/fesm2022/ngwr-donut-chart.mjs +24 -7
  114. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  115. package/fesm2022/ngwr-drag-drop.mjs +7 -7
  116. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  117. package/fesm2022/ngwr-drawer-testing.mjs +250 -0
  118. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -0
  119. package/fesm2022/ngwr-drawer.mjs +37 -19
  120. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  121. package/fesm2022/ngwr-dropdown-testing.mjs +291 -0
  122. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -0
  123. package/fesm2022/ngwr-dropdown.mjs +19 -11
  124. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  125. package/fesm2022/ngwr-empty.mjs +26 -9
  126. package/fesm2022/ngwr-empty.mjs.map +1 -1
  127. package/fesm2022/ngwr-event-calendar.mjs +62 -15
  128. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  129. package/fesm2022/ngwr-falling-text.mjs +4 -4
  130. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  131. package/fesm2022/ngwr-file-upload-testing.mjs +332 -0
  132. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -0
  133. package/fesm2022/ngwr-file-upload.mjs +3 -3
  134. package/fesm2022/ngwr-form-testing.mjs +451 -0
  135. package/fesm2022/ngwr-form-testing.mjs.map +1 -0
  136. package/fesm2022/ngwr-form.mjs +28 -12
  137. package/fesm2022/ngwr-form.mjs.map +1 -1
  138. package/fesm2022/ngwr-fuzzy-text.mjs +11 -4
  139. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  140. package/fesm2022/ngwr-gauge.mjs +21 -7
  141. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  142. package/fesm2022/ngwr-glitch-text.mjs +4 -4
  143. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  144. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  145. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  146. package/fesm2022/ngwr-hotkey.mjs +31 -10
  147. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  148. package/fesm2022/ngwr-i18n-en.mjs +61 -0
  149. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  150. package/fesm2022/ngwr-i18n-ru.mjs +59 -0
  151. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  152. package/fesm2022/ngwr-i18n.mjs +9 -9
  153. package/fesm2022/ngwr-icon.mjs +6 -6
  154. package/fesm2022/ngwr-image-cropper.mjs +26 -3
  155. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  156. package/fesm2022/ngwr-input-number-testing.mjs +306 -0
  157. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -0
  158. package/fesm2022/ngwr-input-number.mjs +37 -5
  159. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  160. package/fesm2022/ngwr-input-otp-testing.mjs +419 -0
  161. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -0
  162. package/fesm2022/ngwr-input-otp.mjs +39 -8
  163. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  164. package/fesm2022/ngwr-input-testing.mjs +102 -0
  165. package/fesm2022/ngwr-input-testing.mjs.map +1 -0
  166. package/fesm2022/ngwr-input.mjs +62 -25
  167. package/fesm2022/ngwr-input.mjs.map +1 -1
  168. package/fesm2022/ngwr-keyboard.mjs +3 -3
  169. package/fesm2022/ngwr-knob.mjs +46 -10
  170. package/fesm2022/ngwr-knob.mjs.map +1 -1
  171. package/fesm2022/ngwr-layout.mjs +36 -20
  172. package/fesm2022/ngwr-layout.mjs.map +1 -1
  173. package/fesm2022/ngwr-lightbox.mjs +35 -8
  174. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  175. package/fesm2022/ngwr-line-chart.mjs +19 -6
  176. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  177. package/fesm2022/ngwr-list.mjs +14 -9
  178. package/fesm2022/ngwr-list.mjs.map +1 -1
  179. package/fesm2022/ngwr-loading-bar.mjs +71 -31
  180. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  181. package/fesm2022/ngwr-markdown-testing.mjs +516 -0
  182. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -0
  183. package/fesm2022/ngwr-markdown.mjs +1492 -0
  184. package/fesm2022/ngwr-markdown.mjs.map +1 -0
  185. package/fesm2022/ngwr-marquee.mjs +19 -8
  186. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  187. package/fesm2022/ngwr-media.mjs +3 -3
  188. package/fesm2022/ngwr-mention-testing.mjs +513 -0
  189. package/fesm2022/ngwr-mention-testing.mjs.map +1 -0
  190. package/fesm2022/ngwr-mention.mjs +16 -7
  191. package/fesm2022/ngwr-mention.mjs.map +1 -1
  192. package/fesm2022/ngwr-meta.mjs +28 -13
  193. package/fesm2022/ngwr-meta.mjs.map +1 -1
  194. package/fesm2022/ngwr-meter-group.mjs +22 -8
  195. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  196. package/fesm2022/ngwr-overlay.mjs +57 -8
  197. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  198. package/fesm2022/ngwr-page-header.mjs +3 -3
  199. package/fesm2022/ngwr-pagination-testing.mjs +389 -0
  200. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -0
  201. package/fesm2022/ngwr-pagination.mjs +27 -11
  202. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  203. package/fesm2022/ngwr-pipes.mjs +21 -21
  204. package/fesm2022/ngwr-platform.mjs +9 -9
  205. package/fesm2022/ngwr-popconfirm-testing.mjs +309 -0
  206. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -0
  207. package/fesm2022/ngwr-popconfirm.mjs +99 -21
  208. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  209. package/fesm2022/ngwr-popover-testing.mjs +316 -0
  210. package/fesm2022/ngwr-popover-testing.mjs.map +1 -0
  211. package/fesm2022/ngwr-popover.mjs +48 -10
  212. package/fesm2022/ngwr-popover.mjs.map +1 -1
  213. package/fesm2022/ngwr-progress.mjs +3 -3
  214. package/fesm2022/ngwr-pull-to-refresh.mjs +19 -4
  215. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  216. package/fesm2022/ngwr-qr.mjs +15 -5
  217. package/fesm2022/ngwr-qr.mjs.map +1 -1
  218. package/fesm2022/ngwr-radio-testing.mjs +392 -0
  219. package/fesm2022/ngwr-radio-testing.mjs.map +1 -0
  220. package/fesm2022/ngwr-radio.mjs +16 -9
  221. package/fesm2022/ngwr-radio.mjs.map +1 -1
  222. package/fesm2022/ngwr-rating-testing.mjs +384 -0
  223. package/fesm2022/ngwr-rating-testing.mjs.map +1 -0
  224. package/fesm2022/ngwr-rating.mjs +40 -5
  225. package/fesm2022/ngwr-rating.mjs.map +1 -1
  226. package/fesm2022/ngwr-result.mjs +12 -12
  227. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  228. package/fesm2022/ngwr-scroll.mjs +3 -3
  229. package/fesm2022/ngwr-segmented-testing.mjs +512 -0
  230. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -0
  231. package/fesm2022/ngwr-segmented.mjs +3 -3
  232. package/fesm2022/ngwr-select-testing.mjs +268 -0
  233. package/fesm2022/ngwr-select-testing.mjs.map +1 -0
  234. package/fesm2022/ngwr-select.mjs +96 -25
  235. package/fesm2022/ngwr-select.mjs.map +1 -1
  236. package/fesm2022/ngwr-shiny-text.mjs +7 -7
  237. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  238. package/fesm2022/ngwr-sidebar.mjs +67 -14
  239. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  240. package/fesm2022/ngwr-skeleton.mjs +3 -3
  241. package/fesm2022/ngwr-slider-testing.mjs +478 -0
  242. package/fesm2022/ngwr-slider-testing.mjs.map +1 -0
  243. package/fesm2022/ngwr-slider.mjs +59 -15
  244. package/fesm2022/ngwr-slider.mjs.map +1 -1
  245. package/fesm2022/ngwr-sparkline.mjs +28 -8
  246. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  247. package/fesm2022/ngwr-speed-dial.mjs +39 -6
  248. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  249. package/fesm2022/ngwr-spinner.mjs +14 -5
  250. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  251. package/fesm2022/ngwr-splash-cursor.mjs +4 -4
  252. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  253. package/fesm2022/ngwr-split-text.mjs +4 -4
  254. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  255. package/fesm2022/ngwr-splitter.mjs +72 -11
  256. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  257. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  258. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  259. package/fesm2022/ngwr-squircle.mjs +6 -6
  260. package/fesm2022/ngwr-star-border.mjs +4 -4
  261. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  262. package/fesm2022/ngwr-statistic.mjs +33 -16
  263. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  264. package/fesm2022/ngwr-stepper-testing.mjs +477 -0
  265. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -0
  266. package/fesm2022/ngwr-stepper.mjs +6 -6
  267. package/fesm2022/ngwr-storage.mjs +27 -17
  268. package/fesm2022/ngwr-storage.mjs.map +1 -1
  269. package/fesm2022/ngwr-switch-testing.mjs +77 -0
  270. package/fesm2022/ngwr-switch-testing.mjs.map +1 -0
  271. package/fesm2022/ngwr-switch.mjs +12 -6
  272. package/fesm2022/ngwr-switch.mjs.map +1 -1
  273. package/fesm2022/ngwr-table-testing.mjs +580 -0
  274. package/fesm2022/ngwr-table-testing.mjs.map +1 -0
  275. package/fesm2022/ngwr-table.mjs +105 -44
  276. package/fesm2022/ngwr-table.mjs.map +1 -1
  277. package/fesm2022/ngwr-tabs-testing.mjs +617 -0
  278. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -0
  279. package/fesm2022/ngwr-tabs.mjs +44 -12
  280. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  281. package/fesm2022/ngwr-textarea-testing.mjs +238 -0
  282. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -0
  283. package/fesm2022/ngwr-textarea.mjs +35 -7
  284. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  285. package/fesm2022/ngwr-theme.mjs +3 -3
  286. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  287. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  288. package/fesm2022/ngwr-timeline.mjs +6 -6
  289. package/fesm2022/ngwr-toast-testing.mjs +101 -0
  290. package/fesm2022/ngwr-toast-testing.mjs.map +1 -0
  291. package/fesm2022/ngwr-toast.mjs +55 -21
  292. package/fesm2022/ngwr-toast.mjs.map +1 -1
  293. package/fesm2022/ngwr-toolbar.mjs +3 -3
  294. package/fesm2022/ngwr-tour.mjs +67 -15
  295. package/fesm2022/ngwr-tour.mjs.map +1 -1
  296. package/fesm2022/ngwr-transfer-testing.mjs +538 -0
  297. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -0
  298. package/fesm2022/ngwr-transfer.mjs +47 -16
  299. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  300. package/fesm2022/ngwr-tree-testing.mjs +734 -0
  301. package/fesm2022/ngwr-tree-testing.mjs.map +1 -0
  302. package/fesm2022/ngwr-tree.mjs +75 -9
  303. package/fesm2022/ngwr-tree.mjs.map +1 -1
  304. package/fesm2022/ngwr-typewriter.mjs +7 -5
  305. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  306. package/fesm2022/ngwr-typography.mjs +3 -3
  307. package/fesm2022/ngwr-version.mjs +1 -1
  308. package/fesm2022/ngwr-version.mjs.map +1 -1
  309. package/fesm2022/ngwr-virtual-scroll.mjs +33 -7
  310. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  311. package/fesm2022/ngwr-waves.mjs +5 -5
  312. package/fesm2022/ngwr-waves.mjs.map +1 -1
  313. package/fesm2022/ngwr-window.mjs +88 -18
  314. package/fesm2022/ngwr-window.mjs.map +1 -1
  315. package/gauge/styles/_index.scss +1 -1
  316. package/glitch-text/styles/_index.scss +4 -0
  317. package/i18n/en.json +56 -0
  318. package/i18n/ru.json +56 -0
  319. package/image-cropper/styles/_index.scss +13 -1
  320. package/input/styles/_index.scss +2 -2
  321. package/input-number/styles/_index.scss +7 -2
  322. package/knob/styles/_index.scss +8 -1
  323. package/layout/styles/_index.scss +3 -3
  324. package/lightbox/styles/_index.scss +10 -2
  325. package/line-chart/styles/_index.scss +6 -0
  326. package/llms-full.txt +151 -4
  327. package/llms.txt +57 -8
  328. package/loading-bar/styles/_index.scss +1 -2
  329. package/markdown/styles/_index.scss +296 -0
  330. package/marquee/styles/_index.scss +12 -0
  331. package/mcp/api.js +512 -0
  332. package/mcp/catalog.js +157 -0
  333. package/mcp/server.js +273 -0
  334. package/mcp/tools.js +366 -0
  335. package/meter-group/styles/_index.scss +1 -1
  336. package/package.json +186 -35
  337. package/pagination/styles/_index.scss +6 -6
  338. package/popover/styles/_index.scss +37 -5
  339. package/rating/styles/_index.scss +10 -0
  340. package/schematics/use/symbol-map.json +2 -0
  341. package/segmented/styles/_index.scss +7 -0
  342. package/select/styles/_index.scss +29 -9
  343. package/sidebar/styles/_index.scss +30 -5
  344. package/slider/styles/_index.scss +15 -0
  345. package/speed-dial/styles/_index.scss +20 -0
  346. package/split-text/styles/_index.scss +13 -0
  347. package/star-border/styles/_index.scss +2 -0
  348. package/stepper/styles/_index.scss +1 -1
  349. package/styles/_grid.scss +4 -4
  350. package/styles.scss +1 -0
  351. package/switch/styles/_index.scss +5 -3
  352. package/table/styles/_index.scss +22 -11
  353. package/tabs/styles/_index.scss +11 -1
  354. package/textarea/styles/_index.scss +5 -0
  355. package/theme/styles/_colors.scss +29 -13
  356. package/theme/styles/_dark.scss +11 -3
  357. package/theme/styles/_mixins.scss +3 -0
  358. package/timeline/styles/_index.scss +2 -2
  359. package/toast/styles/_index.scss +17 -8
  360. package/toolbar/styles/_index.scss +3 -3
  361. package/tour/styles/_index.scss +7 -1
  362. package/tree/styles/_index.scss +5 -3
  363. package/types/ngwr-action-sheet.d.ts +9 -1
  364. package/types/ngwr-affix.d.ts +7 -1
  365. package/types/ngwr-anchor.d.ts +8 -1
  366. package/types/ngwr-avatar.d.ts +13 -3
  367. package/types/ngwr-bar-chart.d.ts +16 -0
  368. package/types/ngwr-burger.d.ts +6 -2
  369. package/types/ngwr-button-testing.d.ts +85 -0
  370. package/types/ngwr-button.d.ts +58 -10
  371. package/types/ngwr-calendar-heatmap.d.ts +16 -2
  372. package/types/ngwr-calendar.d.ts +37 -1
  373. package/types/ngwr-carousel-testing.d.ts +257 -0
  374. package/types/ngwr-carousel.d.ts +20 -4
  375. package/types/ngwr-cascader-testing.d.ts +392 -0
  376. package/types/ngwr-checkbox-testing.d.ts +77 -0
  377. package/types/ngwr-checkbox.d.ts +7 -2
  378. package/types/ngwr-clipboard.d.ts +8 -1
  379. package/types/ngwr-collapse-testing.d.ts +290 -0
  380. package/types/ngwr-color-picker.d.ts +20 -11
  381. package/types/ngwr-command-palette-testing.d.ts +437 -0
  382. package/types/ngwr-command-palette.d.ts +25 -2
  383. package/types/ngwr-compare.d.ts +50 -2
  384. package/types/ngwr-config.d.ts +176 -0
  385. package/types/ngwr-context-menu-testing.d.ts +401 -0
  386. package/types/ngwr-context-menu.d.ts +65 -17
  387. package/types/ngwr-counter.d.ts +6 -1
  388. package/types/ngwr-date-adapter-luxon.d.ts +26 -0
  389. package/types/ngwr-date-picker-testing.d.ts +518 -0
  390. package/types/ngwr-date-picker.d.ts +128 -8
  391. package/types/ngwr-dialog-testing.d.ts +79 -0
  392. package/types/ngwr-dialog.d.ts +13 -0
  393. package/types/ngwr-directives.d.ts +10 -1
  394. package/types/ngwr-donut-chart.d.ts +8 -1
  395. package/types/ngwr-drawer-testing.d.ts +196 -0
  396. package/types/ngwr-drawer.d.ts +15 -0
  397. package/types/ngwr-dropdown-testing.d.ts +202 -0
  398. package/types/ngwr-dropdown.d.ts +7 -1
  399. package/types/ngwr-empty.d.ts +19 -4
  400. package/types/ngwr-event-calendar.d.ts +26 -1
  401. package/types/ngwr-file-upload-testing.d.ts +194 -0
  402. package/types/ngwr-form-testing.d.ts +379 -0
  403. package/types/ngwr-form.d.ts +17 -0
  404. package/types/ngwr-gauge.d.ts +13 -1
  405. package/types/ngwr-hotkey.d.ts +2 -0
  406. package/types/ngwr-image-cropper.d.ts +10 -0
  407. package/types/ngwr-input-number-testing.d.ts +226 -0
  408. package/types/ngwr-input-number.d.ts +29 -1
  409. package/types/ngwr-input-otp-testing.d.ts +299 -0
  410. package/types/ngwr-input-otp.d.ts +23 -2
  411. package/types/ngwr-input-testing.d.ts +84 -0
  412. package/types/ngwr-input.d.ts +20 -6
  413. package/types/ngwr-knob.d.ts +18 -0
  414. package/types/ngwr-layout.d.ts +1 -0
  415. package/types/ngwr-lightbox.d.ts +17 -3
  416. package/types/ngwr-line-chart.d.ts +9 -2
  417. package/types/ngwr-list.d.ts +7 -2
  418. package/types/ngwr-loading-bar.d.ts +4 -7
  419. package/types/ngwr-markdown-testing.d.ts +462 -0
  420. package/types/ngwr-markdown.d.ts +534 -0
  421. package/types/ngwr-marquee.d.ts +12 -2
  422. package/types/ngwr-mention-testing.d.ts +359 -0
  423. package/types/ngwr-meta.d.ts +4 -2
  424. package/types/ngwr-meter-group.d.ts +11 -1
  425. package/types/ngwr-overlay.d.ts +33 -2
  426. package/types/ngwr-pagination-testing.d.ts +291 -0
  427. package/types/ngwr-pagination.d.ts +7 -1
  428. package/types/ngwr-popconfirm-testing.d.ts +235 -0
  429. package/types/ngwr-popconfirm.d.ts +31 -21
  430. package/types/ngwr-popover-testing.d.ts +221 -0
  431. package/types/ngwr-popover.d.ts +19 -2
  432. package/types/ngwr-pull-to-refresh.d.ts +7 -0
  433. package/types/ngwr-qr.d.ts +9 -1
  434. package/types/ngwr-radio-testing.d.ts +296 -0
  435. package/types/ngwr-radio.d.ts +8 -2
  436. package/types/ngwr-rating-testing.d.ts +291 -0
  437. package/types/ngwr-rating.d.ts +23 -0
  438. package/types/ngwr-segmented-testing.d.ts +401 -0
  439. package/types/ngwr-select-testing.d.ts +175 -0
  440. package/types/ngwr-select.d.ts +45 -4
  441. package/types/ngwr-sidebar.d.ts +17 -2
  442. package/types/ngwr-slider-testing.d.ts +329 -0
  443. package/types/ngwr-slider.d.ts +35 -1
  444. package/types/ngwr-sparkline.d.ts +12 -2
  445. package/types/ngwr-speed-dial.d.ts +17 -18
  446. package/types/ngwr-spinner.d.ts +8 -1
  447. package/types/ngwr-splitter.d.ts +24 -1
  448. package/types/ngwr-statistic.d.ts +12 -2
  449. package/types/ngwr-stepper-testing.d.ts +346 -0
  450. package/types/ngwr-storage.d.ts +10 -1
  451. package/types/ngwr-switch-testing.d.ts +66 -0
  452. package/types/ngwr-switch.d.ts +7 -2
  453. package/types/ngwr-table-testing.d.ts +423 -0
  454. package/types/ngwr-table.d.ts +42 -0
  455. package/types/ngwr-tabs-testing.d.ts +470 -0
  456. package/types/ngwr-tabs.d.ts +9 -0
  457. package/types/ngwr-textarea-testing.d.ts +184 -0
  458. package/types/ngwr-textarea.d.ts +7 -2
  459. package/types/ngwr-toast-testing.d.ts +80 -0
  460. package/types/ngwr-toast.d.ts +19 -4
  461. package/types/ngwr-tour.d.ts +27 -0
  462. package/types/ngwr-transfer-testing.d.ts +444 -0
  463. package/types/ngwr-transfer.d.ts +16 -1
  464. package/types/ngwr-tree-testing.d.ts +501 -0
  465. package/types/ngwr-tree.d.ts +33 -0
  466. package/types/ngwr-version.d.ts +1 -1
  467. package/types/ngwr-virtual-scroll.d.ts +13 -1
  468. package/types/ngwr-window.d.ts +23 -2
  469. package/typewriter/styles/_index.scss +1 -1
  470. package/typography/styles/_index.scss +1 -1
  471. package/window/styles/_index.scss +32 -9
@@ -55,6 +55,13 @@ declare function isGroup(entry: WrSidebarEntry): entry is WrSidebarGroup;
55
55
  */
56
56
  declare class WrSidebar {
57
57
  readonly entries: _angular_core.InputSignal<readonly WrSidebarEntry[]>;
58
+ /**
59
+ * Accessible name for the navigation landmark. Falls back to `sidebar.label`,
60
+ * then `'Sidebar'` — a page with a sidebar AND a table of contents has two
61
+ * navigation landmarks, and an unnamed one is announced as just "navigation".
62
+ */
63
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
64
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
58
65
  /** Default icon for entries without one. @default 'folder' */
59
66
  readonly defaultGroupIcon: _angular_core.InputSignal<string>;
60
67
  /** Default icon for items without one. @default 'caret-forward' */
@@ -63,20 +70,28 @@ declare class WrSidebar {
63
70
  readonly autoExpand: _angular_core.InputSignalWithTransform<boolean, any>;
64
71
  protected readonly isGroup: typeof isGroup;
65
72
  private readonly opened;
73
+ /** Group titles already seeded from `defaultOpen`, so it seeds once and not again. */
74
+ private readonly seeded;
75
+ private readonly uid;
66
76
  private readonly router;
67
77
  private readonly currentUrl;
68
78
  /** Last URL we auto-expanded — prevents re-opening a group the user collapsed. */
69
79
  private lastAutoUrl;
70
80
  constructor();
71
81
  protected isOpen(title: string): boolean;
72
- /** Stable id for the group body, referenced by the toggle's `aria-controls`. */
82
+ /**
83
+ * Stable id for the group body, referenced by the toggle's `aria-controls`.
84
+ * Scoped to this sidebar and stripped of anything that is not id-safe: a title
85
+ * like `Data & charts` used to produce `wr-sidebar-group-data-&-charts`, which
86
+ * no selector can address.
87
+ */
73
88
  protected groupBodyId(title: string): string;
74
89
  protected toggleGroup(title: string): void;
75
90
  protected asItem(entry: WrSidebarEntry): WrSidebarItem;
76
91
  protected asGroup(entry: WrSidebarEntry): WrSidebarGroup;
77
92
  private findGroupForUrl;
78
93
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSidebar, never>;
79
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSidebar, "wr-sidebar", never, { "entries": { "alias": "entries"; "required": false; "isSignal": true; }; "defaultGroupIcon": { "alias": "defaultGroupIcon"; "required": false; "isSignal": true; }; "defaultItemIcon": { "alias": "defaultItemIcon"; "required": false; "isSignal": true; }; "autoExpand": { "alias": "autoExpand"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
94
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSidebar, "wr-sidebar", never, { "entries": { "alias": "entries"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "defaultGroupIcon": { "alias": "defaultGroupIcon"; "required": false; "isSignal": true; }; "defaultItemIcon": { "alias": "defaultItemIcon"; "required": false; "isSignal": true; }; "autoExpand": { "alias": "autoExpand"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
80
95
  }
81
96
 
82
97
  export { WrSidebar };
@@ -0,0 +1,329 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrSliderValue } from 'ngwr/slider';
3
+
4
+ /**
5
+ * @license
6
+ *
7
+ * Use of this source code is governed by an MIT-style license that can be
8
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
9
+ */
10
+
11
+ /** Which end of a range slider a thumb is — the `--low` / `--high` modifier it carries. */
12
+ type WrSliderThumbPosition = 'low' | 'high';
13
+ /** Narrows which `<wr-slider>` a harness query matches. */
14
+ interface WrSliderHarnessFilters extends BaseHarnessFilters {
15
+ /**
16
+ * Match the current value, in the shape the model uses: a plain number for a
17
+ * single-thumb slider, `[low, high]` for a range one. Compared element-wise,
18
+ * so a tuple never matches a single-thumb slider and a number never matches a
19
+ * range one.
20
+ */
21
+ readonly value?: WrSliderValue;
22
+ /** Match only dual-thumb (`true`) or only single-thumb (`false`) sliders. */
23
+ readonly range?: boolean;
24
+ /** Match only disabled (`true`) or only enabled (`false`) sliders. */
25
+ readonly disabled?: boolean;
26
+ /**
27
+ * Match the text the slider prints under its track — a string is an exact
28
+ * match, a RegExp is tested. A slider with `showLabel="false"` prints none and
29
+ * never matches.
30
+ */
31
+ readonly labelText?: string | RegExp;
32
+ }
33
+ /** Narrows which thumb of a `<wr-slider>` a harness query matches. */
34
+ interface WrSliderThumbHarnessFilters extends BaseHarnessFilters {
35
+ /** Match one end of a range slider. A single-thumb slider only has a `'low'`. */
36
+ readonly position?: WrSliderThumbPosition;
37
+ /** Match a thumb standing on exactly this value (`aria-valuenow`). */
38
+ readonly value?: number;
39
+ /**
40
+ * Match the thumb's accessible name — `'Value'` on a single-thumb slider,
41
+ * `'Lower value'` / `'Upper value'` on a range one. A string is an exact
42
+ * match, a RegExp is tested.
43
+ */
44
+ readonly label?: string | RegExp;
45
+ }
46
+
47
+ /**
48
+ * @license
49
+ *
50
+ * Use of this source code is governed by an MIT-style license that can be
51
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
52
+ */
53
+
54
+ /**
55
+ * Test harness for one thumb of a `<wr-slider>`.
56
+ *
57
+ * A single-thumb slider has exactly one; a `range` one has two, and each thumb
58
+ * is the other's limit — the lower thumb's `aria-valuemax` is wherever the upper
59
+ * thumb is standing, and vice versa. So {@link getMin} / {@link getMax} answer
60
+ * the room THIS thumb has, not the slider's bounds, which is exactly what a
61
+ * screen reader announces and exactly the window {@link setValue} can reach.
62
+ *
63
+ * Every write here is a KEY PRESS, because a drag is not something a unit test
64
+ * can perform — see {@link setValue}.
65
+ *
66
+ * Every press is on the BLOCK axis — `ArrowUp` / `ArrowDown`, `PageUp` /
67
+ * `PageDown`, `Home` / `End` — so the harness means the same thing in both
68
+ * reading directions. That is not a detail: the component's ← / → follow the
69
+ * VISUAL track, so under `dir="rtl"` a right-arrow LOWERS the value, and a
70
+ * harness that pressed it would have `stepUp()` stepping down while every LTR
71
+ * spec stayed green. It cannot detect the direction to compensate either —
72
+ * `Directionality` is injected, not published to the DOM — so it stays on the
73
+ * axis `dir` does not govern.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * const upper = await slider.getHighThumb();
78
+ *
79
+ * await upper.setValue(90);
80
+ * expect(await upper.getValue()).toBe(90);
81
+ * ```
82
+ *
83
+ * @see https://ngwr.dev/guides/testing
84
+ */
85
+ declare class WrSliderThumbHarness extends ComponentHarness {
86
+ /**
87
+ * The thumb is a real `<button role="slider">`, so it is focusable without a
88
+ * `tabindex` and leaves the tab order by itself when disabled. Anchored on the
89
+ * BEM class rather than on `[role="slider"]`: the class also carries the
90
+ * `--low` / `--high` modifier this harness reads.
91
+ */
92
+ static hostSelector: string;
93
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
94
+ static with(options?: WrSliderThumbHarnessFilters): HarnessPredicate<WrSliderThumbHarness>;
95
+ /** Which end this thumb is. A single-thumb slider's thumb is the `'low'` one. */
96
+ getPosition(): Promise<WrSliderThumbPosition>;
97
+ /** Where the thumb is standing, from `aria-valuenow` — the number a screen reader reads out. */
98
+ getValue(): Promise<number>;
99
+ /**
100
+ * The lowest value THIS thumb can reach (`aria-valuemin`).
101
+ *
102
+ * On a range slider's upper thumb that is the lower thumb, not the slider's
103
+ * `min` — the two cannot cross, so the neighbour is the real floor.
104
+ */
105
+ getMin(): Promise<number>;
106
+ /**
107
+ * The highest value THIS thumb can reach (`aria-valuemax`).
108
+ *
109
+ * On a range slider's lower thumb that is the upper thumb, not the slider's
110
+ * `max`.
111
+ */
112
+ getMax(): Promise<number>;
113
+ /** The thumb's accessible name — `'Value'`, or `'Lower value'` / `'Upper value'` in range mode. */
114
+ getLabel(): Promise<string | null>;
115
+ /** What a screen reader is told this control is. The role is why the arrows mean anything here. */
116
+ getRole(): Promise<string | null>;
117
+ /** Whether the thumb refuses the keyboard. Read from the button's native `disabled`. */
118
+ isDisabled(): Promise<boolean>;
119
+ focus(): Promise<void>;
120
+ isFocused(): Promise<boolean>;
121
+ /**
122
+ * One step up (`ArrowUp`). A disabled thumb does not move.
123
+ *
124
+ * `ArrowRight` is the same key press in an LTR slider and the OPPOSITE one in
125
+ * an RTL slider, so the vertical arrow is the one that means "up" everywhere.
126
+ */
127
+ stepUp(): Promise<void>;
128
+ /** One step down (`ArrowDown`; `ArrowLeft` only agrees in LTR — see {@link stepUp}). */
129
+ stepDown(): Promise<void>;
130
+ /** Ten steps up (`PageUp`; `Shift`+arrow is the same stride). */
131
+ largeStepUp(): Promise<void>;
132
+ /** Ten steps down (`PageDown`; `Shift`+arrow is the same stride). */
133
+ largeStepDown(): Promise<void>;
134
+ /**
135
+ * `Home` — jump to the lowest value this thumb can reach.
136
+ *
137
+ * On a range slider's UPPER thumb that lands on the lower thumb, not on the
138
+ * slider's `min`: the component asks for `min` and then refuses to let the
139
+ * ends cross, so the range collapses instead of inverting.
140
+ */
141
+ toMin(): Promise<void>;
142
+ /**
143
+ * `End` — jump to the highest value this thumb can reach.
144
+ *
145
+ * On a range slider's LOWER thumb that lands on the upper thumb, not on the
146
+ * slider's `max`, for the same reason as {@link toMin}.
147
+ */
148
+ toMax(): Promise<void>;
149
+ /**
150
+ * Walk the thumb to `value` FROM THE KEYBOARD — `PageUp` / `PageDown` for the
151
+ * distance, arrows for the last stretch, `Home` / `End` for the bounds. That
152
+ * is the accessible path, and the only one a unit test can trust.
153
+ *
154
+ * There is deliberately no drag. jsdom has no layout: the track measures 0×0
155
+ * and `getBoundingClientRect()` answers all zeros, while the component turns a
156
+ * pointer into a value by dividing the offset by the track width. Every
157
+ * positive offset therefore divides by zero, clamps to a ratio of 1 and writes
158
+ * the slider's MAX — quietly, with no error to notice. A coordinate cannot
159
+ * mean anything here.
160
+ *
161
+ * It costs one press per stride, so the walk is not free: crossing most of a
162
+ * 0–100 range costs ~19 presses at `step="1"` and ~109 at `step="0.1"`.
163
+ * Landing exactly on a bound is one press, whatever the step. The walk gives
164
+ * up after 1000 presses — a 0–100 range reaches that at `step="0.01"` or finer
165
+ * — and throws rather than spin.
166
+ *
167
+ * A bound the step grid misses is announced but not reachable: `aria-valuemax`
168
+ * is the `max` input, while the component snaps every key press onto whole
169
+ * steps from `min`, so `max="100" step="3"` stops at 99. That is the off-grid
170
+ * throw, arriving for `setValue(100)`.
171
+ *
172
+ * Either the thumb ends up exactly on `value` or this throws: when `value` is
173
+ * outside the thumb's window (the other thumb is one end of it in range mode),
174
+ * when the thumb is disabled, and when `value` is not on the step grid — on
175
+ * the last one the thumb is left at the nearest value it could reach.
176
+ */
177
+ setValue(value: number): Promise<void>;
178
+ /**
179
+ * The landing check every path through {@link setValue} ends on: exactly the
180
+ * value asked for, or an error naming where the thumb stopped instead.
181
+ */
182
+ private assertSettled;
183
+ /** The key that moves the thumb one stride in `direction`. */
184
+ private strideKey;
185
+ /**
186
+ * Press a key on the thumb.
187
+ *
188
+ * `sendKeys` focuses the element first, so this is the whole gesture a user
189
+ * makes — the component listens for `keydown` on the thumb itself.
190
+ */
191
+ private press;
192
+ /**
193
+ * One of the ARIA range attributes as a number.
194
+ *
195
+ * Throws instead of handing back `NaN`: a slider whose `aria-valuenow` is not
196
+ * a number is broken in a way every later assertion would describe badly.
197
+ */
198
+ private numeric;
199
+ }
200
+
201
+ /**
202
+ * @license
203
+ *
204
+ * Use of this source code is governed by an MIT-style license that can be
205
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
206
+ */
207
+
208
+ /**
209
+ * Test harness for `<wr-slider>` — single-thumb and `range`.
210
+ *
211
+ * Every NUMBER it reads comes off the thumbs' ARIA range trio (`aria-valuenow`,
212
+ * `aria-valuemin`, `aria-valuemax`), which is what a screen reader is told and
213
+ * the only place the slider publishes its value. The mode comes off the host's
214
+ * `wr-slider--range` class and {@link getLabelText} off the rendered text.
215
+ *
216
+ * Everything it WRITES is a key press. A slider is a pointer control, but a
217
+ * pointer control cannot be driven by coordinates in jsdom — there is no layout,
218
+ * so the track measures 0×0 and the component divides every offset by that
219
+ * width: a positive one writes the slider's MAX and `clientX: 0` writes `NaN`,
220
+ * neither of them the value asked for. The keyboard is both the accessible path
221
+ * and the only honest one here; {@link WrSliderThumbHarness.setValue} spells out
222
+ * what the walk costs, and {@link WrSliderThumbHarness} why every one of those
223
+ * presses is on the block axis, which `dir` does not turn around.
224
+ *
225
+ * The `step` is deliberately not readable: the component publishes it nowhere in
226
+ * the DOM (ARIA has no attribute for it), so a spec that needs the number should
227
+ * measure it — `stepUp()` moves by exactly one step.
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * const volume = await loader.getHarness(WrSliderHarness);
232
+ *
233
+ * await volume.setValue(70);
234
+ * expect(await volume.getValue()).toBe(70);
235
+ *
236
+ * const span = await loader.getHarness(WrSliderHarness.with({ range: true }));
237
+ * await span.setRange(30, 60);
238
+ * ```
239
+ *
240
+ * @see https://ngwr.dev/guides/testing
241
+ */
242
+ declare class WrSliderHarness extends ComponentHarness {
243
+ static hostSelector: string;
244
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
245
+ static with(options?: WrSliderHarnessFilters): HarnessPredicate<WrSliderHarness>;
246
+ /** Whether the slider has two thumbs and answers with a `[low, high]` tuple. */
247
+ isRange(): Promise<boolean>;
248
+ /**
249
+ * Whether the slider refuses interaction.
250
+ *
251
+ * Read from the thumb's native `disabled` rather than from the
252
+ * `wr-slider--disabled` class: the class is paint, while `disabled` on the
253
+ * button is what takes the thumb out of the tab order and what assistive tech
254
+ * reports.
255
+ */
256
+ isDisabled(): Promise<boolean>;
257
+ /**
258
+ * The current value, in the shape the model uses: a plain number for one
259
+ * thumb, `[low, high]` for two.
260
+ */
261
+ getValue(): Promise<WrSliderValue>;
262
+ /** The slider's lower bound. */
263
+ getMin(): Promise<number>;
264
+ /**
265
+ * The slider's upper bound.
266
+ *
267
+ * Taken from the LAST thumb, because in range mode the thumbs bound each
268
+ * other: the lower one's `aria-valuemax` is wherever the upper one is
269
+ * standing, so only the upper thumb knows the real ceiling.
270
+ */
271
+ getMax(): Promise<number>;
272
+ /**
273
+ * The text the slider prints under the track, or `null` when `showLabel` is
274
+ * off.
275
+ *
276
+ * A range slider joins its ends with an EN DASH — `'20 – 80'`, U+2013 — so an
277
+ * assertion typed with a hyphen will not match.
278
+ */
279
+ getLabelText(): Promise<string | null>;
280
+ /** The slider's thumbs in DOM order: the lower one first. */
281
+ getThumbs(filters?: WrSliderThumbHarnessFilters): Promise<WrSliderThumbHarness[]>;
282
+ /** The only thumb of a single-thumb slider, or the lower one of a range slider. */
283
+ getLowThumb(): Promise<WrSliderThumbHarness>;
284
+ /** The upper thumb. Throws on a single-thumb slider, which has no such part. */
285
+ getHighThumb(): Promise<WrSliderThumbHarness>;
286
+ /**
287
+ * Walk the slider to `value` from the keyboard.
288
+ *
289
+ * Single-thumb only — {@link setRange} moves both ends. See
290
+ * {@link WrSliderThumbHarness.setValue} for what the walk costs and when it
291
+ * throws.
292
+ */
293
+ setValue(value: number): Promise<void>;
294
+ /**
295
+ * Walk both ends of a range slider to `[low, high]`.
296
+ *
297
+ * The far end moves FIRST. The thumbs bound each other, so writing `[90, 95]`
298
+ * over `[20, 80]` lower-end-first would be refused outright — 90 is outside
299
+ * the `[0, 80]` window the upper thumb leaves the lower one.
300
+ */
301
+ setRange(low: number, high: number): Promise<void>;
302
+ /** One step up (`ArrowUp`). Single-thumb only. A disabled slider does not move. */
303
+ stepUp(): Promise<void>;
304
+ /** One step down (`ArrowDown`). Single-thumb only. A disabled slider does not move. */
305
+ stepDown(): Promise<void>;
306
+ /** `Home` — jump to the slider's `min`. Single-thumb only. */
307
+ toMin(): Promise<void>;
308
+ /** `End` — jump to the slider's `max`. Single-thumb only. */
309
+ toMax(): Promise<void>;
310
+ /**
311
+ * Move keyboard focus to the slider's first thumb. A range slider's thumbs are
312
+ * two separate tab stops (both are plain buttons — there is no roving
313
+ * `tabindex`), so reach the other one through {@link getHighThumb}.
314
+ */
315
+ focus(): Promise<void>;
316
+ /** Whether any of the slider's thumbs holds focus. */
317
+ isFocused(): Promise<boolean>;
318
+ /**
319
+ * The one thumb a single-thumb convenience call means.
320
+ *
321
+ * Range mode gets an error rather than a guess: "step this slider up" has two
322
+ * possible answers there, and picking one silently is how a spec ends up
323
+ * asserting against the end it did not move.
324
+ */
325
+ private single;
326
+ }
327
+
328
+ export { WrSliderHarness, WrSliderThumbHarness };
329
+ export type { WrSliderHarnessFilters, WrSliderThumbHarnessFilters, WrSliderThumbPosition };
@@ -31,6 +31,11 @@ type WrSliderValue = number | readonly [number, number];
31
31
  * Keyboard: ← / → adjust by `step`; ↑ / ↓ same; Shift+arrow by `step × 10`;
32
32
  * Home / End jump to min / max; PageUp / PageDown by `step × 10`.
33
33
  *
34
+ * Reading direction: the arrows follow the VISUAL track, so under `dir="rtl"`
35
+ * → moves toward the lower end and ← toward the higher one, and a drag reads
36
+ * its ratio from the right edge. ↑ / ↓, PageUp / PageDown and Home / End are
37
+ * unchanged — they name a value, not a side of the screen.
38
+ *
34
39
  * @example
35
40
  * ```html
36
41
  * <!-- signal forms -->
@@ -74,17 +79,46 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
74
79
  protected readonly low: _angular_core.WritableSignal<number>;
75
80
  protected readonly high: _angular_core.WritableSignal<number>;
76
81
  protected readonly track: _angular_core.Signal<ElementRef<HTMLElement>>;
82
+ /**
83
+ * Ambient reading direction. Optional so a bare `TestBed` — or any consumer
84
+ * that never set a direction — needs no provider; `Directionality` is
85
+ * root-provided, so `null` only ever means "nobody asked", which is LTR.
86
+ *
87
+ * Nothing caches a direction-derived value: the thumbs are painted with
88
+ * `inset-inline-start`, so the track mirrors from CSS alone, and `isRtl()` is
89
+ * read inside the event handlers. A runtime flip therefore needs no
90
+ * subscription to `Directionality.change`.
91
+ */
92
+ private readonly dir;
77
93
  protected readonly classes: _angular_core.Signal<string>;
78
94
  protected readonly lowPercent: _angular_core.Signal<number>;
79
95
  protected readonly highPercent: _angular_core.Signal<number>;
80
- protected readonly fillLeft: _angular_core.Signal<number>;
96
+ /** Offset of the fill from the track's START edge — the left one in LTR, the right one in RTL. */
97
+ protected readonly fillStart: _angular_core.Signal<number>;
81
98
  protected readonly fillWidth: _angular_core.Signal<number>;
82
99
  protected readonly label: _angular_core.Signal<string>;
83
100
  constructor();
84
101
  protected onPointerDown(event: PointerEvent, thumb: 'low' | 'high'): void;
85
102
  protected onTrackPointerDown(event: PointerEvent): void;
86
103
  protected onKey(event: KeyboardEvent, thumb: 'low' | 'high'): void;
104
+ private isRtl;
105
+ /**
106
+ * The value under a pointer, measured along the track's INLINE axis.
107
+ *
108
+ * The offset is taken from whichever edge the track starts at — the left one
109
+ * in LTR, the right one in RTL — so the whole component needs the direction
110
+ * in exactly one place. Measuring from `rect.left` regardless would read 0 at
111
+ * the visual maximum of a mirrored track.
112
+ */
113
+ private valueAt;
87
114
  private updateFromEvent;
115
+ /**
116
+ * Which thumb a track click grabs: the one nearest the pointer ON SCREEN.
117
+ *
118
+ * Value distance is the same thing as visual distance once {@link valueAt}
119
+ * has mirrored the ratio — in RTL the low thumb is the RIGHT one, and a click
120
+ * near the right edge lands close to `low` in value space too.
121
+ */
88
122
  private nearestThumb;
89
123
  private focusThumb;
90
124
  private setThumb;
@@ -14,9 +14,19 @@ import * as _angular_core from '@angular/core';
14
14
  */
15
15
  declare class WrSparkline {
16
16
  readonly data: _angular_core.InputSignal<readonly number[]>;
17
+ /**
18
+ * Accessible name. A sparkline usually sits beside the number it summarises, where
19
+ * announcing it again is noise — so it is `aria-hidden` by default and becomes a
20
+ * named `role="img"` only when a consumer says what it shows.
21
+ */
22
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
17
23
  /** Stroke colour. @default `var(--wr-color-primary)` */
18
24
  readonly color: _angular_core.InputSignal<string>;
19
- /** Stroke width in viewBox units. @default 1.5 */
25
+ /**
26
+ * Line thickness in CSS pixels — `vector-effect="non-scaling-stroke"` keeps it at
27
+ * that width whatever the box is stretched to, so it is NOT in viewBox units.
28
+ * @default 1.5
29
+ */
20
30
  readonly strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
21
31
  /** Fill the area below the line. @default false */
22
32
  readonly showArea: _angular_core.InputSignalWithTransform<boolean, any>;
@@ -42,7 +52,7 @@ declare class WrSparkline {
42
52
  } | null>;
43
53
  protected readonly viewBox: string;
44
54
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSparkline, never>;
45
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSparkline, "wr-sparkline", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "showArea": { "alias": "showArea"; "required": false; "isSignal": true; }; "showTip": { "alias": "showTip"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
55
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSparkline, "wr-sparkline", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "showArea": { "alias": "showArea"; "required": false; "isSignal": true; }; "showTip": { "alias": "showTip"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
46
56
  }
47
57
 
48
58
  export { WrSparkline };
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
2
3
  import { WrIconName } from 'ngwr/icon';
3
4
 
4
5
  /** Per-button action shown when the dial expands. */
@@ -10,24 +11,6 @@ interface WrSpeedDialAction {
10
11
  /** Direction the action buttons fan out. */
11
12
  type WrSpeedDialDirection = 'up' | 'down' | 'left' | 'right';
12
13
 
13
- /**
14
- * Floating action button that expands into a fan of secondary actions on
15
- * click / hover. Place inside a positioned container or near `position: fixed`
16
- * — the component itself doesn't pin to the viewport.
17
- *
18
- * @example
19
- * ```html
20
- * <wr-speed-dial
21
- * [actions]="[
22
- * { id: 'new', label: 'New', icon: 'add' },
23
- * { id: 'edit', label: 'Edit', icon: 'cog' }
24
- * ]"
25
- * (pick)="onPick($event)"
26
- * />
27
- * ```
28
- *
29
- * @see https://ngwr.dev/reference/components/speed-dial
30
- */
31
14
  declare class WrSpeedDial {
32
15
  readonly actions: _angular_core.InputSignal<readonly WrSpeedDialAction[]>;
33
16
  /**
@@ -52,9 +35,25 @@ declare class WrSpeedDial {
52
35
  readonly safeArea: _angular_core.InputSignalWithTransform<boolean, any>;
53
36
  /** Fires when the user picks one of the actions. */
54
37
  readonly pick: _angular_core.OutputEmitterRef<WrSpeedDialAction>;
38
+ /** Id the trigger's `aria-controls` points at. */
39
+ protected readonly menuId: string;
40
+ protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
41
+ constructor();
55
42
  protected readonly classes: _angular_core.Signal<string>;
56
43
  protected onTrigger(): void;
57
44
  protected onPick(action: WrSpeedDialAction): void;
45
+ /**
46
+ * `role="menu"` promises a way out, and the actions are ordinary buttons in the tab
47
+ * order — without this a keyboard user who opened the dial had to tab through every
48
+ * action to leave it.
49
+ */
50
+ protected onKeydown(event: KeyboardEvent): void;
51
+ /**
52
+ * First GLYPH of the label, for an action with no icon. `charAt(0)` returns one
53
+ * UTF-16 code unit, which cuts an astral character (an emoji) in half and renders a
54
+ * replacement character.
55
+ */
56
+ protected initial(label: string): string;
58
57
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSpeedDial, never>;
59
58
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSpeedDial, "wr-speed-dial", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "safeArea": { "alias": "safeArea"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pick": "pick"; }, never, never, true, never>;
60
59
  }
@@ -32,9 +32,16 @@ declare class WrSpinner {
32
32
  * @default 'md'
33
33
  */
34
34
  readonly size: _angular_core.InputSignal<WrSpinnerSize>;
35
+ /**
36
+ * Accessible name for the live region. Falls back to `spinner.label`, then
37
+ * `'Loading'` — which the host used to carry as a hard-coded attribute, while
38
+ * the catalog had the translated key for it all along.
39
+ */
40
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
41
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
35
42
  protected readonly classes: _angular_core.Signal<string>;
36
43
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSpinner, never>;
37
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSpinner, "wr-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
44
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSpinner, "wr-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
38
45
  }
39
46
 
40
47
  export { WrSpinner };
@@ -36,8 +36,18 @@ declare class WrSplitter {
36
36
  readonly maxPosition: _angular_core.InputSignalWithTransform<number, unknown>;
37
37
  /** Disable dragging. @default false */
38
38
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
39
+ /**
40
+ * Accessible name of the divider. A focusable `role="separator"` is an
41
+ * interactive widget, so it needs one — without it a screen reader reaching the
42
+ * divider announces nothing but "separator" and its number. Falls back to
43
+ * `splitter.divider`.
44
+ */
45
+ readonly dividerLabel: _angular_core.InputSignal<string | null>;
46
+ protected readonly resolvedDividerLabel: _angular_core.Signal<string>;
39
47
  private readonly host;
48
+ private readonly dir;
40
49
  private dragging;
50
+ constructor();
41
51
  protected readonly classes: _angular_core.Signal<string>;
42
52
  protected readonly startStyle: _angular_core.Signal<string>;
43
53
  protected readonly endStyle: _angular_core.Signal<string>;
@@ -45,8 +55,21 @@ declare class WrSplitter {
45
55
  protected onPointerMove(event: PointerEvent): void;
46
56
  protected onPointerUp(event: PointerEvent): void;
47
57
  protected onKeydown(event: KeyboardEvent): void;
58
+ /**
59
+ * Fraction of the host's width measured from the INLINE-START edge — the left edge in
60
+ * LTR, the right edge in RTL, which is where `flex-direction: row` puts the start pane
61
+ * whose size `position` is. Counted from `rect.left` in both, a drag under `dir="rtl"`
62
+ * read 0 where the start pane was widest and inverted the whole gesture.
63
+ */
64
+ private inlineFraction;
65
+ /**
66
+ * Read per event rather than cached: nothing this component renders is derived from the
67
+ * direction — `flex-direction: row` mirrors the panes on its own — so there is no stale
68
+ * value for `Directionality.change` to invalidate.
69
+ */
70
+ private isRtl;
48
71
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSplitter, never>;
49
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSplitter, "wr-splitter", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "minPosition": { "alias": "minPosition"; "required": false; "isSignal": true; }; "maxPosition": { "alias": "maxPosition"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "position": "positionChange"; }, never, ["[wrSplitterStart]", "[wrSplitterEnd]"], true, never>;
72
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSplitter, "wr-splitter", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "minPosition": { "alias": "minPosition"; "required": false; "isSignal": true; }; "maxPosition": { "alias": "maxPosition"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "dividerLabel": { "alias": "dividerLabel"; "required": false; "isSignal": true; }; }, { "position": "positionChange"; }, never, ["[wrSplitterStart]", "[wrSplitterEnd]"], true, never>;
50
73
  }
51
74
 
52
75
  export { WrSplitter };
@@ -100,15 +100,25 @@ declare class WrStatisticCountdown {
100
100
  /** Optional text shown once the countdown reaches zero. */
101
101
  readonly endText: _angular_core.InputSignal<string | null>;
102
102
  /**
103
- * Tick interval in ms. Drop to ~16 for `SSS` (millisecond display).
103
+ * Tick interval in ms. Drop to ~16 for `SSS` (millisecond display). Floored
104
+ * at one frame — `0` (or an unparseable value) asked `setInterval` to run as
105
+ * fast as the browser would allow, which is a busy loop, not a countdown.
104
106
  * @default 1000
105
107
  */
106
- readonly tickMs: _angular_core.InputSignal<number>;
108
+ readonly tickMs: _angular_core.InputSignalWithTransform<number, unknown>;
107
109
  /** Fires once when the countdown crosses zero. */
108
110
  readonly countdownEnd: _angular_core.OutputEmitterRef<void>;
109
111
  private readonly destroyRef;
110
112
  private readonly isBrowser;
111
113
  private readonly targetMs;
114
+ /**
115
+ * Milliseconds left, or `null` when `target` does not parse to a date at all.
116
+ * `new Date('nope').getTime()` is `NaN`, and `NaN` propagated all the way to
117
+ * the screen as `NaN:NaN:NaN` — and, worse, `tick` compared it to `0` and so
118
+ * never fired `countdownEnd`, while a guard that only clamped the text would
119
+ * have fired it immediately for a target that was never reached.
120
+ */
121
+ private remainingMs;
112
122
  /** Remaining milliseconds (live signal). */
113
123
  protected readonly remaining: _angular_core.WritableSignal<number>;
114
124
  protected readonly finished: _angular_core.WritableSignal<boolean>;