ngwr 13.0.1 → 14.0.1

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 (309) hide show
  1. package/README.md +69 -13
  2. package/aurora/aurora.scss +1 -1
  3. package/aurora/styles/_dark.scss +21 -0
  4. package/aurora/styles/_index.scss +11 -30
  5. package/aurora/styles/_rules.scss +25 -0
  6. package/border-glow/styles/_dark.scss +46 -0
  7. package/border-glow/styles/_index.scss +5 -0
  8. package/border-glow/styles/_rules.scss +0 -31
  9. package/button/styles/_index.scss +16 -0
  10. package/color-picker/styles/_index.scss +43 -5
  11. package/event-calendar/styles/_index.scss +15 -0
  12. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  13. package/fesm2022/ngwr-affix.mjs +3 -3
  14. package/fesm2022/ngwr-alert.mjs +7 -7
  15. package/fesm2022/ngwr-alert.mjs.map +1 -1
  16. package/fesm2022/ngwr-anchor.mjs +3 -3
  17. package/fesm2022/ngwr-aurora.mjs +4 -4
  18. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  19. package/fesm2022/ngwr-avatar.mjs +3 -3
  20. package/fesm2022/ngwr-back-top.mjs +14 -4
  21. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  22. package/fesm2022/ngwr-badge.mjs +6 -6
  23. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  24. package/fesm2022/ngwr-blur-text.mjs +16 -5
  25. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  26. package/fesm2022/ngwr-border-glow.mjs +4 -4
  27. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  28. package/fesm2022/ngwr-breadcrumbs.mjs +7 -7
  29. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  30. package/fesm2022/ngwr-burger.mjs +3 -3
  31. package/fesm2022/ngwr-button.mjs +88 -10
  32. package/fesm2022/ngwr-button.mjs.map +1 -1
  33. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  34. package/fesm2022/ngwr-calendar-testing.mjs +15 -0
  35. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  36. package/fesm2022/ngwr-calendar.mjs +53 -7
  37. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  38. package/fesm2022/ngwr-card.mjs +9 -9
  39. package/fesm2022/ngwr-carousel.mjs +6 -6
  40. package/fesm2022/ngwr-cascader.mjs +4 -4
  41. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  42. package/fesm2022/ngwr-checkbox.mjs +6 -6
  43. package/fesm2022/ngwr-circular-text.mjs +23 -4
  44. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  45. package/fesm2022/ngwr-click-spark.mjs +3 -3
  46. package/fesm2022/ngwr-clipboard.mjs +3 -3
  47. package/fesm2022/ngwr-collapse.mjs +9 -9
  48. package/fesm2022/ngwr-collapse.mjs.map +1 -1
  49. package/fesm2022/ngwr-color-picker-testing.mjs +23 -7
  50. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  51. package/fesm2022/ngwr-color-picker.mjs +93 -14
  52. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  53. package/fesm2022/ngwr-command-palette.mjs +29 -5
  54. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  55. package/fesm2022/ngwr-compare.mjs +3 -3
  56. package/fesm2022/ngwr-confetti.mjs +3 -3
  57. package/fesm2022/ngwr-context-menu.mjs +18 -12
  58. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  59. package/fesm2022/ngwr-cookie.mjs +3 -3
  60. package/fesm2022/ngwr-counter.mjs +6 -6
  61. package/fesm2022/ngwr-date-adapters-fns.mjs +104 -36
  62. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
  63. package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
  64. package/fesm2022/ngwr-date-picker-testing.mjs +10 -2
  65. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  66. package/fesm2022/ngwr-date-picker.mjs +118 -28
  67. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  68. package/fesm2022/ngwr-date.mjs +483 -82
  69. package/fesm2022/ngwr-date.mjs.map +1 -1
  70. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  71. package/fesm2022/ngwr-density.mjs +6 -6
  72. package/fesm2022/ngwr-descriptions.mjs +6 -6
  73. package/fesm2022/ngwr-dialog.mjs +15 -15
  74. package/fesm2022/ngwr-directives.mjs +12 -12
  75. package/fesm2022/ngwr-divider.mjs +3 -3
  76. package/fesm2022/ngwr-donut-chart.mjs +3 -3
  77. package/fesm2022/ngwr-drag-drop.mjs +37 -9
  78. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  79. package/fesm2022/ngwr-drawer.mjs +18 -18
  80. package/fesm2022/ngwr-dropdown.mjs +29 -12
  81. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  82. package/fesm2022/ngwr-empty.mjs +3 -3
  83. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
  84. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  85. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  86. package/fesm2022/ngwr-falling-text.mjs +3 -3
  87. package/fesm2022/ngwr-file-upload.mjs +55 -15
  88. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  89. package/fesm2022/ngwr-form-testing.mjs +13 -7
  90. package/fesm2022/ngwr-form-testing.mjs.map +1 -1
  91. package/fesm2022/ngwr-form.mjs +44 -25
  92. package/fesm2022/ngwr-form.mjs.map +1 -1
  93. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  94. package/fesm2022/ngwr-gauge.mjs +3 -3
  95. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  96. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  97. package/fesm2022/ngwr-hotkey.mjs +6 -6
  98. package/fesm2022/ngwr-i18n-en.mjs +63 -1
  99. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  100. package/fesm2022/ngwr-i18n-ru.mjs +28 -1
  101. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  102. package/fesm2022/ngwr-i18n.mjs +159 -31
  103. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  104. package/fesm2022/ngwr-icon.mjs +6 -6
  105. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  106. package/fesm2022/ngwr-input-number.mjs +5 -5
  107. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  108. package/fesm2022/ngwr-input-otp.mjs +23 -5
  109. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  110. package/fesm2022/ngwr-input.mjs +37 -26
  111. package/fesm2022/ngwr-input.mjs.map +1 -1
  112. package/fesm2022/ngwr-keyboard.mjs +3 -3
  113. package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
  114. package/fesm2022/ngwr-knob.mjs +22 -4
  115. package/fesm2022/ngwr-knob.mjs.map +1 -1
  116. package/fesm2022/ngwr-layout.mjs +15 -15
  117. package/fesm2022/ngwr-lightbox.mjs +4 -4
  118. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  119. package/fesm2022/ngwr-line-chart.mjs +3 -3
  120. package/fesm2022/ngwr-list.mjs +7 -7
  121. package/fesm2022/ngwr-list.mjs.map +1 -1
  122. package/fesm2022/ngwr-loading-bar-router.mjs +73 -0
  123. package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -0
  124. package/fesm2022/ngwr-loading-bar.mjs +27 -38
  125. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  126. package/fesm2022/ngwr-markdown.mjs +6 -6
  127. package/fesm2022/ngwr-marquee.mjs +3 -3
  128. package/fesm2022/ngwr-media.mjs +3 -3
  129. package/fesm2022/ngwr-mention.mjs +109 -19
  130. package/fesm2022/ngwr-mention.mjs.map +1 -1
  131. package/fesm2022/ngwr-meta.mjs +6 -6
  132. package/fesm2022/ngwr-meter-group.mjs +3 -3
  133. package/fesm2022/ngwr-overlay.mjs +6 -6
  134. package/fesm2022/ngwr-page-header.mjs +3 -3
  135. package/fesm2022/ngwr-pagination-testing.mjs +11 -10
  136. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  137. package/fesm2022/ngwr-pagination.mjs +67 -32
  138. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  139. package/fesm2022/ngwr-pipes.mjs +21 -21
  140. package/fesm2022/ngwr-platform.mjs +9 -9
  141. package/fesm2022/ngwr-popconfirm.mjs +7 -6
  142. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  143. package/fesm2022/ngwr-popover.mjs +7 -6
  144. package/fesm2022/ngwr-popover.mjs.map +1 -1
  145. package/fesm2022/ngwr-progress.mjs +3 -3
  146. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  147. package/fesm2022/ngwr-qr.mjs +3 -3
  148. package/fesm2022/ngwr-radio.mjs +6 -6
  149. package/fesm2022/ngwr-rating.mjs +48 -22
  150. package/fesm2022/ngwr-rating.mjs.map +1 -1
  151. package/fesm2022/ngwr-result.mjs +12 -12
  152. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  153. package/fesm2022/ngwr-scroll.mjs +3 -3
  154. package/fesm2022/ngwr-segmented.mjs +12 -8
  155. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  156. package/fesm2022/ngwr-select.mjs +217 -59
  157. package/fesm2022/ngwr-select.mjs.map +1 -1
  158. package/fesm2022/ngwr-shiny-text.mjs +7 -7
  159. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  160. package/fesm2022/ngwr-sidebar.mjs +3 -3
  161. package/fesm2022/ngwr-skeleton.mjs +3 -3
  162. package/fesm2022/ngwr-slider.mjs +12 -8
  163. package/fesm2022/ngwr-slider.mjs.map +1 -1
  164. package/fesm2022/ngwr-sparkline.mjs +3 -3
  165. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  166. package/fesm2022/ngwr-spinner.mjs +3 -3
  167. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  168. package/fesm2022/ngwr-split-text.mjs +3 -3
  169. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  170. package/fesm2022/ngwr-splitter.mjs +3 -3
  171. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  172. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  173. package/fesm2022/ngwr-squircle.mjs +7 -6
  174. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  175. package/fesm2022/ngwr-star-border.mjs +4 -4
  176. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  177. package/fesm2022/ngwr-statistic.mjs +44 -13
  178. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  179. package/fesm2022/ngwr-stepper.mjs +6 -6
  180. package/fesm2022/ngwr-storage.mjs +11 -3
  181. package/fesm2022/ngwr-storage.mjs.map +1 -1
  182. package/fesm2022/ngwr-switch.mjs +3 -3
  183. package/fesm2022/ngwr-table.mjs +51 -28
  184. package/fesm2022/ngwr-table.mjs.map +1 -1
  185. package/fesm2022/ngwr-tabs-router.mjs +158 -0
  186. package/fesm2022/ngwr-tabs-router.mjs.map +1 -0
  187. package/fesm2022/ngwr-tabs-testing.mjs +13 -11
  188. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  189. package/fesm2022/ngwr-tabs.mjs +104 -16
  190. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  191. package/fesm2022/ngwr-textarea.mjs +46 -6
  192. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  193. package/fesm2022/ngwr-theme.mjs +90 -4
  194. package/fesm2022/ngwr-theme.mjs.map +1 -1
  195. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  196. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  197. package/fesm2022/ngwr-timeline.mjs +6 -6
  198. package/fesm2022/ngwr-toast.mjs +116 -11
  199. package/fesm2022/ngwr-toast.mjs.map +1 -1
  200. package/fesm2022/ngwr-toolbar.mjs +3 -3
  201. package/fesm2022/ngwr-tour.mjs +6 -6
  202. package/fesm2022/ngwr-tour.mjs.map +1 -1
  203. package/fesm2022/ngwr-transfer.mjs +4 -4
  204. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  205. package/fesm2022/ngwr-tree.mjs +35 -12
  206. package/fesm2022/ngwr-tree.mjs.map +1 -1
  207. package/fesm2022/ngwr-typewriter.mjs +3 -3
  208. package/fesm2022/ngwr-typography.mjs +3 -3
  209. package/fesm2022/ngwr-utils.mjs +37 -1
  210. package/fesm2022/ngwr-utils.mjs.map +1 -1
  211. package/fesm2022/ngwr-version.mjs +1 -1
  212. package/fesm2022/ngwr-version.mjs.map +1 -1
  213. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  214. package/fesm2022/ngwr-waves.mjs +4 -4
  215. package/fesm2022/ngwr-waves.mjs.map +1 -1
  216. package/fesm2022/ngwr-window-testing.mjs +10 -2
  217. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  218. package/fesm2022/ngwr-window.mjs +15 -15
  219. package/fesm2022/ngwr-window.mjs.map +1 -1
  220. package/i18n/en.json +33 -6
  221. package/i18n/ru.json +33 -6
  222. package/llms-full.txt +29 -20
  223. package/llms.txt +127 -25
  224. package/mcp/catalog.js +3 -3
  225. package/mcp/providers.js +11 -0
  226. package/package.json +9 -1
  227. package/schematics/migrations/v13/index.js +101 -0
  228. package/schematics/migrations/v14/index.js +422 -0
  229. package/schematics/migrations.json +10 -0
  230. package/schematics/page/templates.js +1 -1
  231. package/schematics/use/symbol-map.json +1 -0
  232. package/shiny-text/styles/_dark.scss +20 -0
  233. package/shiny-text/styles/_index.scss +5 -0
  234. package/shiny-text/styles/_rules.scss +0 -4
  235. package/skills/ngwr/SKILL.md +4 -1
  236. package/skills/ngwr/references/catalog.md +2 -0
  237. package/skills/ngwr/references/setup.md +4 -0
  238. package/spotlight-card/styles/_dark.scss +21 -0
  239. package/spotlight-card/styles/_index.scss +5 -0
  240. package/spotlight-card/styles/_rules.scss +0 -6
  241. package/star-border/styles/_dark.scss +21 -0
  242. package/star-border/styles/_index.scss +5 -0
  243. package/star-border/styles/_rules.scss +0 -5
  244. package/stepper/styles/_index.scss +19 -1
  245. package/textarea/styles/_index.scss +14 -6
  246. package/theme/styles/_colors.scss +102 -0
  247. package/theme/styles/_focus.scss +31 -1
  248. package/tilt-card/styles/_dark.scss +21 -0
  249. package/tilt-card/styles/_index.scss +5 -0
  250. package/tilt-card/styles/_rules.scss +0 -5
  251. package/toast/styles/_index.scss +12 -4
  252. package/types/ngwr-alert.d.ts +3 -3
  253. package/types/ngwr-blur-text.d.ts +8 -0
  254. package/types/ngwr-button.d.ts +45 -2
  255. package/types/ngwr-calendar-testing.d.ts +21 -4
  256. package/types/ngwr-calendar.d.ts +37 -0
  257. package/types/ngwr-circular-text.d.ts +9 -0
  258. package/types/ngwr-collapse.d.ts +19 -15
  259. package/types/ngwr-color-picker-testing.d.ts +10 -4
  260. package/types/ngwr-color-picker.d.ts +70 -2
  261. package/types/ngwr-command-palette.d.ts +14 -0
  262. package/types/ngwr-context-menu.d.ts +1 -1
  263. package/types/ngwr-date-adapters-fns.d.ts +71 -29
  264. package/types/ngwr-date-picker-testing.d.ts +206 -185
  265. package/types/ngwr-date-picker.d.ts +7 -0
  266. package/types/ngwr-date.d.ts +143 -13
  267. package/types/ngwr-drag-drop.d.ts +19 -0
  268. package/types/ngwr-dropdown.d.ts +18 -2
  269. package/types/ngwr-event-calendar-testing.d.ts +12 -9
  270. package/types/ngwr-file-upload.d.ts +31 -3
  271. package/types/ngwr-form-testing.d.ts +13 -7
  272. package/types/ngwr-form.d.ts +47 -12
  273. package/types/ngwr-i18n.d.ts +89 -7
  274. package/types/ngwr-input-number.d.ts +1 -1
  275. package/types/ngwr-input-otp.d.ts +3 -0
  276. package/types/ngwr-input.d.ts +13 -5
  277. package/types/ngwr-knob-testing.d.ts +8 -4
  278. package/types/ngwr-knob.d.ts +18 -0
  279. package/types/ngwr-loading-bar-router.d.ts +35 -0
  280. package/types/ngwr-loading-bar.d.ts +19 -9
  281. package/types/ngwr-mention.d.ts +13 -0
  282. package/types/ngwr-pagination-testing.d.ts +11 -10
  283. package/types/ngwr-pagination.d.ts +39 -10
  284. package/types/ngwr-popconfirm.d.ts +1 -1
  285. package/types/ngwr-popover.d.ts +1 -1
  286. package/types/ngwr-rating.d.ts +25 -4
  287. package/types/ngwr-segmented.d.ts +1 -0
  288. package/types/ngwr-select.d.ts +110 -19
  289. package/types/ngwr-slider.d.ts +1 -0
  290. package/types/ngwr-splitter-testing.d.ts +9 -4
  291. package/types/ngwr-squircle.d.ts +1 -1
  292. package/types/ngwr-statistic.d.ts +22 -2
  293. package/types/ngwr-storage.d.ts +39 -1
  294. package/types/ngwr-table.d.ts +24 -5
  295. package/types/ngwr-tabs-router.d.ts +67 -0
  296. package/types/ngwr-tabs-testing.d.ts +12 -10
  297. package/types/ngwr-tabs.d.ts +103 -6
  298. package/types/ngwr-textarea.d.ts +29 -0
  299. package/types/ngwr-theme.d.ts +92 -2
  300. package/types/ngwr-toast.d.ts +53 -0
  301. package/types/ngwr-tree.d.ts +10 -2
  302. package/types/ngwr-utils.d.ts +33 -1
  303. package/types/ngwr-version.d.ts +1 -1
  304. package/types/ngwr-window-testing.d.ts +11 -3
  305. package/types/ngwr-window.d.ts +11 -4
  306. package/waves/styles/_dark.scss +19 -0
  307. package/waves/styles/_index.scss +5 -0
  308. package/waves/styles/_rules.scss +0 -3
  309. package/window/styles/_index.scss +1 -1
