ngwr 10.0.0 → 10.2.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 (238) hide show
  1. package/README.md +9 -8
  2. package/action-sheet/styles/_index.scss +6 -1
  3. package/alert/styles/_index.scss +7 -3
  4. package/badge/styles/_index.scss +1 -1
  5. package/badge/styles/_tag.scss +2 -2
  6. package/border-glow/styles/_index.scss +5 -0
  7. package/breadcrumbs/styles/_index.scss +1 -1
  8. package/button/styles/_index.scss +6 -6
  9. package/calendar/styles/_index.scss +9 -1
  10. package/circular-text/styles/_index.scss +6 -1
  11. package/density/styles/_index.scss +3 -1
  12. package/dialog/styles/_index.scss +1 -2
  13. package/drag-drop/styles/_index.scss +20 -7
  14. package/event-calendar/styles/_index.scss +284 -0
  15. package/falling-text/styles/_index.scss +5 -0
  16. package/fesm2022/ngwr-alert.mjs +8 -3
  17. package/fesm2022/ngwr-alert.mjs.map +1 -1
  18. package/fesm2022/ngwr-back-top.mjs +6 -4
  19. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  20. package/fesm2022/ngwr-border-glow.mjs +12 -9
  21. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  22. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  23. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  24. package/fesm2022/ngwr-calendar.mjs +5 -3
  25. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  26. package/fesm2022/ngwr-card.mjs +2 -2
  27. package/fesm2022/ngwr-card.mjs.map +1 -1
  28. package/fesm2022/ngwr-carousel.mjs +17 -4
  29. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  30. package/fesm2022/ngwr-cascader.mjs +31 -4
  31. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  32. package/fesm2022/ngwr-checkbox.mjs +12 -3
  33. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  34. package/fesm2022/ngwr-circular-text.mjs +2 -2
  35. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  36. package/fesm2022/ngwr-command-palette.mjs +7 -3
  37. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  38. package/fesm2022/ngwr-counter.mjs +9 -1
  39. package/fesm2022/ngwr-counter.mjs.map +1 -1
  40. package/fesm2022/ngwr-date-picker.mjs +23 -6
  41. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  42. package/fesm2022/ngwr-descriptions.mjs +5 -4
  43. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  44. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  45. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  46. package/fesm2022/ngwr-dropdown.mjs +4 -0
  47. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  48. package/fesm2022/ngwr-event-calendar.mjs +723 -0
  49. package/fesm2022/ngwr-event-calendar.mjs.map +1 -0
  50. package/fesm2022/ngwr-falling-text.mjs +2 -2
  51. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  52. package/fesm2022/ngwr-file-upload.mjs +2 -2
  53. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  54. package/fesm2022/ngwr-form.mjs +258 -42
  55. package/fesm2022/ngwr-form.mjs.map +1 -1
  56. package/fesm2022/ngwr-fuzzy-text.mjs +15 -1
  57. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  58. package/fesm2022/ngwr-gauge.mjs +8 -3
  59. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  60. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  61. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  62. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  63. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  64. package/fesm2022/ngwr-i18n-en.mjs +73 -5
  65. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  66. package/fesm2022/ngwr-i18n-ru.mjs +73 -5
  67. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  68. package/fesm2022/ngwr-i18n.mjs +20 -2
  69. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  70. package/fesm2022/ngwr-icon.mjs +5 -0
  71. package/fesm2022/ngwr-icon.mjs.map +1 -1
  72. package/fesm2022/ngwr-input-number.mjs +19 -3
  73. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  74. package/fesm2022/ngwr-input.mjs +48 -6
  75. package/fesm2022/ngwr-input.mjs.map +1 -1
  76. package/fesm2022/ngwr-knob.mjs +8 -3
  77. package/fesm2022/ngwr-knob.mjs.map +1 -1
  78. package/fesm2022/ngwr-lightbox.mjs +32 -3
  79. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  80. package/fesm2022/ngwr-line-chart.mjs +3 -3
  81. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  82. package/fesm2022/ngwr-list.mjs +2 -2
  83. package/fesm2022/ngwr-list.mjs.map +1 -1
  84. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  85. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  86. package/fesm2022/ngwr-marquee.mjs +2 -2
  87. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  88. package/fesm2022/ngwr-media.mjs +3 -0
  89. package/fesm2022/ngwr-media.mjs.map +1 -1
  90. package/fesm2022/ngwr-meter-group.mjs +14 -3
  91. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  92. package/fesm2022/ngwr-page-header.mjs +2 -2
  93. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  94. package/fesm2022/ngwr-pagination.mjs +1 -1
  95. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  96. package/fesm2022/ngwr-progress.mjs +8 -2
  97. package/fesm2022/ngwr-progress.mjs.map +1 -1
  98. package/fesm2022/ngwr-qr.mjs.map +1 -1
  99. package/fesm2022/ngwr-rating.mjs +6 -4
  100. package/fesm2022/ngwr-rating.mjs.map +1 -1
  101. package/fesm2022/ngwr-result.mjs +19 -12
  102. package/fesm2022/ngwr-result.mjs.map +1 -1
  103. package/fesm2022/ngwr-segmented.mjs +2 -2
  104. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  105. package/fesm2022/ngwr-select.mjs +28 -8
  106. package/fesm2022/ngwr-select.mjs.map +1 -1
  107. package/fesm2022/ngwr-shiny-text.mjs +4 -6
  108. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  109. package/fesm2022/ngwr-speed-dial.mjs +11 -3
  110. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  111. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  112. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  113. package/fesm2022/ngwr-squircle.mjs +1 -1
  114. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  115. package/fesm2022/ngwr-star-border.mjs +2 -2
  116. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  117. package/fesm2022/ngwr-switch.mjs +10 -3
  118. package/fesm2022/ngwr-switch.mjs.map +1 -1
  119. package/fesm2022/ngwr-table.mjs +233 -19
  120. package/fesm2022/ngwr-table.mjs.map +1 -1
  121. package/fesm2022/ngwr-tabs.mjs +21 -4
  122. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  123. package/fesm2022/ngwr-textarea.mjs +20 -4
  124. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  125. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  126. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  127. package/fesm2022/ngwr-toolbar.mjs +2 -2
  128. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  129. package/fesm2022/ngwr-tour.mjs +264 -0
  130. package/fesm2022/ngwr-tour.mjs.map +1 -0
  131. package/fesm2022/ngwr-transfer.mjs +184 -0
  132. package/fesm2022/ngwr-transfer.mjs.map +1 -0
  133. package/fesm2022/ngwr-tree.mjs +23 -6
  134. package/fesm2022/ngwr-tree.mjs.map +1 -1
  135. package/fesm2022/ngwr-typewriter.mjs +2 -2
  136. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  137. package/fesm2022/ngwr-validators.mjs +118 -2
  138. package/fesm2022/ngwr-validators.mjs.map +1 -1
  139. package/fesm2022/ngwr-version.mjs +2 -2
  140. package/fesm2022/ngwr-version.mjs.map +1 -1
  141. package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
  142. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  143. package/fesm2022/ngwr-waves.mjs +2 -2
  144. package/fesm2022/ngwr-waves.mjs.map +1 -1
  145. package/form/styles/_index.scss +8 -4
  146. package/glitch-text/styles/_index.scss +5 -0
  147. package/gradient-text/styles/_index.scss +5 -0
  148. package/i18n/en.json +74 -6
  149. package/i18n/ru.json +74 -6
  150. package/icon/styles/_index.scss +5 -0
  151. package/keyboard/styles/_index.scss +5 -0
  152. package/llms-full.txt +123 -62
  153. package/llms.txt +29 -8
  154. package/loading-bar/styles/_index.scss +5 -0
  155. package/marquee/styles/_index.scss +7 -2
  156. package/overlay/styles/_index.scss +5 -0
  157. package/package.json +13 -1
  158. package/popover/styles/_index.scss +48 -12
  159. package/pull-to-refresh/styles/_index.scss +5 -0
  160. package/result/styles/_index.scss +3 -3
  161. package/schematics/icon-set/index.js +80 -34
  162. package/schematics/icon-set/schema.json +8 -3
  163. package/schematics/ng-add/index.js +5 -2
  164. package/schematics/page/templates.js +17 -21
  165. package/schematics/provider/index.js +31 -13
  166. package/schematics/provider/schema.json +40 -24
  167. package/schematics/use/index.js +5 -1
  168. package/schematics/use/schema.json +8 -3
  169. package/schematics/use/symbol-map.json +6 -177
  170. package/segmented/styles/_index.scss +1 -1
  171. package/select/styles/_index.scss +7 -3
  172. package/shiny-text/styles/_index.scss +5 -0
  173. package/sidebar/styles/_index.scss +3 -3
  174. package/speed-dial/styles/_index.scss +12 -1
  175. package/spotlight-card/styles/_index.scss +5 -0
  176. package/squircle/styles/_index.scss +5 -0
  177. package/star-border/styles/_index.scss +5 -0
  178. package/statistic/styles/_index.scss +2 -2
  179. package/stepper/styles/_index.scss +3 -3
  180. package/styles/_animations.scss +6 -0
  181. package/styles.scss +3 -0
  182. package/table/styles/_index.scss +100 -2
  183. package/tabs/styles/_index.scss +1 -1
  184. package/theme/styles/_colors.scss +65 -2
  185. package/theme/styles/_dark.scss +18 -6
  186. package/theme/styles/_focus.scss +2 -8
  187. package/tilt-card/styles/_index.scss +5 -0
  188. package/toast/styles/_index.scss +6 -3
  189. package/tour/styles/_index.scss +63 -0
  190. package/transfer/styles/_index.scss +105 -0
  191. package/types/ngwr-alert.d.ts +4 -1
  192. package/types/ngwr-avatar.d.ts +1 -1
  193. package/types/ngwr-back-top.d.ts +3 -2
  194. package/types/ngwr-badge.d.ts +1 -1
  195. package/types/ngwr-border-glow.d.ts +0 -1
  196. package/types/ngwr-carousel.d.ts +10 -1
  197. package/types/ngwr-cascader.d.ts +12 -1
  198. package/types/ngwr-checkbox.d.ts +9 -1
  199. package/types/ngwr-command-palette.d.ts +4 -1
  200. package/types/ngwr-date-picker.d.ts +9 -1
  201. package/types/ngwr-density.d.ts +1 -1
  202. package/types/ngwr-divider.d.ts +1 -1
  203. package/types/ngwr-event-calendar.d.ts +358 -0
  204. package/types/ngwr-form.d.ts +177 -20
  205. package/types/ngwr-fuzzy-text.d.ts +8 -0
  206. package/types/ngwr-gauge.d.ts +4 -1
  207. package/types/ngwr-i18n.d.ts +15 -0
  208. package/types/ngwr-input-number.d.ts +8 -1
  209. package/types/ngwr-input.d.ts +50 -20
  210. package/types/ngwr-knob.d.ts +4 -1
  211. package/types/ngwr-lightbox.d.ts +7 -1
  212. package/types/ngwr-line-chart.d.ts +1 -1
  213. package/types/ngwr-media.d.ts +1 -1
  214. package/types/ngwr-meter-group.d.ts +9 -1
  215. package/types/ngwr-page-header.d.ts +2 -2
  216. package/types/ngwr-pagination.d.ts +1 -1
  217. package/types/ngwr-progress.d.ts +4 -1
  218. package/types/ngwr-rating.d.ts +3 -2
  219. package/types/ngwr-result.d.ts +12 -6
  220. package/types/ngwr-segmented.d.ts +6 -0
  221. package/types/ngwr-select.d.ts +13 -7
  222. package/types/ngwr-shiny-text.d.ts +2 -4
  223. package/types/ngwr-speed-dial.d.ts +7 -1
  224. package/types/ngwr-squircle.d.ts +1 -1
  225. package/types/ngwr-switch.d.ts +7 -1
  226. package/types/ngwr-table.d.ts +126 -6
  227. package/types/ngwr-tabs.d.ts +1 -4
  228. package/types/ngwr-textarea.d.ts +8 -1
  229. package/types/ngwr-toolbar.d.ts +2 -2
  230. package/types/ngwr-tour.d.ts +132 -0
  231. package/types/ngwr-transfer.d.ts +118 -0
  232. package/types/ngwr-tree.d.ts +10 -2
  233. package/types/ngwr-validators.d.ts +62 -2
  234. package/types/ngwr-version.d.ts +2 -2
  235. package/typewriter/styles/_index.scss +5 -0
  236. package/typography/styles/_index.scss +5 -5
  237. package/virtual-scroll/styles/_index.scss +6 -1
  238. package/waves/styles/_index.scss +5 -0
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Signal, EnvironmentProviders } from '@angular/core';
2
3
  import * as _angular_forms from '@angular/forms';
