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
@@ -84,6 +84,7 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
84
84
  private readonly host;
85
85
  private readonly destroyRef;
86
86
  protected readonly inputEl: _angular_core.Signal<ElementRef<HTMLInputElement>>;
87
+ protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
87
88
  /** The picked Date. Bound by `[formField]`, or two-way via `[(value)]`. */
88
89
  readonly value: _angular_core.ModelSignal<Date | null>;
89
90
  /** Emitted on blur so a bound field can mark itself touched. */
@@ -92,6 +93,14 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
92
93
  protected readonly text: _angular_core.WritableSignal<string>;
93
94
  /** Whether the popover is currently open. */
94
95
  protected readonly overlayOpen: _angular_core.WritableSignal<boolean>;
96
+ /**
97
+ * Where focus came from, captured as an explicit argument at open time —
98
+ * never read off `document.activeElement`, which by then may already be the
99
+ * pane. Every close path that took focus INTO the panel hands it back here.
100
+ */
101
+ private openedFrom;
102
+ /** Whether the panel this open cycle should take focus. */
103
+ private autoFocusPanel;
95
104
  /** Resolved format — falls back to a mode-appropriate default. */
96
105
  protected readonly resolvedFormat: _angular_core.Signal<string>;
97
106
  protected readonly isTime: _angular_core.Signal<boolean>;
@@ -99,6 +108,9 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
99
108
  private readonly labelDate;
100
109
  private readonly labelTime;
101
110
  private readonly labelDateTime;
111
+ private readonly panelLabelDate;
112
+ private readonly panelLabelTime;
113
+ private readonly panelLabelDateTime;
102
114
  /**
103
115
  * Accessible name of the text field. Falls back to the placeholder, then to
104
116
  * the same catalog string the calendar button uses — the field is a
@@ -108,11 +120,25 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
108
120
  private readonly fieldLabel;
109
121
  protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
110
122
  protected readonly triggerLabel: _angular_core.Signal<string>;
123
+ /**
124
+ * Accessible name of the popup. The trigger advertises
125
+ * `aria-haspopup="dialog"`, so the panel is a `role="dialog"` — and an unnamed
126
+ * dialog announces as a bare "dialog". Defaults to the catalog's
127
+ * `datePicker.panel*` string for the current `mode`.
128
+ */
129
+ readonly panelAriaLabel: _angular_core.InputSignal<string | null>;
130
+ /** Popup id — what the trigger's `aria-controls` points at while open. */
131
+ protected readonly panelId: string;
132
+ protected readonly resolvedPanelLabel: _angular_core.Signal<string>;
111
133
  protected readonly classes: _angular_core.Signal<string>;
112
134
  private overlayRef;
113
135
  /** Live calendar ref while the date popover is open — lets the panel track
114
136
  * the typed value in real time (not just on reopen). */
115
137
  private readonly dateRef;
138
+ private readonly timeRef;
139
+ private readonly dateTimeRef;
140
+ /** The last value an open panel handed us, so the live push never echoes it back. */
141
+ private lastFromPanel;
116
142
  /** Last value we pushed into the model ourselves — lets the sync effect
117
143
  * skip the echo of our own edits (so a live keystroke's raw text is never
118
144
  * reformatted mid-type). */
@@ -123,6 +149,24 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
123
149
  /** Called by the input's click — opens the overlay if it isn't open already. */
124
150
  protected openOnInput(): void;
125
151
  protected toggleOverlay(): void;
