ngwr 13.0.0 → 14.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 (200) hide show
  1. package/README.md +13 -6
  2. package/color-picker/styles/_index.scss +43 -5
  3. package/fesm2022/ngwr-alert.mjs +5 -5
  4. package/fesm2022/ngwr-alert.mjs.map +1 -1
  5. package/fesm2022/ngwr-back-top.mjs +11 -1
  6. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  7. package/fesm2022/ngwr-blur-text.mjs +13 -2
  8. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  9. package/fesm2022/ngwr-border-glow.mjs +12 -3
  10. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  11. package/fesm2022/ngwr-breadcrumbs.mjs +14 -3
  12. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  13. package/fesm2022/ngwr-button.mjs +4 -4
  14. package/fesm2022/ngwr-button.mjs.map +1 -1
  15. package/fesm2022/ngwr-calendar-testing.mjs +15 -0
  16. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  17. package/fesm2022/ngwr-calendar.mjs +51 -5
  18. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  19. package/fesm2022/ngwr-circular-text.mjs +20 -1
  20. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  21. package/fesm2022/ngwr-collapse.mjs.map +1 -1
  22. package/fesm2022/ngwr-color-picker-testing.mjs +23 -7
  23. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  24. package/fesm2022/ngwr-color-picker.mjs +89 -10
  25. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  26. package/fesm2022/ngwr-command-palette.mjs +27 -3
  27. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  28. package/fesm2022/ngwr-context-menu.mjs +13 -3
  29. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  30. package/fesm2022/ngwr-date-adapters-fns.mjs +101 -33
  31. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
  32. package/fesm2022/ngwr-date-picker-testing.mjs +10 -2
  33. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  34. package/fesm2022/ngwr-date-picker.mjs +103 -13
  35. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  36. package/fesm2022/ngwr-date.mjs +480 -79
  37. package/fesm2022/ngwr-date.mjs.map +1 -1
  38. package/fesm2022/ngwr-dialog.mjs +22 -16
  39. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  40. package/fesm2022/ngwr-directives.mjs +5 -2
  41. package/fesm2022/ngwr-directives.mjs.map +1 -1
  42. package/fesm2022/ngwr-drag-drop.mjs +30 -2
  43. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  44. package/fesm2022/ngwr-drawer.mjs +24 -18
  45. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  46. package/fesm2022/ngwr-dropdown.mjs +8 -3
  47. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  48. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
  49. package/fesm2022/ngwr-event-calendar.mjs +1 -1
  50. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  51. package/fesm2022/ngwr-file-upload.mjs +52 -12
  52. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  53. package/fesm2022/ngwr-fuzzy-text.mjs +21 -4
  54. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  55. package/fesm2022/ngwr-gradient-text.mjs +9 -2
  56. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  57. package/fesm2022/ngwr-i18n-en.mjs +63 -1
  58. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  59. package/fesm2022/ngwr-i18n-ru.mjs +28 -1
  60. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  61. package/fesm2022/ngwr-i18n.mjs +150 -22
  62. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  63. package/fesm2022/ngwr-icon-adapters-feather.mjs +11 -0
  64. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
  65. package/fesm2022/ngwr-icon-adapters-lucide.mjs +22 -2
  66. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
  67. package/fesm2022/ngwr-icon.mjs +474 -37
  68. package/fesm2022/ngwr-icon.mjs.map +1 -1
  69. package/fesm2022/ngwr-input-number.mjs +3 -3
  70. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  71. package/fesm2022/ngwr-input-otp.mjs +21 -3
  72. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  73. package/fesm2022/ngwr-input.mjs +14 -7
  74. package/fesm2022/ngwr-input.mjs.map +1 -1
  75. package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
  76. package/fesm2022/ngwr-knob.mjs +20 -2
  77. package/fesm2022/ngwr-knob.mjs.map +1 -1
  78. package/fesm2022/ngwr-loading-bar-router.mjs +73 -0
  79. package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -0
  80. package/fesm2022/ngwr-loading-bar.mjs +21 -32
  81. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  82. package/fesm2022/ngwr-markdown.mjs +63 -11
  83. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  84. package/fesm2022/ngwr-mention.mjs +104 -14
  85. package/fesm2022/ngwr-mention.mjs.map +1 -1
  86. package/fesm2022/ngwr-overlay.mjs +36 -7
  87. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  88. package/fesm2022/ngwr-pagination-testing.mjs +11 -10
  89. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  90. package/fesm2022/ngwr-pagination.mjs +65 -30
  91. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  92. package/fesm2022/ngwr-popconfirm.mjs +3 -2
  93. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  94. package/fesm2022/ngwr-popover.mjs +2 -1
  95. package/fesm2022/ngwr-popover.mjs.map +1 -1
  96. package/fesm2022/ngwr-qr.mjs +38 -1
  97. package/fesm2022/ngwr-qr.mjs.map +1 -1
  98. package/fesm2022/ngwr-select.mjs +93 -34
  99. package/fesm2022/ngwr-select.mjs.map +1 -1
  100. package/fesm2022/ngwr-shiny-text.mjs +10 -3
  101. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  103. package/fesm2022/ngwr-squircle.mjs +2 -1
  104. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  105. package/fesm2022/ngwr-statistic.mjs +35 -4
  106. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  107. package/fesm2022/ngwr-table.mjs +35 -12
  108. package/fesm2022/ngwr-table.mjs.map +1 -1
  109. package/fesm2022/ngwr-tabs-router.mjs +158 -0
  110. package/fesm2022/ngwr-tabs-router.mjs.map +1 -0
  111. package/fesm2022/ngwr-tabs-testing.mjs +13 -11
  112. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  113. package/fesm2022/ngwr-tabs.mjs +104 -12
  114. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  115. package/fesm2022/ngwr-textarea.mjs +20 -1
  116. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  117. package/fesm2022/ngwr-tour.mjs +1 -1
  118. package/fesm2022/ngwr-tour.mjs.map +1 -1
  119. package/fesm2022/ngwr-transfer.mjs +2 -2
  120. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  121. package/fesm2022/ngwr-tree.mjs +18 -2
  122. package/fesm2022/ngwr-tree.mjs.map +1 -1
  123. package/fesm2022/ngwr-utils.mjs +143 -1
  124. package/fesm2022/ngwr-utils.mjs.map +1 -1
  125. package/fesm2022/ngwr-version.mjs +1 -1
  126. package/fesm2022/ngwr-version.mjs.map +1 -1
  127. package/fesm2022/ngwr-window-testing.mjs +10 -2
  128. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  129. package/fesm2022/ngwr-window.mjs +4 -4
  130. package/fesm2022/ngwr-window.mjs.map +1 -1
  131. package/i18n/en.json +33 -6
  132. package/i18n/ru.json +33 -6
  133. package/llms-full.txt +20 -11
  134. package/llms.txt +47 -16
  135. package/mcp/catalog.js +3 -3
  136. package/mcp/providers.js +11 -0
  137. package/package.json +11 -3
  138. package/schematics/migrations/v13/index.js +101 -0
  139. package/schematics/migrations/v14/index.js +422 -0
  140. package/schematics/migrations.json +10 -0
  141. package/schematics/page/templates.js +1 -1
  142. package/schematics/use/symbol-map.json +1 -0
  143. package/skills/ngwr/SKILL.md +4 -1
  144. package/skills/ngwr/references/catalog.md +2 -0
  145. package/skills/ngwr/references/setup.md +4 -0
  146. package/stepper/styles/_index.scss +19 -1
  147. package/textarea/styles/_index.scss +14 -6
  148. package/toast/styles/_index.scss +12 -4
  149. package/types/ngwr-alert.d.ts +3 -3
  150. package/types/ngwr-blur-text.d.ts +8 -0
  151. package/types/ngwr-breadcrumbs.d.ts +1 -0
  152. package/types/ngwr-button.d.ts +2 -2
  153. package/types/ngwr-calendar-testing.d.ts +21 -4
  154. package/types/ngwr-calendar.d.ts +37 -0
  155. package/types/ngwr-circular-text.d.ts +9 -0
  156. package/types/ngwr-collapse.d.ts +19 -15
  157. package/types/ngwr-color-picker-testing.d.ts +10 -4
  158. package/types/ngwr-color-picker.d.ts +70 -2
  159. package/types/ngwr-command-palette.d.ts +14 -0
  160. package/types/ngwr-context-menu.d.ts +1 -1
  161. package/types/ngwr-date-adapters-fns.d.ts +71 -29
  162. package/types/ngwr-date-picker-testing.d.ts +206 -185
  163. package/types/ngwr-date-picker.d.ts +7 -0
  164. package/types/ngwr-date.d.ts +143 -13
  165. package/types/ngwr-drag-drop.d.ts +19 -0
  166. package/types/ngwr-dropdown.d.ts +1 -1
  167. package/types/ngwr-event-calendar-testing.d.ts +12 -9
  168. package/types/ngwr-file-upload.d.ts +31 -3
  169. package/types/ngwr-fuzzy-text.d.ts +5 -0
  170. package/types/ngwr-i18n.d.ts +89 -7
  171. package/types/ngwr-icon-adapters-feather.d.ts +11 -0
  172. package/types/ngwr-icon.d.ts +42 -1
  173. package/types/ngwr-input-number.d.ts +1 -1
  174. package/types/ngwr-input-otp.d.ts +3 -0
  175. package/types/ngwr-input.d.ts +11 -4
  176. package/types/ngwr-knob-testing.d.ts +8 -4
  177. package/types/ngwr-knob.d.ts +18 -0
  178. package/types/ngwr-loading-bar-router.d.ts +35 -0
  179. package/types/ngwr-loading-bar.d.ts +19 -9
  180. package/types/ngwr-mention.d.ts +13 -0
  181. package/types/ngwr-pagination-testing.d.ts +11 -10
  182. package/types/ngwr-pagination.d.ts +39 -10
  183. package/types/ngwr-popconfirm.d.ts +1 -1
  184. package/types/ngwr-popover.d.ts +1 -1
  185. package/types/ngwr-select.d.ts +65 -10
  186. package/types/ngwr-shiny-text.d.ts +1 -0
  187. package/types/ngwr-splitter-testing.d.ts +9 -4
  188. package/types/ngwr-squircle.d.ts +1 -1
  189. package/types/ngwr-statistic.d.ts +22 -2
  190. package/types/ngwr-table.d.ts +24 -5
  191. package/types/ngwr-tabs-router.d.ts +67 -0
  192. package/types/ngwr-tabs-testing.d.ts +12 -10
  193. package/types/ngwr-tabs.d.ts +103 -6
  194. package/types/ngwr-textarea.d.ts +9 -0
  195. package/types/ngwr-tree.d.ts +7 -0
  196. package/types/ngwr-utils.d.ts +79 -1
  197. package/types/ngwr-version.d.ts +1 -1
  198. package/types/ngwr-window-testing.d.ts +11 -3
  199. package/types/ngwr-window.d.ts +11 -4
  200. 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