package/i18n/en.json CHANGED
@@ -29,7 +29,8 @@
29
29
  "goToPage": "Go to page {{page}}",
30
30
  "label": "Pagination",
31
31
  "pageOf": "Page {{current}} of {{total}}",
32
- "of": "of"
32
+ "range": "{{from}}–{{to}} of {{total}}",
33
+ "compact": "{{current}} / {{total}}"
33
34
  },
34
35
  "table": {
35
36
  "empty": "No data",
@@ -120,12 +121,14 @@
120
121
  "collapse": "Collapse",
121
122
  "placeholder": "Select…",
122
123
  "clearSelection": "Clear selection",
123
- "removeItem": "Remove {{label}}"
124
+ "removeItem": "Remove {{label}}",
125
+ "more": "+{{count}} more"
124
126
  },
125
127
  "commandPalette": {
126
128
  "label": "Command palette",
127
129
  "placeholder": "Type a command or search…",
128
- "noResults": "No results"
130
+ "noResults": "No results",
131
+ "escHint": "esc"
129
132
  },
130
133
  "empty": {
131
134
  "noData": "No data"
@@ -136,7 +139,13 @@
136
139
  "dropZoneLabel": "File upload drop zone — click or drop files",
137
140
  "removeFile": "Remove file",
138
141
  "invalid": "Unsupported file type",
139
- "tooBig": "File too large"
142
+ "tooBig": "File too large",
143
+ "size": "{{value}} {{unit}}",
144
+ "unitByte": "B",
145
+ "unitKb": "KB",
146
+ "unitMb": "MB",
147
+ "unitGb": "GB",
148
+ "unitTb": "TB"
140
149
  },