152
+ /**
153
+ * The keyboard route into the panel, per the APG date-picker pattern.
154
+ *
155
+ * `Alt+ArrowDown` opens and takes focus; a bare arrow moves focus in when the
156
+ * panel is ALREADY open, which is how someone who opened it by clicking the
157
+ * field gets to the grid. Every other key — characters, Backspace, the
158
+ * horizontal arrows, Home / End — is left to the field untouched, so typing a
159
+ * date keeps working exactly as before.
160
+ */
161
+ protected onFieldKey(event: KeyboardEvent): void;
162
+ /**
163
+ * Move focus into an already-mounted panel. A plain query is right HERE and
164
+ * wrong at mount time: the panel has settled, so there is no deferral to get
165
+ * wrong — and it keeps `autoFocus` as the single piece of panel API.
166
+ */
167
+ private focusPanel;
168
+ /** Hand focus back to whatever opened the panel, if it is still on the page. */
169
+ private restoreFocus;
126
170
  private openOverlay;
127
171
  private attachDate;
128
172
  private attachTime;
@@ -131,12 +175,19 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
131
175
  /** Push a value to the model while remembering it, so the sync effect treats
132
176
  * the resulting change as an echo and leaves the display text alone. */
133
177
  private commitValue;
178
+ /**
179
+ * Focus goes back to the opener only when it was still INSIDE the panel —
180
+ * dropped there, it would land on `<body>` and the next Tab would restart
181
+ * from the top of the page. When focus had already moved elsewhere (a click
182
+ * on another control, which is itself what closed us) it is left alone:
183
+ * stealing it back would fight the user for the caret.
184
+ */
134
185
  private closeOverlay;
135
186
  private dispose;
136
187
  private isOutOfBounds;
137
188
  private sameDate;
138
189
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDatePicker, never>;
139
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDatePicker, "wr-date-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
190
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDatePicker, "wr-date-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "panelAriaLabel": { "alias": "panelAriaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
140
191
  }
141
192
 
142
193
  /**
@@ -154,6 +205,8 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
154
205
  */
155
206
  type WrDateRange = readonly [Date | null, Date | null];
156
207
 
208
+ /** Which end of the range an edit applies to. */
209
+ type RangeEnd = 0 | 1;
157
210
  /**
158
211
  * Date-range picker — two text inputs sharing one range calendar.
159
212
  *
@@ -224,7 +277,17 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
224
277
  * @default false
225
278
  */
226
279
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
227
- /** Read-only — inputs not typeable, but the trigger icon still opens the overlay. @default false */
280
+ /**
281
+ * Read-only — neither the inputs nor the calendar can change the value.
282
+ *
283
+ * Deliberately stricter than `wr-date-picker`, which still opens its popup
284
+ * while read-only: with two fields feeding one calendar there is no reading
285
+ * of "untypeable" that leaves the grid free to rewrite both ends. The doc
286
+ * used to promise the trigger still opened; the code has always refused, and
287
+ * refusing is the behaviour worth keeping.
288
+ *
289
+ * @default false
290
+ */
228
291
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, any>;
229
292
  private readonly adapter;
230
293
  private readonly overlay;
@@ -233,6 +296,8 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
233
296
  private readonly host;
234
297
  private readonly destroyRef;
235
298
  protected readonly startEl: _angular_core.Signal<ElementRef<HTMLInputElement>>;
299
+ protected readonly endEl: _angular_core.Signal<ElementRef<HTMLInputElement>>;
300
+ protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
236
301
  /** The picked range. Bound by `[formField]`, or two-way via `[(value)]`. */
237
302
  readonly value: _angular_core.ModelSignal<WrDateRange | null>;
238
303
  /** Emitted on blur so a bound field can mark itself touched. */
@@ -242,12 +307,34 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
242
307
  protected readonly endText: _angular_core.WritableSignal<string>;
243
308
  /** Whether the popover is currently open. */
244
309
  protected readonly overlayOpen: _angular_core.WritableSignal<boolean>;
310
+ /**
311
+ * Which element opened the popup — captured as an argument, never read off
312
+ * `document.activeElement`, which by then may already be the pane. With TWO
313
+ * text inputs this is the whole point: "restore focus to the field" is
314
+ * ambiguous here, and the old code resolved it by always picking the START
315
+ * input, so closing from the end input threw the caret across the control.
316
+ */
317
+ private openedFrom;
318
+ /** Whether the panel this open cycle should take focus. */
319
+ private autoFocusPanel;
245
320
  /** Resolved format — falls back to a mode-appropriate default. */
