ngwr 11.2.0 → 12.1.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 (395) hide show
  1. package/README.md +85 -26
  2. package/burger/styles/_index.scss +1 -1
  3. package/button/styles/_index.scss +2 -2
  4. package/calendar/styles/_index.scss +32 -12
  5. package/calendar-heatmap/styles/_index.scss +20 -0
  6. package/carousel/styles/_index.scss +23 -1
  7. package/cascader/styles/_index.scss +15 -3
  8. package/checkbox/styles/_index.scss +2 -2
  9. package/collapse/styles/_index.scss +2 -2
  10. package/color-picker/styles/_index.scss +3 -3
  11. package/compare/styles/_index.scss +18 -2
  12. package/context-menu/styles/_index.scss +21 -2
  13. package/date-picker/styles/_index.scss +5 -5
  14. package/descriptions/styles/_index.scss +1 -1
  15. package/drag-drop/styles/_index.scss +28 -1
  16. package/drawer/styles/_index.scss +37 -0
  17. package/dropdown/styles/_index.scss +2 -2
  18. package/event-calendar/styles/_index.scss +67 -10
  19. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  20. package/fesm2022/ngwr-affix.mjs +3 -3
  21. package/fesm2022/ngwr-alert.mjs +3 -3
  22. package/fesm2022/ngwr-anchor.mjs +3 -3
  23. package/fesm2022/ngwr-aurora.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs +3 -3
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-badge.mjs +6 -6
  27. package/fesm2022/ngwr-bar-chart-testing.mjs +20 -2
  28. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  30. package/fesm2022/ngwr-blur-text.mjs +3 -3
  31. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  32. package/fesm2022/ngwr-border-glow.mjs +4 -4
  33. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  34. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  35. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/ngwr-burger.mjs +3 -3
  37. package/fesm2022/ngwr-button.mjs +6 -6
  38. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  39. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  40. package/fesm2022/ngwr-calendar-testing.mjs +1 -1
  41. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  42. package/fesm2022/ngwr-calendar.mjs +187 -9
  43. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  44. package/fesm2022/ngwr-card.mjs +10 -10
  45. package/fesm2022/ngwr-card.mjs.map +1 -1
  46. package/fesm2022/ngwr-carousel.mjs +124 -24
  47. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  48. package/fesm2022/ngwr-cascader.mjs +48 -5
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +6 -6
  51. package/fesm2022/ngwr-circular-text.mjs +4 -4
  52. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-click-spark.mjs +27 -7
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +3 -3
  56. package/fesm2022/ngwr-collapse.mjs +9 -9
  57. package/fesm2022/ngwr-color-picker-testing.mjs +26 -6
  58. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  59. package/fesm2022/ngwr-color-picker.mjs +98 -8
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +14 -5
  62. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  63. package/fesm2022/ngwr-compare.mjs +3 -3
  64. package/fesm2022/ngwr-confetti.mjs +31 -6
  65. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  66. package/fesm2022/ngwr-config.mjs +9 -0
  67. package/fesm2022/ngwr-config.mjs.map +1 -1
  68. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  69. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-context-menu.mjs +333 -43
  71. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  72. package/fesm2022/ngwr-cookie.mjs +3 -3
  73. package/fesm2022/ngwr-counter.mjs +25 -9
  74. package/fesm2022/ngwr-counter.mjs.map +1 -1
  75. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  76. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  77. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  78. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  79. package/fesm2022/ngwr-date-picker-testing.mjs +11 -6
  80. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  81. package/fesm2022/ngwr-date-picker.mjs +119 -37
  82. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  83. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  84. package/fesm2022/ngwr-date.mjs.map +1 -0
  85. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  86. package/fesm2022/ngwr-density.mjs +6 -6
  87. package/fesm2022/ngwr-descriptions.mjs +6 -6
  88. package/fesm2022/ngwr-dialog.mjs +73 -18
  89. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  90. package/fesm2022/ngwr-directives.mjs +12 -12
  91. package/fesm2022/ngwr-divider.mjs +52 -5
  92. package/fesm2022/ngwr-divider.mjs.map +1 -1
  93. package/fesm2022/ngwr-donut-chart-testing.mjs +8 -4
  94. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  96. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  97. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  98. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  99. package/fesm2022/ngwr-drawer.mjs +121 -58
  100. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  101. package/fesm2022/ngwr-dropdown.mjs +26 -10
  102. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  103. package/fesm2022/ngwr-empty.mjs +3 -3
  104. package/fesm2022/ngwr-event-calendar.mjs +28 -15
  105. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  106. package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
  107. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  108. package/fesm2022/ngwr-falling-text.mjs +75 -46
  109. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +32 -15
  112. package/fesm2022/ngwr-form.mjs.map +1 -1
  113. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  114. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  115. package/fesm2022/ngwr-gauge.mjs +3 -3
  116. package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
  117. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  119. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  120. package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
  121. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  123. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  124. package/fesm2022/ngwr-hotkey.mjs +24 -9
  125. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  126. package/fesm2022/ngwr-i18n-en.mjs +73 -1
  127. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  128. package/fesm2022/ngwr-i18n-ru.mjs +55 -1
  129. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  130. package/fesm2022/ngwr-i18n.mjs +26 -15
  131. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  132. package/fesm2022/ngwr-icon.mjs +6 -6
  133. package/fesm2022/ngwr-image-cropper-testing.mjs +53 -9
  134. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  135. package/fesm2022/ngwr-image-cropper.mjs +150 -12
  136. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  137. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  138. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  139. package/fesm2022/ngwr-input-number.mjs +17 -10
  140. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  141. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  142. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-input-otp.mjs +24 -5
  144. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  145. package/fesm2022/ngwr-input.mjs +15 -15
  146. package/fesm2022/ngwr-keyboard.mjs +3 -3
  147. package/fesm2022/ngwr-knob.mjs +3 -3
  148. package/fesm2022/ngwr-layout.mjs +15 -15
  149. package/fesm2022/ngwr-lightbox.mjs +4 -4
  150. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  151. package/fesm2022/ngwr-line-chart.mjs +73 -26
  152. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  153. package/fesm2022/ngwr-list.mjs +7 -7
  154. package/fesm2022/ngwr-list.mjs.map +1 -1
  155. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  156. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  157. package/fesm2022/ngwr-markdown.mjs +66 -8
  158. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  159. package/fesm2022/ngwr-marquee.mjs +4 -4
  160. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  161. package/fesm2022/ngwr-media.mjs +3 -3
  162. package/fesm2022/ngwr-mention.mjs +108 -13
  163. package/fesm2022/ngwr-mention.mjs.map +1 -1
  164. package/fesm2022/ngwr-meta.mjs +6 -6
  165. package/fesm2022/ngwr-meter-group-testing.mjs +26 -6
  166. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  167. package/fesm2022/ngwr-meter-group.mjs +3 -3
  168. package/fesm2022/ngwr-overlay.mjs +6 -6
  169. package/fesm2022/ngwr-page-header.mjs +3 -3
  170. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  171. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  172. package/fesm2022/ngwr-pagination.mjs +83 -16
  173. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  174. package/fesm2022/ngwr-pipes.mjs +39 -26
  175. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  176. package/fesm2022/ngwr-platform.mjs +9 -9
  177. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  178. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  179. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  180. package/fesm2022/ngwr-popover.mjs +155 -33
  181. package/fesm2022/ngwr-popover.mjs.map +1 -1
  182. package/fesm2022/ngwr-progress.mjs +3 -3
  183. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  184. package/fesm2022/ngwr-qr.mjs +42 -5
  185. package/fesm2022/ngwr-qr.mjs.map +1 -1
  186. package/fesm2022/ngwr-radio.mjs +6 -6
  187. package/fesm2022/ngwr-rating.mjs +3 -3
  188. package/fesm2022/ngwr-result.mjs +21 -30
  189. package/fesm2022/ngwr-result.mjs.map +1 -1
  190. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  191. package/fesm2022/ngwr-scroll.mjs +3 -3
  192. package/fesm2022/ngwr-segmented-testing.mjs +85 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +123 -10
  195. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  196. package/fesm2022/ngwr-select.mjs +159 -34
  197. package/fesm2022/ngwr-select.mjs.map +1 -1
  198. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  199. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  200. package/fesm2022/ngwr-sidebar.mjs +31 -16
  201. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  202. package/fesm2022/ngwr-skeleton.mjs +3 -3
  203. package/fesm2022/ngwr-slider.mjs +100 -9
  204. package/fesm2022/ngwr-slider.mjs.map +1 -1
  205. package/fesm2022/ngwr-sparkline.mjs +3 -3
  206. package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
  207. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  208. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  209. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  210. package/fesm2022/ngwr-spinner.mjs +3 -3
  211. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  212. package/fesm2022/ngwr-split-text.mjs +17 -5
  213. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-splitter.mjs +3 -3
  215. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  216. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  217. package/fesm2022/ngwr-squircle.mjs +6 -6
  218. package/fesm2022/ngwr-star-border.mjs +4 -4
  219. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  220. package/fesm2022/ngwr-statistic.mjs +9 -9
  221. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  222. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-stepper.mjs +33 -8
  224. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  225. package/fesm2022/ngwr-storage.mjs +17 -5
  226. package/fesm2022/ngwr-storage.mjs.map +1 -1
  227. package/fesm2022/ngwr-switch.mjs +3 -3
  228. package/fesm2022/ngwr-table.mjs +99 -39
  229. package/fesm2022/ngwr-table.mjs.map +1 -1
  230. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  231. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-tabs.mjs +36 -10
  233. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  234. package/fesm2022/ngwr-textarea.mjs +3 -3
  235. package/fesm2022/ngwr-theme.mjs +181 -4
  236. package/fesm2022/ngwr-theme.mjs.map +1 -1
  237. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  238. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  239. package/fesm2022/ngwr-timeline.mjs +6 -6
  240. package/fesm2022/ngwr-toast.mjs +9 -9
  241. package/fesm2022/ngwr-toolbar.mjs +3 -3
  242. package/fesm2022/ngwr-tour.mjs +34 -10
  243. package/fesm2022/ngwr-tour.mjs.map +1 -1
  244. package/fesm2022/ngwr-transfer.mjs +3 -3
  245. package/fesm2022/ngwr-tree.mjs +28 -10
  246. package/fesm2022/ngwr-tree.mjs.map +1 -1
  247. package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
  248. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  249. package/fesm2022/ngwr-typewriter.mjs +13 -5
  250. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  251. package/fesm2022/ngwr-typography.mjs +3 -3
  252. package/fesm2022/ngwr-utils.mjs +5 -2
  253. package/fesm2022/ngwr-utils.mjs.map +1 -1
  254. package/fesm2022/ngwr-version.mjs +1 -1
  255. package/fesm2022/ngwr-version.mjs.map +1 -1
  256. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  257. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  258. package/fesm2022/ngwr-waves.mjs +4 -4
  259. package/fesm2022/ngwr-waves.mjs.map +1 -1
  260. package/fesm2022/ngwr-window.mjs +94 -24
  261. package/fesm2022/ngwr-window.mjs.map +1 -1
  262. package/file-upload/styles/_index.scss +2 -2
  263. package/glitch-text/styles/_index.scss +27 -12
  264. package/i18n/en.json +56 -6
  265. package/i18n/ru.json +56 -6
  266. package/image-cropper/styles/_index.scss +19 -0
  267. package/input/styles/_index.scss +2 -2
  268. package/input-number/styles/_index.scss +2 -2
  269. package/input-otp/styles/_index.scss +9 -2
  270. package/knob/styles/_index.scss +1 -1
  271. package/lightbox/styles/_index.scss +16 -2
  272. package/line-chart/styles/_index.scss +28 -14
  273. package/list/styles/_index.scss +1 -1
  274. package/llms-full.txt +19 -24
  275. package/llms.txt +46 -8
  276. package/markdown/styles/_index.scss +3 -3
  277. package/mcp/api.js +6 -4
  278. package/mcp/catalog.js +40 -3
  279. package/mcp/providers.js +16 -3
  280. package/mcp/tools.js +21 -1
  281. package/meter-group/styles/_index.scss +1 -1
  282. package/overlay/styles/_index.scss +33 -1
  283. package/package.json +17 -12
  284. package/pagination/styles/_index.scss +23 -1
  285. package/popover/styles/_index.scss +16 -7
  286. package/progress/styles/_index.scss +1 -1
  287. package/radio/styles/_index.scss +2 -2
  288. package/rating/styles/_index.scss +1 -1
  289. package/schematics/collection.json +1 -1
  290. package/schematics/migrations/v12/index.js +65 -0
  291. package/schematics/migrations/v7/index.js +12 -1
  292. package/schematics/migrations/v8/index.js +10 -1
  293. package/schematics/migrations.json +5 -0
  294. package/schematics/ng-add/index.js +8 -3
  295. package/schematics/provider/index.js +80 -13
  296. package/schematics/use/index.js +9 -129
  297. package/schematics/use/rule.js +206 -0
  298. package/schematics/use/symbol-map.json +4 -4
  299. package/segmented/styles/_index.scss +14 -3
  300. package/select/styles/_index.scss +14 -2
  301. package/sidebar/styles/_index.scss +12 -10
  302. package/skills/ngwr/SKILL.md +7 -5
  303. package/skills/ngwr/references/catalog.md +9 -9
  304. package/skills/ngwr/references/setup.md +10 -5
  305. package/slider/styles/_index.scss +1 -1
  306. package/speed-dial/styles/_index.scss +1 -1
  307. package/stepper/styles/_index.scss +12 -3
  308. package/switch/styles/_index.scss +2 -2
  309. package/table/styles/_index.scss +61 -12
  310. package/tabs/styles/_index.scss +1 -1
  311. package/textarea/styles/_index.scss +1 -1
  312. package/theme/styles/_colors.scss +142 -56
  313. package/theme/styles/_dark.scss +46 -3
  314. package/theme/styles/_focus.scss +28 -5
  315. package/theme/styles/_mixins.scss +1 -1
  316. package/theme/styles/_variables.scss +67 -0
  317. package/transfer/styles/_index.scss +26 -3
  318. package/tree/styles/_index.scss +29 -6
  319. package/types/ngwr-bar-chart-testing.d.ts +9 -1
  320. package/types/ngwr-blur-text.d.ts +8 -4
  321. package/types/ngwr-breadcrumbs.d.ts +17 -10
  322. package/types/ngwr-calendar-testing.d.ts +1 -1
  323. package/types/ngwr-calendar.d.ts +66 -0
  324. package/types/ngwr-carousel.d.ts +85 -6
  325. package/types/ngwr-cascader.d.ts +17 -0
  326. package/types/ngwr-click-spark.d.ts +4 -0
  327. package/types/ngwr-color-picker-testing.d.ts +8 -0
  328. package/types/ngwr-color-picker.d.ts +21 -1
  329. package/types/ngwr-confetti.d.ts +8 -0
  330. package/types/ngwr-config.d.ts +10 -1
  331. package/types/ngwr-context-menu-testing.d.ts +24 -11
  332. package/types/ngwr-context-menu.d.ts +56 -0
  333. package/types/ngwr-counter.d.ts +1 -0
  334. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  335. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  336. package/types/ngwr-date-picker-testing.d.ts +11 -6
  337. package/types/ngwr-date-picker.d.ts +8 -4
  338. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  339. package/types/ngwr-dialog.d.ts +38 -1
  340. package/types/ngwr-divider.d.ts +25 -0
  341. package/types/ngwr-donut-chart-testing.d.ts +7 -3
  342. package/types/ngwr-donut-chart.d.ts +3 -3
  343. package/types/ngwr-drag-drop.d.ts +56 -2
  344. package/types/ngwr-drawer.d.ts +56 -5
  345. package/types/ngwr-event-calendar.d.ts +8 -2
  346. package/types/ngwr-falling-text-testing.d.ts +5 -3
  347. package/types/ngwr-falling-text.d.ts +1 -1
  348. package/types/ngwr-form.d.ts +12 -2
  349. package/types/ngwr-glitch-text-testing.d.ts +37 -8
  350. package/types/ngwr-gradient-text-testing.d.ts +16 -3
  351. package/types/ngwr-i18n.d.ts +13 -4
  352. package/types/ngwr-image-cropper-testing.d.ts +49 -10
  353. package/types/ngwr-image-cropper.d.ts +70 -5
  354. package/types/ngwr-input-number-testing.d.ts +15 -10
  355. package/types/ngwr-input-number.d.ts +11 -4
  356. package/types/ngwr-input-otp-testing.d.ts +12 -6
  357. package/types/ngwr-input-otp.d.ts +15 -1
  358. package/types/ngwr-line-chart.d.ts +20 -3
  359. package/types/ngwr-markdown.d.ts +11 -0
  360. package/types/ngwr-mention.d.ts +32 -0
  361. package/types/ngwr-meter-group-testing.d.ts +12 -2
  362. package/types/ngwr-overlay.d.ts +1 -0
  363. package/types/ngwr-pagination-testing.d.ts +4 -4
  364. package/types/ngwr-pagination.d.ts +11 -0
  365. package/types/ngwr-pipes.d.ts +1 -1
  366. package/types/ngwr-popover-testing.d.ts +7 -2
  367. package/types/ngwr-popover.d.ts +1 -0
  368. package/types/ngwr-result.d.ts +6 -0
  369. package/types/ngwr-segmented-testing.d.ts +53 -0
  370. package/types/ngwr-segmented.d.ts +107 -5
  371. package/types/ngwr-select.d.ts +68 -6
  372. package/types/ngwr-shiny-text.d.ts +4 -2
  373. package/types/ngwr-sidebar.d.ts +14 -5
  374. package/types/ngwr-slider.d.ts +69 -1
  375. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  376. package/types/ngwr-speed-dial.d.ts +22 -3
  377. package/types/ngwr-split-text.d.ts +9 -0
  378. package/types/ngwr-stepper-testing.d.ts +5 -5
  379. package/types/ngwr-stepper.d.ts +8 -0
  380. package/types/ngwr-storage.d.ts +1 -0
  381. package/types/ngwr-table.d.ts +104 -11
  382. package/types/ngwr-tabs-testing.d.ts +11 -10
  383. package/types/ngwr-tabs.d.ts +2 -0
  384. package/types/ngwr-theme.d.ts +82 -1
  385. package/types/ngwr-tour.d.ts +22 -4
  386. package/types/ngwr-tree.d.ts +5 -4
  387. package/types/ngwr-typewriter-testing.d.ts +10 -0
  388. package/types/ngwr-utils.d.ts +5 -2
  389. package/types/ngwr-version.d.ts +1 -1
  390. package/types/ngwr-window.d.ts +39 -11
  391. package/typography/styles/_index.scss +1 -1
  392. package/window/styles/_index.scss +72 -26
  393. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  395. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -194,6 +194,48 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