@@ -266,11 +266,11 @@
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'`
@@ -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'`
@@ -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
@@ -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, 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
 
@@ -75,20 +75,44 @@ one element at a time; a step whose target is missing is skipped, not floated.
75
75
  - `ng g ngwr:page <form|table|dashboard>` — starter page wired with ngwr.
76
76
  - `ng update ngwr` — runs upgrade migrations.
77
77
 
78
- ## Upgrading to v12
78
+ ## Upgrading to v14
79
79
 
80
- Two breaking changes, and only one is codemoddable.
80
+ Run `ng update ngwr@14`. It rewrites the renames and REPORTS the rest — read its
81
+ output, because the reported half is where the silent failures are.
81
82
 
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.
83
+ Rewritten for you (five renames, one word per concept):
90
84
 
91
- Full guide, with diffs: https://ngwr.dev/start/migration
85
+ - `<wr-alert>` from `closeable` to `closable`.
86
+ - `<wr-table>` from `[totalItems]` to `[total]`.
87
+ - `<wr-pagination>` from `[(currentPage)]` to `[(page)]`, and from
88
+ `(currentPageChange)` to `(pageChange)`.
89
+ - `isDisabledWhenLoading` to `disabledWhenLoading` (the library's last
90
+ `is`-prefixed boolean).
91
+ - The window `chromeSize` scale from `'compact' | 'normal'` to `'sm' | 'md'`,
92
+ including the `.wr-window--chrome-compact` class.
93
+
94
+ Reported, not rewritten — each needs a decision a codemod cannot make:
95
+
96
+ - **Router integration is opt-in.** `<wr-loading-bar>` no longer follows the
97
+ router on its own: add `provideWrLoadingBarRouter()` from
98
+ `ngwr/loading-bar/router`. A `<wr-tab routerLink>` needs `wrTabsRouting` on the
99
+ strip and `WrTabsRouting` (from `ngwr/tabs/router`) in `imports`. The tab strip
100
+ throws without it; **the loading bar does not — it just never moves.**
101
+ - **Locale comes from Angular's `LOCALE_ID`.** `WR_DATE_LOCALE` and `WrI18n`'s
102
+ `defaultLocale` / `availableLocales` used to read `navigator.language` or a
103
+ literal `'en'`. An app that really wants the browser's tag now writes
104
+ `provideWrDateAdapter({ locale: navigator.language })`.
105
+ - **A named date format refuses input it cannot read.** `shortDate` / `time` and
106
+ friends parse through the same `Intl` formatter that printed the string, so
107
+ they round-trip; unreadable input returns null and leaves the committed value
108
+ alone instead of guessing. Pass an explicit token `[format]` if you relied on
109
+ `new Date()`'s leniency.
110
+ - **`<wr-pagination ofLabel>` is gone**, and the `pagination.of` catalog key with
111
+ it. The range is one `pagination.range` template with `{{from}}` / `{{to}}` /
112
+ `{{total}}` placeholders — a catalog still carrying the old key reverts that
113
+ line to English silently.
114
+
115
+ Earlier steps, with diffs, back to v6: https://ngwr.dev/start/migration
92
116
 