246
321
  protected readonly resolvedFormat: _angular_core.Signal<string>;
247
322
  protected readonly isDateTime: _angular_core.Signal<boolean>;
248
323
  protected readonly triggerLabel: string;
249
324
  protected readonly startLabel: string;
250
325
  protected readonly endLabel: string;
326
+ private readonly panelLabelRange;
327
+ private readonly panelLabelRangeDateTime;
328
+ /**
329
+ * Accessible name of the popup. The trigger advertises
330
+ * `aria-haspopup="dialog"`, so the pane is a `role="dialog"` — and an unnamed
331
+ * dialog announces as a bare "dialog". Defaults to the catalog's
332
+ * `datePicker.panelRange*` string for the current `mode`.
333
+ */
334
+ readonly panelAriaLabel: _angular_core.InputSignal<string | null>;
335
+ /** Popup id — what the trigger's `aria-controls` points at while open. */
336
+ protected readonly panelId: string;
337
+ protected readonly resolvedPanelLabel: _angular_core.Signal<string>;
251
338
  protected readonly classes: _angular_core.Signal<string>;
252
339
  private overlayRef;
253
340
  /** Live panel ref while the popover is open — lets typed edits move the
@@ -261,15 +348,39 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
261
348
  protected onEndInput(event: Event): void;
262
349
  protected onBlur(event: FocusEvent): void;
263
350
  /** Called by an input's click — opens the overlay if it isn't open already. */
264
- protected openOnInput(): void;
351
+ protected openOnInput(end: RangeEnd): void;
265
352
  protected toggleOverlay(): void;
353
+ /**
354
+ * The keyboard route into the popup, per the APG date-picker pattern, and the
355
+ * only one either field has. `Alt+ArrowDown` opens and takes focus; a bare
356
+ * vertical arrow walks focus in when the popup is ALREADY open, which is how
357
+ * someone who opened it by clicking a field reaches the grid. Every other key
358
+ * belongs to the field, so typing a date keeps working with the popup open.
359
+ */
360
+ protected onFieldKey(event: KeyboardEvent, end: RangeEnd): void;
361
+ /** The input element for an end — the two are otherwise addressed by index. */
362
+ private fieldEl;
363
+ /**
364
+ * Move focus into an already-mounted panel. A plain query is right HERE and
365
+ * wrong at mount time: the panel has settled, so there is no deferral to get
366
+ * wrong — and it keeps `autoFocus` as the single piece of panel API.
367
+ */
368
+ private focusPanel;
369
+ /** Hand focus back to whatever opened the popup, if it is still on the page. */
370
+ private restoreFocus;
266
371
  private onRangeInput;
267
372
  private openOverlay;
268
373
  /**
269
- * Close the popover. `restoreFocus` returns focus to the start input — needed
270
- * when the overlay is dismissed while focus lives inside it (picking the
271
- * second date), because disposing then leaves focus on a removed element and
272
- * the browser falls back to `<body>`.
374
+ * Close the popover, handing focus back to whichever field or button opened
375
+ * it — but ONLY when focus was still inside the pane. Dropped there it would
376
+ * land on `<body>` and the next Tab would restart from the top of the page;
377
+ * moved on by the user, it must be left where they put it.
378
+ *
379
+ * There is deliberately no "always restore" escape hatch. Escape reaches this
380
+ * overlay from anywhere in the document (the CDK dispatches it to the topmost
381
+ * one), so forcing a restore would drag the caret backwards out of the field
382
+ * the user was actually typing in — into the one that happened to open the
383
+ * popup, possibly several Tab stops away.
273
384
  */
274
385
  private closeOverlay;
