ngwr 11.2.0 → 12.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 (394) hide show
  1. package/README.md +7 -7
  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 +17 -13
  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 +14 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +29 -6
  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 +18 -23
  275. package/llms.txt +22 -6
  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-pipes.d.ts +1 -1
  365. package/types/ngwr-popover-testing.d.ts +7 -2
  366. package/types/ngwr-popover.d.ts +1 -0
  367. package/types/ngwr-result.d.ts +6 -0
  368. package/types/ngwr-segmented-testing.d.ts +9 -0
  369. package/types/ngwr-segmented.d.ts +21 -1
  370. package/types/ngwr-select.d.ts +68 -6
  371. package/types/ngwr-shiny-text.d.ts +4 -2
  372. package/types/ngwr-sidebar.d.ts +14 -5
  373. package/types/ngwr-slider.d.ts +69 -1
  374. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  375. package/types/ngwr-speed-dial.d.ts +22 -3
  376. package/types/ngwr-split-text.d.ts +9 -0
  377. package/types/ngwr-stepper-testing.d.ts +5 -5
  378. package/types/ngwr-stepper.d.ts +8 -0
  379. package/types/ngwr-storage.d.ts +1 -0
  380. package/types/ngwr-table.d.ts +104 -11
  381. package/types/ngwr-tabs-testing.d.ts +11 -10
  382. package/types/ngwr-tabs.d.ts +2 -0
  383. package/types/ngwr-theme.d.ts +82 -1
  384. package/types/ngwr-tour.d.ts +22 -4
  385. package/types/ngwr-tree.d.ts +5 -4
  386. package/types/ngwr-typewriter-testing.d.ts +10 -0
  387. package/types/ngwr-utils.d.ts +5 -2
  388. package/types/ngwr-version.d.ts +1 -1
  389. package/types/ngwr-window.d.ts +39 -11
  390. package/typography/styles/_index.scss +1 -1
  391. package/window/styles/_index.scss +72 -26
  392. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  393. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -66,6 +66,18 @@ declare class WrContextMenu {
66
66
  */
67
67
  protected readonly openMenuId: _angular_core.WritableSignal<string | null>;
68
68
  private overlayRef;
69
+ /**
70
+ * The open menu's subscription to CDK's keyboard dispatcher, held so that
71
+ * `closeOverlay()` can drop it — see the unsubscribe there for why the pane's
72
+ * own disposal is 220 ms too late.
73
+ */
74
+ private rootKeys;
75
+ /**
76
+ * Where the keyboard was at the moment this menu took it, so a close can put
77
+ * it back there. Null when it was nowhere in particular (`<body>`) or already
78
+ * inside a menu pane, neither of which is a place to return to.
79
+ */
80
+ private restoreFocusTo;
69
81
  /**
70
82
  * Panes waiting out their exit animation, keyed by the timer that disposes
71
83
  * them.
@@ -149,6 +161,24 @@ declare class WrContextMenu {
149
161
  close(): void;
150
162
  private openOverlay;
151
163
  private closeOverlay;
164
+ /**
165
+ * Put the keyboard back where it came from.
166
+ *
167
+ * The element that had it when the menu opened comes first: a context menu
168
+ * hangs on a REGION — a card, a table row — and Shift+F10 / the Menu key fires
169
+ * `contextmenu` at whatever control inside it the user was actually on, which
170
+ * is their place in the page.
171
+ *
172
+ * The trigger is the fallback, and it needs help to be one. `[wrContextMenu]`
173
+ * adds no `tabindex` and every shape the docs ship is a plain `<div>`, so
174
+ * `focus()` on it does nothing at all — the handback silently missed, leaving
175
+ * the caret in the disposing pane and then on `<body>`, which is the outcome
176
+ * the call is there to prevent. Lending it `tabindex="-1"` for the call and
177
+ * taking that back on blur keeps the consumer's DOM as they wrote it; a
178
+ * permanent `tabindex="0"` would make every right-clickable region a tab stop,
179
+ * which is their decision and not the library's.
180
+ */
181
+ private handBackFocus;
152
182
  private cancelLeaveTimer;
153
183
  private scheduleLeave;
154
184
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrContextMenu, never>;
@@ -191,9 +221,17 @@ declare class WrContextMenuItem {
191
221
  private readonly scrollStrategies;
192
222
  private readonly destroyRef;
193
223
  private submenuRef;
224
+ private submenuKeys;
194
225
  private openTimer;
195
226
  private closeTimer;
196
227
  protected submenuOpen: boolean;
228
+ /**
229
+ * Whether the pending open was asked for by the keyboard (→ / Enter / Space)
230
+ * rather than by hover — only then does the submenu take focus, the same rule
231
+ * `wr-dropdown` applies to its own open. Sweeping the cursor across a row must
232
+ * show its submenu without yanking the caret out of it.
233
+ */
234
+ private openedByKeyboard;
197
235
  /**
198
236
  * Id of the submenu's menu element while it is open, published on the item as
199
237
  * `aria-controls` — the same contract the root trigger keeps (see
@@ -257,6 +295,24 @@ declare class WrContextMenuItem {
257
295
  private cancelOpen;
258
296
  private cancelClose;
259
297
  private openSubmenu;
298
+ /**
299
+ * @internal Keys routed here while this submenu is the topmost overlay: the
300
+ * arrows walk the rows of the pane the caret is in, and Escape or the arrow
301
+ * pointing BACK the way the menu cascades steps out one level, returning the
302
+ * cursor to the row that owns the pane when the cursor was inside it.
303
+ *
304
+ * Escape closes this level only, not the whole chain — the APG's rule for a
305
+ * submenu. It reaches this handler rather than the root's because the
306
+ * dispatcher stops at the topmost overlay that listens, which is now this one.
307
+ *
308
+ * Which is also why the arrows are aimed at the pane holding the caret rather
309
+ * than at this one. The dispatcher routes by stacking order, not by focus, and
310
+ * a HOVER-opened submenu is topmost while focus is deliberately still on the
311
+ * root row the pointer swept off (see `openedByKeyboard`) — so ArrowDown used
312
+ * to jump into this pane's first row instead of moving down the menu the user
313
+ * is in. Same reason `wr-dropdown`'s menu handler checks ownership.
314
+ */
315
+ private onSubmenuKeydown;
260
316
  /** Bound handlers (= preserves identity for removeEventListener). */
261
317
  private readonly onSubmenuEnter;
262
318
  private readonly onSubmenuLeave;
@@ -163,6 +163,7 @@ declare class WrCountUp {
163
163
  private readonly host;
164
164
  private readonly locale;
165
165
  private readonly isBrowser;
166
+ private readonly platform;
166
167
  private readonly destroyRef;
167
168
  private rafId;
168
169
  private delayTimer;
@@ -1,12 +1,34 @@
1
- import { WrDateAdapter, WrDateFormat } from 'ngwr/date-adapter';
1
+ import { WrDateAdapter, WrDateFormat } from 'ngwr/date';
2
2
  import * as i0 from '@angular/core';
3
3
  import { EnvironmentProviders } from '@angular/core';
4
4
 
5
5
  /**
6
6
  * {@link WrDateAdapter} backed by `date-fns`. Same `Date` value type as the
7
- * native adapter, but defers all math, formatting, and parsing to date-fns
8
- * — pick this when you want more robust locale-aware patterns (`P`, `PP`,
9
- * `PPP`, `p`) without writing them by hand.
7
+ * native adapter, but defers all math, formatting, and parsing to date-fns —
8
+ * pick this when you want its long patterns (`P`, `PP`, `PPP`, `p`) without
9
+ * writing them by hand.
10
+ *
11
+ * **{@link WR_DATE_LOCALE} does not reach `format` or `parse`, and that is not
12
+ * an oversight.** date-fns resolves those patterns against a date-fns `Locale`
13
+ * OBJECT rather than a BCP 47 tag, and the objects are separate modules —
14
+ * mapping a tag onto one would mean importing all of them, which defeats the
15
+ * tree-shaking that is the reason this is an opt-in entry point. So the named
16
+ * formats render AND read in en-US whatever the tag says, while
17
+ * `getFirstDayOfWeek`, `getDayOfWeekNames` and `getMonthNames` go through `Intl`
18
+ * and do honour it: a calendar heads its columns `пн вт ср` beside a trigger
19
+ * reading `08/11/2025`. Reading is the sharper edge — `11/08/2025` typed by a
20
+ * user in a dd/MM locale parses as 8 November, valid and wrong.
21
+ *
22
+ * The lever is date-fns's own module default, and the adapter passing no locale
23
+ * is precisely what keeps it working. Set it once at bootstrap, or take
24
+ * `provideWrLuxonAdapter()`, which forwards the tag itself:
25
+ *
26
+ * ```ts
27
+ * import { setDefaultOptions } from 'date-fns';
28
+ * import { ru } from 'date-fns/locale';
29
+ *
30
+ * setDefaultOptions({ locale: ru });
31
+ * ```
10
32
  *
11
33
  * @example
12
34
  * ```ts
@@ -56,8 +78,13 @@ declare class WrDateFnsAdapter extends WrDateAdapter<Date> {
56
78
 
57
79
  /**
58
80
  * Register the {@link WrDateFnsAdapter} so date-pickers / calendars in this
59
- * app use `date-fns` for all math and formatting. Pass `locale` to override
60
- * the BCP 47 tag.
81
+ * app use `date-fns` for all math and formatting.
82
+ *
83
+ * `locale` sets {@link WR_DATE_LOCALE}, which this adapter reads for the first
84
+ * day of the week and nothing else — its `format` and `parse` do not pass a
85
+ * locale to date-fns. For localized month names and patterns, set date-fns's own
86
+ * module default with `setDefaultOptions`, or use the luxon adapter, which does
87
+ * thread the tag through everything.
61
88
  *
62
89
  * @example
63
90
  * ```ts
@@ -1,5 +1,5 @@
1
1
  import { DateTime } from 'luxon';
2
- import { WrDateAdapter, WrDateFormat } from 'ngwr/date-adapter';
2
+ import { WrDateAdapter, WrDateFormat } from 'ngwr/date';
3
3
  import * as i0 from '@angular/core';
4
4
  import { EnvironmentProviders } from '@angular/core';
5
5
 
@@ -101,18 +101,23 @@ type Unit = (typeof UNITS)[number];
101
101
  * independently instead of by CSS nth-of-type gymnastics.
102
102
  *
103
103
  * Units are addressed by position, not by the boxes' `aria-label`: every string
104
- * in this panel is still hard-coded English (the box labels, the steppers'
105
- * "Increment hours", the AM/PM text), so keying on them would make this harness
106
- * the thing that breaks when they are moved into the i18n catalog. Column order
107
- * is the layout contract.
104
+ * in this panel now resolves through the i18n catalog (`datePicker.hours`,
105
+ * `datePicker.incrementHours`, `datePicker.am` …), so keying on them would make
106
+ * this harness answer in whatever locale the app under test is configured for.
107
+ * Column order is the layout contract.
108
108
  *
109
109
  * @internal
110
110
  */
111
111
  declare class WrTimePanelHarness extends ComponentHarness {
112
112
  static hostSelector: string;
113
- /** The stepper's value as `HH:MM`, plus `:SS` and ` AM`/` PM` when those columns exist. */
113
+ /** The stepper's value as `HH:MM`, plus `:SS` and a space-joined {@link getMeridiem} when those columns exist. */
114
114
  getTimeText(): Promise<string>;
115
- /** `'AM'` / `'PM'`, or `null` when the stepper is in 24-hour mode. */
115
+ /**
116
+ * The meridiem column's rendered text, or `null` when the stepper is in
117
+ * 24-hour mode. `'AM'` / `'PM'` on the built-in fallbacks — it reads whatever
118
+ * `datePicker.am` / `datePicker.pm` resolve to, so a configured catalog
119
+ * changes the answer.
120
+ */
116
121
  getMeridiem(): Promise<string | null>;
117
122
  /**
118
123
  * Type into the boxes named by `fields`, leaving the rest alone.
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
3
  import { FormValueControl } from '@angular/forms/signals';
4
- import { WrDateFormat } from 'ngwr/date-adapter';
4
+ import { WrDateFormat } from 'ngwr/date';
5
5
 
6
6
  /**
7
7
  * Unified date / time / date-time picker. Same `<input>` + popover skeleton
@@ -143,6 +143,10 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
143
143
  * skip the echo of our own edits (so a live keystroke's raw text is never
144
144
  * reformatted mid-type). */
145
145
  private lastValue;
146
+ /** The format the sync effect last rendered with. Paired with `lastValue`
147
+ * because the echo guard has to answer "is the display still current", and a
148
+ * `[format]` / `[mode]` change makes it stale with the value untouched. */
149
+ private lastFormat;
146
150
  constructor();
147
151
  protected onInput(event: Event): void;
148
152
  protected onBlur(): void;
@@ -320,9 +324,9 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
320
324
  /** Resolved format — falls back to a mode-appropriate default. */
321
325
  protected readonly resolvedFormat: _angular_core.Signal<string>;
322
326
  protected readonly isDateTime: _angular_core.Signal<boolean>;
323
- protected readonly triggerLabel: string;
324
- protected readonly startLabel: string;
325
- protected readonly endLabel: string;
327
+ protected readonly triggerLabel: _angular_core.Signal<string>;
328
+ protected readonly startLabel: _angular_core.Signal<string>;
329
+ protected readonly endLabel: _angular_core.Signal<string>;
326
330
  private readonly panelLabelRange;
327
331
  private readonly panelLabelRangeDateTime;
328
332
  /**
@@ -145,6 +145,18 @@ declare class WrNativeDateAdapter extends WrDateAdapter<Date> {
145
145
  format(date: Date, formatKeyOrString: WrDateFormat | (string & {})): string;
146
146
  parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): Date | null;
147
147
  getFirstDayOfWeek(): number;
148
+ /**
149
+ * One `Intl.DateTimeFormat` per named format, built once.
150
+ *
151
+ * Constructing one is the expensive part of `format()`, and this adapter is
152
+ * called per CELL: `wr-event-calendar` builds an `aria-label` for every time
153
+ * slot on every day, so a week view asked for hundreds of identical
154
+ * formatters. `locale` is injected once and never changes for the life of the
155
+ * adapter, so the cache needs no invalidation — that is the whole reason it
156
+ * can be this simple.
157
+ */
158
+ private readonly formatters;
159
+ private intl;
148
160
  getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[];
149
161
  getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[];
150
162
  private formatWithTokens;
@@ -185,12 +197,19 @@ declare function provideWrDateAdapter(options?: WrDateAdapterOptions): Environme
185
197
  */
186
198
 
187
199
  /**
188
- * BCP 47 locale tag used by {@link WrDateAdapter} implementations for
189
- * formatting, parsing, and locale-derived defaults (first day of week,
190
- * month / day names). Defaults to `navigator.language` in the browser and
191
- * `'en-US'` on the server.
200
+ * BCP 47 locale tag the {@link WrDateAdapter} implementations read. Defaults to
201
+ * `navigator.language` in the browser and `'en-US'` on the server; override via
202
+ * {@link provideWrDateAdapter}'s `locale` option.
192
203
  *
193
- * Override via {@link provideWrDateAdapter}'s `locale` option.
204
+ * **How far it reaches depends on the adapter, and the difference matters.**
205
+ * The luxon adapter threads it through everything — every `DateTime` is
206
+ * constructed with it, and `format` / `parse` call `setLocale`. The date-fns
207
+ * adapter reads it only for locale-DERIVED defaults (first day of week); its
208
+ * `format` and `parse` pass no locale to date-fns, so they stay on that
209
+ * library's module default. Setting this token and expecting French month names
210
+ * out of `WrDateFnsAdapter` gets English ones, and the parse side of that
211
+ * mismatch is silent rather than loud — see the adapter's own class docs for the
212
+ * lever (`setDefaultOptions`).
194
213
  */
195
214
  declare const WR_DATE_LOCALE: InjectionToken<string>;
196
215
 
@@ -4,6 +4,7 @@ import { OverlayRef } from '@angular/cdk/overlay';
4
4
  import * as i0 from '@angular/core';
5
5
  import { ComponentRef, InjectionToken, ElementRef } from '@angular/core';
6
6
  import { ReplaySubject } from 'rxjs';
7
+ import * as i1 from '@angular/cdk/scrolling';
7
8
 
8
9
  /**
9
10
  * @license
@@ -87,6 +88,15 @@ interface WrDialogOptions<D = unknown> {
87
88
  readonly closeOnBackdropClick?: boolean;
88
89
  /** When `true`, the Escape key closes the dialog. @default true */
89
90
  readonly closeOnEscape?: boolean;
91
+ /**
92
+ * When `true`, the dialog closes as soon as the URL changes — the Back button
93
+ * and any `router.navigate()` alike. Nothing else ties a dialog to the route
94
+ * it was opened on, so turning this off leaves the pane, its backdrop and its
95
+ * focus trap over whatever page the app navigates to. Turn it off only for a
96
+ * dialog that OWNS the navigation (a wizard that keeps its step in the URL).
97
+ * @default true
98
+ */
99
+ readonly closeOnNavigation?: boolean;
90
100
  /**
91
101
  * Render a dismiss (×) button in the panel's top-right corner. Set `false`
92
102
  * when the content supplies its own close affordance, or when the dialog must
@@ -139,7 +149,24 @@ declare class WrDialog {
139
149
  private readonly isBrowser;
140
150
  private readonly responsiveConfig;
141
151
  private readonly i18n;
152
+ private readonly location;
142
153
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, options?: WrDialogOptions<D>): WrDialogRef<C, R>;
154
+ /**
155
+ * Tie the dialog's lifetime to the URL it was opened on.
156
+ *
157
+ * Nothing else does. The overlay belongs to a root service and is dismissed
158
+ * only by the backdrop, Escape or an explicit `close()`, so pressing Back
159
+ * swapped the routed view underneath and left the modal pane, its backdrop and
160
+ * its focus trap sitting over a page the user never opened them on.
161
+ *
162
+ * `onUrlChange`, not `Location.subscribe()` — which is what CDK's own
163
+ * `disposeOnNavigation` uses: `subscribe` fires on popstate alone, so an
164
+ * in-app `router.navigate()` left the dialog standing. And `dialogRef.close()`
165
+ * rather than disposing the overlay behind the ref's back, which would never
166
+ * emit `closed`, never destroy the focus trap, and leave `awaitClose()`
167
+ * pending forever.
168
+ */
169
+ private watchNavigation;
143
170
  /**
144
171
  * The dismiss button's accessible name.
145
172
  *
@@ -242,6 +269,16 @@ declare class WrDialogTitle {
242
269
  /**
243
270
  * Styles the scrollable body section of a dialog.
244
271
  *
272
+ * `CdkScrollable` is a host directive because this element is a real scroll
273
+ * container (`overflow: auto`) and an anchored overlay opened from inside it has
274
+ * to follow its trigger. CDK's `reposition()` strategy listens to
275
+ * `ScrollDispatcher`, which is fed by registered scrollables plus ONE
276
+ * non-capturing `document` listener — and element `scroll` does not bubble, so
277
+ * without the registration a `<wr-select>` halfway down a long dialog form kept
278
+ * its panel pinned to the viewport while the trigger scrolled away. Angular
279
+ * Material carries the same host directive on `MatDialogContent` for the same
280
+ * reason.
281
+ *
245
282
  * @example
246
283
  * ```html
247
284
  * <div wrDialogContent>…body…</div>
@@ -249,7 +286,7 @@ declare class WrDialogTitle {
249
286
  */
250
287
  declare class WrDialogContent {
251
288
  static ɵfac: i0.ɵɵFactoryDeclaration<WrDialogContent, never>;
252
- static ɵdir: i0.ɵɵDirectiveDeclaration<WrDialogContent, "[wrDialogContent]", never, {}, {}, never, never, true, never>;
289
+ static ɵdir: i0.ɵɵDirectiveDeclaration<WrDialogContent, "[wrDialogContent]", never, {}, {}, never, never, true, [{ directive: typeof i1.CdkScrollable; inputs: {}; outputs: {}; }]>;
253
290
  }
254
291
 
255
292
  /**
@@ -65,6 +65,31 @@ declare class WrDivider {
65
65
  */
66
66
  readonly align: _angular_core.InputSignal<WrDividerAlign>;
67
67
  protected readonly classes: _angular_core.Signal<string>;
68
+ private readonly host;
69
+ /**
70
+ * The consumer's own `aria-label`, resolved on the first sync — `undefined`
71
+ * until then, which is how "not looked at yet" stays distinct from "they wrote
72
+ * none".
73
+ */
74
+ private authored;
75
+ constructor();
76
+ /**
77
+ * Name the separator with the label it projects.
78
+ *
79
+ * `role="separator"` makes the host's children presentational and a separator
80
+ * takes its accessible name from the author alone — so `<wr-divider>OR</wr-divider>`
81
+ * reaches assistive tech as an unnamed rule while everyone else reads "OR".
82
+ * Copying the label into `aria-label` is the only way to expose it without giving
83
+ * up the role, and the two can never disagree because one is the source of the
84
+ * other.
85
+ *
86
+ * Written straight to the DOM rather than through a host binding, for two
87
+ * reasons a binding cannot cover: the label is projected content, so an
88
+ * interpolation or an `@if` can change it while the divider stays put; and a
89
+ * binding resolving to `null` would strip an `aria-label` the consumer wrote
90
+ * themselves — theirs is the author name already and is never touched.
91
+ */
92
+ private syncLabel;
68
93
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDivider, never>;
69
94
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDivider, "wr-divider", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
70
95
  }
@@ -31,11 +31,15 @@ interface WrDonutChartLegendEntry {
31
31
  * Test harness for `<wr-donut-chart>`.
32
32
  *
33
33
  * **The ring itself is unreadable, and that is by design.** The slices are SVG
34
- * paths inside an `aria-hidden` drawing: a screen reader is given the chart's
34
+ * paths inside a `role="img"` drawing: a screen reader is given that drawing's
35
35
  * `aria-label` and nothing else, and a spec cannot get a label or a value off a
36
36
  * path's `d`. {@link getLegend} is where the numbers are — which is also the
37
- * argument for keeping `showLegend` on, since with it off the chart's data has no
38
- * textual form at all.
37
+ * argument for keeping `showLegend` on, since with it off the only other text is
38
+ * whatever {@link getCenterValue} and {@link getCenterLabel} were given.
39
+ *
40
+ * The name is read off the `<svg>` rather than off the surface that wraps it, and
41
+ * the two are not interchangeable: `img` makes its whole subtree presentational, so
42
+ * a name on the wrapper would take the centre text down with it.
39
43
  *
40
44
  * {@link getSliceCount} is therefore the one thing the ring answers: how many
41
45
  * wedges were drawn. Compare it with the legend's length to catch a slice that was
@@ -23,9 +23,9 @@ interface WrDonutSegment {
23
23
  declare class WrDonutChart {
24
24
  readonly segments: _angular_core.InputSignal<readonly WrDonutSegment[]>;
25
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`.
26
+ * Accessible name of the drawing. The arcs carry no text and the legend is optional, so
27
+ * with `showLegend: false` this and the centre text are the whole of what a screen reader
28
+ * gets. Falls back to `donutChart.label`.
29
29
  */
30
30
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
31
31
  protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
@@ -21,8 +21,21 @@ interface WrSortableReorderEvent<T> {
21
21
  * emitted via 2-way `[(items)]`.
22
22
  *
23
23
  * Drop a single template — it's rendered per item with `let-item
24
- * let-index="index"`. Add `[handle]="true"` (or `[wrDragHandle]` inside
25
- * your template) to restrict drag start to a handle element.
24
+ * let-index="index"`. Put `wrDragHandle` on an element inside that
25
+ * template to restrict drag start to a handle; there is no input for
26
+ * it, the directive's presence is the switch.
27
+ *
28
+ * Every row is a tab stop: Space or Enter picks it up, the arrow keys move it,
29
+ * Space or Enter drops it and Escape puts it back. CDK's `cdkDrag` ships no key
30
+ * handling of its own, so without this the component's only function was
31
+ * unreachable from a keyboard.
32
+ *
33
+ * What that does NOT answer is WCAG 2.5.7, which asks for a POINTER alternative
34
+ * to the drag. Click-to-pick-up is the obvious candidate and is not safe here:
35
+ * the CDK's drag-drop bundle installs no click suppressor of any kind, so the
36
+ * mouseup ending a drag still produces a click, and a row that grabbed itself on
37
+ * click would be picking itself straight back up. A visible move-up /
38
+ * move-down affordance is the remaining answer, and that is a design change.
26
39
  *
27
40
  * @example
28
41
  * ```html
@@ -64,7 +77,48 @@ declare class WrSortableList<T = unknown> {
64
77
  /** Fired after a successful reorder with the new array + indices. */
65
78
  readonly reorder: _angular_core.OutputEmitterRef<WrSortableReorderEvent<T>>;
66
79
  protected readonly rowTemplate: _angular_core.Signal<TemplateRef<any>>;
80
+ private readonly injector;
81
+ private readonly rowEls;
82
+ /** Index of the row the keyboard is holding, or `null` when nothing is held. */
83
+ protected readonly grabbedIndex: _angular_core.WritableSignal<number | null>;
84
+ /** Live-region text. Written by the keyboard path only. */
85
+ protected readonly announcement: _angular_core.WritableSignal<string>;
86
+ /** Links every row to the key model via `aria-describedby`. */
87
+ protected readonly keyHelpId: string;
88
+ protected readonly resolvedKeyHelp: _angular_core.Signal<string>;
89
+ private readonly grabbedText;
90
+ private readonly movedText;
91
+ private readonly droppedText;
92
+ private readonly cancelledText;
93
+ /** Where the held row started. Escape puts it back there. */
94
+ private grabOrigin;
95
+ /** True while a keyboard move is handing focus back — see `onRowFocusout`. */
96
+ private restoringFocus;
67
97
  protected onDrop(event: CdkDragDrop<T[]>): void;
98
+ /**
99
+ * The keyboard reorder path: pick up, move, drop — deliberately a two-step
100
+ * grab rather than "an arrow moves the focused row", so that arrowing through
101
+ * a list a user is only reading can never rearrange it.
102
+ *
103
+ * Keys are handled only when the ROW itself is the event target; a button or
104
+ * an input projected into the row template keeps every key it would normally
105
+ * get.
106
+ */
107
+ protected onRowKeydown(event: KeyboardEvent, index: number): void;
108
+ /**
109
+ * Focus leaving a held row ends the gesture as a drop rather than dropping the
110
+ * change on the floor — `[(items)]` has already been written by then, so a
111
+ * silent release would leave `reorder` never reporting a move that happened.
112
+ * The guard is what makes it safe: moving a focused node in the DOM blurs it,
113
+ * so every keyboard move fires this too.
114
+ */
115
+ protected onRowFocusout(): void;
116
+ private grab;
117
+ private moveGrabbed;
118
+ private drop;
119
+ private cancelGrab;
120
+ private relocate;
121
+ private position;
68
122
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSortableList<any>, never>;
69
123
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSortableList<any>, "wr-sortable-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "lockAxis": { "alias": "lockAxis"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "reorder": "reorder"; }, ["rowTemplate"], never, true, never>;
70
124
  }
@@ -48,6 +48,16 @@ interface WrDrawerOptions<D = unknown> {
48
48
  readonly closeOnBackdropClick?: boolean;
49
49
  /** When `true`, the Escape key closes the drawer. @default true */
50
50
  readonly closeOnEscape?: boolean;
51
+ /**
52
+ * When `true`, the drawer closes as soon as the URL changes — the Back button
53
+ * and any `router.navigate()` alike. Nothing else ties a drawer to the route
54
+ * it was opened on, so turning this off leaves the panel, its backdrop, its
55
+ * focus trap and the page-wide scroll block over whatever page the app
56
+ * navigates to. Turn it off only for a drawer that OWNS the navigation (a
57
+ * filter panel that keeps its state in the query string).
58
+ * @default true
59
+ */
60
+ readonly closeOnNavigation?: boolean;
51
61
  /**
52
62
  * Render a dismiss (×) button in the panel's top-right corner. Set `false`
53
63
  * when the content supplies its own close affordance. @default true
@@ -125,12 +135,33 @@ declare class WrDrawer {
125
135
  readonly closeLabel: _angular_core.InputSignal<string | null>;
126
136
  protected readonly resolvedCloseLabel: _angular_core.Signal<string>;
127
137
  protected readonly panelTpl: _angular_core.Signal<TemplateRef<any>>;
138
+ /**
139
+ * A projected `[wrDrawerTitle]`, if the consumer gave one.
140
+ *
141
+ * The dismiss button is corner chrome positioned at a fixed
142
+ * `inset-block-start` chosen to centre it on the TITLE's first line. With no
143
+ * title the content starts at the top of the panel and runs underneath it: on
144
+ * a bare `<wr-drawer><nav /></wr-drawer>` the button covered the first menu
145
+ * row by 24×16 px, and `elementFromPoint` at the button's centre returned the
146
+ * button, so that corner of the first item was unclickable. The panel has to
147
+ * know, because only the panel can reserve the space.
148
+ */
149
+ private readonly projectedTitle;
128
150
  protected panelClass(): string;
129
151
  private swipeStartX;
130
152
  private swipeStartY;
131
153
  private swiping;
132
154
  protected onSwipeStart(event: PointerEvent): void;
133
155
  protected onSwipeMove(event: PointerEvent, panel: HTMLElement): void;
156
+ /**
157
+ * A cancelled pointer is an ABANDONED swipe, not a completed one — the system
158
+ * took the gesture away (a call, a system gesture, an orientation change) and
159
+ * no `pointerup` ever arrives. Routing it through `onSwipeEnd` dismissed the
160
+ * drawer on an interruption the user did not ask for and, because the overlay
161
+ * is disposed with the dragged offset applied, could not take back. Same rule
162
+ * `wr-pull-to-refresh` states for `touchcancel`.
163
+ */
164
+ protected onSwipeCancel(panel: HTMLElement): void;
134
165
  protected onSwipeEnd(event: PointerEvent, panel: HTMLElement): void;
135
166
  /** Axis + sign of the closing direction for the current position. */
136
167
  private closeAxis;
@@ -158,7 +189,7 @@ declare class WrDrawer {
158
189
  private openOverlay;
159
190
  private closeOverlay;
160
191
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDrawer, never>;
161
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDrawer, "wr-drawer", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "showHandle": { "alias": "showHandle"; "required": false; "isSignal": true; }; "safeArea": { "alias": "safeArea"; "required": false; "isSignal": true; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*"], true, never>;
192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDrawer, "wr-drawer", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "showHandle": { "alias": "showHandle"; "required": false; "isSignal": true; }; "safeArea": { "alias": "safeArea"; "required": false; "isSignal": true; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, ["projectedTitle"], ["*"], true, never>;
162
193
  }
163
194
 
164
195
  /**
@@ -265,14 +296,34 @@ declare class WrDrawerManager {
265
296
  private readonly focusTrapFactory;
266
297
  private readonly isBrowser;
267
298
  private readonly i18n;
299
+ private readonly location;
268
300
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, options?: WrDrawerOptions<D>): WrDrawerRef<C, R>;
301
+ /**
302
+ * Tie the drawer's lifetime to the URL it was opened on — the same treatment
303
+ * `WrDialog` gets, and for the same reason.
304
+ *
305
+ * Nothing else does. The overlay belongs to a root service and is dismissed
306
+ * only by the backdrop, Escape, the appended × or an explicit `close()`, so
307
+ * navigating away left the panel, its backdrop, its focus trap and the
308
+ * page-wide scroll block sitting over a page the user never opened them on.
309
+ *
310
+ * `onUrlChange`, not `Location.subscribe()` — which is what CDK's own
311
+ * `disposeOnNavigation` uses: `subscribe` fires on popstate alone, so an in-app
312
+ * `router.navigate()` left the drawer standing. And `drawerRef.close()` rather
313
+ * than disposing the overlay behind the ref's back, which would never emit
314
+ * `closed`, never destroy the focus trap, and leave `awaitClose()` pending.
315
+ */
316
+ private watchNavigation;
269
317
  /**
270
318
  * The dismiss button's accessible name.
271
319
  *
272
- * Resolved per open, not once at injection: this is a root service, so a
273
- * `readI18nText` field — which is what `WrDialog` uses — would be evaluated
274
- * before an async catalog had loaded and then freeze that answer for the life
275
- * of the app.
320
+ * Resolved per open, not stored as a plain string at injection: this is a root
321
+ * service, so a one-shot read — which is what `WrDialog` used to have, and moved
322
+ * off for this reason — would run before an async catalog had loaded and then
323
+ * freeze that answer for the life of the app. (`readI18nText` hands back a signal
324
+ * now, so it would no longer freeze; the name still has to be pushed onto the
325
+ * button per open either way.) `WrDialog.closeLabel()` is the matching precedent,
326
+ * not the counter-example.
276
327
  *
277
328
  * The miss check is the point. `t()` hands back the KEY when the catalog has
278
329
  * no entry, and `WrI18n` is root-provided with an empty catalog by default —
@@ -101,8 +101,14 @@ interface TimeChip {
101
101
  readonly top: number;
102
102
  /** Height as a multiple of the cell, ×100. */
103
103
  readonly height: number;
104
- /** Horizontal share of the column, both 0–100. */
105
- readonly left: number;
104
+ /**
105
+ * Lane offset from the column's inline START, 0–100 — not from its physical
106
+ * left. Concurrent events are laid out in reading order, so under `dir="rtl"`
107
+ * lane 0 belongs at the right; a physical `left` would read the cluster
108
+ * back-to-front, which is the one thing in this component that was not logical.
109
+ */
110
+ readonly inlineStart: number;
111
+ /** Lane width as a share of the column, 0–100. */
106
112
  readonly width: number;
107
113
  readonly continuesBefore: boolean;
108
114
  readonly continuesAfter: boolean;
@@ -45,9 +45,11 @@ interface WrFallingTextHarnessFilters extends BaseHarnessFilters {
45
45
  * implementation would satisfy every naive test but not this one.
46
46
  *
47
47
  * **Nothing positional is offered, and that is not a jsdom concession.** The words'
48
- * `transform` values are one frame of a loop that never stops, seeded by `Math.random()`,
49
- * so they are not reproducible even in a real browser; there is no rest state to call
50
- * settled; the drag path needs `setPointerCapture` and AABB hit-testing over boxes that
48
+ * `transform` values are one frame of a physics loop seeded by `Math.random()`, so they
49
+ * are not reproducible even in a real browser; the loop parks once no word's transform
50
+ * changes any more, but where it parks is a different arrangement every run, and words
51
+ * packed tightly enough to keep jostling never reach that point at all; the drag path
52
+ * needs `setPointerCapture` and AABB hit-testing over boxes that
51
53
  * a unit test measures as 0×0 at the origin, where every word contains every point. Nor
52
54
  * is `[gravity]` or `[trigger]` readable — neither reaches the DOM, and answering them
53
55
  * would mean reaching into the component instance. There is no `isReducedMotion()`
@@ -52,7 +52,7 @@ declare class WrFallingText {
52
52
  }[]>;
53
53
  constructor();
54
54
  private start;
55
- /** Apply the body's position + angle to the DOM. */
55
+ /** Apply the body's position + angle to the DOM. `false` when it has not moved. */
56
56
  private commit;
57
57
  private toLocal;
58
58
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrFallingText, never>;