194
194
  protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
195
195
  /** Per-chip ARIA label — interpolates `{{label}}`. @internal */
196
196
  protected readonly chipRemoveLabel: (params?: ngwr_i18n.WrI18nParams) => string;
197
+ /**
198
+ * The overflow chip past `maxTagCount` — interpolates `{{count}}`. Through the
199
+ * catalog, like every other string here: printed as a bare `+{{ extra }} more`
200
+ * it stayed English in a fully localized app, beside an event-calendar cell
201
+ * reading "ещё 3" from the same string. @internal
202
+ */
203
+ protected readonly moreLabel: (params?: ngwr_i18n.WrI18nParams) => string;
204
+ private readonly field;
205
+ /**
206
+ * Id the surrounding `<wr-form-field>`'s `<label for>` points at.
207
+ *
208
+ * The field renders its label before it can see what was projected into it, so
209
+ * the id travels the other way and the control adopts it, exactly as `[wrInput]`
210
+ * and `wr-slider` do. Without this the `for` named an element that was nowhere in
211
+ * the document: clicking the label did nothing, and the field's own text reached
212
+ * the control through no path at all.
213
+ *
214
+ * It lands on the ONE focusable element each trigger shape has — the button, the
215
+ * search input, or the tag input — never on the host, because only a labelable
216
+ * element can be a label's target and `<wr-select>` is not one.
217
+ *
218
+ * What this does NOT change is that element's NAME: `aria-label` outranks a
219
+ * `<label>` in the accname order, and the trigger keeps `resolvedAriaLabel()`
220
+ * because the field cannot promise it has a name to give — `<wr-form-field>`
221
+ * renders a label only when its `label` input is set, and a combobox that traded
222
+ * a generic name for no name would be the worse bug. `WrFormFieldContext`
223
+ * publishes no "do I have a visible label" signal to key that on. Until it does,
224
+ * set `[ariaLabel]` to the field's label where the two should read alike.
225
+ */
226
+ protected readonly controlId: _angular_core.Signal<string | null>;
227
+ /**
228
+ * The field's error message, wired to the same element.
229
+ *
230
+ * Without it the messages `<wr-form-field>` renders are visible and nothing else:
231
+ * a screen reader on the trigger never learns the field is invalid, nor what the
232
+ * message says. `aria-invalid` is keyed on the message EXISTING rather than on
233
+ * `errorKeys()`, because the field only publishes an id once it is showing
234
+ * something — announcing "invalid" while pointing at nothing is worse than
235
+ * staying quiet.
236
+ */
237
+ protected readonly describedBy: _angular_core.Signal<string | null>;
238
+ protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
197
239
  /**
198
240
  * Disable the select. Bound automatically from the field's disabled state
199
241
  * when used with `[formField]`.
@@ -465,7 +507,17 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
465
507
  protected readonly dynamicOptions: _angular_core.Signal<readonly unknown[]>;
466
508
  private static readonly FALLBACK_ROW_PX;
467
509
  private static readonly FALLBACK_VIEWPORT_PX;
468
- /** Consumer-projected `<wr-option>` children only (NOT the `@for`-rendered ones). */
510
+ /**
511
+ * Consumer-projected `<wr-option>` children only (NOT the `@for`-rendered ones
512
+ * — those live in the panel's own view, which a content query never sees).
513
+ *
514
+ * `descendants: true` because a projected option is as often wrapped in a
515
+ * `<wr-option-group>` as it is a direct child, and the signal default is
516
+ * `false`. A grouped list therefore read as NO projected options: `virtualActive`
517
+ * engaged over the (empty) data array, so the panel rendered the group's rows
518
+ * with a virtual window beside them that owned the keyboard — no
519
+ * `aria-activedescendant`, no active row, and Enter committing nothing.
520
+ */
469
521
  private readonly projectedOptions;