275
386
  private dispose;
@@ -300,9 +411,18 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
300
411
  */
301
412
  private isOutOfBounds;
302
413
  private sameDate;
414
+ /**
415
+ * `null` and `[null, null]` are the same VALUE — an empty range — and treating
416
+ * them as different is what let the FIRST blur on an untouched picker write
417
+ * `[null, null]` over the `null` it was bound to. No date had moved, but
418
+ * `model()` emitted: a bound `[formField]` went dirty from nothing but tabbing
419
+ * through, and a consumer's `@if (period())` flipped from empty to truthy with
420
+ * neither end picked. The write guard in `commitRange` is only as good as this
421
+ * comparison.
422
+ */
303
423
  private sameRange;
304
424
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDateRangePicker, never>;
305
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDateRangePicker, "wr-date-range-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
425
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDateRangePicker, "wr-date-range-picker", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "panelAriaLabel": { "alias": "panelAriaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
306
426
  }
307
427
 
308
428
  export { WrDatePicker, WrDateRangePicker };
@@ -0,0 +1,79 @@
1
+ import { BaseHarnessFilters, ContentContainerComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+
3
+ /**
4
+ * @license
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
8
+ */
9
+
10
+ /** Narrows which open dialog a harness query matches. */
11
+ interface WrDialogHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match the dialog's `[wrDialogTitle]` text — a string is an exact match, a
14
+ * RegExp is tested. A dialog with no title never matches.
15
+ */
16
+ readonly title?: string | RegExp;
17
+ }
18
+
19
+ /**
20
+ * @license
21
+ *
22
+ * Use of this source code is governed by an MIT-style license that can be
23
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
24
+ */
25
+
26
+ /**
27
+ * Test harness for a dialog opened with `WrDialog.open()`.
28
+ *
29
+ * A dialog is never inside the fixture — `WrDialog` attaches it to the overlay
30
+ * container — so load this from `TestbedHarnessEnvironment.documentRootLoader()`
31
+ * rather than from `loader()`. The harness is a CONTENT CONTAINER, which is what
32
+ * makes the interesting assertions possible: the buttons and fields it holds are
33
+ * the consumer's own components, so `dialog.getHarness(WrButtonHarness…)` reads
34
+ * them without the spec ever touching the overlay.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
39
+ * const dialog = await rootLoader.getHarness(WrDialogHarness);
40
+ *
41
+ * expect(await dialog.getTitleText()).toBe('Delete this item?');
42
+ * await (await dialog.getHarness(WrButtonHarness.with({ text: 'Delete' }))).click();
43
+ * ```
44
+ *
45
+ * @see https://ngwr.dev/guides/testing
46
+ */
47
+ declare class WrDialogHarness extends ContentContainerComponentHarness {
48
+ /** The overlay panel `WrDialog` creates. */
49
+ static hostSelector: string;
50
+ /** Build a predicate that narrows the query — useful when two dialogs are stacked. */
51
+ static with(options?: WrDialogHarnessFilters): HarnessPredicate<WrDialogHarness>;
52
+ /** The `[wrDialogTitle]` text, or `null` when the dialog has no title. */
53
+ getTitleText(): Promise<string | null>;
54
+ /** The `[wrDialogContent]` text, or `null` when the dialog projects no content region. */
55
+ getContentText(): Promise<string | null>;
56
+ /**
57
+ * The role and modality the dialog announces.
58
+ *
59
+ * Worth asserting rather than assuming: `WrDialog` sets these on the OVERLAY
60
+ * element, not on the component it renders, so a consumer looking for them on
61
+ * their own host would not find them.
62
+ */
63
+ getRole(): Promise<string | null>;
64
+ /** Whether the dialog is marked `aria-modal`. */
65
+ isModal(): Promise<boolean>;
66
+ /** Whether the built-in dismiss button is present (`closable`, the default). */
67
+ isClosable(): Promise<boolean>;
68
+ /** The dismiss button's accessible name — the string a screen reader reads out. */
69
+ getCloseLabel(): Promise<string | null>;
70
+ /** Click the built-in dismiss button. Throws when the dialog was opened `closable: false`. */
71
+ close(): Promise<void>;
72
+ /** Press Escape. A dialog opened `closeOnEscape: false` ignores it — assert, do not assume. */
73
+ sendEscape(): Promise<void>;
74
+ /** Whether focus is currently somewhere inside the dialog, where the trap should keep it. */
75
+ isFocusTrapped(): Promise<boolean>;
76
+ }
77
+
78
+ export { WrDialogHarness };
79
+ export type { WrDialogHarnessFilters };
@@ -140,6 +140,19 @@ declare class WrDialog {
140
140
  private readonly responsiveConfig;
141
141
  private readonly i18n;
142
142
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, options?: WrDialogOptions<D>): WrDialogRef<C, R>;
143
+ /**
144
+ * The dismiss button's accessible name.
145
+ *
146
+ * Two failure modes, and resolving PER OPEN is what covers both. `t()` hands
147
+ * back the KEY on a miss, and `WrI18n` is root-provided with an empty catalog
148
+ * by default, so an app that never configured i18n named its dismiss button
149
+ * "dialog.close" — a name axe cannot fault, because a name is present, and a
150
+ * screen reader reads out verbatim. Resolving once at injection time fixed
151
+ * that but froze the answer: this is a root service, constructed before an
152
+ * async catalog has loaded, so a localized app got the English fallback on
153
+ * every dialog it ever opened.
154
+ */
155
+ private closeLabel;
143
156
  static ɵfac: i0.ɵɵFactoryDeclaration<WrDialog, never>;
