ngwr 9.1.0 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +23 -8
  2. package/action-sheet/styles/_index.scss +6 -1
  3. package/badge/styles/_index.scss +17 -7
  4. package/badge/styles/_tag.scss +12 -3
  5. package/border-glow/styles/_index.scss +5 -0
  6. package/button/styles/_index.scss +48 -1
  7. package/calendar/styles/_index.scss +9 -1
  8. package/circular-text/styles/_index.scss +6 -1
  9. package/density/styles/_index.scss +3 -1
  10. package/dialog/styles/_index.scss +66 -2
  11. package/drag-drop/styles/_index.scss +20 -7
  12. package/drawer/styles/_index.scss +61 -1
  13. package/event-calendar/styles/_index.scss +284 -0
  14. package/falling-text/styles/_index.scss +5 -0
  15. package/fesm2022/ngwr-action-sheet.mjs +1 -1
  16. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  17. package/fesm2022/ngwr-alert.mjs +8 -3
  18. package/fesm2022/ngwr-alert.mjs.map +1 -1
  19. package/fesm2022/ngwr-back-top.mjs +6 -4
  20. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  21. package/fesm2022/ngwr-border-glow.mjs +12 -9
  22. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  23. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  24. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  25. package/fesm2022/ngwr-calendar.mjs +5 -3
  26. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  27. package/fesm2022/ngwr-card.mjs +2 -2
  28. package/fesm2022/ngwr-card.mjs.map +1 -1
  29. package/fesm2022/ngwr-carousel.mjs +17 -4
  30. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  31. package/fesm2022/ngwr-cascader.mjs +35 -7
  32. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  33. package/fesm2022/ngwr-checkbox.mjs +12 -3
  34. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  35. package/fesm2022/ngwr-circular-text.mjs +2 -2
  36. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  37. package/fesm2022/ngwr-color-picker.mjs +6 -5
  38. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  39. package/fesm2022/ngwr-command-palette.mjs +7 -3
  40. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  41. package/fesm2022/ngwr-context-menu.mjs +7 -7
  42. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  43. package/fesm2022/ngwr-counter.mjs +9 -1
  44. package/fesm2022/ngwr-counter.mjs.map +1 -1
  45. package/fesm2022/ngwr-date-picker.mjs +37 -15
  46. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  47. package/fesm2022/ngwr-density.mjs +10 -2
  48. package/fesm2022/ngwr-density.mjs.map +1 -1
  49. package/fesm2022/ngwr-descriptions.mjs +5 -4
  50. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  51. package/fesm2022/ngwr-dialog.mjs +10 -1
  52. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  53. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  54. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  55. package/fesm2022/ngwr-drawer.mjs +37 -16
  56. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  57. package/fesm2022/ngwr-dropdown.mjs +8 -3
  58. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  59. package/fesm2022/ngwr-event-calendar.mjs +723 -0
  60. package/fesm2022/ngwr-event-calendar.mjs.map +1 -0
  61. package/fesm2022/ngwr-falling-text.mjs +2 -2
  62. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  63. package/fesm2022/ngwr-file-upload.mjs +2 -2
  64. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  65. package/fesm2022/ngwr-form.mjs +258 -42
  66. package/fesm2022/ngwr-form.mjs.map +1 -1
  67. package/fesm2022/ngwr-fuzzy-text.mjs +15 -1
  68. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  69. package/fesm2022/ngwr-gauge.mjs +8 -3
  70. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  71. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  72. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  73. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  74. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  75. package/fesm2022/ngwr-i18n-en.mjs +89 -5
  76. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  77. package/fesm2022/ngwr-i18n-ru.mjs +90 -5
  78. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  79. package/fesm2022/ngwr-i18n.mjs +94 -3
  80. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  81. package/fesm2022/ngwr-icon.mjs +79 -35
  82. package/fesm2022/ngwr-icon.mjs.map +1 -1
  83. package/fesm2022/ngwr-input-number.mjs +19 -3
  84. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  85. package/fesm2022/ngwr-input.mjs +48 -6
  86. package/fesm2022/ngwr-input.mjs.map +1 -1
  87. package/fesm2022/ngwr-knob.mjs +8 -3
  88. package/fesm2022/ngwr-knob.mjs.map +1 -1
  89. package/fesm2022/ngwr-lightbox.mjs +32 -3
  90. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  91. package/fesm2022/ngwr-line-chart.mjs +3 -3
  92. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  93. package/fesm2022/ngwr-list.mjs +2 -2
  94. package/fesm2022/ngwr-list.mjs.map +1 -1
  95. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  96. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  97. package/fesm2022/ngwr-marquee.mjs +2 -2
  98. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  99. package/fesm2022/ngwr-media.mjs +3 -0
  100. package/fesm2022/ngwr-media.mjs.map +1 -1
  101. package/fesm2022/ngwr-mention.mjs +166 -10
  102. package/fesm2022/ngwr-mention.mjs.map +1 -1
  103. package/fesm2022/ngwr-meter-group.mjs +14 -3
  104. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  105. package/fesm2022/ngwr-overlay.mjs +173 -3
  106. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  107. package/fesm2022/ngwr-page-header.mjs +2 -2
  108. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  109. package/fesm2022/ngwr-pagination.mjs +17 -4
  110. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  111. package/fesm2022/ngwr-popconfirm.mjs +4 -3
  112. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  113. package/fesm2022/ngwr-popover.mjs +10 -3
  114. package/fesm2022/ngwr-popover.mjs.map +1 -1
  115. package/fesm2022/ngwr-progress.mjs +8 -2
  116. package/fesm2022/ngwr-progress.mjs.map +1 -1
  117. package/fesm2022/ngwr-qr.mjs.map +1 -1
  118. package/fesm2022/ngwr-rating.mjs +6 -4
  119. package/fesm2022/ngwr-rating.mjs.map +1 -1
  120. package/fesm2022/ngwr-result.mjs +19 -12
  121. package/fesm2022/ngwr-result.mjs.map +1 -1
  122. package/fesm2022/ngwr-segmented.mjs +2 -2
  123. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  124. package/fesm2022/ngwr-select.mjs +40 -13
  125. package/fesm2022/ngwr-select.mjs.map +1 -1
  126. package/fesm2022/ngwr-shiny-text.mjs +4 -6
  127. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  128. package/fesm2022/ngwr-speed-dial.mjs +11 -3
  129. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  130. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  131. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  132. package/fesm2022/ngwr-squircle.mjs +1 -1
  133. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  134. package/fesm2022/ngwr-star-border.mjs +2 -2
  135. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  136. package/fesm2022/ngwr-switch.mjs +10 -3
  137. package/fesm2022/ngwr-switch.mjs.map +1 -1
  138. package/fesm2022/ngwr-table.mjs +233 -19
  139. package/fesm2022/ngwr-table.mjs.map +1 -1
  140. package/fesm2022/ngwr-tabs.mjs +21 -4
  141. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  142. package/fesm2022/ngwr-textarea.mjs +20 -4
  143. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  144. package/fesm2022/ngwr-theme.mjs +13 -3
  145. package/fesm2022/ngwr-theme.mjs.map +1 -1
  146. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  147. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  148. package/fesm2022/ngwr-toolbar.mjs +2 -2
  149. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  150. package/fesm2022/ngwr-tour.mjs +264 -0
  151. package/fesm2022/ngwr-tour.mjs.map +1 -0
  152. package/fesm2022/ngwr-transfer.mjs +184 -0
  153. package/fesm2022/ngwr-transfer.mjs.map +1 -0
  154. package/fesm2022/ngwr-tree.mjs +27 -9
  155. package/fesm2022/ngwr-tree.mjs.map +1 -1
  156. package/fesm2022/ngwr-typewriter.mjs +2 -2
  157. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  158. package/fesm2022/ngwr-validators.mjs +118 -2
  159. package/fesm2022/ngwr-validators.mjs.map +1 -1
  160. package/fesm2022/ngwr-version.mjs +2 -2
  161. package/fesm2022/ngwr-version.mjs.map +1 -1
  162. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  163. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  164. package/fesm2022/ngwr-waves.mjs +25 -3
  165. package/fesm2022/ngwr-waves.mjs.map +1 -1
  166. package/form/styles/_index.scss +8 -4
  167. package/glitch-text/styles/_index.scss +5 -0
  168. package/gradient-text/styles/_index.scss +5 -0
  169. package/i18n/en.json +233 -0
  170. package/i18n/ru.json +233 -0
  171. package/icon/styles/_index.scss +15 -1
  172. package/input/styles/_index.scss +16 -0
  173. package/input-number/styles/_index.scss +8 -1
  174. package/keyboard/styles/_index.scss +15 -3
  175. package/llms-full.txt +124 -63
  176. package/llms.txt +29 -8
  177. package/loading-bar/styles/_index.scss +5 -0
  178. package/marquee/styles/_index.scss +7 -2
  179. package/mention/styles/_index.scss +23 -0
  180. package/overlay/styles/_index.scss +5 -0
  181. package/package.json +15 -1
  182. package/pagination/styles/_index.scss +12 -0
  183. package/popover/styles/_index.scss +165 -45
  184. package/pull-to-refresh/styles/_index.scss +5 -0
  185. package/result/styles/_index.scss +3 -3
  186. package/schematics/icon-set/index.js +80 -34
  187. package/schematics/icon-set/schema.json +8 -3
  188. package/schematics/ng-add/index.js +23 -6
  189. package/schematics/package.json +3 -0
  190. package/schematics/page/templates.js +17 -21
  191. package/schematics/provider/index.js +31 -13
  192. package/schematics/provider/schema.json +40 -24
  193. package/schematics/use/index.js +5 -1
  194. package/schematics/use/schema.json +8 -3
  195. package/schematics/use/symbol-map.json +7 -176
  196. package/segmented/styles/_index.scss +1 -1
  197. package/select/styles/_index.scss +20 -3
  198. package/shiny-text/styles/_index.scss +5 -0
  199. package/speed-dial/styles/_index.scss +12 -1
  200. package/splitter/styles/_index.scss +7 -1
  201. package/spotlight-card/styles/_index.scss +5 -0
  202. package/squircle/styles/_index.scss +5 -0
  203. package/star-border/styles/_index.scss +5 -0
  204. package/statistic/styles/_index.scss +2 -2
  205. package/styles/_animations.scss +6 -0
  206. package/styles.scss +3 -0
  207. package/table/styles/_index.scss +128 -12
  208. package/theme/styles/_box-model.scss +29 -0
  209. package/theme/styles/_colors.scss +116 -15
  210. package/theme/styles/_dark.scss +65 -7
  211. package/theme/styles/_focus.scss +2 -8
  212. package/theme/styles/_index.scss +1 -0
  213. package/tilt-card/styles/_index.scss +5 -0
  214. package/toast/styles/_index.scss +6 -3
  215. package/tour/styles/_index.scss +63 -0
  216. package/transfer/styles/_index.scss +105 -0
  217. package/types/ngwr-alert.d.ts +4 -1
  218. package/types/ngwr-avatar.d.ts +1 -1
  219. package/types/ngwr-back-top.d.ts +3 -2
  220. package/types/ngwr-badge.d.ts +1 -1
  221. package/types/ngwr-border-glow.d.ts +0 -1
  222. package/types/ngwr-carousel.d.ts +10 -1
  223. package/types/ngwr-cascader.d.ts +13 -1
  224. package/types/ngwr-checkbox.d.ts +9 -1
  225. package/types/ngwr-color-picker.d.ts +1 -0
  226. package/types/ngwr-command-palette.d.ts +4 -1
  227. package/types/ngwr-context-menu.d.ts +1 -0
  228. package/types/ngwr-date-picker.d.ts +14 -4
  229. package/types/ngwr-density.d.ts +9 -2
  230. package/types/ngwr-dialog.d.ts +9 -0
  231. package/types/ngwr-divider.d.ts +1 -1
  232. package/types/ngwr-drawer.d.ts +20 -4
  233. package/types/ngwr-dropdown.d.ts +1 -0
  234. package/types/ngwr-event-calendar.d.ts +358 -0
  235. package/types/ngwr-form.d.ts +177 -20
  236. package/types/ngwr-fuzzy-text.d.ts +8 -0
  237. package/types/ngwr-gauge.d.ts +4 -1
  238. package/types/ngwr-i18n.d.ts +80 -2
  239. package/types/ngwr-icon.d.ts +11 -19
  240. package/types/ngwr-input-number.d.ts +8 -1
  241. package/types/ngwr-input.d.ts +50 -20
  242. package/types/ngwr-knob.d.ts +4 -1
  243. package/types/ngwr-lightbox.d.ts +7 -1
  244. package/types/ngwr-line-chart.d.ts +1 -1
  245. package/types/ngwr-media.d.ts +1 -1
  246. package/types/ngwr-mention.d.ts +45 -1
  247. package/types/ngwr-meter-group.d.ts +9 -1
  248. package/types/ngwr-overlay.d.ts +80 -2
  249. package/types/ngwr-page-header.d.ts +2 -2
  250. package/types/ngwr-pagination.d.ts +15 -2
  251. package/types/ngwr-popconfirm.d.ts +1 -0
  252. package/types/ngwr-popover.d.ts +1 -0
  253. package/types/ngwr-progress.d.ts +4 -1
  254. package/types/ngwr-rating.d.ts +3 -2
  255. package/types/ngwr-result.d.ts +12 -6
  256. package/types/ngwr-segmented.d.ts +6 -0
  257. package/types/ngwr-select.d.ts +19 -7
  258. package/types/ngwr-shiny-text.d.ts +2 -4
  259. package/types/ngwr-speed-dial.d.ts +7 -1
  260. package/types/ngwr-squircle.d.ts +1 -1
  261. package/types/ngwr-switch.d.ts +7 -1
  262. package/types/ngwr-table.d.ts +126 -6
  263. package/types/ngwr-tabs.d.ts +1 -4
  264. package/types/ngwr-textarea.d.ts +8 -1
  265. package/types/ngwr-theme.d.ts +8 -1
  266. package/types/ngwr-toolbar.d.ts +2 -2
  267. package/types/ngwr-tour.d.ts +132 -0
  268. package/types/ngwr-transfer.d.ts +118 -0
  269. package/types/ngwr-tree.d.ts +11 -2
  270. package/types/ngwr-validators.d.ts +62 -2
  271. package/types/ngwr-version.d.ts +2 -2
  272. package/types/ngwr-waves.d.ts +10 -0
  273. package/typewriter/styles/_index.scss +5 -0
  274. package/typography/styles/_index.scss +3 -3
  275. package/virtual-scroll/styles/_index.scss +6 -1
  276. package/waves/styles/_index.scss +26 -0