3
4
  import { NgControl } from '@angular/forms';
4
5
 
@@ -12,7 +13,7 @@ import { NgControl } from '@angular/forms';
12
13
  * ```html
13
14
  * <wr-form-item [hasError]="form.controls.email.invalid">
14
15
  * <label>Email</label>
15
- * <wr-input formControlName="email" />
16
+ * <input wrInput formControlName="email" />
16
17
  * <wr-form-error>Invalid email</wr-form-error>
17
18
  * </wr-form-item>
18
19
  * ```
@@ -31,6 +32,71 @@ declare class WrFormItem {
31
32
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrFormItem, "wr-form-item", never, { "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
32
33
  }
33
34
 
35
+ /**
36
+ * @license
37
+ *
38
+ * Use of this source code is governed by an MIT-style license that can be
39
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
40
+ */
41
+
42
+ /**
43
+ * What a projected control can read from its surrounding `<wr-form-field>`.
44
+ *
45
+ * The field renders `<label [for]>` before it can see what was projected into
46
+ * it, so the id has to travel the other way: the control adopts the id the
47
+ * label already points at. Doing it through DI keeps it a render-time binding,
48
+ * which is what SSR needs — stamping the id from `afterNextRender` would leave
49
+ * every prerendered page with a label pointing at nothing.
50
+ */
51
+ interface WrFormFieldContext {
52
+ /** Id the field's `<label for>` points at. */
53
+ readonly controlId: Signal<string>;
54
+ /**
55
+ * Validator keys currently in error, once the control is touched or dirty.
56
+ * Empty when the field is valid or has not been interacted with.
57
+ */
58
+ readonly errorKeys: Signal<readonly string[]>;
59
+ /** Id of the element listing the visible messages, or `null` when there are none. */
60
+ readonly describedBy: Signal<string | null>;
61
+ }
62
+ /** Present only inside a `<wr-form-field>`; inject with `{ optional: true }`. */
63
+ declare const WR_FORM_FIELD: InjectionToken<WrFormFieldContext>;
64
+
65
+ /**
66
+ * One error message tied to a validator key. Renders only when the parent
67
+ * form-field has a matching error in `control.errors`, and only once the
68
+ * control is touched or dirty.
69
+ *
70
+ * @example
71
+ * ```html
72
+ * <wr-form-error key="required">This field is required.</wr-form-error>
73
+ * <wr-form-error key="email">That doesn't look right.</wr-form-error>
74
+ * ```
75
+ */
76
+ declare class WrFormError {
77
+ /**
78
+ * Validator key this message corresponds to (e.g. `'required'`).
79
+ * Optional — without a key the message always renders, which is the
80
+ * plain inline-error usage inside `<wr-form-item>`.
81
+ */
82
+ readonly key: _angular_core.InputSignal<string | undefined>;
83
+ private readonly field;
84
+ /**
85
+ * Whether this message is the one the current error calls for.
86
+ *
87
+ * The parent projects every `<wr-form-error>` through a single
88
+ * `<ng-content select>`, which cannot filter — so each message decides for
89
+ * itself. Without this, one invalid control rendered "Email is required."
90
+ * and "That isn't a valid email." side by side, which is what the docs have
91
+ * always described as gated behaviour.
92
+ *
93
+ * A keyless message always shows: that is the plain inline-error usage inside
94
+ * `<wr-form-item>`, which has no error discovery at all.
95
+ */
96
+ protected readonly visible: _angular_core.Signal<boolean>;
97
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrFormError, never>;
98
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrFormError, "wr-form-error", never, { "key": { "alias": "key"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
99
+ }
34
100
  /**
35
101
  * Wraps a label + control + hint + error messages into a single block —
36
102
  * the layout primitive every form ends up reinventing.
@@ -52,7 +118,7 @@ declare class WrFormItem {
52
118
  *
53
119
  * @see https://ngwr.dev/reference/components/form-field
54
120
  */
55
- declare class WrFormField {
121
+ declare class WrFormField implements WrFormFieldContext {
56
122
  /** Label text shown above the control. */
57
123
  readonly label: _angular_core.InputSignal<string>;
58
124
  /** Hint text shown below the control. Hidden when an error is visible. */
@@ -61,35 +127,126 @@ declare class WrFormField {
61
127
  readonly required: _angular_core.InputSignalWithTransform<boolean, any>;
62
128
  /** Show `(optional)` next to the label. Mutually exclusive with `required`. @default false */
63
129
  readonly optional: _angular_core.InputSignalWithTransform<boolean, any>;
64
- /** Force a specific id on the label's `for` attribute. Auto-generated otherwise. */
130
+ /**
131
+ * Force a specific id on the label's `for` attribute. Auto-generated
132
+ * otherwise, and adopted by the projected `wrInput` unless that element
133
+ * already carries an `id` of its own.
134
+ */
65
135
  readonly controlId: _angular_core.InputSignal<string>;
66
- /** Projected `NgControl` — used to read touched / dirty / errors. */
136
+ /**
137
+ * Projected `NgControl` — used to read touched / dirty / errors.
138
+ *
139
+ * This catches `[formField]` too: Angular's Signal Forms directive provides
140
+ * `NgControl` via its interop shim, so both forms flavours land here.
141
+ */
67
142
  protected readonly ngControl: _angular_core.Signal<NgControl | undefined>;
143
+ /**
144
+ * Bumped on every event the projected control emits.
145
+ *
146
+ * `AbstractControl`'s `touched` / `dirty` / `errors` accessors are NOT
147
+ * reactive under classic forms — Angular reads them inside `untracked()`, and
148
+ * `errors` is a plain assigned field. A `computed` over them therefore caches
149
+ * its first value and never recomputes, which in a zoneless app means the
150
+ * error block never appears at all. `control.events` is the reactive source
151
+ * Angular does expose, so the computed depends on this counter instead.
152
+ * Signal Forms needs none of this — its interop getters read live signals —
153
+ * and harmlessly contributes no events.
154
+ */
155
+ private readonly revision;
156
+ constructor();
68
157
  protected readonly errors: _angular_core.Signal<_angular_forms.ValidationErrors | null>;
69
158
  protected readonly hasError: _angular_core.Signal<boolean>;
159
+ /** @internal Read by the projected `<wr-form-error>` children to decide which of them renders. */
160
+ readonly errorKeys: _angular_core.Signal<readonly string[]>;
161
+ /** @internal Read by the projected control so a screen reader is pointed at the message. */
162
+ readonly describedBy: _angular_core.Signal<string | null>;
163
+ /**
164
+ * Render a catalog message for any error the markup does not already answer.
165
+ *
166
+ * On by default: a field with no `<wr-form-error>` at all is the common case,
167
+ * and an empty error block helps nobody. Turn it off for a field whose copy is
168
+ * entirely hand-written. @default true
169
+ */
170
+ readonly autoErrors: _angular_core.InputSignalWithTransform<boolean, any>;
171
+ private readonly projectedErrors;
172
+ private readonly appMessages;
173
+ private readonly i18n;
174
+ /**
175
+ * Errors with no projected `<wr-form-error key>` to answer them, resolved to
176
+ * text: the app catalog first, then the `validation.*` i18n keys, then a
177
+ * built-in English sentence. Per-field markup always wins — it is the most
178
+ * specific thing the author wrote.
179
+ */
180
+ protected readonly autoMessages: _angular_core.Signal<readonly {
181
+ key: string;
182
+ text: string;
183
+ }[]>;
184
+ private resolve;
70
185
  protected readonly classes: _angular_core.Signal<string>;
71
186
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrFormField, never>;
72
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrFormField, "wr-form-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; }, {}, ["ngControl"], ["*", "wr-form-error"], true, never>;
187
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrFormField, "wr-form-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "optional": { "alias": "optional"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "autoErrors": { "alias": "autoErrors"; "required": false; "isSignal": true; }; }, {}, ["ngControl", "projectedErrors"], ["*", "wr-form-error"], true, never>;
73
188
  }
189
+
74
190
  /**
75
- * One error message tied to a validator key. Renders only when the
76
- * parent form-field has a matching error in `control.errors`.
191
+ * @license
77
192
  *
78
- * @example
79
- * ```html
80
- * <wr-form-error key="required">This field is required.</wr-form-error>
81
- * <wr-form-error key="email">That doesn't look right.</wr-form-error>
82
- * ```
193
+ * Use of this source code is governed by an MIT-style license that can be
194
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
83
195
  */
84
- declare class WrFormError {
196
+
197
+ /** What a message function is handed to build its sentence. */
198
+ interface WrFormErrorContext {
199
+ /** Validator key (classic forms) or Signal Forms `kind` that produced the error. */
200
+ readonly key: string;
85
201
  /**
86
- * Validator key this message corresponds to (e.g. `'required'`).
87
- * Optional — without a key the message always renders, which is the
88
- * plain inline-error usage inside `<wr-form-item>`.
202
+ * The validator's own payload — `{ requiredLength, actualLength }` for
203
+ * `minlength`, `{ min }` for `wrMinDate`, and so on. `true` for the
204
+ * flag-shaped validators, which carry nothing.
89
205
  */
90
- readonly key: _angular_core.InputSignal<string | undefined>;
91
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrFormError, never>;
92
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrFormError, "wr-form-error", never, { "key": { "alias": "key"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
206
+ readonly error: unknown;
207
+ /** The surrounding field's `label`, so a message can name the field. */
208
+ readonly label: string;
93
209
  }
210
+ /** A message, or a function that builds one from the validator's payload. */
211
+ type WrFormErrorMessage = string | ((ctx: WrFormErrorContext) => string);
212
+ /** Validator key → message. Keys are matched exactly against `control.errors`. */
213
+ type WrFormErrorMessages = Readonly<Record<string, WrFormErrorMessage>>;
214
+ /**
215
+ * App-wide validation copy. Empty by default; `<wr-form-field>` falls through
216
+ * to the `ngwr/i18n` catalog and then to a built-in English sentence, so a
217
+ * form shows a usable message with no configuration at all.
218
+ */
219
+ declare const WR_FORM_ERRORS: InjectionToken<Readonly<Record<string, WrFormErrorMessage>>>;
220
+ /**
221
+ * Register validation messages for the whole app.
222
+ *
223
+ * Only the keys you name are overridden — everything else keeps resolving
224
+ * through the i18n catalog, so this composes with `provideWrI18n()` rather than
225
+ * replacing it. A projected `<wr-form-error key="…">` still wins over both:
226
+ * per-field copy beats app-wide copy.
227
+ *
228
+ * @example
229
+ * ```ts
230
+ * bootstrapApplication(App, {
231
+ * providers: [
232
+ * provideWrFormErrors({
233
+ * required: 'Please fill this in.',
234
+ * minlength: ({ error }) => `At least ${(error as { requiredLength: number }).requiredLength} characters.`,
235
+ * }),
236
+ * ],
237
+ * });
238
+ * ```
239
+ */
240
+ declare function provideWrFormErrors(messages?: WrFormErrorMessages): EnvironmentProviders;
241
+ /**
242
+ * Last-resort English, used when no app catalog and no i18n catalog answer.
243
+ *
244
+ * These exist so that a form with zero configuration still says something true
245
+ * rather than rendering an empty error block. Every key here also ships as a
246
+ * `validation.*` entry in `ngwr/i18n/{en,ru}`, which is what a localized app
247
+ * actually reads.
248
+ */
249
+ declare const WR_FORM_ERROR_FALLBACKS: WrFormErrorMessages;
94
250
 
95
- export { WrFormError, WrFormField, WrFormItem };
251
+ export { WR_FORM_ERRORS, WR_FORM_ERROR_FALLBACKS, WR_FORM_FIELD, WrFormError, WrFormField, WrFormItem, provideWrFormErrors };
252
+ export type { WrFormErrorContext, WrFormErrorMessage, WrFormErrorMessages, WrFormFieldContext };
@@ -64,6 +64,14 @@ declare class WrFuzzyText {
64
64
  private readonly isBrowser;
65
65
  private readonly platform;
66
66
  private teardown;
67
+ /**
68
+ * `init()` suspends on font loading, so the component can be destroyed while
69
+ * it is awaiting. At that moment `teardown` is still undefined, so the
70
+ * destroy hook has nothing to call — and everything the rest of `init()`
71
+ * starts (the rAF loop, the glitch timers, canvas listeners) would run for
72
+ * the life of the page. This flag lets the continuation bail out.
73
+ */
74
+ private destroyed;
67
75
  constructor();
68
76
  private init;
69
77
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrFuzzyText, never>;
@@ -13,6 +13,9 @@ import * as _angular_core from '@angular/core';
13
13
  * @see https://ngwr.dev/reference/components/gauge
14
14
  */
15
15
  declare class WrGauge {
16
+ /** Accessible name — the role needs one. Falls back to `gauge.label`. */
17
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
18
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
16
19
  readonly value: _angular_core.InputSignal<number>;
17
20
  readonly min: _angular_core.InputSignalWithTransform<number, unknown>;
18
21
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -33,7 +36,7 @@ declare class WrGauge {
33
36
  protected readonly valuePath: _angular_core.Signal<string>;
34
37
  protected readonly viewBox = "0 0 100 56";
35
38
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrGauge, never>;
36
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrGauge, "wr-gauge", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "valueColor": { "alias": "valueColor"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
39
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrGauge, "wr-gauge", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "valueColor": { "alias": "valueColor"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
37
40
  }
38
41
 
39
42
  export { WrGauge };
@@ -190,6 +190,21 @@ declare class WrTDirective {
190
190
  interface WrI18nLoader {
191
191
  load(locale: string, scope: string | null): Observable<WrI18nCatalog>;
192
192
  }
193
+ /**
194
+ * The active loader.
195
+ *
196
+ * Defaults to one that serves an empty catalog, which is what makes
197
+ * `provideWrI18n()` genuinely optional: every ngwr component routes its
198
+ * built-in strings through `useI18nText` / `readI18nText`, those inject
199
+ * `WrI18n` optionally — and because `WrI18n` is `providedIn: 'root'`, an
200
+ * optional inject still CONSTRUCTS it. Without a default here that construction
201
+ * threw `NG0201: No provider found for WR_I18N_LOADER`, so an app that had
202
+ * simply not configured i18n could not render `<wr-alert>` at all.
203
+ *
204
+ * With the empty catalog, every lookup misses, `t()` hands back the key, and
205
+ * the helpers fall through to the component's own English default — the
206
+ * documented no-i18n behaviour.
207
+ */
193
208
  declare const WR_I18N_LOADER: InjectionToken<WrI18nLoader>;
194
209
 
195
210
  /**
@@ -44,6 +44,13 @@ declare class WrInputNumber implements FormValueControl<number | null> {
44
44
  readonly suffix: _angular_core.InputSignal<string>;
45
45
  /** Placeholder shown when the input is empty. */
46
46
  readonly placeholder: _angular_core.InputSignal<string>;
47
+ /**
48
+ * Accessible name for the field. Falls back to the placeholder — inside a
49
+ * `<wr-form-field>` the projected `wrInput` picks up the label's id and needs
50
+ * neither, but standalone the text field has no name at all.
51
+ */
52
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
53
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
47
54
  /** Disable interaction. @default false */
48
55
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
49
56
  /** Read-only — values cannot be changed (steppers + typing disabled). @default false */
@@ -77,7 +84,7 @@ declare class WrInputNumber implements FormValueControl<number | null> {
77
84
  /** Format a value using `Intl.NumberFormat` for the active locale. */
78
85
  private format;
79
86
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputNumber, never>;
80
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputNumber, "wr-input-number", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "showSteppers": { "alias": "showSteppers"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
87
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputNumber, "wr-input-number", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "showSteppers": { "alias": "showSteppers"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
81
88
  }
82
89
 
83
90
  export { WrInputNumber };
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
 
3
3
  /**
4
4
  * @license
@@ -7,7 +7,7 @@ import * as i0 from '@angular/core';
7
7
  * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
8
8
  */
9
9
  /**
10
- * Native input `type` values supported by `<wr-input>`.
10
+ * Native input `type` values supported by ``input[wrInput]``.
11
11
  */
12
12
  type WrInputType = 'text' | 'number' | 'password' | 'email' | 'search' | 'tel' | 'url';
13
13
 
@@ -42,16 +42,40 @@ type WrInputSize = 'sm' | 'md' | 'lg';
42
42
  * @see https://ngwr.dev/reference/components/input
43
43
  */
44
44
  declare class WrInput {
45
+ private readonly host;
46
+ private readonly field;
47
+ /**
48
+ * Read once, at construction: a static `id=""` in the template is already on
49
+ * the element by the time a directive is instantiated, and it must win over
50
+ * the field's generated one.
51
+ */
52
+ private readonly ownId;
53
+ /**
54
+ * Adopts the surrounding `<wr-form-field>`'s `controlId`, so the label it
55
+ * already rendered actually points at this element. Without this the `for`
56
+ * referenced an id that existed nowhere and the input had no label at all.
57
+ */
58
+ protected readonly resolvedId: _angular_core.Signal<string | null>;
59
+ /**
60
+ * Announced state, taken from the surrounding `<wr-form-field>`.
61
+ *
62
+ * The field renders the message but cannot reach the projected control, so
63
+ * the control reads back: without this the error is visible on screen and
64
+ * invisible to a screen reader, which never learns the field is invalid or
65
+ * what the message says.
66
+ */
67
+ protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
68
+ protected readonly describedBy: _angular_core.Signal<string | null>;
45
69
  /**
46
70
  * Control size. Named `wrSize` (not `size`) so it never clashes with the
47
71
  * native `<input size>` attribute. @default 'md'
48
72
  */
49
- readonly wrSize: i0.InputSignal<WrInputSize>;
73
+ readonly wrSize: _angular_core.InputSignal<WrInputSize>;
50
74
  /** Pill-shaped corners. @default false */
51
- readonly rounded: i0.InputSignalWithTransform<boolean, any>;
52
- protected readonly classes: i0.Signal<string>;
53
- static ɵfac: i0.ɵɵFactoryDeclaration<WrInput, never>;
54
- static ɵdir: i0.ɵɵDirectiveDeclaration<WrInput, "input[wrInput], textarea[wrInput]", never, { "wrSize": { "alias": "wrSize"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
75
+ readonly rounded: _angular_core.InputSignalWithTransform<boolean, any>;
76
+ protected readonly classes: _angular_core.Signal<string>;
77
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInput, never>;
78
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrInput, "input[wrInput], textarea[wrInput]", never, { "wrSize": { "alias": "wrSize"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
55
79
  }
56
80
 
57
81
  /**
@@ -68,8 +92,8 @@ declare class WrInput {
68
92
  * ```
69
93
  */
70
94
  declare class WrInputPrefix {
71
- static ɵfac: i0.ɵɵFactoryDeclaration<WrInputPrefix, never>;
72
- static ɵdir: i0.ɵɵDirectiveDeclaration<WrInputPrefix, "[wrInputPrefix]", never, {}, {}, never, never, true, never>;
95
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputPrefix, never>;
96
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrInputPrefix, "[wrInputPrefix]", never, {}, {}, never, never, true, never>;
73
97
  }
74
98
 
75
99
  /**
@@ -86,8 +110,8 @@ declare class WrInputPrefix {
86
110
  * ```
87
111
  */
88
112
  declare class WrInputSuffix {
89
- static ɵfac: i0.ɵɵFactoryDeclaration<WrInputSuffix, never>;
90
- static ɵdir: i0.ɵɵDirectiveDeclaration<WrInputSuffix, "[wrInputSuffix]", never, {}, {}, never, never, true, never>;
113
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputSuffix, never>;
114
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrInputSuffix, "[wrInputSuffix]", never, {}, {}, never, never, true, never>;
91
115
  }
92
116
 
93
117
  /**
@@ -112,10 +136,10 @@ declare class WrInputSuffix {
112
136
  */
113
137
  declare class WrInputGroup {
114
138
  /** Pill-shaped corners. @default false */
115
- readonly rounded: i0.InputSignalWithTransform<boolean, any>;
116
- protected readonly classes: i0.Signal<string>;
117
- static ɵfac: i0.ɵɵFactoryDeclaration<WrInputGroup, never>;
118
- static ɵcmp: i0.ɵɵComponentDeclaration<WrInputGroup, "wr-input-group", never, { "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
139
+ readonly rounded: _angular_core.InputSignalWithTransform<boolean, any>;
140
+ protected readonly classes: _angular_core.Signal<string>;
141
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputGroup, never>;
142
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputGroup, "wr-input-group", never, { "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
119
143
  }
120
144
 
121
145
  /**
@@ -133,12 +157,18 @@ declare class WrInputGroup {
133
157
  */
134
158
  declare class WrPasswordToggle {
135
159
  /** Reference to the linked password input. */
136
- readonly for: i0.InputSignal<HTMLInputElement>;
137
- protected readonly revealed: i0.WritableSignal<boolean>;
138
- protected readonly ariaLabel: i0.Signal<"Hide password" | "Show password">;
160
+ readonly for: _angular_core.InputSignal<HTMLInputElement>;
161
+ protected readonly revealed: _angular_core.WritableSignal<boolean>;
162
+ /** Accessible name while the password is hidden. Falls back to `input.showPassword`. */
163
+ readonly showLabel: _angular_core.InputSignal<string | null>;
164
+ /** Accessible name while the password is revealed. Falls back to `input.hidePassword`. */
165
+ readonly hideLabel: _angular_core.InputSignal<string | null>;
166
+ private readonly resolvedShowLabel;
167
+ private readonly resolvedHideLabel;
168
+ protected readonly ariaLabel: _angular_core.Signal<string>;
139
169
  protected toggle(): void;
140
- static ɵfac: i0.ɵɵFactoryDeclaration<WrPasswordToggle, never>;
141
- static ɵcmp: i0.ɵɵComponentDeclaration<WrPasswordToggle, "wr-password-toggle", never, { "for": { "alias": "for"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
170
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrPasswordToggle, never>;
171
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrPasswordToggle, "wr-password-toggle", never, { "for": { "alias": "for"; "required": true; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
142
172
  }
143
173
 
144
174
  export { WrInput, WrInputGroup, WrInputPrefix, WrInputSuffix, WrPasswordToggle };
@@ -21,6 +21,9 @@ import { FormValueControl } from '@angular/forms/signals';
21
21
  * @see https://ngwr.dev/reference/components/knob
22
22
  */
23
23
  declare class WrKnob implements FormValueControl<number> {
24
+ /** Accessible name — the role needs one. Falls back to `knob.label`. */
25
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
26
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
24
27
  /** Minimum allowed value. @default 0 */
25
28
  readonly min: _angular_core.InputSignalWithTransform<number | undefined, unknown>;
26
29
  /** Maximum allowed value. @default 100 */
@@ -76,7 +79,7 @@ declare class WrKnob implements FormValueControl<number> {
76
79
  private commit;
77
80
  private arcPath;
78
81
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrKnob, never>;
79
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrKnob, "wr-knob", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "valueColor": { "alias": "valueColor"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "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
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrKnob, "wr-knob", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "valueColor": { "alias": "valueColor"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "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>;
80
83
  }
81
84
 
82
85
  export { WrKnob };
@@ -19,6 +19,9 @@ import { TemplateRef } from '@angular/core';
19
19
  * @see https://ngwr.dev/reference/components/lightbox
20
20
  */
21
21
  declare class WrLightbox {
22
+ /** Accessible name. Falls back to `image.close`, then `'Close preview'`. */
23
+ readonly closeLabel: _angular_core.InputSignal<string | null>;
24
+ protected readonly resolvedCloseLabel: _angular_core.Signal<string>;
22
25
  /** Image source. */
23
26
  readonly src: _angular_core.InputSignal<string>;
24
27
  /** Alt text. Required for a11y; falls back to an empty string. @default '' */
@@ -44,6 +47,9 @@ declare class WrLightbox {
44
47
  private readonly overlay;
45
48
  private readonly vcr;
46
49
  private readonly destroyRef;
50
+ private readonly focusTrapFactory;
51
+ private focusTrap;
52
+ private previouslyFocused;
47
53
  private overlayRef;
48
54
  constructor();
49
55
  protected onClick(): void;
@@ -57,7 +63,7 @@ declare class WrLightbox {
57
63
  private openOverlay;
58
64
  private closeOverlay;
59
65
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrLightbox, never>;
60
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrLightbox, "wr-lightbox", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "preview": { "alias": "preview"; "required": false; "isSignal": true; }; "disablePreview": { "alias": "disablePreview"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
66
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrLightbox, "wr-lightbox", never, { "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "preview": { "alias": "preview"; "required": false; "isSignal": true; }; "disablePreview": { "alias": "disablePreview"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
61
67
  }
62
68
 
63
69
  export { WrLightbox };
@@ -12,7 +12,7 @@ interface WrLineSeries {
12
12
  *
13
13
  * @example
14
14
  * ```html
15
- * <wr-lineChart
15
+ * <wr-line-chart
16
16
  * [series]="[
17
17
  * { label: 'Visits', data: [12, 18, 9, 22, 30, 27, 35] },
18
18
  * { label: 'Signups', data: [3, 5, 4, 8, 11, 9, 14], color: 'var(--wr-color-success)' }
@@ -3,7 +3,7 @@ import { InjectionToken, Signal, EnvironmentProviders } from '@angular/core';
3
3
  import * as ngwr_media from 'ngwr/media';
4
4
 
5
5
  /** Named breakpoint identifiers — match the SCSS `_breakpoints.scss` keys. */
6
- type WrBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
6
+ type WrBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'xga' | 'fhd' | 'rt';
7
7
  /** Map of breakpoint → minimum viewport width in pixels. */
8
8
  type WrBreakpointMap = Readonly<Record<WrBreakpoint, number>>;
9
9
 
@@ -35,6 +35,9 @@ interface WrMeterSegment {
35
35
  * @see https://ngwr.dev/reference/components/meter-group
36
36
  */
37
37
  declare class WrMeterGroup {
38
+ /** Accessible name — the role needs one. Falls back to `meterGroup.label`. */
39
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
40
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
38
41
  readonly segments: _angular_core.InputSignal<readonly WrMeterSegment[]>;
39
42
  /** Explicit total. When `0` (default), `max = sum(values)`. @default 0 */
40
43
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -43,6 +46,11 @@ declare class WrMeterGroup {
43
46
  /** Show each segment's percent value in the legend. @default true */
44
47
  readonly showValues: _angular_core.InputSignalWithTransform<boolean, any>;
45
48
  protected readonly resolvedMax: _angular_core.Signal<number>;
49
+ /**
50
+ * Sum of the segments, for `aria-valuenow`. `role="progressbar"` without it
51
+ * announces no value at all, so the bar was invisible to assistive tech.
52
+ */
53
+ protected readonly totalValue: _angular_core.Signal<number>;
46
54
  protected readonly slices: _angular_core.Signal<{
47
55
  label: string;
48
56
  value: number;
@@ -50,7 +58,7 @@ declare class WrMeterGroup {
50
58
  percent: number;
51
59
  }[]>;
52
60
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrMeterGroup, never>;
53
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrMeterGroup, "wr-meter-group", never, { "segments": { "alias": "segments"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "showValues": { "alias": "showValues"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
61
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrMeterGroup, "wr-meter-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "segments": { "alias": "segments"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "showValues": { "alias": "showValues"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
54
62
  }
55
63
 
56
64
  export { WrMeterGroup };
@@ -11,8 +11,8 @@ import * as _angular_core from '@angular/core';
11
11
  * <wr-page-header title="Settings" subtitle="Manage your workspace">
12
12
  * <nav wrPageHeaderBreadcrumbs>…</nav>
13
13
  * <div wrPageHeaderActions>
14
- * <button wrButton>Invite</button>
15
- * <button wrButton color="primary">Save</button>
14
+ * <button wr-btn>Invite</button>
15
+ * <button wr-btn color="primary">Save</button>
16
16
  * </div>
17
17
  * <div wrPageHeaderExtra>
18
18
  * <wr-tag>v2.4</wr-tag>
@@ -129,4 +129,4 @@ declare class WrPagination {
129
129
  }
130
130
 
131
131
  export { WrPagination };
132
- export type { WrPaginationAlign };
132
+ export type { WrPaginationAlign, WrPaginationShape, WrPaginationSize };
@@ -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. */