144
157
  static ɵprov: i0.ɵɵInjectableDeclaration<WrDialog>;
145
158
  }
@@ -85,7 +85,16 @@ declare class WrCopyToClipboard {
85
85
  private readonly doc;
86
86
  /** @internal */
87
87
  protected onClick(): Promise<void>;
88
- /** Legacy clipboard write — hidden textarea + execCommand('copy'). */
88
+ /**
89
+ * Legacy clipboard write — hidden textarea + `execCommand('copy')`.
90
+ *
91
+ * Two things this has to get right beyond writing the text. `execCommand`
92
+ * REPORTS refusal rather than throwing it: a document without focus hands back
93
+ * `false` and copies nothing, so ignoring the return value shows a "Copied!"
94
+ * toast over an unchanged clipboard. And selecting the textarea moves focus
95
+ * into it, so removing the node afterwards drops focus on `<body>` — the user's
96
+ * next Tab restarts from the top of the page, on every copy.
97
+ */
89
98
  private fallback;
90
99
  static ɵfac: i0.ɵɵFactoryDeclaration<WrCopyToClipboard, never>;
91
100
  static ɵdir: i0.ɵɵDirectiveDeclaration<WrCopyToClipboard, "[wrCopyToClipboard]", never, { "wrCopyToClipboard": { "alias": "wrCopyToClipboard"; "required": true; "isSignal": true; }; }, { "copied": "copied"; "copyFailed": "copyFailed"; }, never, never, true, never>;
@@ -22,6 +22,13 @@ interface WrDonutSegment {
22
22
  */
23
23
  declare class WrDonutChart {
24
24
  readonly segments: _angular_core.InputSignal<readonly WrDonutSegment[]>;
25
+ /**
26
+ * Accessible name of the chart. The ring is `aria-hidden` and the legend is optional,
27
+ * so with `showLegend: false` this is the only thing a screen reader gets. Falls back
28
+ * to `donutChart.label`.
29
+ */
30
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
31
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
25
32
  /** Diameter in CSS pixels. @default 200 */
26
33
  readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
27
34
  /** Inner-ring thickness as a percent of radius (0–100). `0` = solid pie. @default 30 */
@@ -46,7 +53,7 @@ declare class WrDonutChart {
46
53
  /** SVG path for one donut slice using outer and inner arcs. */
47
54
  private arcPath;
48
55
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDonutChart, never>;
49
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDonutChart, "wr-donut-chart", never, { "segments": { "alias": "segments"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "centerValue": { "alias": "centerValue"; "required": false; "isSignal": true; }; "centerLabel": { "alias": "centerLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
56
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDonutChart, "wr-donut-chart", never, { "segments": { "alias": "segments"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "centerValue": { "alias": "centerValue"; "required": false; "isSignal": true; }; "centerLabel": { "alias": "centerLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
50
57
  }
51
58
 
52
59
  export { WrDonutChart };
@@ -0,0 +1,196 @@
1
+ import { BaseHarnessFilters, ContentContainerComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrDrawerPosition } from 'ngwr/drawer';
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
+ /** Narrows which open drawer a harness query matches. */
12
+ interface WrDrawerHarnessFilters extends BaseHarnessFilters {
13
+ /**
14
+ * Match the `[wrDrawerTitle]` text — a string is an exact match, a RegExp is
15
+ * tested. A drawer with no title never matches.
16
+ */
17
+ readonly title?: string | RegExp;
18
+ /**
19
+ * Match the `[wrDrawerContent]` text. A drawer whose content is not wrapped in
20
+ * that directive never matches.
21
+ */
22
+ readonly content?: string | RegExp;
23
+ /** Match the edge the drawer slid in from: `left`, `right`, `top` or `bottom`. */
24
+ readonly position?: WrDrawerPosition;
25
+ }
26
+
27
+ /**
28
+ * @license
29
+ *
30
+ * Use of this source code is governed by an MIT-style license that can be
31
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
32
+ */
33
+
34
+ /**
35
+ * Test harness for an open drawer — both flavours.
36
+ *
37
+ * A drawer ships as an element (`<wr-drawer [(open)]="…">`) AND as a service call
38
+ * (`WrDrawerManager.open(Cmp)`), but neither puts the panel where a consumer's
39
+ * spec can see it: both render into the NGWR overlay container, a sibling of the
40
+ * whole app. So this is loaded from `TestbedHarnessEnvironment.documentRootLoader()`
41
+ * in BOTH cases — a fixture-scoped loader finds nothing, including for the element
42
+ * form, whose `<wr-drawer>` host is `display: none` and holds no content.
43
+ *
44
+ * The harness is anchored on the overlay pane, which is the one element the two
45
+ * flavours share: for `<wr-drawer>` it wraps the panel div, for the manager it IS
46
+ * the panel (the caller's component is attached straight into it). It is also the
47
+ * only per-instance anchor there is — `<wr-drawer>` publishes no `aria-controls` /
48
+ * `aria-owns` link to the overlay it opened — which is why every query here starts
49
+ * from the pane rather than from a class in the shared container.
50
+ *
51
+ * The harness is a CONTENT CONTAINER: the fields and buttons in the panel are the
52
+ * consumer's own components, so `drawer.getHarness(WrButtonHarness…)` reads them
53
+ * without the spec ever touching the overlay.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
58
+ * const drawer = await rootLoader.getHarness(WrDrawerHarness.with({ title: 'Filters' }));
59
+ *
60
+ * expect(await drawer.getPosition()).toBe('bottom');
61
+ * expect(await drawer.isSheet()).toBe(true);
62
+ * await drawer.close();
63
+ * ```
64
+ *
65
+ * @see https://ngwr.dev/guides/testing
66
+ */
67
+ declare class WrDrawerHarness extends ContentContainerComponentHarness {
68
+ /** The overlay pane both flavours create. A closed drawer has none. */
69
+ static hostSelector: string;
70
+ /** Build a predicate that narrows the query — drawers can be stacked. */
71
+ static with(options?: WrDrawerHarnessFilters): HarnessPredicate<WrDrawerHarness>;
72
+ /**
73
+ * Whether this drawer is still open.
74
+ *
75
+ * A harness can only be obtained while a drawer is open — closing disposes the
76
+ * overlay, panel and all — so this is the answer for a harness you are already
77
+ * HOLDING: it flips to `false` after a dismissal, where a fresh
78
+ * `getHarnessOrNull()` comes back `null`.
79
+ *
80
+ * Attachment is the test, not a class: disposal takes the pane out of the
81
+ * document along with its wrapper, so the `body` ancestor in the selector is what
82
+ * distinguishes a live panel from the detached element a stale harness holds.
83
+ */
84
+ isOpen(): Promise<boolean>;
85
+ /** The `[wrDrawerTitle]` text, or `null` when the drawer has no title. */
86
+ getTitleText(): Promise<string | null>;
87
+ /** The `[wrDrawerContent]` text, or `null` when the body is not wrapped in it. */
88
+ getContentText(): Promise<string | null>;
89
+ /**
90
+ * The edge the drawer is attached to.
91
+ *
92
+ * Read from the overlay's own side modifier, which both flavours set and consumer
93
+ * CSS targets. It is a real mode axis rather than a style flag: left/right size
94
+ * themselves from `width` and stretch full-height, top/bottom span the viewport
95
+ * and size themselves from `height` / `maxHeight`.
96
+ */
97
+ getPosition(): Promise<WrDrawerPosition>;
98
+ /**
99
+ * Whether the drawer presents as a SHEET rather than a side panel — the top and
100
+ * bottom edges, where it spans the full viewport width and takes its size from
101
+ * `height` / `maxHeight`.
102
+ *
103
+ * This answers the axis only. The bottom-sheet look is that plus `rounded` and
104
+ * `showHandle`, which {@link isRounded} and {@link hasHandle} answer separately.
105
+ */
106
+ isSheet(): Promise<boolean>;
107
+ /** Whether the leading corners are rounded (`rounded`). */
108
+ isRounded(): Promise<boolean>;
109
+ /** Whether the trailing edge is padded for the device's safe area (`safeArea`). */
110
+ hasSafeArea(): Promise<boolean>;
111
+ /**
112
+ * Whether the drawer draws a grab handle (`showHandle`), which is also what
113
+ * enables swipe-to-dismiss.
114
+ *
115
+ * Always `false` for a `WrDrawerManager.open()` drawer, and not a defect: the
116
+ * handle lives in the component's own wrapper markup, which the service path
117
+ * replaces with the caller's component.
118
+ */
119
+ hasHandle(): Promise<boolean>;
120
+ /**
121
+ * The role the drawer announces.
122
+ *
123
+ * Worth asserting rather than assuming: both flavours write it onto the OVERLAY
124
+ * element, not onto the markup the consumer wrote, so a spec looking for it on
125
+ * its own host would not find it.
126
+ */
127
+ getRole(): Promise<string | null>;
128
+ /** Whether the drawer is marked `aria-modal` — the promise the backdrop and focus trap make. */
129
+ isModal(): Promise<boolean>;
130
+ /**
131
+ * Whether the panel takes its accessible name from the drawer's own title.
132
+ *
133
+ * Both flavours point `aria-labelledby` at `[wrDrawerTitle]`'s generated id, but
134
+ * only once the content is in the DOM — deferred either way — so a spec has to
135
+ * let the fixture settle (`await fixture.whenStable()`) before asking.
136
+ */
137
+ isLabelledByTitle(): Promise<boolean>;
138
+ /** Whether the built-in dismiss (✕) button is present (`closable`, the default). */
139
+ isClosable(): Promise<boolean>;
140
+ /** The dismiss button's accessible name — the string a screen reader reads out. */
141
+ getCloseLabel(): Promise<string | null>;
142
+ /**
143
+ * Click the built-in dismiss button.
144
+ *
145
+ * Throws on a drawer opened `closable: false`. That is a deliberate shape — the
146
+ * projected content owns the close affordance, typically a `[wrDrawerClose]`
147
+ * button — and a quiet no-op here would read as "closed" three assertions later.
148
+ */
149
+ close(): Promise<void>;
150
+ /**
151
+ * Press Escape. A drawer opened `closeOnEscape: false` ignores it — assert, do
152
+ * not assume.
153
+ *
154
+ * The key reaches a drawer through the CDK's keyboard dispatcher, which hands it
155
+ * to the TOP-MOST listening overlay, so with drawers stacked this dismisses the
156
+ * top one whichever harness it is called on.
157
+ */
158
+ sendEscape(): Promise<void>;
159
+ /** Whether the drawer dims the page behind it (`hasBackdrop`, the default). */
160
+ hasBackdrop(): Promise<boolean>;
161
+ /**
162
+ * Click the backdrop — the third way a drawer is dismissed, next to the dismiss
163
+ * button and Escape, and the one a `closeOnBackdropClick: false` drawer is meant
164
+ * to survive.
165
+ */
166
+ clickBackdrop(): Promise<void>;
167
+ /** Whether focus is currently inside the drawer, where the trap should hold it. */
168
+ isFocusTrapped(): Promise<boolean>;
169
+ /**
170
+ * The element carrying the `.wr-drawer__panel` classes.
171
+ *
172
+ * `WrDrawerManager` flattens the panel onto the overlay pane itself, while
173
+ * `<wr-drawer>` renders it as a div inside the pane — same classes, one level
174
+ * apart, so the modifiers have to be read from whichever element has them.
175
+ */
176
+ private panel;
177
+ /**
178
+ * THIS drawer's backdrop, or `null` when it has none.
179
+ *
180
+ * Scoped by the overlay pane's own id, not by a bare `.wr-drawer-backdrop` query:
181
+ * the container is shared, so a class query answers with whichever drawer opened
182
+ * first — and two drawers open at once can disagree about `hasBackdrop`.
183
+ *
184
+ * Two queries, because the CDK puts the backdrop in one of two places. With the
185
+ * popover API — its default wherever `showPopover` exists, so in every real
186
+ * browser — the backdrop is PREPENDED INSIDE the host, next to the pane, which is
187
+ * what the first query's `+` pins down. Without it (jsdom, or `usePopover: false`)
188
+ * it goes immediately BEFORE the host wrapper that holds the pane, which is what
189
+ * the second query matches — so under vitest the second one does the work and the
190
+ * first is the production path.
191
+ */
192
+ private backdrop;
193
+ }
194
+
195
+ export { WrDrawerHarness };
196
+ export type { WrDrawerHarnessFilters };
@@ -254,6 +254,21 @@ declare class WrDrawerManager {
254
254
  private readonly isBrowser;
255
255
  private readonly i18n;
256
256
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, options?: WrDrawerOptions<D>): WrDrawerRef<C, R>;
257
+ /**
258
+ * The dismiss button's accessible name.
259
+ *
260
+ * Resolved per open, not once at injection: this is a root service, so a
261
+ * `readI18nText` field — which is what `WrDialog` uses — would be evaluated
262
+ * before an async catalog had loaded and then freeze that answer for the life
263
+ * of the app.
264
+ *
265
+ * The miss check is the point. `t()` hands back the KEY when the catalog has
266
+ * no entry, and `WrI18n` is root-provided with an empty catalog by default —
267
+ * so an app that never configured i18n got a button announced as
268
+ * "drawer.close, button". A name WAS present, which is exactly why the axe
269
+ * gate could not see it.
270
+ */
271
+ private closeLabel;
257
272
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDrawerManager, never>;
258
273
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrDrawerManager>;
259
274
  }