141
150
  "popconfirm": {
142
151
  "label": "Confirm action",
@@ -184,7 +193,10 @@
184
193
  "prevYear": "Previous year",
185
194
  "nextYear": "Next year",
186
195
  "prevYears": "Previous 12 years",
187
- "nextYears": "Next 12 years"
196
+ "nextYears": "Next 12 years",
197
+ "header": "{{month}} {{year}}",
198
+ "yearRange": "{{from}} – {{to}}",
199
+ "dayLabel": "{{weekday}}, {{date}}"
188
200
  },
189
201
  "imageCropper": {
190
202
  "empty": "No image",
@@ -201,7 +213,18 @@
201
213
  "colorPicker": {
202
214
  "area": "Saturation and brightness, {{saturation}}% and {{brightness}}%",
203
215
  "hue": "Hue",
204
- "alpha": "Opacity"
216
+ "alpha": "Opacity",
217
+ "formatHex": "HEX",
218
+ "formatRgb": "RGB",
219
+ "formatHsl": "HSL",
220
+ "channelHex": "HEX",
221
+ "channelRed": "R",
222
+ "channelGreen": "G",
223
+ "channelBlue": "B",
224
+ "channelHue": "H",
225
+ "channelSaturation": "S%",
226
+ "channelLightness": "L%",
227
+ "channelAlpha": "A%"
205
228
  },
206
229
  "calendarHeatmap": {
207
230
  "label": "Calendar heatmap"
@@ -329,6 +352,10 @@
329
352
  "speedDial": {
330
353
  "label": "Actions"
331
354
  },
355
+ "statistic": {
356
+ "delta": "{{value}}{{suffix}}",
357
+ "deltaSuffix": "%"
358
+ },
332
359
  "result": {
333
360
  "notFound": "Sorry, the page you visited does not exist.",
334
361
  "forbidden": "Sorry, you are not authorized to access this page.",
package/i18n/ru.json CHANGED
@@ -29,7 +29,8 @@
29
29
  "goToPage": "Перейти на страницу {{page}}",
30
30
  "label": "Пагинация",
31
31
  "pageOf": "Страница {{current}} из {{total}}",
32
- "of": "из"
32
+ "range": "{{from}}–{{to}} из {{total}}",
33
+ "compact": "{{current}} / {{total}}"
33
34
  },
34
35
  "table": {
35
36
  "empty": "Нет данных",
@@ -120,12 +121,14 @@
120
121
  "collapse": "Свернуть",
121
122
  "placeholder": "Выберите…",
122
123
  "clearSelection": "Очистить выбор",
123
- "removeItem": "Удалить {{label}}"
124
+ "removeItem": "Удалить {{label}}",
125
+ "more": "ещё {{count}}"
124
126
  },
125
127
  "commandPalette": {
126
128
  "label": "Палитра команд",
127
129
  "placeholder": "Введите команду или поиск…",
128
- "noResults": "Ничего не найдено"
130
+ "noResults": "Ничего не найдено",
131
+ "escHint": "esc"
129
132
  },
130
133
  "empty": {
131
134
  "noData": "Нет данных"
@@ -136,7 +139,13 @@
136
139
  "dropZoneLabel": "Зона загрузки файлов — нажмите или перетащите",
137
140
  "removeFile": "Удалить файл",
138
141
  "invalid": "Неподдерживаемый тип файла",
139
- "tooBig": "Файл слишком большой"
142
+ "tooBig": "Файл слишком большой",
143
+ "size": "{{value}} {{unit}}",
144
+ "unitByte": "Б",
145
+ "unitKb": "КБ",
146
+ "unitMb": "МБ",
147
+ "unitGb": "ГБ",
148
+ "unitTb": "ТБ"
140
149
  },
141
150
  "popconfirm": {
142
151
  "label": "Подтверждение действия",
@@ -184,7 +193,10 @@
184
193
  "prevYear": "Предыдущий год",
185
194
  "nextYear": "Следующий год",
186
195
  "prevYears": "Предыдущие 12 лет",
187
- "nextYears": "Следующие 12 лет"
196
+ "nextYears": "Следующие 12 лет",
197
+ "header": "{{month}} {{year}}",
198
+ "yearRange": "{{from}} – {{to}}",
199
+ "dayLabel": "{{weekday}}, {{date}}"
188
200
  },
189
201
  "imageCropper": {
190
202
  "empty": "Нет изображения",
@@ -201,7 +213,18 @@
201
213
  "colorPicker": {
202
214
  "area": "Насыщенность и яркость, {{saturation}}% и {{brightness}}%",
203
215
  "hue": "Оттенок",
204
- "alpha": "Непрозрачность"
216
+ "alpha": "Непрозрачность",
217
+ "formatHex": "HEX",
218
+ "formatRgb": "RGB",
219
+ "formatHsl": "HSL",
220
+ "channelHex": "HEX",
221
+ "channelRed": "R",
222
+ "channelGreen": "G",
223
+ "channelBlue": "B",
224
+ "channelHue": "H",
225
+ "channelSaturation": "S%",
226
+ "channelLightness": "L%",
227
+ "channelAlpha": "A%"
205
228
  },
206
229
  "calendarHeatmap": {
207
230
  "label": "Календарная тепловая карта"
@@ -329,6 +352,10 @@
329
352
  "speedDial": {
330
353
  "label": "Действия"
331
354
  },
355
+ "statistic": {
356
+ "delta": "{{value}}{{suffix}}",
357
+ "deltaSuffix": "%"
358
+ },
332
359
  "result": {
333
360
  "notFound": "Извините, страница не найдена.",
334
361
  "forbidden": "Извините, доступ к этой странице ограничен.",
package/llms-full.txt CHANGED
@@ -129,7 +129,7 @@
129
129
 
130
130
  ## ngwr/calendar/testing
131
131
  - import: `import { WrCalendarDayHarness } from 'ngwr/calendar/testing'`
132
- - exports: WrCalendarDayHarness, WrCalendarHarness, WrCalendarChip, WrCalendarDayHarnessFilters, WrCalendarHarnessFilters, WrCalendarView
132
+ - exports: WrCalendarDayHarness, WrCalendarHarness, WrCalendarArrowKey, WrCalendarChip, WrCalendarDayHarnessFilters, WrCalendarHarnessFilters, WrCalendarView
133
133
 
134
134
  ## ngwr/card
135
135
  - import: `import { WrCard } from 'ngwr/card'`
@@ -191,7 +191,7 @@
191
191
  ## ngwr/collapse
192
192
  - import: `import { WrCollapse } from 'ngwr/collapse'`
193
193
  - selector: `wr-accordion`, `wr-collapse-group`, `wr-collapse`
194
- - exports: WrCollapse, WrCollapseGroup, WrAccordion, WR_COLLAPSE_GROUP, WrCollapseGroupContext
194
+ - exports: WrCollapse, WrCollapseGroup, WrAccordion, WR_COLLAPSE_GROUP, WrCollapseGroupContext, WrCollapseGroupMember
195
195
  - Expandable panel with a clickable header. Two-way binds `open`. Wrap in `<wr-collapse-group accordion>` for single-open behavior.
196
196
 
197
197
  ## ngwr/collapse/testing
@@ -262,15 +262,15 @@
262
262
  - import: `import { WrDatePicker } from 'ngwr/date-picker'`
263
263
  - selector: `wr-date-picker`, `wr-date-range-picker`
264
264
  - exports: WrDatePicker, WrDateRangePicker, WrDateRange
265
- - Unified date / time / date-time picker. `<input>` + popover for every mode — overlay content swaps based on `[mode]`. Parses on every keystroke (silently — only emits when valid), reformats canonical on blur. Format driven by `WrDateAdapter`. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through Angular's bridge.
265
+ - Unified date / time / date-time picker. `<input>` + popover for every mode — overlay content swaps based on `[mode]`. Parses on every keystroke (silently — only emits when valid), reformats canonical on blur. Format driven by `WrDateAdapter`. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
266
266
 
267
267
  ## ngwr/date-picker/testing
268
268
  - import: `import { WrDatePickerDayHarness } from 'ngwr/date-picker/testing'`
269
- - exports: WrDatePickerDayHarness, WrDatePickerHarness, WrDateRangePickerHarness, WrDatePickerDayHarnessFilters, WrDatePickerHarnessFilters, WrDatePickerTimeFields, WrDateRangePickerHarnessFilters
269
+ - exports: WrDatePickerDayHarness, WrDatePickerHarness, WrDateRangePickerHarness, WrAnyDatePickerHarness, WrDatePickerDayHarnessFilters, WrDatePickerHarnessFilters, WrDatePickerTimeFields, WrDateRangePickerEnd, WrDateRangePickerHarnessFilters
270
270
 
271
271
  ## ngwr/date/adapters/fns
272
272
  - import: `import { WrDateFnsAdapter } from 'ngwr/date/adapters/fns'`
273
- - exports: WrDateFnsAdapter, provideWrDateFnsAdapter
273
+ - exports: WrDateFnsAdapter, provideWrDateFnsAdapter, WR_DATE_FNS_LOCALE
274
274
 
275
275
  ## ngwr/date/adapters/luxon
276
276
  - import: `import { WrLuxonAdapter } from 'ngwr/date/adapters/luxon'`
@@ -369,7 +369,7 @@
369
369
 
370
370
  ## ngwr/event-calendar/testing
371
371
  - import: `import { WrEventCalendarChipHarness } from 'ngwr/event-calendar/testing'`
372
- - exports: WrEventCalendarChipHarness, WrEventCalendarHarness, WrEventCalendarChipHarnessFilters, WrEventCalendarHarnessFilters
372
+ - exports: WrEventCalendarChipHarness, WrEventCalendarHarness, WrEventCalendarArrowKey, WrEventCalendarChipHarnessFilters, WrEventCalendarHarnessFilters
373
373
 
374
374
  ## ngwr/falling-text
375
375
  - import: `import { WrFallingText } from 'ngwr/falling-text'`
@@ -529,7 +529,7 @@
529
529
 
530
530
  ## ngwr/knob/testing
531
531
  - import: `import { WrKnobHarness } from 'ngwr/knob/testing'`
532
- - exports: WrKnobHarness, WrKnobHarnessFilters
532
+ - exports: WrKnobHarness, WrKnobArrowKey, WrKnobHarnessFilters
533
533
 
534
534
  ## ngwr/layout
535
535
  - import: `import { WrLayout } from 'ngwr/layout'`
@@ -567,7 +567,11 @@
567
567
  - import: `import { WrLoadingBar } from 'ngwr/loading-bar'`
568
568
  - selector: `wr-loading-bar`
569
569
  - exports: WrLoadingBar, WrLoadingState, WrLoadingBarComponent
570
- - Top-of-page progress bar driven by router navigations out of the box, plus a manual `start()` / `complete()` slot API for HTTP interceptors or any long-running task.
570
+ - Top-of-page progress bar with a `start()` / `complete()` slot API for HTTP interceptors or any long-running task. Add `provideWrLoadingBarRouter()` and router navigations drive it as well — an opt-in, because that subscription is what would otherwise pull `@angular/router` into an app that never routes.
571
+
572
+ ## ngwr/loading-bar/router
573
+ - import: `import { provideWrLoadingBarRouter } from 'ngwr/loading-bar/router'`
574
+ - exports: provideWrLoadingBarRouter
571
575
 
572
576
  ## ngwr/markdown
573
577
  - import: `import { WrMarkdown } from 'ngwr/markdown'`
@@ -634,7 +638,7 @@
634
638
  - import: `import { WrPagination } from 'ngwr/pagination'`
635
639
  - selector: `wr-pagination`
636
640
  - exports: WrPagination, WrPaginationAlign, WrPaginationSize, WrPaginationShape
637
- - Numbered page navigator. Two-way binds currentPage and pageSize via signal models.
641
+ - Numbered page navigator. Two-way binds page and pageSize via signal models.
638
642
 
639
643
  ## ngwr/pagination/testing
640
644
  - import: `import { WrPaginationHarness } from 'ngwr/pagination/testing'`
@@ -691,7 +695,7 @@
691
695
  - import: `import { WrRadio } from 'ngwr/radio'`
692
696
  - selector: `wr-radio-group`, `wr-radio`
693
697
  - exports: WrRadio, WrRadioSize, WrRadioGroup, WR_RADIO_GROUP, WrRadioGroupContext
694
- - Single-choice option. Always used inside <wr-radio-group>, which is the form control: it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through Angular's bridge.
698
+ - Single-choice option. Always used inside <wr-radio-group>, which is the form control: it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
695
699
 
696
700
  ## ngwr/radio/testing
697
701
  - import: `import { WrRadioGroupHarness } from 'ngwr/radio/testing'`
@@ -701,7 +705,7 @@
701
705
  - import: `import { WrRating } from 'ngwr/rating'`
702
706
  - selector: `wr-rating`
703
707
  - exports: WrRating, WrRatingSize
704
- - Star rating input with whole or half-step granularity. Value type is `number | null` (clamped to `[0, count]`). Keyboard: arrows step by `step`, Home / End jump to 0 / max, Delete / Backspace clears.
708
+ - Star rating input with whole or half-step granularity. Value type is `number | null`; `[0, count]` bounds what the control's own edits produce. Keyboard: arrows step by `step`, Home / End jump to 0 / max, Delete / Backspace clears.
705
709
 
706
710
  ## ngwr/rating/testing
707
711
  - import: `import { WrRatingHarness } from 'ngwr/rating/testing'`
@@ -742,7 +746,7 @@
742
746
  - import: `import { WrSelect } from 'ngwr/select'`
743
747
  - selector: `wr-option-group`, `wr-option`, `wr-select`
744
748
  - exports: WrSelect, WrOption, WrOptionGroup, WR_SELECT, WrSelectContext, WrSelectMode, WrSelectSearchLoader, WrSelectTagValidator, WrSelectSize
745
- - Native-like select built on CDK Overlay. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through Angular's bridge.
749
+ - Native-like select built on CDK Overlay. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
746
750
 
747
751
  ## ngwr/select/testing
748
752
  - import: `import { WrOptionHarness } from 'ngwr/select/testing'`
@@ -774,7 +778,7 @@
774
778
  - import: `import { WrSlider } from 'ngwr/slider'`
775
779
  - selector: `wr-slider`
776
780
  - exports: WrSlider, WrSliderValue
777
- - Drag-to-pick numeric input. Single-thumb by default, optional dual-thumb range mode. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and template-driven `[(ngModel)]` / reactive forms keep working through Angular's bridge.
781
+ - Drag-to-pick numeric input. Single-thumb by default, optional dual-thumb range mode. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and template-driven `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
778
782
 
779
783
  ## ngwr/slider/testing
780
784
  - import: `import { WrSliderHarness } from 'ngwr/slider/testing'`
@@ -834,7 +838,7 @@
834
838
 
835
839
  ## ngwr/splitter/testing
836
840
  - import: `import { WrSplitterHarness } from 'ngwr/splitter/testing'`
837
- - exports: WrSplitterHarness, WrSplitterHarnessFilters, WrSplitterPaneSizes
841
+ - exports: WrSplitterHarness, WrSplitterArrowKey, WrSplitterHarnessFilters, WrSplitterPaneSizes
838
842
 
839
843
  ## ngwr/spotlight-card
840
844
  - import: `import { WrSpotlightCard } from 'ngwr/spotlight-card'`
@@ -880,14 +884,14 @@
880
884
 
881
885
  ## ngwr/storage
882
886
  - import: `import { WrStorage } from 'ngwr/storage'`
883
- - exports: WrStorage, provideWrStorage, ProvideWrStorageOptions, WR_STORAGE_CONFIG, DEFAULT_WR_STORAGE_CONFIG, WrStorageConfig, WrStorageConfigResolved, WR_STORAGE_ENGINE, createMemoryStorage, WrStorageEngine
887
+ - exports: WrStorage, provideWrStorage, ProvideWrStorageOptions, WR_STORAGE_CONFIG, DEFAULT_WR_STORAGE_CONFIG, WrStorageConfig, WrStorageConfigResolved, WR_STORAGE_ENGINE, createMemoryStorage, WrStorageEngine, WrStorageEnvelope
884
888
  - Reactive key/value storage on top of any `Storage`-compatible engine. Swap the engine through DI (defaults to `localStorage` with an in-memory SSR / private-mode fallback). Built-in prefixing, TTL, and signal-based `watch()` for local + cross-tab updates.
885
889
 
886
890
  ## ngwr/switch
887
891
  - import: `import { WrSwitch } from 'ngwr/switch'`
888
892
  - selector: `wr-switch`
889
893
  - exports: WrSwitch, WrSwitchSize
890
- - Boolean toggle with an iOS-style slider. A signal-forms native control — it implements `FormCheckboxControl`, so `[formField]` binds straight to its `checked` model. `[(checked)]` works standalone, and `[(ngModel)]` / reactive forms keep working through Angular's bridge.
894
+ - Boolean toggle with an iOS-style slider. A signal-forms native control — it implements `FormCheckboxControl`, so `[formField]` binds straight to its `checked` model. `[(checked)]` works standalone, and `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
891
895
 
892
896
  ## ngwr/switch/testing
893
897
  - import: `import { WrSwitchHarness } from 'ngwr/switch/testing'`
@@ -906,9 +910,14 @@
906
910
  ## ngwr/tabs
907
911
  - import: `import { WrTabs } from 'ngwr/tabs'`
908
912
  - selector: `wr-tab`, `wr-tabs`
909
- - exports: WrTabs, WrTab, WR_TABS, WrTabsContext
913
+ - exports: WrTabs, WrTab, WR_TABS, WrTabsContext, WR_TABS_ROUTING, WrTabsRoutingAdapter
910
914
  - Tabbed container. Use projected content for simple tabs, or set routerLink on children to switch into router mode.
911
915
 
916
+ ## ngwr/tabs/router
917
+ - import: `import { WrTabsRouting } from 'ngwr/tabs/router'`
918
+ - selector: `[wrTabsRouting]`
919
+ - exports: WrTabsRouting
920
+
912
921
  ## ngwr/tabs/testing
913
922
  - import: `import { WrTabHarness } from 'ngwr/tabs/testing'`
914
923
  - exports: WrTabHarness, WrTabsHarness, WrTabHarnessFilters, WrTabsHarnessFilters, WrTabsHarnessSize
@@ -917,7 +926,7 @@
917
926
  - import: `import { WrTextarea } from 'ngwr/textarea'`
918
927
  - selector: `wr-textarea`
919
928
  - exports: WrTextarea, WrTextareaSize, WrTextareaResize
920
- - Multi-line text input with optional autosize. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through Angular's bridge.
929
+ - Multi-line text input with optional autosize. A signal-forms native control — it implements `FormValueControl`, so `[formField]` binds straight to its `value` model. `[(value)]` works standalone, and `[(ngModel)]` / reactive forms keep working through [Angular 22's forms bridge](/guides/forms).
921
930
 
922
931
  ## ngwr/textarea/testing
923
932
  - import: `import { WrTextareaHarness } from 'ngwr/textarea/testing'`
@@ -925,7 +934,7 @@
925
934
 
926
935
  ## ngwr/theme
927
936
  - import: `import { WrTheme } from 'ngwr/theme'`
928
- - exports: WR_COLORS, wrContrastFor, wrIntentTokens, wrThemeTokens, WrColor, WrTheme, provideWrTheme, WR_THEME_CONFIG, DEFAULT_WR_THEME_CONFIG, WrResolvedTheme, WrThemeMode, WrThemeConfig
937
+ - exports: WR_COLORS, wrContrastFor, wrIntentTokens, wrThemeTokens, WrColor, WrTheme, provideWrTheme, wrThemePrePaintScript, WrThemePrePaintOptions, WR_THEME_CONFIG, DEFAULT_WR_THEME_CONFIG, WrResolvedTheme, WrThemeMode, WrThemeConfig
929
938
  - Light / dark theme manager. Writes `[data-theme]` on `<html>`, persists the chosen mode to localStorage. `auto` mode follows `WrPlatform.prefersDark`.
930
939
 
931
940
  ## ngwr/tilt-card
@@ -1007,7 +1016,7 @@
1007
1016
 
1008
1017
  ## ngwr/utils
1009
1018
  - import: `import { isDefined } from 'ngwr/utils'`
1010
- - exports: Maybe, SafeAny, isDefined, isNonEmptyArray, isObservable, clamp, round, numAttr, isSafeCssValue, resolveCssSize, ResolveCssSizeOptions, ResolvedCssSize, getRootFontSize, getFocusableElements, trapFocus, randomId, noop, debounce, throttle, WrDebouncedFn, WrThrottledFn, KEYS, hasModifier, isPrintableKey, WrKey, badgeLog
1019
+ - exports: Maybe, SafeAny, isDefined, isNonEmptyArray, isObservable, clamp, round, numAttr, isSafeCssValue, resolveCssSize, ResolveCssSizeOptions, ResolvedCssSize, getRootFontSize, getFocusableElements, trapFocus, randomId, noop, debounce, throttle, WrDebouncedFn, WrThrottledFn, KEYS, hasModifier, isComposing, isPrintableKey, WrKey, badgeLog
1011
1020
 
1012
1021
  ## ngwr/validators
1013
1022
  - import: `import { WrValidators } from 'ngwr/validators'`
package/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # ngwr
2
2
 
3
3
  > Angular UI library — standalone, signals-first, zoneless, fully tree-shakable.
4
- > 202 secondary entry points, 187 component and directive classes, built on
4
+ > 204 secondary entry points, 174 component and directive classes, built on
5
5
  > `@angular/cdk` primitives. The only runtime dependency is `tslib`. Docs and
6
6
  > live demos: https://ngwr.dev — source: https://github.com/thekhegay/ngwr
7
7
 
@@ -28,11 +28,36 @@ pnpm add ngwr @angular/cdk
28
28
 
29
29
  Requires Angular / CDK `>= 22.0.0` (peers: `@angular/cdk`, `@angular/common`,
30
30
  `@angular/core`, `@angular/platform-browser`, `rxjs ^7`; optional `date-fns` /
31
- `luxon` / `lucide`).
31
+ `luxon` / `lucide`). On Angular 21 or older the INSTALL succeeds — every package
32
+ manager treats an unmet peer as a warning — and the `ng build` fails instead, in
33
+ the linker, with `Unsupported enum value for [object Object]`. The floor is real
34
+ and the ceiling is absent — an Angular newer than the release has not been built
35
+ or tested against, and nothing warns. There is no `engines` field and no
36
+ TypeScript peer either: both come from your Angular. What that range does and
37
+ does not promise: https://ngwr.dev/start/versioning
32
38
 
33
- Each component is a tree-shakable subpath import: `import { WrButton } from
34
- 'ngwr/button'`. Styles: `@use 'ngwr'` (everything) or `@use 'ngwr/<name>'` (per
35
- component) in your global SCSS.
39
+ **There is no root barrel: `import { X } from 'ngwr'` is always wrong.** The root
40
+ entry point exports nothing, so an IDE auto-import from it gives `TS2305` and no
41
+ hint. Every symbol comes from its entry point — `import { WrButton } from
42
+ 'ngwr/button'` — and the entry point is the last segment of the component's docs
43
+ URL. Mind the ones that do not match the selector: `<wr-btn>` is `ngwr/button`,
44
+ `<wr-tag>` is `ngwr/badge`, `<wr-option>` is `ngwr/select`, `<wr-accordion>` is
45
+ `ngwr/collapse`, `<wr-form-field>` is `ngwr/form`, `<wr-sortable-list>` is
46
+ `ngwr/drag-drop`, `<wr-kbd>` is `ngwr/keyboard`.
47
+
48
+ Styles: `@use 'ngwr'` (everything — about 290 kB minified, 42 kB gzipped) or
49
+ `@use 'ngwr/<name>'` per component in your global SCSS. **Per component, the
50
+ theme tokens come with each entry but the other components it renders do not**,
51
+ and nothing warns — the control just paints wrong. Always add `ngwr/icon` (the
52
+ inline chevrons, carets and sort arrows are bare SVGs sized by `.wr-icon__svg`),
53
+ `ngwr/density` (nothing else declares the `--wr-density-*` multipliers, so
54
+ `provideWrDensity()` silently does nothing without it) and `ngwr/overlay` (the
55
+ responsive bottom sheet). Then follow what a component renders:
56
+ `ngwr/table` needs checkbox / dropdown / pagination / spinner, `ngwr/pagination`
57
+ needs button / select, `ngwr/date-picker` needs calendar / input, and a service
58
+ mounts a component no template names — `WrDialog.open()` needs `ngwr/dialog`,
59
+ `WrToast.show()` needs `ngwr/toast`. Full table:
60
+ https://ngwr.dev/start/installation
36
61
 
37
62
  ## Providers (main.ts)
38
63
 
@@ -44,7 +69,11 @@ Add from their entry points as needed:
44
69
  tracker mobile sheets need to clear the on-screen keyboard. Without it overlays
45
70
  still work, falling back to CDK's shared root container — but
46
71
  `--wr-keyboard-inset` stays 0 and sheets won't lift above the keyboard. Add
47
- `provideWrResponsiveOverlays()` for mobile sheets.
72
+ `provideWrResponsiveOverlays()` for mobile sheets — both from `ngwr/overlay`,
73
+ not from the component's own entry point. Optional does not mean free: what it
74
+ references is CDK's overlay module, the heaviest dependency in the catalog, so
75
+ it is near-zero in an app with any overlay on screen and the whole of it in an
76
+ app with none.
48
77
  - `provideWrIcons(lucideIcons({ check: Check }))` — icon registry (`ngwr/icon`,
49
78
  adapters under `ngwr/icon/adapters/*`).
50
79
  - `provideWrTheme()` — `--wr-*` design tokens. `provideWrDensity()` — sizing.
@@ -75,20 +104,48 @@ one element at a time; a step whose target is missing is skipped, not floated.
75
104
  - `ng g ngwr:page <form|table|dashboard>` — starter page wired with ngwr.
76
105
  - `ng update ngwr` — runs upgrade migrations.
77
106
 
78
- ## Upgrading to v12
107
+ ## Upgrading to v14
108
+
109
+ Run `ng update ngwr@14`. It rewrites the renames and REPORTS the rest — read its
110
+ output, because the reported half is where the silent failures are.
111
+
112
+ Rewritten for you (six renames, one word per concept):
79
113
 
80
- Two breaking changes, and only one is codemoddable.
114
+ - `<wr-alert>` from `closeable` to `closable`.
115
+ - `[wrInput]` from `wrSize` to `size`, like every other control. v13's release
116
+ note announced this rename and did NOT make it; it lands in v14. On v13 a
117
+ `size` written on an ngwr input compiled — it is a legal native attribute —
118
+ and the control quietly fell back to `md`.
119
+ - `<wr-table>` from `[totalItems]` to `[total]`.
120
+ - `<wr-pagination>` from `[(currentPage)]` to `[(page)]`, and from
121
+ `(currentPageChange)` to `(pageChange)`.
122
+ - `isDisabledWhenLoading` to `disabledWhenLoading` (the library's last
123
+ `is`-prefixed boolean).
124
+ - The window `chromeSize` scale from `'compact' | 'normal'` to `'sm' | 'md'`,
125
+ including the `.wr-window--chrome-compact` class.
81
126
 
82
- - **Date entry points nest under `ngwr/date`.** `ngwr/date-adapter` →
83
- `ngwr/date`, `ngwr/date-adapter-fns` → `ngwr/date/adapters/fns`,
84
- `ngwr/date-adapter-luxon` → `ngwr/date/adapters/luxon`. Import paths only —
85
- every symbol keeps its name. `ng update ngwr@12` rewrites them.
86
- - **`readI18nText()` returns `Signal<string>`.** Add `()` at every read. No
87
- codemod: adding the call means knowing which identifiers hold the result, and
88
- the type error already names every site. `useI18nText`, the `wrT` pipe and the
89
- `[wrT]` directive are unchanged.
127
+ Reported, not rewritten — each needs a decision a codemod cannot make:
90
128
 
91
- Full guide, with diffs: https://ngwr.dev/start/migration
129
+ - **Router integration is opt-in.** `<wr-loading-bar>` no longer follows the
130
+ router on its own: add `provideWrLoadingBarRouter()` from
131
+ `ngwr/loading-bar/router`. A `<wr-tab routerLink>` needs `wrTabsRouting` on the
132
+ strip and `WrTabsRouting` (from `ngwr/tabs/router`) in `imports`. The tab strip
133
+ throws without it; **the loading bar does not — it just never moves.**
134
+ - **Locale comes from Angular's `LOCALE_ID`.** `WR_DATE_LOCALE` and `WrI18n`'s
135
+ `defaultLocale` / `availableLocales` used to read `navigator.language` or a
136
+ literal `'en'`. An app that really wants the browser's tag now writes
137
+ `provideWrDateAdapter({ locale: navigator.language })`.
138
+ - **A named date format refuses input it cannot read.** `shortDate` / `time` and
139
+ friends parse through the same `Intl` formatter that printed the string, so
140
+ they round-trip; unreadable input returns null and leaves the committed value
141
+ alone instead of guessing. Pass an explicit token `[format]` if you relied on
142
+ `new Date()`'s leniency.
143
+ - **`<wr-pagination ofLabel>` is gone**, and the `pagination.of` catalog key with
144
+ it. The range is one `pagination.range` template with `{{from}}` / `{{to}}` /
145
+ `{{total}}` placeholders — a catalog still carrying the old key reverts that
146
+ line to English silently.
147
+
148
+ Earlier steps, with diffs, back to v6: https://ngwr.dev/start/migration
92
149
 
93
150
  ## Use ngwr — don't hand-roll
94
151
 
@@ -138,9 +195,22 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
138
195
  its own `value` model, and implements neither.
139
196
  Bind `[formField]="form.x"`, use the two-way model standalone (`[(value)]`, or
140
197
  `[(checked)]` on checkbox/switch), or classic `[(ngModel)]` / reactive forms
141
- via Angular's bridge.
198
+ via Angular's bridge. **That bridge is not an accessor and does not behave like
199
+ one**, and the differences are silent: `updateOn: 'blur'` / `'submit'` do not
200
+ apply to an ngwr control while a native `<input>` in the same group still
201
+ honours them; a `{ emitEvent: false }` write moves the model and leaves the
202
+ control showing the old value; `<wr-select>` compares object values by `===`
203
+ with no `compareWith`. What the bridge carries, what it drops, and what a form
204
+ does about each: https://ngwr.dev/guides/forms
142
205
  - **Icons** — register via `provideWrIcons`, render `<wr-icon name="check" />`.
143
- - **i18n** — `{{ 'key' | wrT }}` (pipe from `ngwr/i18n`).
206
+ - **Router** — nothing injects `@angular/router` unless you opt in. A
207
+ `<wr-tab routerLink>` needs `wrTabsRouting` on the strip plus `WrTabsRouting`
208
+ (`ngwr/tabs/router`) in `imports`, and it throws if you forget.
209
+ `<wr-loading-bar>` follows navigation only with
210
+ `provideWrLoadingBarRouter()` (`ngwr/loading-bar/router`), and it does NOT
211
+ throw — without the provider the bar simply never moves.
212
+ - **i18n** — `{{ 'key' | wrT }}` (pipe from `ngwr/i18n`). The locale defaults to
213
+ Angular's `LOCALE_ID`, not the browser, for both copy and dates.
144
214
  - **Theme** — CSS custom properties `--wr-color-*`, `--wr-border-radius-*`, … set
145
215
  by `provideWrTheme()`. Two contrast tokens per intent, easy to confuse:
146
216
  `--wr-color-<intent>-contrast` is the label ON a filled intent;
@@ -150,6 +220,17 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
150
220
  tint — which is exactly where outlined / ghost / tinted variants paint it, so use
151
221
  `-ink` there. For muted prose use `--wr-color-on-surface-muted`, not the `medium`
152
222
  intent.
223
+ - **SSR** — everything renders on the server; the library contains no
224
+ `ngSkipHydration`, so `provideClientHydration()` and `withEventReplay()` need
225
+ nothing from it. Two calls are NOT no-ops there and ship an overlay into a
226
+ cached page: `WrToast.show()` and `WrDialog.open()` (`WrTour.start()` is the
227
+ one that returns early) — guard them with `afterNextRender` or `WrPlatform`'s
228
+ `isBrowser`. `WrMedia` has no viewport to measure, so `matches()` is `false`
229
+ and `current()` is `'xs'` until hydration: reflow with the `responsive`
230
+ container-query modifiers rather than a template branch. And a server has no
231
+ `localStorage`, so a dark-mode visitor sees a light page until the bundle
232
+ boots — `wrThemePrePaintScript()` (`ngwr/theme`) is the blocking `<head>`
233
+ reader that closes it: https://ngwr.dev/guides/ssr
153
234
  - **Mobile** — overlays collapse to sheets (`provideWrResponsiveOverlays()`), a
154
235
  `responsive` input reflows layout components, a `touch` density preset enlarges
155
236
  controls, and `WrHaptics` (ngwr/platform) fires vibration feedback.
@@ -157,7 +238,9 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
157
238
  `wr-tree` and `wr-select` (search mode), alongside the standalone
158
239
  `wr-virtual-scroll` wrapper.
159
240
  - **Testing** — CDK component harnesses ship beside the components they drive, at
160
- `ngwr/<name>/testing`. 70 entry points so far, 104 harness classes, covering the
241
+ `ngwr/<name>/testing`. 70 entry points so far, 104 exported harness names over
242
+ 103 distinct classes — `WrCalendarDayHarness` ships under two, since a date
243
+ picker's popup IS a calendar — covering the
161
244
  form controls, the overlays, both data views, the navigation / disclosure set
162
245
  (`tabs`, `stepper`, `carousel`, `pagination`, `segmented`, `collapse`,
163
246
  `transfer`) and `markdown`: the form controls
@@ -195,23 +278,40 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
195
278
 
196
279
  ## Deciding whether to use it
197
280
 
198
- Three pages exist for the question before installation, and everything on them
281
+ Four pages exist for the question before installation, and everything on them
199
282
  is meant to be checkable rather than taken on trust:
200
283
 
201
284
  - **Why ngwr, and when not to** — the wedge (nineteen value controls are Signal
202
285
  Forms controls; no `ControlValueAccessor` in the library), a comparison against
203
286
  Material / PrimeNG / NG-ZORRO / Taiga / Spartan, and a per-competitor "choose
204
287
  something else if" section: https://ngwr.dev/start/comparison
205
- - **What gates a change** — eight gates on every PR, three separate
288
+ - **What gates a change** — nine gates on every PR, three separate
206
289
  accessibility sweeps and what each one cannot see, the two nightly baselines
207
290
  and what is accepted in them, plus what the test suite does NOT cover:
208
291
  https://ngwr.dev/start/quality
209
292
  - **A live Signal Forms demo** you can read before installing anything:
210
293
  https://ngwr.dev/start/playground
294
+ - **What a version number promises** — what a major is allowed to break, and the
295
+ one semver rule made mechanical: `release:prepare` refuses a minor or patch
296
+ bump when any commit since the last tag is marked breaking, so `^14.0.0` is a
297
+ safe range (12.2.0 was a minor carrying a breaking change, which is why the
298
+ guard exists). Also the support window — current major in full, previous major
299
+ mechanical security fixes only, ending when the next major ships — and the
300
+ actual cadence: https://ngwr.dev/start/versioning
211
301
 
212
302
  The honest shape of the project, since these pages say it too: one maintainer,
213
- MIT, six majors shipped between 2026-06-12 and 2026-08-20, a codemod for every
214
- break a codemod can repair, no commercial support.
303
+ MIT, eight majors shipped since 2026-06-12, a codemod for every break a codemod
304
+ can repair and a reported diagnosis for the rest, no commercial support.
305
+
306
+ Public API is three surfaces and all three move only in a major: the exported
307
+ TypeScript, the `.wr-*` BEM class names (every component ships
308
+ `ViewEncapsulation.None`), and the `--wr-*` custom properties. `@internal` in a
309
+ TSDoc means not API and survives into the published types, so
310
+ `grep -rn "@internal" node_modules/ngwr/types` answers it. A few helpers are
311
+ exported, unmarked and undocumented — `wrAppendOverlayClose`, `wrMirrorOffsets`,
312
+ `wrPresentAsSheet`, `WrOutsideClick`, `useConfigValue`, `useFormFieldAria`,
313
+ `squirclePath`, `wrContrastFor`, `isSafeCssValue` — and carry no stability
314
+ statement; do not build on them.
215
315
 
216
316
  ## Resources (machine-readable)
217
317
 
@@ -252,4 +352,6 @@ break a codemod can repair, no commercial support.
252
352
  - All site URLs (for crawlers): https://ngwr.dev/sitemap.xml
253
353
  - Source, README, per-component `.d.ts` types: https://github.com/thekhegay/ngwr
254
354
  (installed at `node_modules/ngwr/types/ngwr-<name>.d.ts`; the package also
255
- ships `README.md`, `llms.txt`, `llms-full.txt` and `skills/ngwr/`)
355
+ ships `README.md`, `llms.txt`, `llms-full.txt` and `skills/ngwr/` — and no
356
+ other markdown: there is no `CHANGELOG.md` in the tarball, and the docs'
357
+ markdown twins are served from ngwr.dev rather than copied into it)
package/mcp/catalog.js CHANGED
@@ -11,8 +11,8 @@ import { fileURLToPath } from 'node:url';
11
11
  * The catalog, read from the files the package already ships.
12
12
  *
13
13
  * **No second copy of anything, and that is the design constraint this whole
14
- * server was built under.** `llms-full.txt` (~57 KB, 202 entry points) and
15
- * `schematics/use/symbol-map.json` (215 symbols) are already in the tarball for
14
+ * server was built under.** `llms-full.txt` (~57 KB, 204 entry points) and
15
+ * `schematics/use/symbol-map.json` (216 symbols) are already in the tarball for
16
16
  * other reasons, and the `.d.ts` bundle carries every signature. A server that
17
17
  * embedded its own index would be a fourth copy to keep in step with the library,
18
18
  * and the first one to go stale.
@@ -51,7 +51,7 @@ class Catalog {
51
51
  /**
52
52
  * Does this entry point ship a stylesheet?
53
53
  *
54
- * Read from the package's own `exports` map rather than assumed: 94 of the 202
54
+ * Read from the package's own `exports` map rather than assumed: 96 of the 204
55
55
  * entry points ship no `styles/_index.scss` — the testing harnesses, the
56
56
  * services, the adapters — and telling a consumer to `@use` one of those breaks
57
57
  * their Sass build.
package/mcp/providers.js CHANGED
@@ -25,6 +25,17 @@ const REQUIRED_PROVIDERS = [
25
25
  provider: "provideWrDateFnsAdapter() // from 'ngwr/date/adapters/fns'",
26
26
  why: 'every date mode goes through an adapter; there is no built-in default',
27
27
  },
28
+ {
29
+ // The bar itself needs no provider — `start()` / `complete()` work bare — so
30
+ // the rule names the ROUTER half, which is exactly the table's criterion: the
31
+ // component compiles, renders, and sits at 0% forever with nothing naming the
32
+ // cause. The subscription is opt-in because it is what pulls
33
+ // `@angular/router` into a bundle, and this project's own site shipped a dead
34
+ // bar for the length of one release by missing it.
35
+ test: /^WrLoadingBar/,
36
+ provider: "provideWrLoadingBarRouter() // from 'ngwr/loading-bar/router'",
37
+ why: 'without it the bar never responds to navigation; it only moves for manual start() / complete()',
38
+ },
28
39
  {
29
40
  // Spelled out rather than `^WrT(Pipe|Directive)$`: `describeTest` in the
30
41
  // skill generator only names alternatives that are bare symbols, so a group
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngwr",
3
- "version": "13.0.1",
3
+ "version": "14.0.1",
4
4
  "bin": {
5
5
  "ngwr-mcp": "mcp/server.js"
6
6
  },
@@ -845,6 +845,10 @@
845
845
  "types": "./types/ngwr-line-chart-testing.d.ts",
846
846
  "default": "./fesm2022/ngwr-line-chart-testing.mjs"
847
847
  },
848
+ "./loading-bar/router": {
849
+ "types": "./types/ngwr-loading-bar-router.d.ts",
850
+ "default": "./fesm2022/ngwr-loading-bar-router.mjs"
851
+ },
848
852
  "./markdown/testing": {
849
853
  "types": "./types/ngwr-markdown-testing.d.ts",
850
854
  "default": "./fesm2022/ngwr-markdown-testing.mjs"
@@ -965,6 +969,10 @@
965
969
  "types": "./types/ngwr-table-testing.d.ts",
966
970
  "default": "./fesm2022/ngwr-table-testing.mjs"
967
971
  },
972
+ "./tabs/router": {
973
+ "types": "./types/ngwr-tabs-router.d.ts",
974
+ "default": "./fesm2022/ngwr-tabs-router.mjs"
975
+ },
968
976
  "./tabs/testing": {
969
977
  "types": "./types/ngwr-tabs-testing.d.ts",
970
978
  "default": "./fesm2022/ngwr-tabs-testing.mjs"