@@ -1,3 +1,4 @@
1
+ import * as ngwr_i18n from 'ngwr/i18n';
1
2
  import * as _angular_core from '@angular/core';
2
3
 
3
4
  /**
@@ -91,11 +92,23 @@ declare class WrPagination {
91
92
  readonly nextLabel: _angular_core.InputSignal<string | null>;
92
93
  /** "Items per page" label. Falls back to `pagination.itemsPerPage`. */
93
94
  readonly itemsPerPageLabel: _angular_core.InputSignal<string | null>;
95
+ /** Accessible name for the `role="navigation"` host. Falls back to `pagination.label`. */
96
+ readonly label: _angular_core.InputSignal<string | null>;
94
97
  /** Resolved labels. */
95
98
  protected readonly resolvedOf: _angular_core.Signal<string>;
96
99
  protected readonly resolvedPrev: _angular_core.Signal<string>;
97
100
  protected readonly resolvedNext: _angular_core.Signal<string>;
98
101
  protected readonly resolvedItemsPerPage: _angular_core.Signal<string>;
102
+ /**
103
+ * Page-size option text — interpolates `{{size}}`. Was the template literal
104
+ * `{{ option }} / page`, which no catalog could reach, so a Russian UI read
105
+ * "25 / page".
106
+ */
107
+ protected readonly perPage: (params?: ngwr_i18n.WrI18nParams) => string;
108
+ /** Per-page-button aria-label — interpolates `{{page}}`. */
109
+ protected readonly goToPage: (params?: ngwr_i18n.WrI18nParams) => string;
110
+ /** The nav landmark's own accessible name — was a hardcoded English literal. */
111
+ protected readonly navLabel: _angular_core.Signal<string>;
99
112
  /** Internal: total page count. */