470
522
  /**
471
523
  * `dynamicOptions()` narrowed to the current search query. `dynamicOptions()`
@@ -475,9 +527,9 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
475
527
  */
476
528
  protected readonly filteredDynamicOptions: _angular_core.Signal<readonly unknown[]>;
477
529
  /**
478
- * Virtualization engaged: opt-in, search mode, a non-empty filtered array, and
479
- * NO projected `<wr-option>` children (those keep the full-render registry path
480
- * so their DOM-derived labels / selection still work).
530
+ * Virtualization engaged: opt-in, search mode, and NO projected `<wr-option>`
531
+ * children — grouped ones included (those keep the full-render registry path so
532
+ * their DOM-derived labels / selection still work).
481
533
  *
482
534
  * NOT gated on there being matches. It used to also require
483
535
  * `filteredDynamicOptions().length > 0`, which meant a query matching nothing
@@ -576,8 +628,18 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
576
628
  isSelected(value: unknown): boolean;
577
629
  selectOption(value: unknown): void;
578
630
  registerOption(reg: WrSelectOptionRegistration): () => void;
579
- /** Remove one selection (chip × button). Works for multi and tag modes. */
580
- protected removeChip(value: unknown, event: Event): void;
631
+ /**
632
+ * Remove one selection (chip × button) BY POSITION. Works for multi and tag
633
+ * modes.
634
+ *
635
+ * Positional, not by value: under `allowDuplicates` two chips carry the same
636
+ * string, and a filter on equality deleted every copy at once — one click on
637
+ * the second "red" took both reds with it. `visibleChips()` slices the HEAD
638
+ * of `selectedChips()`, which maps the value array one for one, so the
639
+ * `$index` a chip was rendered with indexes the value array directly. The
640
+ * multi-mode toggle in `selectOption` was already positional.
641
+ */
642
+ protected removeChip(index: number, event: Event): void;
581
643
  /** Clear every selection (× button). Multi/tag → empty array; search → null. */
