ngwr 10.0.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 (233) hide show
  1. package/README.md +9 -8
  2. package/action-sheet/styles/_index.scss +6 -1
  3. package/badge/styles/_index.scss +1 -1
  4. package/badge/styles/_tag.scss +2 -2
  5. package/border-glow/styles/_index.scss +5 -0
  6. package/button/styles/_index.scss +6 -6
  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 +1 -2
  11. package/drag-drop/styles/_index.scss +20 -7
  12. package/event-calendar/styles/_index.scss +284 -0
  13. package/falling-text/styles/_index.scss +5 -0
  14. package/fesm2022/ngwr-alert.mjs +8 -3
  15. package/fesm2022/ngwr-alert.mjs.map +1 -1
  16. package/fesm2022/ngwr-back-top.mjs +6 -4
  17. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  18. package/fesm2022/ngwr-border-glow.mjs +12 -9
  19. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  20. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  21. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  22. package/fesm2022/ngwr-calendar.mjs +5 -3
  23. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  24. package/fesm2022/ngwr-card.mjs +2 -2
  25. package/fesm2022/ngwr-card.mjs.map +1 -1
  26. package/fesm2022/ngwr-carousel.mjs +17 -4
  27. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  28. package/fesm2022/ngwr-cascader.mjs +31 -4
  29. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  30. package/fesm2022/ngwr-checkbox.mjs +12 -3
  31. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  32. package/fesm2022/ngwr-circular-text.mjs +2 -2
  33. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  34. package/fesm2022/ngwr-command-palette.mjs +7 -3
  35. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  36. package/fesm2022/ngwr-counter.mjs +9 -1
  37. package/fesm2022/ngwr-counter.mjs.map +1 -1
  38. package/fesm2022/ngwr-date-picker.mjs +23 -6
  39. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  40. package/fesm2022/ngwr-descriptions.mjs +5 -4
  41. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  42. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  43. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  44. package/fesm2022/ngwr-dropdown.mjs +4 -0
  45. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  46. package/fesm2022/ngwr-event-calendar.mjs +723 -0
  47. package/fesm2022/ngwr-event-calendar.mjs.map +1 -0
  48. package/fesm2022/ngwr-falling-text.mjs +2 -2
  49. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  50. package/fesm2022/ngwr-file-upload.mjs +2 -2
  51. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  52. package/fesm2022/ngwr-form.mjs +258 -42
  53. package/fesm2022/ngwr-form.mjs.map +1 -1
  54. package/fesm2022/ngwr-fuzzy-text.mjs +15 -1
  55. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  56. package/fesm2022/ngwr-gauge.mjs +8 -3
  57. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  58. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  59. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  60. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  61. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  62. package/fesm2022/ngwr-i18n-en.mjs +73 -5
  63. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  64. package/fesm2022/ngwr-i18n-ru.mjs +73 -5
  65. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  66. package/fesm2022/ngwr-i18n.mjs +20 -2
  67. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  68. package/fesm2022/ngwr-icon.mjs +5 -0
  69. package/fesm2022/ngwr-icon.mjs.map +1 -1
  70. package/fesm2022/ngwr-input-number.mjs +19 -3
  71. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  72. package/fesm2022/ngwr-input.mjs +48 -6
  73. package/fesm2022/ngwr-input.mjs.map +1 -1
  74. package/fesm2022/ngwr-knob.mjs +8 -3
  75. package/fesm2022/ngwr-knob.mjs.map +1 -1
  76. package/fesm2022/ngwr-lightbox.mjs +32 -3
  77. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  78. package/fesm2022/ngwr-line-chart.mjs +3 -3
  79. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  80. package/fesm2022/ngwr-list.mjs +2 -2
  81. package/fesm2022/ngwr-list.mjs.map +1 -1
  82. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  83. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  84. package/fesm2022/ngwr-marquee.mjs +2 -2
  85. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  86. package/fesm2022/ngwr-media.mjs +3 -0
  87. package/fesm2022/ngwr-media.mjs.map +1 -1
  88. package/fesm2022/ngwr-meter-group.mjs +14 -3
  89. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  90. package/fesm2022/ngwr-page-header.mjs +2 -2
  91. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  92. package/fesm2022/ngwr-pagination.mjs +1 -1
  93. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  94. package/fesm2022/ngwr-progress.mjs +8 -2
  95. package/fesm2022/ngwr-progress.mjs.map +1 -1
  96. package/fesm2022/ngwr-qr.mjs.map +1 -1
  97. package/fesm2022/ngwr-rating.mjs +6 -4
  98. package/fesm2022/ngwr-rating.mjs.map +1 -1
  99. package/fesm2022/ngwr-result.mjs +19 -12
  100. package/fesm2022/ngwr-result.mjs.map +1 -1
  101. package/fesm2022/ngwr-segmented.mjs +2 -2
  102. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  103. package/fesm2022/ngwr-select.mjs +28 -8
  104. package/fesm2022/ngwr-select.mjs.map +1 -1
  105. package/fesm2022/ngwr-shiny-text.mjs +4 -6
  106. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  107. package/fesm2022/ngwr-speed-dial.mjs +11 -3
  108. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  109. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  110. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  111. package/fesm2022/ngwr-squircle.mjs +1 -1
  112. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  113. package/fesm2022/ngwr-star-border.mjs +2 -2
  114. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  115. package/fesm2022/ngwr-switch.mjs +10 -3
  116. package/fesm2022/ngwr-switch.mjs.map +1 -1
  117. package/fesm2022/ngwr-table.mjs +233 -19
  118. package/fesm2022/ngwr-table.mjs.map +1 -1
  119. package/fesm2022/ngwr-tabs.mjs +21 -4
  120. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  121. package/fesm2022/ngwr-textarea.mjs +20 -4
  122. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  123. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  124. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  125. package/fesm2022/ngwr-toolbar.mjs +2 -2
  126. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  127. package/fesm2022/ngwr-tour.mjs +264 -0
  128. package/fesm2022/ngwr-tour.mjs.map +1 -0
  129. package/fesm2022/ngwr-transfer.mjs +184 -0
  130. package/fesm2022/ngwr-transfer.mjs.map +1 -0
  131. package/fesm2022/ngwr-tree.mjs +23 -6
  132. package/fesm2022/ngwr-tree.mjs.map +1 -1
  133. package/fesm2022/ngwr-typewriter.mjs +2 -2
  134. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  135. package/fesm2022/ngwr-validators.mjs +118 -2
  136. package/fesm2022/ngwr-validators.mjs.map +1 -1
  137. package/fesm2022/ngwr-version.mjs +2 -2
  138. package/fesm2022/ngwr-version.mjs.map +1 -1
  139. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  140. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  141. package/fesm2022/ngwr-waves.mjs +2 -2
  142. package/fesm2022/ngwr-waves.mjs.map +1 -1
  143. package/form/styles/_index.scss +8 -4
  144. package/glitch-text/styles/_index.scss +5 -0
  145. package/gradient-text/styles/_index.scss +5 -0
  146. package/i18n/en.json +74 -6
  147. package/i18n/ru.json +74 -6
  148. package/icon/styles/_index.scss +5 -0
  149. package/keyboard/styles/_index.scss +5 -0
  150. package/llms-full.txt +123 -62
  151. package/llms.txt +29 -8
  152. package/loading-bar/styles/_index.scss +5 -0
  153. package/marquee/styles/_index.scss +7 -2
  154. package/overlay/styles/_index.scss +5 -0
  155. package/package.json +13 -1
  156. package/popover/styles/_index.scss +48 -12
  157. package/pull-to-refresh/styles/_index.scss +5 -0
  158. package/result/styles/_index.scss +3 -3
  159. package/schematics/icon-set/index.js +80 -34
  160. package/schematics/icon-set/schema.json +8 -3
  161. package/schematics/ng-add/index.js +5 -2
  162. package/schematics/page/templates.js +17 -21
  163. package/schematics/provider/index.js +31 -13
  164. package/schematics/provider/schema.json +40 -24
  165. package/schematics/use/index.js +5 -1
  166. package/schematics/use/schema.json +8 -3
  167. package/schematics/use/symbol-map.json +6 -177
  168. package/segmented/styles/_index.scss +1 -1
  169. package/select/styles/_index.scss +7 -3
  170. package/shiny-text/styles/_index.scss +5 -0
  171. package/speed-dial/styles/_index.scss +12 -1
  172. package/spotlight-card/styles/_index.scss +5 -0
  173. package/squircle/styles/_index.scss +5 -0
  174. package/star-border/styles/_index.scss +5 -0
  175. package/statistic/styles/_index.scss +2 -2
  176. package/styles/_animations.scss +6 -0
  177. package/styles.scss +3 -0
  178. package/table/styles/_index.scss +100 -2
  179. package/theme/styles/_colors.scss +43 -1
  180. package/theme/styles/_dark.scss +18 -6
  181. package/theme/styles/_focus.scss +2 -8
  182. package/tilt-card/styles/_index.scss +5 -0
  183. package/toast/styles/_index.scss +6 -3
  184. package/tour/styles/_index.scss +63 -0
  185. package/transfer/styles/_index.scss +105 -0
  186. package/types/ngwr-alert.d.ts +4 -1
  187. package/types/ngwr-avatar.d.ts +1 -1
  188. package/types/ngwr-back-top.d.ts +3 -2
  189. package/types/ngwr-badge.d.ts +1 -1
  190. package/types/ngwr-border-glow.d.ts +0 -1
  191. package/types/ngwr-carousel.d.ts +10 -1
  192. package/types/ngwr-cascader.d.ts +12 -1
  193. package/types/ngwr-checkbox.d.ts +9 -1
  194. package/types/ngwr-command-palette.d.ts +4 -1
  195. package/types/ngwr-date-picker.d.ts +9 -1
  196. package/types/ngwr-density.d.ts +1 -1
  197. package/types/ngwr-divider.d.ts +1 -1
  198. package/types/ngwr-event-calendar.d.ts +358 -0
  199. package/types/ngwr-form.d.ts +177 -20
  200. package/types/ngwr-fuzzy-text.d.ts +8 -0
  201. package/types/ngwr-gauge.d.ts +4 -1
  202. package/types/ngwr-i18n.d.ts +15 -0
  203. package/types/ngwr-input-number.d.ts +8 -1
  204. package/types/ngwr-input.d.ts +50 -20
  205. package/types/ngwr-knob.d.ts +4 -1
  206. package/types/ngwr-lightbox.d.ts +7 -1
  207. package/types/ngwr-line-chart.d.ts +1 -1
  208. package/types/ngwr-media.d.ts +1 -1
  209. package/types/ngwr-meter-group.d.ts +9 -1
  210. package/types/ngwr-page-header.d.ts +2 -2
  211. package/types/ngwr-pagination.d.ts +1 -1
  212. package/types/ngwr-progress.d.ts +4 -1
  213. package/types/ngwr-rating.d.ts +3 -2
  214. package/types/ngwr-result.d.ts +12 -6
  215. package/types/ngwr-segmented.d.ts +6 -0
  216. package/types/ngwr-select.d.ts +13 -7
  217. package/types/ngwr-shiny-text.d.ts +2 -4
  218. package/types/ngwr-speed-dial.d.ts +7 -1
  219. package/types/ngwr-squircle.d.ts +1 -1
  220. package/types/ngwr-switch.d.ts +7 -1
  221. package/types/ngwr-table.d.ts +126 -6
  222. package/types/ngwr-tabs.d.ts +1 -4
  223. package/types/ngwr-textarea.d.ts +8 -1
  224. package/types/ngwr-toolbar.d.ts +2 -2
  225. package/types/ngwr-tour.d.ts +132 -0
  226. package/types/ngwr-transfer.d.ts +118 -0
  227. package/types/ngwr-tree.d.ts +10 -2
  228. package/types/ngwr-validators.d.ts +62 -2
  229. package/types/ngwr-version.d.ts +2 -2
  230. package/typewriter/styles/_index.scss +5 -0
  231. package/typography/styles/_index.scss +3 -3
  232. package/virtual-scroll/styles/_index.scss +6 -1
  233. package/waves/styles/_index.scss +5 -0