93
117
  ## Use ngwr — don't hand-roll
94
118
 
@@ -140,7 +164,14 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
140
164
  `[(checked)]` on checkbox/switch), or classic `[(ngModel)]` / reactive forms
141
165
  via Angular's bridge.
142
166
  - **Icons** — register via `provideWrIcons`, render `<wr-icon name="check" />`.
143
- - **i18n** — `{{ 'key' | wrT }}` (pipe from `ngwr/i18n`).
167
+ - **Router** — nothing injects `@angular/router` unless you opt in. A
168
+ `<wr-tab routerLink>` needs `wrTabsRouting` on the strip plus `WrTabsRouting`
169
+ (`ngwr/tabs/router`) in `imports`, and it throws if you forget.
170
+ `<wr-loading-bar>` follows navigation only with
171
+ `provideWrLoadingBarRouter()` (`ngwr/loading-bar/router`), and it does NOT
172
+ throw — without the provider the bar simply never moves.
173
+ - **i18n** — `{{ 'key' | wrT }}` (pipe from `ngwr/i18n`). The locale defaults to
174
+ Angular's `LOCALE_ID`, not the browser, for both copy and dates.
144
175
  - **Theme** — CSS custom properties `--wr-color-*`, `--wr-border-radius-*`, … set
145
176
  by `provideWrTheme()`. Two contrast tokens per intent, easy to confuse:
146
177
  `--wr-color-<intent>-contrast` is the label ON a filled intent;
@@ -202,7 +233,7 @@ is meant to be checkable rather than taken on trust:
202
233
  Forms controls; no `ControlValueAccessor` in the library), a comparison against
203
234
  Material / PrimeNG / NG-ZORRO / Taiga / Spartan, and a per-competitor "choose
204
235
  something else if" section: https://ngwr.dev/start/comparison
205
- - **What gates a change** — eight gates on every PR, three separate
236
+ - **What gates a change** — nine gates on every PR, three separate
206
237
  accessibility sweeps and what each one cannot see, the two nightly baselines
207
238
  and what is accepted in them, plus what the test suite does NOT cover:
208
239
  https://ngwr.dev/start/quality
@@ -210,8 +241,8 @@ is meant to be checkable rather than taken on trust:
210
241
  https://ngwr.dev/start/playground
211
242
 
212
243
  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.
244
+ MIT, eight majors shipped since 2026-06-12, a codemod for every break a codemod
245
+ can repair and a reported diagnosis for the rest, no commercial support.
215
246
 
216
247
  ## Resources (machine-readable)
217
248
 
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,8 +1,8 @@
1
1
  {
2
2
  "name": "ngwr",
3
- "version": "13.0.0",
3
+ "version": "14.0.0",
4
4
  "bin": {
5
- "ngwr-mcp": "./mcp/server.js"
5
+ "ngwr-mcp": "mcp/server.js"
6
6
  },
7
7
  "license": "MIT",
8
8
  "description": "Signals-first Angular UI library: 100+ standalone, zoneless-ready components with native Signal Forms, SSR-safe rendering and CSS-variable theming.",
@@ -34,7 +34,7 @@
34
34
  "homepage": "https://ngwr.dev",
35
35
  "repository": {
36
36
  "type": "git",
37
- "url": "https://github.com/thekhegay/ngwr"
37
+ "url": "git+https://github.com/thekhegay/ngwr.git"
38
38
  },
39
39
  "bugs": {
40
40
  "url": "https://github.com/thekhegay/ngwr/issues"
@@ -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"
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ /**
10
+ * v12 to v13 migration. It REPORTS and rewrites nothing, and both halves of
11
+ * that are deliberate.
12
+ *
13
+ * v13 has exactly one breaking change that reaches consumer code: `[id]` on
14
+ * `<wr-checkbox>`, `<wr-radio>` and `<wr-switch>` no longer lands on the HOST
15
+ * element. It only ever lived there by accident — a static `id="x"` was written
16
+ * to the host as a plain attribute AS WELL as fed to the inner `<input>`, so two
17
+ * elements carried the same id, `<label for>` resolved through
18
+ * `getElementById` to the host (not a labelable element, so `input.labels` went
19
+ * from 1 to 0) and `document.getElementById(id)` returned the wrong node. The
20
+ * host binding is `[attr.id]: null` now and the id lands only where it was
21
+ * documented to.
22
+ *
23
+ * **Why this reports instead of rewriting.** The change is not a rename. What a
24
+ * consumer has to do depends on what they wrote and on what they meant by it: a
25
+ * `wr-checkbox#agree { … }` rule may want to become `#agree` (the inner input,
26
+ * which is what most of them were reaching for), or `wr-checkbox:has(#agree)`,
27
+ * or a class — and only the author knows which. Rewriting the selector to
28
+ * `#agree` moves the declarations onto an `<input>` whose box is the 16px tick,
29
+ * not the row, so a codemod confident enough to edit it would silently restyle
30
+ * the wrong element. Naming the files is the honest amount of help.
31
+ *
32
+ * **Why it exists at all**, when v10 and v11 ship nothing. Those two broke
33
+ * painted COLOUR, and an empty codemod would have told people their visual
34
+ * regressions were handled. This one has something true to say: a selector that
35
+ * stops matching is silent in every language it can be written in — CSS has no
36
+ * error for it, `querySelector` returns `null`, and a Playwright or Cypress
37
+ * locator times out somewhere unrelated. It is exactly the shape that needs a
38
+ * file list, and until now nothing produced one: `ng update ngwr@14` from a v12
39
+ * app runs `migration-v14` and never mentions v13 at all, because the semver
40
+ * range `>12.x <=14.0.0` has nothing in it between the two.
41
+ *
42
+ * **What is deliberately NOT reported.** A `<label for="x">` pointing at one of
43
+ * these components got BETTER, not worse — it used to resolve to the
44
+ * unlabelable host and now finds the real input — so there is nothing to tell
45
+ * anyone. And `<wr-checkbox-group>` / `<wr-radio-group>` keep their host `id`;
46
+ * they never had the double-write, and the `#` immediately after the tag name
47
+ * in every pattern here is what keeps `wr-checkbox-group#filters` out of the
48
+ * warning.
49
+ *
50
+ * The other thing v13 shipped — `readonly` and `invalid` reaching every control
51
+ * — is additive, and needs no entry.
52
+ */
53
+ const IGNORE_DIRS = new Set(['node_modules', 'dist', '.git', '.cache', '.angular', 'coverage', '.next', '.nuxt']);
54
+ /**
55
+ * An id selector anchored to one of the three tags, in a stylesheet, a
56
+ * `querySelector` string or a test locator alike — the substring is the same in
57
+ * all of them.
58
+ *
59
+ * The `#` is doing the anchoring work a negative lookahead does elsewhere in
60
+ * these migrations: `wr-checkbox-group#filters` cannot match `wr-checkbox#`,
61
+ * because the character after `wr-checkbox` is a hyphen. That is worth stating
62
+ * rather than relying on, since the group DOES keep its host id and reporting
63
+ * it would be a false alarm on working code.
64
+ */
65
+ const HOST_ID_SELECTOR = /\bwr-(?:checkbox|radio|switch)#[\w-]+/g;
66
+ function ngUpdateV13() {
67
+ return (tree, context) => {
68
+ const hits = [];
69
+ visit(tree, '/', filePath => {
70
+ const lower = filePath.toLowerCase();
71
+ if (!/\.(ts|html|scss|css)$/.test(lower))
72
+ return;
73
+ const found = [...new Set(tree.readText(filePath).match(HOST_ID_SELECTOR) ?? [])];
74
+ if (found.length > 0)
75
+ hits.push({ file: filePath, selectors: found });
76
+ });
77
+ if (hits.length === 0) {
78
+ context.logger.info('ngwr v13 migration: nothing to do — no host-id selector on a checkbox, radio or switch.');
79
+ return tree;
80
+ }
81
+ context.logger.warn(`ngwr v13: a host-id selector found in ${hits.length} file(s). \`[id]\` on <wr-checkbox>, <wr-radio> and ` +
82
+ '<wr-switch> no longer lands on the host element — it goes to the inner <input>, which is where the input ' +
83
+ 'was always documented to put it. Nothing throws: the selector simply stops matching, and CSS has no error ' +
84
+ 'for that. Point it at the inner input (`#agree`), at the host by another hook (`wr-checkbox:has(#agree)`, ' +
85
+ 'or a class), depending on which box you meant to style — the row or the 16px tick.');
86
+ for (const { file, selectors } of hits)
87
+ context.logger.warn(` ${file} — ${selectors.join(', ')}`);
88
+ return tree;
89
+ };
90
+ }
91
+ function visit(tree, path, visitor) {
92
+ const dir = tree.getDir(path);
93
+ for (const file of dir.subfiles)
94
+ visitor(`${path === '/' ? '' : path}/${file}`);
95
+ for (const sub of dir.subdirs) {
96
+ if (IGNORE_DIRS.has(sub))
97
+ continue;
98
+ visit(tree, `${path === '/' ? '' : path}/${sub}`, visitor);
99
+ }
100
+ }
101
+ exports.default = ngUpdateV13;