100
113
  protected readonly totalPages: _angular_core.Signal<number>;
101
114
  /** Internal: "X–Y of Z" string. */
@@ -112,8 +125,8 @@ declare class WrPagination {
112
125
  protected goTo(page: number | typeof ELLIPSIS): void;
113
126
  protected onSizeChange(size: number): void;
114
127
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrPagination, never>;
115
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrPagination, "wr-pagination", never, { "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "showSizeChanger": { "alias": "showSizeChanger"; "required": false; "isSignal": true; }; "showTotal": { "alias": "showTotal"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "itemsPerPageLabel": { "alias": "itemsPerPageLabel"; "required": false; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "pageSize": "pageSizeChange"; }, never, never, true, never>;
128
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrPagination, "wr-pagination", never, { "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "showSizeChanger": { "alias": "showSizeChanger"; "required": false; "isSignal": true; }; "showTotal": { "alias": "showTotal"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "itemsPerPageLabel": { "alias": "itemsPerPageLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "pageSize": "pageSizeChange"; }, never, never, true, never>;
116
129
  }
117
130
 
118
131
  export { WrPagination };
119
- export type { WrPaginationAlign };
132
+ export type { WrPaginationAlign, WrPaginationShape, WrPaginationSize };
@@ -43,6 +43,7 @@ declare class WrPopconfirm {
43
43
  readonly cancelled: _angular_core.OutputEmitterRef<void>;
44
44
  private readonly host;
45
45
  private readonly overlay;
46
+ private readonly outsideClick;
46
47
  private readonly vcr;
47
48
  private readonly scrollStrategies;
48
49
  private readonly destroyRef;
@@ -51,6 +51,7 @@ declare class WrPopover {
51
51
  readonly closed: _angular_core.OutputEmitterRef<void>;
52
52
  private readonly host;
53
53
  private readonly overlay;
54
+ private readonly outsideClick;
54
55
  private readonly responsiveConfig;
55
56
  private readonly vcr;
56
57
  private readonly scrollStrategies;
@@ -12,6 +12,9 @@ import * as _angular_core from '@angular/core';
12
12
  * @see https://ngwr.dev/reference/components/progress
13
13
  */
14
14
  declare class WrProgress {
15
+ /** Accessible name — `role="progressbar"` needs one. Falls back to `progress.label`. */
16
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
17
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
15
18
  /**
16
19
  * Bar color.
17
20
  *
@@ -27,7 +30,7 @@ declare class WrProgress {
27
30
  protected readonly clamped: _angular_core.Signal<number>;
28
31
  protected readonly classes: _angular_core.Signal<string>;
29
32
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrProgress, never>;
30
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrProgress, "wr-progress", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrProgress, "wr-progress", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
31
34
  }
32
35
 
33
36
  export { WrProgress };
@@ -42,8 +42,9 @@ declare class WrRating implements FormValueControl<number | null> {
42
42
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
43
43
  /** Control size — scales the icons + gaps. @default 'md' */
44
44
  readonly size: _angular_core.InputSignal<WrRatingSize>;
45
- /** Accessible label. @default 'Rating' */
46
- readonly ariaLabel: _angular_core.InputSignal<string>;
45
+ /** Accessible label. Falls back to `rating.label`, then `'Rating'`. */
46
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
47
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
47
48
  /** The rating. Bound by `[formField]`, or two-way via `[(value)]`. */
48
49
  readonly value: _angular_core.ModelSignal<number | null>;
49
50
  /** Emitted on blur so a bound field can mark itself touched. */
@@ -10,11 +10,11 @@ type WrResultStatus = 'success' | 'warning' | 'error' | 'info' | 'empty';
10
10
  * @example
11
11
  * ```html
12
12
  * <wr-result status="success" title="Submitted!" description="We'll be in touch.">
13
- * <button wrButton color="primary" wrResultExtra>Continue</button>
13
+ * <button wr-btn color="primary" wrResultExtra>Continue</button>
14
14
  * </wr-result>
15
15
  *
16
16
  * <wr-result status="empty" title="No projects yet">
17
- * <button wrButton wrResultExtra>Create one</button>
17
+ * <button wr-btn wrResultExtra>Create one</button>
18
18
  * </wr-result>
19
19
  * ```
20
20
  *
@@ -35,27 +35,33 @@ declare class WrResult {
35
35
  * @example
36
36
  * ```html
37
37
  * <wr-result-404>
38
- * <button wrButton wrResultExtra>Back home</button>
38
+ * <button wr-btn wrResultExtra>Back home</button>
39
39
  * </wr-result-404>
40
40
  * ```
41
41
  */
42
42
  declare class WrResult404 {
43
43
  readonly title: _angular_core.InputSignal<string>;
44
- readonly description: _angular_core.InputSignal<string>;
44
+ /** Body text. Falls back to `result.notFound` from WrI18n. */
45
+ readonly description: _angular_core.InputSignal<string | null>;
46
+ protected readonly desc: _angular_core.Signal<string>;
45
47
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrResult404, never>;
46
48
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrResult404, "wr-result-404", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
47
49
  }
48
50
  /** Pre-set 403 result — forbidden / no access. */
49
51
  declare class WrResult403 {
50
52
  readonly title: _angular_core.InputSignal<string>;
51
- readonly description: _angular_core.InputSignal<string>;
53
+ /** Body text. Falls back to `result.forbidden` from WrI18n. */
54
+ readonly description: _angular_core.InputSignal<string | null>;
55
+ protected readonly desc: _angular_core.Signal<string>;
52
56
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrResult403, never>;
53
57
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrResult403, "wr-result-403", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
54
58
  }
55
59
  /** Pre-set 500 result — internal server error. */
56
60
  declare class WrResult500 {
57
61
  readonly title: _angular_core.InputSignal<string>;
58
- readonly description: _angular_core.InputSignal<string>;
62
+ /** Body text. Falls back to `result.serverError` from WrI18n. */
63
+ readonly description: _angular_core.InputSignal<string | null>;
64
+ protected readonly desc: _angular_core.Signal<string>;
59
65
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrResult500, never>;
60
66
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrResult500, "wr-result-500", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
61
67
  }
@@ -18,6 +18,12 @@ interface WrSegmentedOption<T = unknown> {
18
18
  readonly value: T;
19
19
  readonly label?: string;
20
20
  readonly icon?: WrIconName;
21
+ /**
22
+ * Accessible name for an icon-only option. Without a `label` the button has
23
+ * no text at all, so assistive tech announced nothing; when this is omitted
24
+ * the option's `value` is used as a last resort.
25
+ */
26
+ readonly ariaLabel?: string;
21
27
  readonly disabled?: boolean;
22
28
  }
23
29
 
@@ -21,8 +21,8 @@ import { Observable } from 'rxjs';
21
21
  * - `'multi'` — array value, chips on the trigger, options toggle on click.
22
22
  * - `'search'` — type-ahead with sync filter or async loader (replaces
23
23
  * the standalone `<wr-autocomplete>`).
24
- * - `'tag'` — free-text + chips, with optional `allowCreate` /
25
- * `createValidator` for typed lists (replaces `<wr-chips-input>`).
24
+ * - `'tag'` — free-text + chips, with `separators` / `validate` /
25
+ * `allowDuplicates` (replaces `<wr-chips-input>`).
26
26
  */
27
27
  type WrSelectMode = 'single' | 'multi' | 'search' | 'tag';
28
28
  /**
@@ -166,8 +166,6 @@ interface SelectedChip {
166
166
  * />
167
167
  * ```
168
168
  *
169
- * The legacy `[multi]="true"` boolean is still accepted but is now an
170
- * alias for `[mode]="'multi'"` — prefer the explicit mode.
171
169
  *
172
170
  * @see https://ngwr.dev/reference/components/select
173
171
  */
@@ -178,6 +176,14 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
178
176
  readonly clearLabel: _angular_core.InputSignal<string | null>;
179
177
  protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
180
178
  protected readonly resolvedClear: _angular_core.Signal<string>;
179
+ /**
180
+ * Accessible name of the trigger. Falls back to the placeholder, then to
181
+ * `select.label` — `role="combobox"` on an empty trigger otherwise has no name
182
+ * at all, which is the common case before anything is selected.
183
+ */
184
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
185
+ private readonly labelText;
186
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
181
187
  /** Per-chip ARIA label — interpolates `{{label}}`. @internal */
182
188
  protected readonly chipRemoveLabel: (params?: ngwr_i18n.WrI18nParams) => string;
183
189
  /**
@@ -204,8 +210,8 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
204
210
  *
205
211
  * - `'single'` (default) — one value, no input. Classic dropdown.
206
212
  * - `'multi'` — array value, chips on the trigger.
207
- * - `'search'` *(planned)* — type-ahead with sync filter or async loader.
208
- * - `'tag'` *(planned)* — free-text + chips with optional `allowCreate`.
213
+ * - `'search'` — type-ahead with sync filter or async loader.
214
+ * - `'tag'` — free-text + chips.
209
215
  *
210
216
  */
211
217
  readonly mode: _angular_core.InputSignal<WrSelectMode | null>;
@@ -499,6 +505,7 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
499
505
  protected readonly searchDisplay: _angular_core.Signal<string>;
500
506
  private readonly host;
501
507
  private readonly overlay;
508
+ private readonly outsideClick;
502
509
  private readonly responsiveConfig;
503
510
  private readonly vcr;
504
511
  private readonly scrollStrategies;
@@ -532,7 +539,7 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
532
539
  private openOverlay;
533
540
  private closeOverlay;
534
541
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSelect, never>;
535
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSelect, "wr-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchQuery": { "alias": "searchQuery"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "loader": { "alias": "loader"; "required": false; "isSignal": true; }; "serverSearch": { "alias": "serverSearch"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "freeText": { "alias": "freeText"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "searchQuery": "searchQueryChange"; "searchChange": "searchChange"; "value": "valueChange"; "touch": "touch"; }, ["projectedOptions"], ["*"], true, never>;
542
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSelect, "wr-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchQuery": { "alias": "searchQuery"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "loader": { "alias": "loader"; "required": false; "isSignal": true; }; "serverSearch": { "alias": "serverSearch"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "freeText": { "alias": "freeText"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "searchQuery": "searchQueryChange"; "searchChange": "searchChange"; "value": "valueChange"; "touch": "touch"; }, ["projectedOptions"], ["*"], true, never>;
536
543
  }
537
544
 
538
545
  /**
@@ -591,6 +598,11 @@ declare class WrOption {
591
598
  declare class WrOptionGroup {
592
599
  /** Section heading shown above the options. */
593
600
  readonly label: _angular_core.InputSignal<string>;
601
+ /**
602
+ * `role="group"` alone announces an unnamed group — the visible heading has to
603
+ * be wired to it for the name to reach a screen reader.
604
+ */
605
+ protected readonly labelId: string;
594
606
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrOptionGroup, never>;
595
607
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrOptionGroup, "wr-option-group", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
596
608
  }
@@ -27,11 +27,9 @@ declare class WrShinyText {
27
27
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
28
28
  /** Time for the bright stripe to traverse the text, in seconds. @default 2 */
29
29
  readonly speed: _angular_core.InputSignalWithTransform<number, unknown>;
30
- /** Base text colour (outside the bright stripe). @default '#b5b5b5' */
31
- /** Base text colour. When unset, the theme decides. */
30
+ /** Base text colour outside the bright stripe. Unset falls back to `--wr-shiny-text-base`. */
32
31
  readonly color: _angular_core.InputSignal<string | null>;
33
- /** Bright stripe colour. @default '#ffffff' */
34
- /** Sweep highlight colour. When unset, the theme decides. */
32
+ /** Sweep highlight colour. Unset falls back to the theme token. */
35
33
  readonly shineColor: _angular_core.InputSignal<string | null>;
36
34
  /** Gradient angle in degrees. @default 120 */
37
35
  readonly spread: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -30,6 +30,12 @@ type WrSpeedDialDirection = 'up' | 'down' | 'left' | 'right';
30
30
  */
31
31
  declare class WrSpeedDial {
32
32
  readonly actions: _angular_core.InputSignal<readonly WrSpeedDialAction[]>;
33
+ /**
34
+ * Accessible name of the trigger. Falls back to `speedDial.label`, then
35
+ * `'Actions'` — the trigger is icon-only, so without this it has no name at all.
36
+ */
37
+ readonly triggerLabel: _angular_core.InputSignal<string | null>;
38
+ protected readonly resolvedTriggerLabel: _angular_core.Signal<string>;
33
39
  /** Direction the actions fan out. @default 'up' */
34
40
  readonly direction: _angular_core.InputSignal<WrSpeedDialDirection>;
35
41
  /** Two-way bindable open state. @default false */
@@ -50,7 +56,7 @@ declare class WrSpeedDial {
50
56
  protected onTrigger(): void;
51
57
  protected onPick(action: WrSpeedDialAction): void;
52
58
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSpeedDial, never>;
53
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSpeedDial, "wr-speed-dial", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "safeArea": { "alias": "safeArea"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pick": "pick"; }, never, never, true, never>;
59
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSpeedDial, "wr-speed-dial", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "safeArea": { "alias": "safeArea"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pick": "pick"; }, never, never, true, never>;
54
60
  }
55
61
 
56
62
  export { WrSpeedDial };
@@ -49,7 +49,7 @@ type WrSquircleCornerMask = 'all' | 'left' | 'right' | 'top' | 'bottom' | 'none'
49
49
  *
50
50
  * @example
51
51
  * ```html
52
- * <button wrButton wrSquircle [radius]="16">Save</button>
52
+ * <button wr-btn wrSquircle [radius]="16">Save</button>
53
53
  * <wr-tag wrSquircle>v2.0</wr-tag>
54
54
  * <div wrSquircle [radius]="32" [smoothing]="0.8">…</div>
55
55
  * <div wrSquircle [borderWidth]="2" borderColor="var(--wr-color-primary)">…</div>
@@ -21,6 +21,12 @@ import { FormCheckboxControl } from '@angular/forms/signals';
21
21
  */
22
22
  type WrSwitchSize = 'sm' | 'md' | 'lg';
23
23
  declare class WrSwitch implements FormCheckboxControl {
24
+ /**
25
+ * Accessible name for a switch used WITHOUT projected text. The wrapping
26
+ * `<label>` names the control whenever content is projected; with none, the
27
+ * label is empty and the input has no name at all.
28
+ */
29
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
24
30
  /** Stable id used to associate the native input with its label. */
25
31
  readonly id: _angular_core.InputSignal<string>;
26
32
  /**
@@ -40,7 +46,7 @@ declare class WrSwitch implements FormCheckboxControl {
40
46
  protected onInputChange(event: Event): void;
41
47
  protected onInputBlur(): void;
42
48
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSwitch, never>;
43
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSwitch, "wr-switch", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touch": "touch"; }, never, ["*"], true, never>;
49
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSwitch, "wr-switch", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touch": "touch"; }, never, ["*"], true, never>;
44
50
  }
45
51
 
46
52
  export { WrSwitch };
@@ -207,6 +207,16 @@ type RenderRow = {
207
207
  readonly kind: 'row';
208
208
  readonly id: string;
209
209
  readonly row: Record<string, unknown>;
210
+ /** 0 for a flat table and for every root; +1 per level in tree mode. */
211
+ readonly depth: number;
212
+ /** Whether this row owns a child array — drives the toggle vs the spacer. */
213
+ readonly parent: boolean;
214
+ /** Open state, `null` for a leaf (so `aria-expanded` is omitted entirely). */
215
+ readonly open: boolean | null;
216
+ /** 1-based position among its siblings, for `aria-posinset`. */
217
+ readonly posinset: number;
218
+ /** Sibling count, for `aria-setsize`. */
219
+ readonly setsize: number;
210
220
  } | {
211
221
  readonly kind: 'group-foot';
212
222
  readonly id: string;
@@ -238,7 +248,7 @@ type RenderRow = {
238
248
  declare class WrTable {
239
249
  /** Column definitions, keyed by row property name. */
240
250
  readonly columns: _angular_core.InputSignal<WrTableColumns>;
241
- /** Row items. `null`/`undefined` → loading skeleton. */
251
+ /** Row items. `null`/`undefined` renders the empty state; use `[loading]` for the spinner. */
242
252
  readonly items: _angular_core.InputSignal<readonly Record<string, unknown>[] | null | undefined>;
243
253
  /** Show the loading spinner overlay. @default false */
244
254
  readonly loading: _angular_core.InputSignalWithTransform<boolean, any>;
@@ -287,6 +297,44 @@ declare class WrTable {
287
297
  * @default null
288
298
  */
289
299
  readonly groupBy: _angular_core.InputSignal<string | ((row: Record<string, unknown>) => unknown) | null>;
300
+ /**
301
+ * Render the rows as a hierarchy: names the property (or computes the array)
302
+ * holding each row's children. `items` then means the ROOTS, and the forest is
303
+ * flattened depth-first into the same `<tbody>` — child rows are ordinary
304
+ * `<tr>`s going through the same cell loop, so column pin / resize /
305
+ * drag-reorder and `[wrTableCell]` templates keep working at every depth.
306
+ *
307
+ * Open state reuses the `expanded` model and row identity reuses `rowKey`, so
308
+ * a tree needs no second key space. Everything collapsed is the default.
309
+ *
310
+ * **Mutually exclusive with `groupBy`** — a forest has no flat list to bucket,
311
+ * so grouping wins and the hierarchy is ignored while it is set. Also
312
+ * mutually exclusive with `[wrTableExpand]` detail rows: both own the row's
313
+ * disclosure affordance.
314
+ *
315
+ * `pageSize` pages the ROOTS; a root brings its open descendants with it.
316
+ *
317
+ * @example
318
+ * ```html
319
+ * <wr-table
320
+ * rowKey="id"
321
+ * childrenKey="reports"
322
+ * treeColumn="name"
323
+ * [columns]="columns"
324
+ * [items]="org"
325
+ * [(expanded)]="open"
326
+ * />
327
+ * ```
328
+ */
329
+ readonly childrenKey: _angular_core.InputSignal<string | ((row: Record<string, unknown>) => readonly Record<string, unknown>[] | null | undefined) | null>;
330
+ /**
331
+ * Which column carries the indent and the expand toggle. Keyed, not
332
+ * positional, so it survives a `columnOrder` drag. Defaults to whichever
333
+ * column renders first.
334
+ */
335
+ readonly treeColumn: _angular_core.InputSignal<string | null>;
336
+ /** Accessible name of a parent row's expand toggle. Falls back to `table.toggleRow`. */
337
+ readonly toggleRowLabel: _angular_core.InputSignal<string | null>;
290
338
  /**
291
339
  * Two-way bindable collapsed group values (the values `groupBy` returns).
292
340
  * Keyed by value, so a collapsed group stays collapsed across page changes and
@@ -306,6 +354,28 @@ declare class WrTable {
306
354
  readonly showGroupCount: _angular_core.InputSignalWithTransform<boolean, any>;
307
355
  /** Two-way bindable sort array. Order in array = application order. */
308
356
  readonly sort: _angular_core.ModelSignal<readonly WrTableSortState[]>;
357
+ /** Text shown when there are no rows. Falls back to `table.empty`. */
358
+ readonly emptyLabel: _angular_core.InputSignal<string | null>;
359
+ /** Accessible name of a column's sort button. Falls back to `table.sort`. */
360
+ readonly sortLabel: _angular_core.InputSignal<string | null>;
361
+ /** Accessible name of the select-all checkbox. Falls back to `table.selectAll`. */
362
+ readonly selectAllLabel: _angular_core.InputSignal<string | null>;
363
+ /** Accessible name of a row's select checkbox. Falls back to `table.selectRow`. */
364
+ readonly selectRowLabel: _angular_core.InputSignal<string | null>;
365
+ /** Accessible name of a row's expand toggle. Falls back to `table.expandRow`. */
366
+ readonly expandRowLabel: _angular_core.InputSignal<string | null>;
367
+ /** Accessible name of a group band's select checkbox. Falls back to `table.selectGroup`. */
368
+ readonly selectGroupLabel: _angular_core.InputSignal<string | null>;
369
+ /** Accessible name of a group band's collapse toggle. Falls back to `table.toggleGroup`. */
370
+ readonly toggleGroupLabel: _angular_core.InputSignal<string | null>;
371
+ protected readonly resolvedEmptyLabel: _angular_core.Signal<string>;
372
+ protected readonly resolvedSortLabel: _angular_core.Signal<string>;
373
+ protected readonly resolvedSelectAllLabel: _angular_core.Signal<string>;
374
+ protected readonly resolvedSelectRowLabel: _angular_core.Signal<string>;
375
+ protected readonly resolvedExpandRowLabel: _angular_core.Signal<string>;
376
+ protected readonly resolvedToggleRowLabel: _angular_core.Signal<string>;
377
+ protected readonly resolvedSelectGroupLabel: _angular_core.Signal<string>;
378
+ protected readonly resolvedToggleGroupLabel: _angular_core.Signal<string>;
309
379
  /** Fires whenever a column's filter selection changes. */
310
380
  readonly filterChange: _angular_core.OutputEmitterRef<WrTableFilterChange>;
311
381
  /**
@@ -453,6 +523,11 @@ declare class WrTable {
453
523
  protected readonly sortPredicate: (index: number) => boolean;
454
524
  private rowKeyOf;
455
525
  /** Keys of the rows on the current page — the select-all scope. */
526
+ /**
527
+ * Scope of the header select-all: the rows currently ON SCREEN. In tree mode
528
+ * that is every VISIBLE node — a collapsed subtree is not on screen and is not
529
+ * swept in, which keeps the checkbox honest about what it just did.
530
+ */
456
531
  private readonly pageRowKeys;
457
532
  protected isRowSelected(row: Record<string, unknown>): boolean;
458
533
  /** Every current-page row selected (drives the header checkbox). */
@@ -465,7 +540,33 @@ declare class WrTable {
465
540
  protected toggleAll(checked: boolean): void;
466
541
  private readonly expandTpl;
467
542
  /** Whether the expand column shows (a `[wrTableExpand]` template was projected). */
543
+ /**
544
+ * Tree mode is on when `childrenKey` is set AND grouping is not. Grouping wins
545
+ * deliberately: `groupBy` buckets a flat list and a forest has none, so rather
546
+ * than half-support the pair the hierarchy is ignored while a group is set.
547
+ */
548
+ protected readonly treeMode: _angular_core.Signal<boolean>;
549
+ /** Detail rows and tree rows both own the row's disclosure — tree mode wins. */
468
550
  protected readonly expandable: _angular_core.Signal<boolean>;
551
+ /** The column that carries the indent + toggle — named, else whichever renders first. */
552
+ protected readonly treeColumnKey: _angular_core.Signal<string | null>;
553
+ /** This row's children, whatever shape `childrenKey` names. */
554
+ private childrenOf;
555
+ /**
556
+ * Depth-first flatten of the forest, descending only into open parents.
557
+ * `seen` is path-scoped rather than global: the same row legitimately appearing
558
+ * under two parents is fine, a row appearing under itself is a cycle and would
559
+ * otherwise hang the walk.
560
+ */
561
+ private flattenForest;
562
+ /** Every node in the forest, depth-first — what selection and CSV must see. */
563
+ private allTreeRows;
564
+ /** Open / close one parent row. */
565
+ protected toggleTreeRow(row: Record<string, unknown>): void;
566
+ /** Open every parent in the forest. */
567
+ expandAllRows(): void;
568
+ /** Close every parent. */
569
+ collapseAllRows(): void;
469
570
  /** Leading control columns — selection + expand. */
470
571
  protected readonly leadingCols: _angular_core.Signal<number>;
471
572
  /** Total rendered columns (data + leading), for detail-row / empty colspans. */
@@ -517,25 +618,38 @@ declare class WrTable {
517
618
  * Covers the current `items`, so in server-side mode (`totalItems` set) it
518
619
  * exports the current page, while client-side pagination exports every page.
519
620
  *
621
+ * Returns the string; use `exportCsv()` when you want it downloaded as a file.
622
+ *
520
623
  * @example
521
- * ```html
522
- * <wr-table #table [columns]="columns" [items]="rows" />
523
- * <wr-btn (click)="table.exportCsv({ filename: 'users.csv' })">Export</wr-btn>
624
+ * ```ts
625
+ * const csv = this.table().toCsv({ delimiter: ';' });
524
626
  * ```
525
627
  */
526
628
  toCsv(options?: WrTableCsvOptions): string;
527
629
  /** Download the table as a CSV file. No-op on the server. */
528
630
  exportCsv(options?: WrTableCsvOptions): void;
631
+ /**
632
+ * Every row of the dataset. Flat that is `items`; in tree mode it is the whole
633
+ * forest depth-first, so selection, CSV and the grand summary count children
634
+ * instead of silently reporting roots only.
635
+ */
636
+ private datasetRows;
529
637
  private selectedRows;
530
638
  private computeSummary;
531
639
  protected directionFor(key: string): WrTableSortDirection;
640
+ /**
641
+ * `aria-sort` for a column header, per the WAI-ARIA table pattern. Only a
642
+ * sortable column gets the attribute at all: on a plain column it would claim
643
+ * the header is sortable when it is not.
644
+ */
645
+ protected ariaSortFor(key: string, sortable: boolean | undefined): 'ascending' | 'descending' | 'none' | null;
532
646
  protected cycleSort(key: string): void;
533
647
  protected onFilter(key: string, items: readonly WrTableFilterItem[]): void;
534
648
  protected cellContext(item: Record<string, unknown>, key: string, column: unknown): WrTableCellContext;
535
649
  protected getValue(item: Record<string, unknown>, key: unknown): unknown;
536
650
  protected templateFor(key: unknown): TemplateRef<WrTableCellContext> | undefined;
537
651
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTable, never>;
538
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTable, "wr-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "columnOrder": { "alias": "columnOrder"; "required": false; "isSignal": true; }; "rowSelection": { "alias": "rowSelection"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "collapsedGroups": { "alias": "collapsedGroups"; "required": false; "isSignal": true; }; "groupSummary": { "alias": "groupSummary"; "required": false; "isSignal": true; }; "showGroupCount": { "alias": "showGroupCount"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; }, { "columnOrder": "columnOrderChange"; "selection": "selectionChange"; "expanded": "expandedChange"; "collapsedGroups": "collapsedGroupsChange"; "sort": "sortChange"; "filterChange": "filterChange"; "page": "pageChange"; }, ["cellTemplates", "expandTpl", "groupTpl"], never, true, never>;
652
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTable, "wr-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "columnOrder": { "alias": "columnOrder"; "required": false; "isSignal": true; }; "rowSelection": { "alias": "rowSelection"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; "treeColumn": { "alias": "treeColumn"; "required": false; "isSignal": true; }; "toggleRowLabel": { "alias": "toggleRowLabel"; "required": false; "isSignal": true; }; "collapsedGroups": { "alias": "collapsedGroups"; "required": false; "isSignal": true; }; "groupSummary": { "alias": "groupSummary"; "required": false; "isSignal": true; }; "showGroupCount": { "alias": "showGroupCount"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "sortLabel": { "alias": "sortLabel"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "selectRowLabel": { "alias": "selectRowLabel"; "required": false; "isSignal": true; }; "expandRowLabel": { "alias": "expandRowLabel"; "required": false; "isSignal": true; }; "selectGroupLabel": { "alias": "selectGroupLabel"; "required": false; "isSignal": true; }; "toggleGroupLabel": { "alias": "toggleGroupLabel"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; }, { "columnOrder": "columnOrderChange"; "selection": "selectionChange"; "expanded": "expandedChange"; "collapsedGroups": "collapsedGroupsChange"; "sort": "sortChange"; "filterChange": "filterChange"; "page": "pageChange"; }, ["cellTemplates", "expandTpl", "groupTpl"], never, true, never>;
539
653
  }
540
654
 
541
655
  /**
@@ -634,6 +748,12 @@ declare class WrTableSort {
634
748
  */
635
749
  declare class WrTableFilter {
636
750
  /** Available filter options. */
751
+ /** Accessible name of the filter trigger. Falls back to `table.filter`. */
752
+ readonly filterLabel: _angular_core.InputSignal<string | null>;
753
+ /** Text shown when the search finds nothing. Falls back to `table.noMatches`. */
754
+ readonly noMatchesLabel: _angular_core.InputSignal<string | null>;
755
+ protected readonly resolvedFilterLabel: _angular_core.Signal<string>;
756
+ protected readonly resolvedNoMatchesLabel: _angular_core.Signal<string>;
637
757
  readonly items: _angular_core.InputSignal<readonly WrTableFilterItem<unknown>[]>;
638
758
  /** Fires whenever the selection changes. */
639
759
  readonly selectionChange: _angular_core.OutputEmitterRef<readonly WrTableFilterItem<unknown>[]>;
@@ -647,7 +767,7 @@ declare class WrTableFilter {
647
767
  protected onReset(): void;
648
768
  private emitSelected;
649
769
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTableFilter, never>;
650
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTableFilter, "wr-table-filter", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
770
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTableFilter, "wr-table-filter", never, { "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "noMatchesLabel": { "alias": "noMatchesLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
651
771
  }
652
772
 
653
773
  export { WrTable, WrTableCell, WrTableExpand, WrTableFilter, WrTableGroupHeader, WrTableSort };
@@ -104,10 +104,7 @@ declare class WrTabs implements WrTabsContext {
104
104
  /** Content-mode: the tab whose key matches `active()` (or the first tab if none yet). */
105
105
  protected readonly activeTab: _angular_core.Signal<WrTab | null>;
106
106
  activate(key: string): void;
107
- register({ key }: {
108
- key: string;
109
- routerLink: unknown;
110
- }): void;
107
+ register(): void;
111
108
  unregister(): void;
112
109
  protected readonly stripRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
113
110
  /** Whether the strip is scrolled away from its start / end — drives the edge fades. */
@@ -28,6 +28,13 @@ type WrTextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
28
28
  declare class WrTextarea implements FormValueControl<string> {
29
29
  /** Native placeholder text. @default '' */
30
30
  readonly placeholder: _angular_core.InputSignal<string>;
31
+ /**
32
+ * Accessible name for the field. Falls back to the placeholder — the native
33
+ * `<textarea>` lives inside the component, so a `<label for>` outside cannot
34
+ * reach it.
35
+ */
36
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
37
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
31
38
  /** Control size — shares the `--wr-control-*` contract. @default 'md' */
32
39
  readonly size: _angular_core.InputSignal<WrTextareaSize>;
33
40
  /** Visible row count. @default 3 */
@@ -78,7 +85,7 @@ declare class WrTextarea implements FormValueControl<string> {
78
85
  protected endResize(event: PointerEvent): void;
79
86
  private autofit;
80
87
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTextarea, never>;
81
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTextarea, "wr-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autosize": { "alias": "autosize"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
88
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTextarea, "wr-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autosize": { "alias": "autosize"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
82
89
  }
83
90
 
84
91
  export { WrTextarea };
@@ -116,7 +116,14 @@ declare class WrTheme {
116
116
  */
117
117
 
118
118
  /**
119
- * Configure {@link WrTheme}. Partial — merged with defaults.
119
+ * Configure and activate {@link WrTheme}. Config is partial — merged with
120
+ * defaults.
121
+ *
122
+ * Calling this is all it takes: the initializer instantiates {@link WrTheme},
123
+ * whose constructor effect mirrors the resolved theme onto `<html>`. Without
124
+ * that, the service (a tree-shakable `@Service()`) would only be created once
125
+ * something injected it, so `[data-theme]` was never written and an app that
126
+ * followed the docs silently ignored `defaultMode: 'auto'`.
120
127
  *
121
128
  * @example
122
129
  * ```ts