@@ -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 };
@@ -8,14 +8,14 @@ import * as i0 from '@angular/core';
8
8
  * ```html
9
9
  * <wr-toolbar>
10
10
  * <div wrToolbarStart>
11
- * <button wrButton>Back</button>
11
+ * <button wr-btn>Back</button>
12
12
  * <strong>Items</strong>
13
13
  * </div>
14
14
  * <div wrToolbarCenter>
15
15
  * <wr-segmented [(value)]="view" [options]="['grid', 'list']" />
16
16
  * </div>
17
17
  * <div wrToolbarEnd>
18
- * <button wrButton color="primary">New</button>
18
+ * <button wr-btn color="primary">New</button>
19
19
  * </div>
20
20
  * </wr-toolbar>
21
21
  * ```
@@ -0,0 +1,132 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import * as ngwr_i18n from 'ngwr/i18n';
3
+
4
+ /**
5
+ * @license
6
+ *
7
+ * Use of this source code is governed by an MIT-style license that can be
8
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
9
+ */
10
+ /** Where the step popup sits relative to its target. */
11
+ type WrTourPlacement = 'top' | 'bottom' | 'left' | 'right';
12
+ /** One stop on a tour. */
13
+ interface WrTourStep {
14
+ /**
15
+ * What to spotlight — a CSS selector resolved when the step opens, or the
16
+ * element itself. A step whose selector matches nothing is SKIPPED rather than
17
+ * shown floating: a tour that points at a control the user cannot see is worse
18
+ * than one that is a step shorter.
19
+ */
20
+ readonly target: string | HTMLElement;
21
+ /** Heading above the copy. */
22
+ readonly title?: string;
23
+ /** The step's body text. */
24
+ readonly content: string;
25
+ /** Preferred side. The overlay falls back to the opposite side near an edge. @default 'bottom' */
26
+ readonly placement?: WrTourPlacement;
27
+ }
28
+
29
+ /**
30
+ * Guided product tour: a spotlight over one element at a time plus a popup
31
+ * explaining it.
32
+ *
33
+ * Steps are data, not markup — call `start()` with an array and the service owns
34
+ * the overlay, the cut-out, focus and the keyboard. A step whose target is not
35
+ * on the page is skipped rather than shown floating, so a tour survives a
36
+ * feature being hidden behind a flag or a permission.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * private readonly tour = inject(WrTour);
41
+ *
42
+ * showMeAround(): void {
43
+ * this.tour.start([
44
+ * { target: '[data-tour="search"]', title: 'Search', content: 'Find anything by name.' },
45
+ * { target: '[data-tour="filters"]', content: 'Narrow the list down.', placement: 'right' },
46
+ * ]);
47
+ * }
48
+ * ```
49
+ *
50
+ * @see https://ngwr.dev/reference/services/tour
51
+ */
52
+ declare class WrTour {
53
+ private readonly overlay;
54
+ private readonly scrollStrategies;
55
+ private readonly injector;
56
+ private readonly focusTrapFactory;
57
+ private readonly document;
58
+ private readonly isBrowser;
59
+ private readonly steps;
60
+ private readonly cursor;
61
+ private overlayRef;
62
+ private spotlight;
63
+ private detachKeydown;
64
+ private detachReposition;
65
+ private restoreFocus;
66
+ /** Whether a tour is running. */
67
+ readonly active: _angular_core.Signal<boolean>;
68
+ /** Zero-based index of the current step, `-1` when idle. */
69
+ readonly index: _angular_core.Signal<number>;
70
+ /** How many steps this tour has. */
71
+ readonly total: _angular_core.Signal<number>;
72
+ /** The step being shown, or `null` when idle. */
73
+ readonly step: _angular_core.Signal<WrTourStep | null>;
74
+ /**
75
+ * Begin a tour. Restarts if one is already running. A no-op under SSR — a
76
+ * tour is a client-side affordance and there is nothing to spotlight on the
77
+ * server.
78
+ */
79
+ start(steps: readonly WrTourStep[]): void;
80
+ /** Advance; finishes the tour past the last step. */
81
+ next(): void;
82
+ /** Go back; stays put on the first step. */
83
+ prev(): void;
84
+ /** End the tour and return focus where it was. */
85
+ stop(): void;
86
+ /**
87
+ * Move to `index`, skipping steps whose target is not in the DOM. `direction`
88
+ * says which way to keep skipping, so a missing step never traps the tour
89
+ * between two dead ends.
90
+ */
91
+ private goTo;
92
+ private resolve;
93
+ private openStep;
94
+ private placeSpotlight;
95
+ private teardownStep;
96
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTour, never>;
97
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrTour>;
98
+ }
99
+
100
+ /** What the popup needs from the running tour, without importing the service (cycle). */
101
+ interface WrTourController {
102
+ readonly index: () => number;
103
+ readonly total: () => number;
104
+ readonly step: () => WrTourStep | null;
105
+ next(): void;
106
+ prev(): void;
107
+ stop(): void;
108
+ }
109
+ /**
110
+ * The card a tour shows next to the spotlit element. Rendered by `WrTour` into
111
+ * a CDK overlay — not something you place yourself.
112
+ *
113
+ * @see https://ngwr.dev/reference/services/tour
114
+ */
115
+ declare class WrTourPopup {
116
+ protected readonly tour: WrTourController;
117
+ protected readonly nextLabel: string;
118
+ protected readonly backLabel: string;
119
+ protected readonly doneLabel: string;
120
+ protected readonly skipLabel: string;
121
+ /** `Step {{current}} of {{total}}` — also the dialog's accessible name. */
122
+ protected readonly progress: (params?: ngwr_i18n.WrI18nParams) => string;
123
+ protected readonly isLast: _angular_core.Signal<boolean>;
124
+ protected readonly isFirst: _angular_core.Signal<boolean>;
125
+ protected readonly progressText: _angular_core.Signal<string>;
126
+ protected readonly ariaLabel: _angular_core.Signal<string>;
127
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTourPopup, never>;
128
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTourPopup, "wr-tour-popup", never, {}, {}, never, never, true, never>;
129
+ }
130
+
131
+ export { WrTour, WrTourPopup };
132
+ export type { WrTourPlacement, WrTourStep };
@@ -0,0 +1,118 @@
1
+ import * as ngwr_i18n from 'ngwr/i18n';
2
+ import * as _angular_core from '@angular/core';
3
+ import { FormValueControl } from '@angular/forms/signals';
4
+
5
+ /**
6
+ * @license
7
+ *
8
+ * Use of this source code is governed by an MIT-style license that can be
9
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
10
+ */
11
+ /** One row in either pane of a `<wr-transfer>`. */
12
+ interface WrTransferItem<TValue = unknown> {
13
+ /** Identity — what `[(value)]` carries, compared with SameValueZero. */
14
+ readonly value: TValue;
15
+ /** Text shown in the pane and matched by the search box. */
16
+ readonly label: string;
17
+ /** Greyed out and never moved by the bulk buttons. */
18
+ readonly disabled?: boolean;
19
+ }
20
+
21
+ /** A pane's rows plus the header state derived from them. */
22
+ interface PaneState {
23
+ readonly rows: readonly WrTransferItem[];
24
+ readonly checkedCount: number;
25
+ readonly allChecked: boolean;
26
+ readonly someChecked: boolean;
27
+ }
28
+ /**
29
+ * Dual-listbox picker: two panes and the buttons that move rows between them.
30
+ *
31
+ * The full item set is `[items]` and the RIGHT pane is the value — `[(value)]`
32
+ * holds the chosen `WrTransferItem['value']`s, everything else stays left. The
33
+ * checked state inside each pane is transient staging, deliberately not part of
34
+ * the value: what a form cares about is which rows ended up on the right.
35
+ *
36
+ * A signal-forms native control (`FormValueControl<readonly unknown[]>`), so
37
+ * `[formField]` binds straight to `value`; `[(ngModel)]` and reactive forms keep
38
+ * working through Angular's bridge, and `[(value)]` is the standalone shape.
39
+ *
40
+ * @example
41
+ * ```html
42
+ * <!-- Standalone -->
43
+ * <wr-transfer [items]="permissions" [(value)]="granted" />
44
+ *
45
+ * <!-- Searchable, with pane titles -->
46
+ * <wr-transfer
47
+ * searchable
48
+ * sourceTitle="Available"
49
+ * targetTitle="Granted"
50
+ * [items]="permissions"
51
+ * [formField]="form.granted"
52
+ * />
53
+ * ```
54
+ *
55
+ * @see https://ngwr.dev/reference/components/transfer
56
+ */
57
+ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
58
+ /** Every row, in either pane. Membership of the right pane is `value`. */
59
+ readonly items: _angular_core.InputSignal<readonly WrTransferItem<unknown>[]>;
60
+ /**
61
+ * Values currently in the RIGHT pane. Two-way bindable; bound automatically
62
+ * by `[formField]` / `[(ngModel)]`.
63
+ */
64
+ readonly value: _angular_core.ModelSignal<readonly unknown[]>;
65
+ /** Emitted on blur / commit so a bound field marks itself touched. */
66
+ readonly touch: _angular_core.OutputEmitterRef<void>;
67
+ /** Disable the whole control. @default false */
68
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
69
+ /** Show a filter box above each pane. @default false */
70
+ readonly searchable: _angular_core.InputSignalWithTransform<boolean, any>;
71
+ /** Heading above the left pane. Falls back to `transfer.source`. */
72
+ readonly sourceTitle: _angular_core.InputSignal<string | null>;
73
+ /** Heading above the right pane. Falls back to `transfer.target`. */
74
+ readonly targetTitle: _angular_core.InputSignal<string | null>;
75
+ /** Placeholder in both filter boxes. Falls back to `transfer.search`. */
76
+ readonly searchPlaceholder: _angular_core.InputSignal<string | null>;
77
+ /** Shown in a pane with no rows. Falls back to `transfer.empty`. */
78
+ readonly emptyText: _angular_core.InputSignal<string | null>;
79
+ /** Accessible name of the move-right button. Falls back to `transfer.toTarget`. */
80
+ readonly toTargetLabel: _angular_core.InputSignal<string | null>;
81
+ /** Accessible name of the move-left button. Falls back to `transfer.toSource`. */
82
+ readonly toSourceLabel: _angular_core.InputSignal<string | null>;
83
+ protected readonly resolvedSourceTitle: _angular_core.Signal<string>;
84
+ protected readonly resolvedTargetTitle: _angular_core.Signal<string>;
85
+ protected readonly resolvedSearch: _angular_core.Signal<string>;
86
+ protected readonly resolvedEmpty: _angular_core.Signal<string>;
87
+ protected readonly resolvedToTarget: _angular_core.Signal<string>;
88
+ protected readonly resolvedToSource: _angular_core.Signal<string>;
89
+ /** `{{checked}} / {{total}}` under each heading. @internal */
90
+ protected readonly countLabel: (params?: ngwr_i18n.WrI18nParams) => string;
91
+ /** Pane order — the template iterates it so both panes share one block. */
92
+ protected readonly panes: readonly ["source", "target"];
93
+ private readonly sourceQuery;
94
+ private readonly targetQuery;
95
+ /** Staged rows, per pane. Cleared as soon as a move commits them. */
96
+ private readonly sourceChecked;
97
+ private readonly targetChecked;
98
+ private readonly valueSet;
99
+ protected readonly source: _angular_core.Signal<PaneState>;
100
+ protected readonly target: _angular_core.Signal<PaneState>;
101
+ protected readonly canMoveRight: _angular_core.Signal<boolean>;
102
+ protected readonly canMoveLeft: _angular_core.Signal<boolean>;
103
+ protected readonly classes: _angular_core.Signal<string>;
104
+ protected isChecked(pane: 'source' | 'target', item: WrTransferItem): boolean;
105
+ protected toggle(pane: 'source' | 'target', item: WrTransferItem, checked: boolean): void;
106
+ /** Header checkbox — stages or clears every enabled row the filter shows. */
107
+ protected toggleAll(pane: 'source' | 'target', checked: boolean): void;
108
+ protected onSearch(pane: 'source' | 'target', event: Event): void;
109
+ protected moveRight(): void;
110
+ protected moveLeft(): void;
111
+ /** Filter, then derive the header state from what survived. */
112
+ private pane;
113
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTransfer, never>;
114
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTransfer, "wr-transfer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "sourceTitle": { "alias": "sourceTitle"; "required": false; "isSignal": true; }; "targetTitle": { "alias": "targetTitle"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "toTargetLabel": { "alias": "toTargetLabel"; "required": false; "isSignal": true; }; "toSourceLabel": { "alias": "toSourceLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
115
+ }
116
+
117
+ export { WrTransfer };
118
+ export type { WrTransferItem };
@@ -93,6 +93,14 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
93
93
  readonly openOn: _angular_core.InputSignal<"inline" | "overlay">;