582
644
  protected clearAll(event: Event): void;
583
645
  /** Capacity check used by tag mode to refuse the next add. */
@@ -52,8 +52,10 @@ declare class WrShinyText {
52
52
  * Gradient sweep over text. Applies a `background-clip: text` gradient
53
53
  * with a moving highlight — gives any text a subtle shimmer.
54
54
  *
55
- * The directive only adds the `wr-shimmer` host class. Pair with the
56
- * styles in `ngwr/animations` (which include the `wr-shimmer` keyframes).
55
+ * The directive only adds the `wr-shimmer` host class. Pair with the styles
56
+ * in `ngwr/shiny-text` (`@use 'ngwr/shiny-text'`), which carry the
57
+ * `.wr-shimmer` rule and its keyframes; the umbrella `@use 'ngwr'` forwards
58
+ * the same sheet.
57
59
  *
58
60
  * @example
59
61
  * ```html
@@ -75,17 +75,26 @@ declare class WrSidebar {
75
75
  private readonly uid;
76
76
  private readonly router;
77
77
  private readonly currentUrl;
78
- /** Last URL we auto-expanded — prevents re-opening a group the user collapsed. */
78
+ /**
79
+ * Last URL we resolved to a group — prevents re-opening one the user collapsed.
80
+ * A URL no entry claims is deliberately NOT recorded: see the effect below.
81
+ */
79
82
  private lastAutoUrl;
80
83
  constructor();
81
84
  protected isOpen(title: string): boolean;
82
85
  /**
83
86
  * 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
+ *
88
+ * Keyed by POSITION, not by the title. Slugging the title kept the id readable
89
+ * but was not injective: it lowercases and collapses every non-`[a-z0-9]` run,
90
+ * so `Data & charts` and `Data / charts` produced the same string, and a title
91
+ * with no ASCII alphanumerics at all — `Компоненты`, `数据` — produced the empty
92
+ * one. A whole Russian or Chinese sidebar therefore emitted N identical ids and
93
+ * every toggle's `aria-controls` resolved to the FIRST group's body. The toggle
94
+ * and its body read `$index` from the same `@for` iteration, so the two always
95
+ * name each other — reordering `entries` renumbers both together.
87
96
  */
88
- protected groupBodyId(title: string): string;
97
+ protected groupBodyId(index: number): string;
89
98
  protected toggleGroup(title: string): void;
90
99
  protected asItem(entry: WrSidebarEntry): WrSidebarItem;
91
100
  protected asGroup(entry: WrSidebarEntry): WrSidebarGroup;
@@ -69,6 +69,63 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
69
69
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
70
70
  /** Render the current value below the track. @default true */
71
71
  readonly showLabel: _angular_core.InputSignalWithTransform<boolean, any>;
72
+ /**
73
+ * Accessible name of the thumb — the single one, or the LOWER one in range
74
+ * mode. Falls back to `slider.label` / `slider.lower`.
75
+ */
76
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
77
+ /** Accessible name of the upper thumb in range mode. Falls back to `slider.upper`. */
78
+ readonly upperLabel: _angular_core.InputSignal<string | null>;
79
+ /**
80
+ * A thumb projects no text, so these ARE the accessible names — and they were
81
+ * hard-coded English with no key behind them, so every slider on a page
82
+ * announced the same untranslated "Value" whatever it controlled.
83
+ *
84
+ * Range mode reads `ariaLabel` as the LOWER end rather than as the whole
85
+ * control: a name given once must land on something, and naming both thumbs
86
+ * the same thing would read two different values under one name.
87
+ */
88
+ private readonly singleLabel;
89
+ private readonly lowerLabel;
90
+ protected readonly resolvedUpperLabel: _angular_core.Signal<string>;
91
+ protected readonly resolvedLowLabel: _angular_core.Signal<string>;
92
+ private readonly field;
93
+ /**
94
+ * Id the surrounding `<wr-form-field>`'s `<label for>` points at, put on the
95
+ * single thumb — the LOWER one in range mode, the same end `ariaLabel` names.
96
+ *
97
+ * The field renders its label before it can see what was projected into it, so
98
+ * the id travels the other way and the control adopts it, exactly as
99
+ * `[wrInput]` does. Without this the `for` named an element that was nowhere
100
+ * in the document: clicking the label did nothing, and the field's own text
101
+ * reached the thumb through no path at all.
102
+ *
103
+ * It lands on the THUMB rather than on the host because only a labelable
104
+ * element can be a label's target, and `<wr-slider>` is not one — a `for`
105
+ * pointing at the host would resolve and still name nothing. The thumb is a
106
+ * real `<button>`, so it is.
107
+ *
108
+ * What this does NOT change is the thumb's name: an `aria-label` outranks a
109
+ * `<label>` in the accname order, and the thumb keeps its own because the
110
+ * field cannot promise it has one to give — `<wr-form-field>` renders a label
111
+ * only when `label` is set, and a slider that traded a generic name for no
112
+ * name would be the worse bug. Set `[ariaLabel]` to the field's label where
113
+ * the two should read alike.
114
+ */
115
+ protected readonly thumbId: _angular_core.Signal<string | null>;
116
+ /**
117
+ * The field's error message, wired to the thumb the same way `wrInput` wires it
118
+ * to its native element.
119
+ *
120
+ * Without this the messages `<wr-form-field>` renders are visible and nothing
121
+ * else: a screen reader on the thumb never learns the field is invalid, nor
122
+ * what the message says. `aria-invalid` is keyed on the message EXISTING rather
123
+ * than on `errorKeys()`, because the field only publishes an id once it is
124
+ * showing something — announcing "invalid" while pointing at nothing is worse
125
+ * than staying quiet.
126
+ */
127
+ protected readonly describedBy: _angular_core.Signal<string | null>;
128
+ protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
72
129
  /**
73
130
  * Current value. Bound by `[formField]`, or two-way via `[(value)]`. Shape
74
131
  * follows `range`: a plain `number`, or `[low, high]` in range mode.
@@ -116,6 +173,17 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
116
173
  protected onPointerDown(event: PointerEvent, thumb: 'low' | 'high'): void;
117
174
  protected onTrackPointerDown(event: PointerEvent): void;
118
175
  protected onKey(event: KeyboardEvent, thumb: 'low' | 'high'): void;
176
+ /**
177
+ * A bound field learns it may show its validation copy from `touch`, and
178
+ * pointer-up plus a value-changing keypress cannot be the only sources: a
179
+ * slider tabbed into and out of without an arrow press left the field
180
+ * untouched forever — which is exactly the case `touched` exists for, and
181
+ * what this output has always documented itself as doing. `wr-knob` and
182
+ * `wr-rating` bind `(blur)` on the one element they own; this component has
183
+ * two thumbs, so it listens for the bubbling `focusout` on its host instead
184
+ * — and ignores the one that only moves focus from one thumb to the other.
185
+ */
186
+ protected onFocusOut(event: FocusEvent): void;
119
187
  private isRtl;
120
188
  /**
121
189
  * The value under a pointer, measured along the track's INLINE axis.
@@ -142,7 +210,7 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
142
210
  private percentOf;
143
211
  private emitChange;
144
212
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSlider, never>;
145
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSlider, "wr-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSlider, "wr-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "upperLabel": { "alias": "upperLabel"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
146
214
  }
147
215
 
148
216
  export { WrSlider };
@@ -46,14 +46,12 @@ interface WrSpeedDialActionHarnessFilters extends BaseHarnessFilters {
46
46
  * @see https://ngwr.dev/guides/testing
47
47
  */
48
48
  declare class WrSpeedDialActionHarness extends ComponentHarness {
49
- /** The action button. `role="menuitem"` sits on this element too. */
49
+ /** The action button. */
50
50
  static hostSelector: string;
51
51
  /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
52
52
  static with(options?: WrSpeedDialActionHarnessFilters): HarnessPredicate<WrSpeedDialActionHarness>;
53
53
  /** The action's accessible name — what a screen reader reads, and what `title` shows. */
54
54
  getLabel(): Promise<string | null>;
55
- /** The role the action announces — `menuitem`. */
56
- getRole(): Promise<string | null>;
57
55
  /** Whether the action draws an icon rather than a letter. */
58
56
  hasIcon(): Promise<boolean>;
59
57
  /** The icon's registered name, from `wr-icon`'s reflected `data-icon`, or `null`. */
@@ -136,15 +134,22 @@ declare class WrSpeedDialHarness extends ComponentHarness {
136
134
  isDisabled(): Promise<boolean>;
137
135
  /** Whether the host is padded for the device's safe area (`safeArea`). */
138
136
  hasSafeArea(): Promise<boolean>;
139
- /** The role the action list announces — `menu`. */
137
+ /**
138
+ * The role the action list announces — `list`.
139
+ *
140
+ * Worth asking despite being a plain `<ul>`: the list is styled `list-style: none`,
141
+ * which drops the implicit list semantics in Safari, so the role is written out. It
142
+ * is deliberately NOT `menu` — that role promises arrows, Home/End and a single tab
143
+ * stop, none of which this component has.
144
+ */
140
145
  getMenuRole(): Promise<string | null>;
141
146
  /**
142
- * Whether the trigger's `aria-controls` names THIS dial's menu, and nothing else on
143
- * the page.
147
+ * Whether the trigger's `aria-controls` names THIS dial's action list, and nothing
148
+ * else on the page.
144
149
  *
145
150
  * Both halves matter. The id is resolved inside the host first, so a trigger
146
- * pointing at a SIBLING dial's menu — which resolves perfectly well from the
147
- * document — fails here. Then it is counted across the document, because two menus
151
+ * pointing at a SIBLING dial's list — which resolves perfectly well from the
152
+ * document — fails here. Then it is counted across the document, because two lists
148
153
  * answering to one id hand every reference to whichever comes first.
149
154
  */
150
155
  isMenuBound(): Promise<boolean>;
@@ -179,9 +184,8 @@ declare class WrSpeedDialHarness extends ComponentHarness {
179
184
  * Press Escape — closing the dial and putting focus back on the trigger.
180
185
  *
181
186
  * Sent to the host, which is where the component listens. The focus return is the
182
- * half worth asserting: `role="menu"` promises a way out, and the actions are
183
- * ordinary tab stops, so without it a keyboard user has to walk through every
184
- * action to leave.
187
+ * half worth asserting: the actions are ordinary tab stops, so without it a keyboard
188
+ * user has to walk through every action to leave.
185
189
  */
186
190
  sendEscape(): Promise<void>;
187
191
  /** Move keyboard focus to the trigger. */
@@ -11,6 +11,24 @@ interface WrSpeedDialAction {
11
11
  /** Direction the action buttons fan out. */
12
12
  type WrSpeedDialDirection = 'up' | 'down' | 'left' | 'right';
13
13
 
14
+ /**
15
+ * Floating action button that expands into a fan of secondary actions on click.
16
+ * Place inside a positioned container or near `position: fixed` — the component
17
+ * itself doesn't pin to the viewport.
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <wr-speed-dial
22
+ * [actions]="[
23
+ * { id: 'new', label: 'New', icon: 'add' },
24
+ * { id: 'edit', label: 'Edit', icon: 'cog' }
25
+ * ]"
26
+ * (pick)="onPick($event)"
27
+ * />
28
+ * ```
29
+ *
30
+ * @see https://ngwr.dev/reference/components/speed-dial
31
+ */
14
32
  declare class WrSpeedDial {
15
33
  readonly actions: _angular_core.InputSignal<readonly WrSpeedDialAction[]>;
16
34
  /**
@@ -38,14 +56,15 @@ declare class WrSpeedDial {
38
56
  /** Id the trigger's `aria-controls` points at. */
39
57
  protected readonly menuId: string;
40
58
  protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
59
+ private readonly host;
41
60
  constructor();
42
61
  protected readonly classes: _angular_core.Signal<string>;
43
62
  protected onTrigger(): void;
44
63
  protected onPick(action: WrSpeedDialAction): void;
45
64
  /**
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.
65
+ * Escape closes the dial and hands the caret back. The actions are ordinary buttons
66
+ * in the tab order, so without this a keyboard user who opened the dial had to tab
67
+ * through every action to leave it.
49
68
  */
50
69
  protected onKeydown(event: KeyboardEvent): void;
51
70
  /**
@@ -84,6 +84,15 @@ declare class WrSplitText {
84
84
  * watching the same host and all of them able to fire `animate()`.
85
85
  */
86
86
  private observer;
87
+ /**
88
+ * `startObserver()` builds its observer inside a `document.fonts.ready`
89
+ * continuation, so the component can be destroyed while it is awaiting. At
90
+ * that moment `observer` is still null, so the destroy hook below disconnects
91
+ * nothing — and the continuation then starts an observer on a host Angular
92
+ * has already detached, which nothing is left to disconnect. Same hazard, and
93
+ * same flag, as `wr-fuzzy-text`.
94
+ */
95
+ private destroyed;
87
96
  constructor();
88
97
  private startObserver;
89
98
  private animate;
@@ -248,11 +248,11 @@ declare class WrStepperHarness extends ComponentHarness {
248
248
  * The index of the step the wizard is showing, from the header announcing
249
249
  * `aria-current="step"`.
250
250
  *
251
- * Throws when no header does, which is a state a stepper can genuinely be in: the
252
- * `active` model is two-way, `WrStepper.goTo()` clamps an out-of-range index but a
253
- * host writing `active` directly does not, and an index past the last step leaves
254
- * every header un-current and every step body hidden. A `-1` here would be read as
255
- * "the first step" by the next line of a spec.
251
+ * Throws when no header does, which is a state a stepper can genuinely be in: one
252
+ * with no `<wr-step>` children renders its (empty) header strip and no body. A `-1`
253
+ * here would be read as "the first step" by the next line of a spec. An
254
+ * out-of-range `active` is NOT such a state — `WrStepper` clamps the two-way model
255
+ * back into the step list, not only inside `goTo()`.
256
256
  */
257
257
  getActiveIndex(): Promise<number>;
258
258
  /** The label of the step the wizard is showing. Throws when there is no current step. */
@@ -88,6 +88,14 @@ declare class WrStepper implements WrStepperContext {
88
88
  */
89
89
  readonly responsive: _angular_core.InputSignalWithTransform<boolean, any>;
90
90
  protected readonly steps: _angular_core.Signal<readonly WrStep[]>;
91
+ /**
92
+ * The "optional" badge sits INSIDE the header button's label span, so the word
93
+ * is part of the step's accessible name — a hard-coded literal announced English
94
+ * to every locale, not just showed it. Catalog-only rather than an input: the
95
+ * badge is one word shared by every step, and an app that wants other wording
96
+ * overrides `stepper.optional` once instead of on every `<wr-step>`.
97
+ */
98
+ protected readonly optionalLabel: _angular_core.Signal<string>;
91
99
  protected readonly classes: _angular_core.Signal<string>;
92
100
  constructor();
93
101
  /** Is the step at `index` considered completed? */
@@ -36,6 +36,7 @@ import * as ngwr_storage from 'ngwr/storage';
36
36
  declare class WrStorage {
37
37
  private readonly engine;
38
38
  private readonly config;
39
+ private readonly destroyRef;
39
40
  private readonly isBrowser;
40
41
  /**
41
42
  * Per-key watchers. Shared so multiple `watch(k)` calls reuse one signal.
@@ -2,6 +2,57 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef } from '@angular/core';
3
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
4
 
5
+ /**
6
+ * @license
7
+ *
8
+ * Use of this source code is governed by an MIT-style license that can be
9
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
10
+ */
11
+ /**
12
+ * One row handed to `wr-table` through `[items]`.
13
+ *
14
+ * **`object`, not `Record<string, unknown>`, and the difference is the whole
15
+ * reason this type exists.** TypeScript withholds the implicit index signature
16
+ * from an `interface`, because declaration merging can widen one later, so an
17
+ * interface is NOT assignable to `Record<string, unknown>` while a `type` alias
18
+ * describing the same shape IS:
19
+ *
20
+ * ```ts
21
+ * interface UserI { id: number }
22
+ * type UserT = { id: number };
23
+ *
24
+ * declare function take(rows: readonly Record<string, unknown>[]): void;
25
+ * take([] as UserI[]); // Index signature for type 'string' is missing in type 'UserI'
26
+ * take([] as UserT[]); // fine
27
+ * ```
28
+ *
29
+ * The table used to declare `[items]` as the record form, so `[items]="users"`
30
+ * compiled for one declaration of `User` and failed for the other — reported as
31
+ * "the table refuses my data", which is what it looks like from outside. Nothing
32
+ * about the row is read at bind time; the table reads cells by string key and
33
+ * hands back `unknown`, so the wider type costs nothing and accepts both.
34
+ *
35
+ * The row callbacks (`rowKey`, `groupBy`, `childrenKey`) do NOT take this type:
36
+ * their parameter is `Record<string, unknown>`, and it stays that way. A
37
+ * parameter is contravariant, so no signature short of a generic component can
38
+ * accept `(row: User) => row.id` — and widening it to `object` would reject the
39
+ * callbacks that do compile today (an explicit
40
+ * `(row: Record<string, unknown>) => …`) while making the row unindexable.
41
+ *
42
+ * Index the row instead — `(row) => row['id']` needs no cast at all — or, to
43
+ * reach your own type, `(row) => (row as unknown as User).id`. A single
44
+ * `as User` is not enough for an `interface`: TypeScript refuses that
45
+ * conversion outright (TS2352, "neither type sufficiently overlaps"), over the
46
+ * same missing index signature. `rowKey="id"` sidesteps all of it.
47
+ *
48
+ * `childrenKey` is the one callback that also RETURNS rows, and there the type
49
+ * IS this wide one — a return is covariant, so
50
+ * `(row) => (row as unknown as User).reports` needs no second assertion on the
51
+ * array. Declared narrow, it accepted a forest through `[items]` and refused to
52
+ * let the children back out.
53
+ */
54
+ type WrTableRow = object;
55
+
5
56
  /**
6
57
  * @license
7
58
  *
@@ -248,8 +299,22 @@ type RenderRow = {
248
299
  declare class WrTable {
249
300
  /** Column definitions, keyed by row property name. */
250
301
  readonly columns: _angular_core.InputSignal<WrTableColumns>;
251
- /** Row items. `null`/`undefined` renders the empty state; use `[loading]` for the spinner. */
252
- readonly items: _angular_core.InputSignal<readonly Record<string, unknown>[] | null | undefined>;
302
+ /**
303
+ * Row items. `null`/`undefined` renders the empty state; use `[loading]` for
304
+ * the spinner.
305
+ *
306
+ * Typed `WrTableRow` (= `object`) rather than `Record<string, unknown>`, so an
307
+ * array of an `interface` binds as readily as an array of a `type` — see
308
+ * {@link WrTableRow} for why those two are not the same to TypeScript.
309
+ */
310
+ readonly items: _angular_core.InputSignal<readonly object[] | null | undefined>;
311
+ /**
312
+ * The rows as records, for everything downstream that reads a cell by key.
313
+ *
314
+ * One cast at the boundary: the INPUT is wide so any object shape binds, while
315
+ * the body keeps indexing rows the way it always has.
316
+ */
317
+ private readonly rows;
253
318
  /** Show the loading spinner overlay. @default false */
254
319
  readonly loading: _angular_core.InputSignalWithTransform<boolean, any>;
255
320
  /**
@@ -314,6 +379,14 @@ declare class WrTable {
314
379
  *
315
380
  * `pageSize` pages the ROOTS; a root brings its open descendants with it.
316
381
  *
382
+ * The function form RETURNS `WrTableRow`s, matching `[items]`: a return is
383
+ * covariant, so an array of `interface`-typed children satisfies it. Declared
384
+ * as records it did not, and a forest that bound to `[items]` could not hand
385
+ * its children back out. The PARAMETER stays `Record<string, unknown>` — that
386
+ * side is contravariant, and widening it would reject the callbacks that
387
+ * compile today while leaving `row['reports']` unindexable. See
388
+ * {@link WrTableRow}.
389
+ *
317
390
  * @example
318
391
  * ```html
319
392
  * <wr-table
@@ -326,7 +399,7 @@ declare class WrTable {
326
399
  * />
327
400
  * ```
328
401
  */
329
- readonly childrenKey: _angular_core.InputSignal<string | ((row: Record<string, unknown>) => readonly Record<string, unknown>[] | null | undefined) | null>;
402
+ readonly childrenKey: _angular_core.InputSignal<string | ((row: Record<string, unknown>) => readonly WrTableRow[] | null | undefined) | null>;
330
403
  /**
331
404
  * Which column carries the indent and the expand toggle. Keyed, not
332
405
  * positional, so it survives a `columnOrder` drag. Defaults to whichever
@@ -476,9 +549,17 @@ declare class WrTable {
476
549
  private readonly pins;
477
550
  constructor();
478
551
  private measurePins;
479
- /** Sticky `left` offset (px) for a left-pinned column, else `null`. */
552
+ /**
553
+ * Sticky `inset-inline-start` offset (px) for a `pin: 'left'` column, else `null`.
554
+ *
555
+ * The input keeps its physical name — it is public API — but the offset it
556
+ * produces is LOGICAL. `measurePins()` accumulates in DOM order, which is
557
+ * start-to-end semantics, and under `dir="rtl"` the column order mirrors: a
558
+ * `pin: 'left'` column then sits at the physical right, where a `left: 0`
559
+ * sticky inset can never catch it and the column just scrolls away.
560
+ */
480
561
  protected leftPin(key: string): number | null;
481
- /** Sticky `right` offset (px) for a right-pinned column, else `null`. */
562
+ /** Sticky `inset-inline-end` offset (px) for a `pin: 'right'` column, else `null`. See {@link leftPin}. */
482
563
  protected rightPin(key: string): number | null;
483
564
  /** Whether `key` is the inner-edge pinned column on `side` (carries the shadow). */
484
565
  protected isPinEdge(key: string, side: 'left' | 'right'): boolean;
@@ -569,7 +650,7 @@ declare class WrTable {
569
650
  * that is every VISIBLE node — a collapsed subtree is not on screen and is not
570
651
  * swept in, which keeps the checkbox honest about what it just did.
571
652
  */
572
- private readonly pageRowKeys;
653
+ protected readonly pageRowKeys: _angular_core.Signal<readonly unknown[]>;
573
654
  protected isRowSelected(row: Record<string, unknown>): boolean;
574
655
  /** Every current-page row selected (drives the header checkbox). */
575
656
  protected readonly allSelected: _angular_core.Signal<boolean>;
@@ -633,9 +714,9 @@ declare class WrTable {
633
714
  /**
634
715
  * The flat `<tbody>` render list. Ungrouped it is exactly today's rows in
635
716
  * order (the rendered elements are unchanged; only the `@for` track identity
636
- * moves to a stable id). Returns `[]` for both no-rows and loading — the
637
- * template's `@if (visibleItems())` guard keeps the loading case from showing
638
- * the empty row.
717
+ * moves to a stable id). Returns `[]` for nullish rows, and reads nothing about
718
+ * `loading()` — suppressing the "no data" row under the spinner is the
719
+ * template's job, not this one's.
639
720
  */
640
721
  protected readonly renderRows: _angular_core.Signal<readonly RenderRow[]>;
641
722
  /** Default band label — the primitive as text, `'—'` for empty, JSON for objects. */
@@ -793,8 +874,20 @@ declare class WrTableFilter {
793
874
  readonly filterLabel: _angular_core.InputSignal<string | null>;
794
875
  /** Text shown when the search finds nothing. Falls back to `table.noMatches`. */
795
876
  readonly noMatchesLabel: _angular_core.InputSignal<string | null>;
877
+ /**
878
+ * Placeholder AND accessible name of the search box. Falls back to `table.search`.
879
+ *
880
+ * One string for both because the box has no visible label: the placeholder was
881
+ * its only name, so a hard-coded literal left the control unnamed in every other
882
+ * language rather than merely untranslated.
883
+ */
884
+ readonly searchLabel: _angular_core.InputSignal<string | null>;
885
+ /** Label of the clear-selection button. Falls back to `table.reset`. */
886
+ readonly resetLabel: _angular_core.InputSignal<string | null>;
796
887
  protected readonly resolvedFilterLabel: _angular_core.Signal<string>;
797
888
  protected readonly resolvedNoMatchesLabel: _angular_core.Signal<string>;
889
+ protected readonly resolvedSearchLabel: _angular_core.Signal<string>;
890
+ protected readonly resolvedResetLabel: _angular_core.Signal<string>;
798
891
  readonly items: _angular_core.InputSignal<readonly WrTableFilterItem<unknown>[]>;
799
892
  /** Fires whenever the selection changes. */
800
893
  readonly selectionChange: _angular_core.OutputEmitterRef<readonly WrTableFilterItem<unknown>[]>;
@@ -818,8 +911,8 @@ declare class WrTableFilter {
818
911
  protected onReset(): void;
819
912
  private emitSelected;
820
913
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTableFilter, never>;
821
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTableFilter, "wr-table-filter", never, { "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "noMatchesLabel": { "alias": "noMatchesLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
914
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTableFilter, "wr-table-filter", never, { "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "noMatchesLabel": { "alias": "noMatchesLabel"; "required": false; "isSignal": true; }; "searchLabel": { "alias": "searchLabel"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
822
915
  }
823
916
 
824
917
  export { WrTable, WrTableCell, WrTableExpand, WrTableFilter, WrTableGroupHeader, WrTableSort };
825
- export type { WrTableCellContext, WrTableColumn, WrTableColumns, WrTableCsvOptions, WrTableExpandContext, WrTableFilterChange, WrTableFilterItem, WrTableGroupContext, WrTableSortDirection, WrTableSortState, WrTableSummary };
918
+ export type { WrTableCellContext, WrTableColumn, WrTableColumns, WrTableCsvOptions, WrTableExpandContext, WrTableFilterChange, WrTableFilterItem, WrTableGroupContext, WrTableRow, WrTableSortDirection, WrTableSortState, WrTableSummary };
@@ -111,12 +111,12 @@ declare class WrTabHarness extends ContentContainerComponentHarness {
111
111
  * Whether this is the strip's selected tab.
112
112
  *
113
113
  * `aria-selected` first, because that is the state a screen reader acts on and
114
- * the `--active` class is only what it looks like. A ROUTER tab carries no
115
- * `aria-selected` at all — the router paints the class through
116
- * `routerLinkActive` and nothing announces the selection — so the class is the
117
- * fallback rather than the first choice, and the two branches are not
118
- * interchangeable: reading the class first would report a content tab as selected
119
- * while `aria-selected="false"` told assistive tech otherwise.
114
+ * the `--active` class is only what it looks like. Both shapes carry it now — a
115
+ * router tab publishes it off the same `routerLinkActive` that paints the class —
116
+ * so the class is a fallback for a tab that has neither yet, not a second reading
117
+ * of the same thing. The order is not interchangeable: reading the class first
118
+ * would report a tab as selected while `aria-selected="false"` told assistive tech
119
+ * otherwise.
120
120
  */
121
121
  isSelected(): Promise<boolean>;
122
122
  /**
@@ -243,10 +243,11 @@ declare class WrTabHarness extends ContentContainerComponentHarness {
243
243
  * the tab they move to, the APG's automatic-activation pattern. `<wr-tabs>`
244
244
  * renders exactly one panel: the selected tab's.
245
245
  * - **Router** — one `routerLink` on any child switches the whole strip over. The
246
- * tabs become `<a role="tab">`s, they announce no `aria-selected` at all (the
247
- * router paints `--active` and nothing else), the strip renders NO panel, and it
248
- * stops being one tab stop — every enabled tab is a Tab stop of its own. The
249
- * arrow keys still move focus, but they select nothing: the route does that.
246
+ * tabs become `<a role="tab">`s whose `aria-selected` follows the resolved route
247
+ * (the same `routerLinkActive` that paints `--active`), the strip renders NO
248
+ * panel, and it stops being one tab stop — every enabled tab is a Tab stop of its
249
+ * own. The arrow keys still move focus, but they select nothing: the route does
250
+ * that.
250
251
  *
251
252
  * So {@link getSelectedLabel} and {@link getFocusedLabel} are two different
252
253
  * questions, and {@link getTabStopLabels} is a third. They coincide in content mode
@@ -123,6 +123,8 @@ declare class WrTabs implements WrTabsContext {
123
123
  /** Recompute which edges can scroll, from the strip's scroll metrics. @internal */
124
124
  protected updateFades(): void;
125
125
  protected onTabClick(tab: WrTab): void;
126
+ /** Per-instance prefix, so keys only have to be unique within one group. */
127
+ private readonly uid;
126
128
  /** Header id for `aria-labelledby` on the panel. @internal */
127
129
  headerId(key: string): string;
128
130
  /** Panel id for `aria-controls` on the tab header. @internal */