94
94
  /** Placeholder shown on the trigger when no node is selected. */
95
95
  readonly placeholder: _angular_core.InputSignal<string>;
96
+ /**
97
+ * Accessible name of the overlay trigger. Falls back to the placeholder, then
98
+ * to `select.label` — a `role="combobox"` with nothing selected and no
99
+ * placeholder otherwise has no name at all.
100
+ */
101
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
102
+ private readonly labelText;
103
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
96
104
  /** Show a clear-all (×) button on the trigger when at least one node is selected. @default true */
97
105
  readonly clearable: _angular_core.InputSignalWithTransform<boolean, any>;
98
106
  /**
@@ -145,7 +153,7 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
145
153
  private readonly platformId;
146
154
  /** Currently focused row's index in the flattened visible list. */
147
155
  protected readonly focusedIndex: _angular_core.WritableSignal<number>;
148
- /** Resolved ARIA labels — pick up live locale changes via re-render. */
156
+ /** Resolved ARIA labels — resolved once at construction, so a runtime locale switch needs a re-create. */
149
157
  protected readonly clearLabel: string;
150
158
  protected readonly expandLabel: string;
151
159
  protected readonly collapseLabel: string;
@@ -225,7 +233,7 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
225
233
  private openOverlay;
226
234
  private closeOverlay;
227
235
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTree<any>, never>;
228
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTree<any>, "wr-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "openOn": { "alias": "openOn"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; "defaultExpandAll": { "alias": "defaultExpandAll"; "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; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "expanded": "expandedChange"; "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
236
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTree<any>, "wr-tree", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "openOn": { "alias": "openOn"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; "defaultExpandAll": { "alias": "defaultExpandAll"; "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; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; "expanded": "expandedChange"; "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
229
237
  }
230
238
 
231
239
  export { WrTree };