ngwr 7.0.0 → 7.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 (170) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -4
  3. package/alert/styles/_index.scss +2 -0
  4. package/back-top/styles/_index.scss +4 -2
  5. package/burger/styles/_index.scss +101 -0
  6. package/cascader/styles/_index.scss +16 -0
  7. package/command-palette/styles/_index.scss +28 -0
  8. package/descriptions/styles/_index.scss +59 -0
  9. package/dialog/styles/_index.scss +2 -0
  10. package/dropdown/styles/_index.scss +1 -0
  11. package/fesm2022/ngwr-affix.mjs +3 -3
  12. package/fesm2022/ngwr-alert.mjs +3 -3
  13. package/fesm2022/ngwr-anchor.mjs +3 -3
  14. package/fesm2022/ngwr-aurora.mjs +3 -3
  15. package/fesm2022/ngwr-avatar.mjs +3 -3
  16. package/fesm2022/ngwr-back-top.mjs +3 -3
  17. package/fesm2022/ngwr-badge.mjs +6 -6
  18. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  19. package/fesm2022/ngwr-blur-text.mjs +3 -3
  20. package/fesm2022/ngwr-border-glow.mjs +3 -3
  21. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  22. package/fesm2022/ngwr-burger.mjs +60 -0
  23. package/fesm2022/ngwr-burger.mjs.map +1 -0
  24. package/fesm2022/ngwr-button.mjs +6 -6
  25. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  26. package/fesm2022/ngwr-calendar.mjs +3 -3
  27. package/fesm2022/ngwr-card.mjs +9 -9
  28. package/fesm2022/ngwr-carousel.mjs +6 -6
  29. package/fesm2022/ngwr-cascader.mjs +5 -5
  30. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  31. package/fesm2022/ngwr-checkbox.mjs +6 -6
  32. package/fesm2022/ngwr-circular-text.mjs +3 -3
  33. package/fesm2022/ngwr-click-spark.mjs +3 -3
  34. package/fesm2022/ngwr-clipboard.mjs +3 -3
  35. package/fesm2022/ngwr-collapse.mjs +9 -9
  36. package/fesm2022/ngwr-color-picker.mjs +6 -6
  37. package/fesm2022/ngwr-command-palette.mjs +19 -5
  38. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  39. package/fesm2022/ngwr-compare.mjs +3 -3
  40. package/fesm2022/ngwr-confetti.mjs +3 -3
  41. package/fesm2022/ngwr-context-menu.mjs +12 -12
  42. package/fesm2022/ngwr-cookie.mjs +3 -3
  43. package/fesm2022/ngwr-counter.mjs +6 -6
  44. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  45. package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
  46. package/fesm2022/ngwr-date-adapter.mjs +3 -3
  47. package/fesm2022/ngwr-date-picker.mjs +9 -9
  48. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  49. package/fesm2022/ngwr-density.mjs +6 -6
  50. package/fesm2022/ngwr-descriptions.mjs +16 -7
  51. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  52. package/fesm2022/ngwr-dialog.mjs +26 -19
  53. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  54. package/fesm2022/ngwr-directives.mjs +15 -15
  55. package/fesm2022/ngwr-divider.mjs +3 -3
  56. package/fesm2022/ngwr-donut-chart.mjs +3 -3
  57. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  58. package/fesm2022/ngwr-drawer.mjs +15 -15
  59. package/fesm2022/ngwr-dropdown.mjs +43 -19
  60. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  61. package/fesm2022/ngwr-empty.mjs +3 -3
  62. package/fesm2022/ngwr-falling-text.mjs +3 -3
  63. package/fesm2022/ngwr-file-upload.mjs +3 -3
  64. package/fesm2022/ngwr-form.mjs +9 -9
  65. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  66. package/fesm2022/ngwr-gauge.mjs +3 -3
  67. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  68. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  69. package/fesm2022/ngwr-hotkey.mjs +6 -6
  70. package/fesm2022/ngwr-i18n.mjs +9 -9
  71. package/fesm2022/ngwr-icon.mjs +3 -3
  72. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  73. package/fesm2022/ngwr-input-number.mjs +3 -3
  74. package/fesm2022/ngwr-input-otp.mjs +3 -3
  75. package/fesm2022/ngwr-input.mjs +15 -15
  76. package/fesm2022/ngwr-keyboard.mjs +3 -3
  77. package/fesm2022/ngwr-knob.mjs +3 -3
  78. package/fesm2022/ngwr-layout.mjs +15 -15
  79. package/fesm2022/ngwr-lightbox.mjs +4 -4
  80. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  81. package/fesm2022/ngwr-line-chart.mjs +3 -3
  82. package/fesm2022/ngwr-list.mjs +6 -6
  83. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  84. package/fesm2022/ngwr-marquee.mjs +3 -3
  85. package/fesm2022/ngwr-media.mjs +3 -3
  86. package/fesm2022/ngwr-mention.mjs +6 -6
  87. package/fesm2022/ngwr-meta.mjs +64 -7
  88. package/fesm2022/ngwr-meta.mjs.map +1 -1
  89. package/fesm2022/ngwr-meter-group.mjs +3 -3
  90. package/fesm2022/ngwr-overlay.mjs +73 -4
  91. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  92. package/fesm2022/ngwr-page-header.mjs +13 -5
  93. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  94. package/fesm2022/ngwr-pagination.mjs +3 -3
  95. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  96. package/fesm2022/ngwr-pipes.mjs +21 -21
  97. package/fesm2022/ngwr-platform.mjs +3 -3
  98. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  99. package/fesm2022/ngwr-popover.mjs +45 -15
  100. package/fesm2022/ngwr-popover.mjs.map +1 -1
  101. package/fesm2022/ngwr-progress.mjs +3 -3
  102. package/fesm2022/ngwr-qr.mjs +3 -3
  103. package/fesm2022/ngwr-radio.mjs +6 -6
  104. package/fesm2022/ngwr-rating.mjs +3 -3
  105. package/fesm2022/ngwr-result.mjs +12 -12
  106. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  107. package/fesm2022/ngwr-scramble-text.mjs +3 -3
  108. package/fesm2022/ngwr-scroll.mjs +3 -3
  109. package/fesm2022/ngwr-segmented.mjs +3 -3
  110. package/fesm2022/ngwr-select.mjs +43 -22
  111. package/fesm2022/ngwr-select.mjs.map +1 -1
  112. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  113. package/fesm2022/ngwr-sidebar.mjs +3 -3
  114. package/fesm2022/ngwr-skeleton.mjs +3 -3
  115. package/fesm2022/ngwr-slider.mjs +3 -3
  116. package/fesm2022/ngwr-sparkline.mjs +3 -3
  117. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  118. package/fesm2022/ngwr-spinner.mjs +3 -3
  119. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  120. package/fesm2022/ngwr-split-text.mjs +3 -3
  121. package/fesm2022/ngwr-splitter.mjs +3 -3
  122. package/fesm2022/ngwr-spotlight-card.mjs +6 -6
  123. package/fesm2022/ngwr-squircle.mjs +6 -6
  124. package/fesm2022/ngwr-star-border.mjs +3 -3
  125. package/fesm2022/ngwr-statistic.mjs +6 -6
  126. package/fesm2022/ngwr-stepper.mjs +16 -7
  127. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  128. package/fesm2022/ngwr-storage.mjs +3 -3
  129. package/fesm2022/ngwr-switch.mjs +3 -3
  130. package/fesm2022/ngwr-table.mjs +12 -12
  131. package/fesm2022/ngwr-table.mjs.map +1 -1
  132. package/fesm2022/ngwr-tabs.mjs +6 -6
  133. package/fesm2022/ngwr-textarea.mjs +3 -3
  134. package/fesm2022/ngwr-theme.mjs +3 -3
  135. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  136. package/fesm2022/ngwr-timeline.mjs +6 -6
  137. package/fesm2022/ngwr-toast.mjs +9 -9
  138. package/fesm2022/ngwr-toolbar.mjs +3 -3
  139. package/fesm2022/ngwr-tree.mjs +3 -3
  140. package/fesm2022/ngwr-typewriter.mjs +3 -3
  141. package/fesm2022/ngwr-typography.mjs +3 -3
  142. package/fesm2022/ngwr-version.mjs +1 -1
  143. package/fesm2022/ngwr-version.mjs.map +1 -1
  144. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  145. package/fesm2022/ngwr-waves.mjs +3 -3
  146. package/fesm2022/ngwr-window.mjs +12 -12
  147. package/lightbox/styles/_index.scss +2 -0
  148. package/overlay/styles/_index.scss +31 -0
  149. package/package.json +11 -5
  150. package/page-header/styles/_index.scss +16 -0
  151. package/popover/styles/_index.scss +17 -0
  152. package/schematics/use/symbol-map.json +1 -0
  153. package/select/styles/_index.scss +27 -0
  154. package/stepper/styles/_index.scss +30 -0
  155. package/styles.scss +2 -0
  156. package/theme/styles/_mixins.scss +47 -0
  157. package/toast/styles/_index.scss +30 -1
  158. package/tree/styles/_index.scss +15 -0
  159. package/types/ngwr-burger.d.ts +36 -0
  160. package/types/ngwr-command-palette.d.ts +13 -1
  161. package/types/ngwr-descriptions.d.ts +8 -1
  162. package/types/ngwr-dialog.d.ts +7 -0
  163. package/types/ngwr-dropdown.d.ts +10 -1
  164. package/types/ngwr-meta.d.ts +24 -0
  165. package/types/ngwr-overlay.d.ts +69 -1
  166. package/types/ngwr-page-header.d.ts +8 -1
  167. package/types/ngwr-popover.d.ts +11 -2
  168. package/types/ngwr-select.d.ts +10 -1
  169. package/types/ngwr-stepper.d.ts +8 -1
  170. package/types/ngwr-version.d.ts +1 -1
@@ -14,6 +14,13 @@
14
14
  gap: 1rem;
15
15
  font-family: var(--wr-font-family-base);
16
16
 
17
+ // Opt-in (`responsive`): query the box's own width so a horizontal stepper
18
+ // can drop to vertical when its column is too narrow. The host is already
19
+ // full-width, so containment is safe here.
20
+ &--responsive {
21
+ container: wr-stepper / inline-size;
22
+ }
23
+
17
24
  &__headers {
18
25
  list-style: none;
19
26
  margin: 0;
@@ -151,6 +158,29 @@
151
158
  }
152
159
  }
153
160
 
161
+ // Responsive horizontal steppers fall back to the vertical layout when their
162
+ // own box is too narrow for the row — mirrors the `--vertical` rules above,
163
+ // scoped to responsive steppers that aren't already vertical.
164
+ @container wr-stepper (max-width: 32rem) {
165
+ .wr-stepper--responsive:not(.wr-stepper--vertical) .wr-stepper__headers {
166
+ flex-direction: column;
167
+ }
168
+
169
+ .wr-stepper--responsive:not(.wr-stepper--vertical) .wr-stepper__header {
170
+ align-items: stretch;
171
+ flex: 0 0 auto;
172
+ }
173
+
174
+ .wr-stepper--responsive:not(.wr-stepper--vertical) .wr-stepper__connector {
175
+ width: 1.5px;
176
+ min-height: 1.25rem;
177
+ height: auto;
178
+ margin: 0.25rem 0 0.25rem calc(var(--wr-stepper-indicator-size) / 2);
179
+ align-self: stretch;
180
+ flex: 0 0 auto;
181
+ }
182
+ }
183
+
154
184
  // `<wr-step>` itself — visibility is driven by an `--active` class
155
185
  // the stepper toggles via host binding.
156
186
  .wr-step {
package/styles.scss CHANGED
@@ -27,6 +27,7 @@
27
27
  @forward './blur-text/styles';
28
28
  @forward './border-glow/styles';
29
29
  @forward './breadcrumbs/styles';
30
+ @forward './burger/styles';
30
31
  @forward './button/styles';
31
32
  @forward './calendar/styles';
32
33
  @forward './calendar-heatmap/styles';
@@ -73,6 +74,7 @@
73
74
  @forward './marquee/styles';
74
75
  @forward './mention/styles';
75
76
  @forward './meter-group/styles';
77
+ @forward './overlay/styles';
76
78
  @forward './page-header/styles';
77
79
  @forward './pagination/styles';
78
80
  @forward './popconfirm/styles';
@@ -55,3 +55,50 @@
55
55
  border-radius: calc(#{$br} * 1.85);
56
56
  }
57
57
  }
58
+
59
+ /// Expand a small control's touch hit area to a comfortable minimum on
60
+ /// coarse (touch) pointers, without changing how it looks. Lays an
61
+ /// invisible, centred `::after` over the control that's at least `$size`
62
+ /// square; taps on the slack still land on the host. Fine-pointer
63
+ /// (mouse / trackpad) layouts are left exactly as-is, so dense desktop
64
+ /// UIs keep their tight targets.
65
+ ///
66
+ /// Use on small icon-only controls — close (×) buttons, chip removes,
67
+ /// tree / cascader toggles — where the visible glyph is well under the
68
+ /// ~44px comfortable tap size. Skip controls that are already tall
69
+ /// enough, and avoid it on tightly-packed rows where a 44px slack would
70
+ /// overlap a neighbouring target.
71
+ ///
72
+ /// The pseudo is absolutely positioned, so the host must be a containing
73
+ /// block. For the common static control the mixin sets `position:
74
+ /// relative` for you; pass `$positioned: true` when the host is already
75
+ /// `absolute` / `fixed` / `relative` so the mixin doesn't downgrade its
76
+ /// positioning under the media query.
77
+ ///
78
+ /// @param {Length} $size [44px] - Minimum hit-area edge (Apple HIG).
79
+ /// @param {Bool} $positioned [false] - Set true if the host already
80
+ /// establishes a positioning context (skips `position: relative`).
81
+ ///
82
+ /// @example scss
83
+ /// .wr-alert__close {
84
+ /// @include touch-target;
85
+ /// }
86
+ @mixin touch-target($size: 44px, $positioned: false) {
87
+ @media (pointer: coarse) {
88
+ @if not $positioned {
89
+ position: relative;
90
+ }
91
+
92
+ &::after {
93
+ content: '';
94
+ position: absolute;
95
+ top: 50%;
96
+ left: 50%;
97
+ width: 100%;
98
+ height: 100%;
99
+ min-width: $size;
100
+ min-height: $size;
101
+ transform: translate(-50%, -50%);
102
+ }
103
+ }
104
+ }
@@ -20,7 +20,11 @@ $toast-colors: (
20
20
  display: flex;
21
21
  flex-direction: column;
22
22
  gap: 0.5rem;
23
- padding: 1rem;
23
+ // Safe-area: fold each inset into the matching padding side so toasts clear
24
+ // notches / the home indicator / rounded corners on mobile, whichever edge
25
+ // the host is anchored to. env() is 0 without insets, so desktop stays 1rem.
26
+ padding: calc(1rem + env(safe-area-inset-top)) calc(1rem + env(safe-area-inset-right))
27
+ calc(1rem + env(safe-area-inset-bottom)) calc(1rem + env(safe-area-inset-left));
24
28
  pointer-events: none;
25
29
  max-width: 22rem;
26
30
  width: 100%;
@@ -261,3 +265,28 @@ $toast-colors: (
261
265
  order: 99;
262
266
  align-self: stretch;
263
267
  }
268
+
269
+ // Touch pointers: grow the per-toast action buttons (copy / dismiss) to ~32px
270
+ // with a wider gap so the pair no longer sits 2px apart, and give the
271
+ // dismiss-all bar a taller hit area. Fine pointers keep the compact desktop
272
+ // sizing above.
273
+ @media (pointer: coarse) {
274
+ .wr-toast__actions {
275
+ gap: 0.25rem;
276
+ }
277
+
278
+ .wr-toast__action {
279
+ display: inline-flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ width: 2rem;
283
+ height: 2rem;
284
+ padding: 0;
285
+ --wr-icon-size: 1.125rem;
286
+ }
287
+
288
+ .wr-toast-host__close-all {
289
+ padding-top: 0.75rem;
290
+ padding-bottom: 0.75rem;
291
+ }
292
+ }
@@ -269,3 +269,18 @@
269
269
  max-height: var(--wr-tree-panel-max-height, 18rem);
270
270
  overflow-y: auto;
271
271
  }
272
+
273
+ // Touch pointers: taller rows (~44px) and a larger expand/collapse toggle so
274
+ // both the row and its toggle are comfortable tap targets. Fine pointers keep
275
+ // the compact desktop rows above.
276
+ @media (pointer: coarse) {
277
+ .wr-tree__row {
278
+ padding-top: 0.5rem;
279
+ padding-bottom: 0.5rem;
280
+ }
281
+
282
+ .wr-tree__toggle {
283
+ width: 1.75rem;
284
+ height: 1.75rem;
285
+ }
286
+ }
@@ -0,0 +1,36 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /**
4
+ * Animated menu toggle — three SVG strokes morph between a hamburger and a
5
+ * close mark on `open`. Two-way bindable, so it pairs naturally with a
6
+ * `<wr-drawer>` or any disclosure.
7
+ *
8
+ * The morph is pure CSS (`stroke-dasharray` / `stroke-dashoffset` tweens),
9
+ * so it stays smooth without JS and collapses to its end state under
10
+ * `prefers-reduced-motion`.
11
+ *
12
+ * @example Toggle a drawer
13
+ * ```html
14
+ * <wr-burger [(open)]="menuOpen" />
15
+ * <wr-drawer [(open)]="menuOpen" position="right">…</wr-drawer>
16
+ * ```
17
+ *
18
+ * @see https://ngwr.dev/components/burger
19
+ */
20
+ declare class WrBurger {
21
+ /** Two-way bindable open state. Drives the hamburger ↔ close morph. @default false */
22
+ readonly open: _angular_core.ModelSignal<boolean>;
23
+ /** Accessible label for the toggle button. @default 'Toggle menu' */
24
+ readonly label: _angular_core.InputSignal<string>;
25
+ /** Disable the toggle. @default false */
26
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
27
+ protected readonly classes: _angular_core.Signal<{
28
+ 'wr-burger': boolean;
29
+ 'wr-burger--opened': boolean;
30
+ }>;
31
+ protected toggle(): void;
32
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrBurger, never>;
33
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrBurger, "wr-burger", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, never, true, never>;
34
+ }
35
+
36
+ export { WrBurger };
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
+ import { BooleanInput } from '@angular/cdk/coercion';
3
4
  import { WrIconName } from 'ngwr/icon';
4
5
 
5
6
  /**
@@ -69,10 +70,20 @@ declare class WrCommandPalette {
69
70
  protected readonly resolvedEmpty: _angular_core.Signal<string>;
70
71
  /** Auto-close on `(picked)`. Set false to keep open. @default true */
71
72
  readonly closeOnPick: _angular_core.InputSignalWithTransform<boolean, any>;
73
+ /**
74
+ * Present the palette full-screen on small viewports instead of a centred
75
+ * modal. `undefined` follows the app-wide `provideWrResponsiveOverlays()`
76
+ * setting; `true`/`false` overrides it. The palette docks to the top (it
77
+ * auto-focuses its input, so the on-screen keyboard stays clear).
78
+ * @default undefined
79
+ */
80
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean | undefined, BooleanInput>;
72
81
  /** Fires when the user commits an item (Enter / click). */
73
82
  readonly picked: _angular_core.OutputEmitterRef<WrCommandItem>;
74
83
  protected readonly query: _angular_core.WritableSignal<string>;
75
84
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
85
+ /** Whether the current opening is presented full-screen. Decided on open. */
86
+ protected readonly presentAsSheet: _angular_core.WritableSignal<boolean>;
76
87
  protected readonly inputEl: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
77
88
  protected readonly panelEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
78
89
  /** Listbox id (referenced by the input's `aria-controls`). */
@@ -82,6 +93,7 @@ declare class WrCommandPalette {
82
93
  /** Id of the active option for `aria-activedescendant`. */
83
94
  protected readonly activeOptionId: _angular_core.Signal<string | null>;
84
95
  private readonly hotkeys;
96
+ private readonly responsiveConfig;
85
97
  private readonly destroyRef;
86
98
  private readonly focusTrapFactory;
87
99
  private readonly isBrowser;
@@ -106,7 +118,7 @@ declare class WrCommandPalette {
106
118
  close(): void;
107
119
  private commit;
108
120
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrCommandPalette, never>;
109
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCommandPalette, "wr-command-palette", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "closeOnPick": { "alias": "closeOnPick"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; }, never, never, true, never>;
121
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCommandPalette, "wr-command-palette", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "closeOnPick": { "alias": "closeOnPick"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; }, never, never, true, never>;
110
122
  }
111
123
 
112
124
  export { WrCommandPalette };
@@ -23,9 +23,16 @@ declare class WrDescriptions {
23
23
  readonly inline: _angular_core.InputSignalWithTransform<boolean, any>;
24
24
  /** Add visible borders around each row. @default false */
25
25
  readonly bordered: _angular_core.InputSignalWithTransform<boolean, any>;
26
+ /**
27
+ * Reflow `inline` rows back to a stacked layout when the box itself is
28
+ * narrow (a container query on its own width, not the viewport — so it
29
+ * adapts inside a narrow card or side panel). Makes the box fill its
30
+ * container's width. @default false
31
+ */
32
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean, any>;
26
33
  protected readonly classes: _angular_core.Signal<string>;
27
34
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDescriptions, never>;
28
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDescriptions, "wr-descriptions", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
35
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrDescriptions, "wr-descriptions", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
29
36
  }
30
37
 
31
38
  /**
@@ -66,6 +66,12 @@ interface WrDialogOptions<D = unknown> {
66
66
  readonly maxWidth?: string;
67
67
  /** Extra CSS class(es) added to the panel. */
68
68
  readonly panelClass?: string | readonly string[];
69
+ /**
70
+ * Present as a full-width bottom-sheet on small viewports instead of a
71
+ * centred modal. `undefined` follows the app-wide
72
+ * `provideWrResponsiveOverlays()` setting; `true`/`false` overrides it.
73
+ */
74
+ readonly responsive?: boolean;
69
75
  }
70
76
 
71
77
  /**
@@ -96,6 +102,7 @@ declare class WrDialog {
96
102
  private readonly parentInjector;
97
103
  private readonly focusTrapFactory;
98
104
  private readonly isBrowser;
105
+ private readonly responsiveConfig;
99
106
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, options?: WrDialogOptions<D>): WrDialogRef<C, R>;
100
107
  static ɵfac: i0.ɵɵFactoryDeclaration<WrDialog, never>;
101
108
  static ɵprov: i0.ɵɵInjectableDeclaration<WrDialog>;
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef } from '@angular/core';
3
+ import { BooleanInput } from '@angular/cdk/coercion';
3
4
 
4
5
  /**
5
6
  * Holds the menu content rendered when a {@link WrDropdown} opens.
@@ -59,12 +60,20 @@ declare class WrDropdown {
59
60
  readonly trigger: _angular_core.InputSignal<WrDropdownTrigger>;
60
61
  /** Where the menu anchors relative to the trigger. @default 'bottom-start' */
61
62
  readonly position: _angular_core.InputSignal<WrDropdownPosition>;
63
+ /**
64
+ * Present the menu as a full-width bottom-sheet on small viewports instead
65
+ * of an anchored panel. `undefined` follows the app-wide
66
+ * `provideWrResponsiveOverlays()` setting; `true`/`false` overrides it.
67
+ * @default undefined
68
+ */
69
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean | undefined, BooleanInput>;
62
70
  /** Fires after the menu opens. */
63
71
  readonly opened: _angular_core.OutputEmitterRef<void>;
64
72
  /** Fires after the menu closes. */
65
73
  readonly closed: _angular_core.OutputEmitterRef<void>;
66
74
  private readonly host;
67
75
  private readonly overlay;
76
+ private readonly responsiveConfig;
68
77
  private readonly vcr;
69
78
  private readonly scrollStrategies;
70
79
  private readonly destroyRef;
@@ -95,7 +104,7 @@ declare class WrDropdown {
95
104
  private focusItemAt;
96
105
  private readonly onOverlayMouseLeave;
97
106
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrDropdown, never>;
98
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrDropdown, "[wrDropdown]", never, { "menu": { "alias": "wrDropdown"; "required": true; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
107
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrDropdown, "[wrDropdown]", never, { "menu": { "alias": "wrDropdown"; "required": true; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
99
108
  }
100
109
 
101
110
  /**
@@ -73,6 +73,7 @@ declare class WrMeta {
73
73
  private readonly meta;
74
74
  private readonly doc;
75
75
  private readonly defaults;
76
+ private readonly injector;
76
77
  /** Stack of meta layers. Bottom = defaults, top = currently applied. */
77
78
  private readonly stack;
78
79
  /** Resolved (merged) metadata at the top of the stack. */
@@ -86,6 +87,29 @@ declare class WrMeta {
86
87
  set(config: WrMetaConfig): void;
87
88
  /** Push a new layer. Returns a handle whose `.pop()` removes it. */
88
89
  push(config: WrMetaConfig): WrMetaHandle;
90
+ /**
91
+ * Reactive layer. Runs `factory` inside an effect and re-applies the
92
+ * resolved metadata whenever any signal it reads changes — so a title
93
+ * (or any field) built from {@link WrI18n}'s `t()` updates live on
94
+ * locale switch, with no manual re-`set()`.
95
+ *
96
+ * Returns a handle whose `.pop()` removes the layer and stops the effect.
97
+ * Safe to call outside an injection context.
98
+ *
99
+ * @example Locale-aware title
100
+ * ```ts
101
+ * const meta = inject(WrMeta);
102
+ * const i18n = inject(WrI18n);
103
+ *
104
+ * // `i18n.t(...)` tracks the active locale, so the title re-renders
105
+ * // every time `i18n.use(...)` switches languages.
106
+ * meta.bind(() => ({
107
+ * title: i18n.t('home.title'),
108
+ * description: i18n.t('home.description'),
109
+ * }));
110
+ * ```
111
+ */
112
+ bind(factory: () => WrMetaConfig): WrMetaHandle;
89
113
  /** Pop the most recently pushed layer (defaults remain). */
90
114
  pop(): void;
91
115
  /** Clear all overrides, restore the defaults registered via `provideWrMeta`. */
@@ -68,6 +68,74 @@ declare class WrOverlayContainer extends OverlayContainer {
68
68
  */
69
69
  declare function provideWrOverlay(): EnvironmentProviders;
70
70
 
71
+ /**
72
+ * @license
73
+ *
74
+ * Use of this source code is governed by an MIT-style license that can be
75
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
76
+ */
77
+
78
+ /** Configuration for responsive (bottom-sheet) overlay presentation. */
79
+ interface WrResponsiveOverlaysConfig {
80
+ /**
81
+ * Viewport width (CSS px) at or below which overlays present as a
82
+ * bottom-sheet instead of a floating panel. @default 640
83
+ */
84
+ readonly breakpoint: number;
85
+ }
86
+ /**
87
+ * When set, overlay services (dialog, select, dropdown, …) present as a
88
+ * slide-up bottom-sheet on viewports at or below `breakpoint`. `null`
89
+ * (the default) keeps every overlay floating. Configure via
90
+ * {@link provideWrResponsiveOverlays}; override per call with a
91
+ * component's `responsive` option.
92
+ *
93
+ * @internal
94
+ */
95
+ declare const WR_RESPONSIVE_OVERLAYS: InjectionToken<WrResponsiveOverlaysConfig | null>;
96
+ /**
97
+ * Decide whether an overlay should present as a bottom-sheet for the
98
+ * current viewport.
99
+ *
100
+ * - `responsive === true` — sheet on small viewports regardless of config.
101
+ * - `responsive === false` — never a sheet.
102
+ * - `responsive === undefined` — follow the global config (sheet when
103
+ * {@link provideWrResponsiveOverlays} is configured).
104
+ *
105
+ * SSR-safe: returns `false` when there's no `window`.
106
+ *
107
+ * @internal
108
+ */
109
+ declare function wrPresentAsSheet(responsive: boolean | undefined, config: WrResponsiveOverlaysConfig | null): boolean;
110
+
111
+ /**
112
+ * @license
113
+ *
114
+ * Use of this source code is governed by an MIT-style license that can be
115
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
116
+ */
117
+
118
+ /**
119
+ * Opt every NGWR overlay into responsive presentation — on viewports at or
120
+ * below `breakpoint`, dialogs / selects / dropdowns and friends slide up as
121
+ * a full-width bottom-sheet instead of a floating panel. Built on the same
122
+ * overlay plumbing, so focus-trap, backdrop and scroll-blocking carry over.
123
+ *
124
+ * Individual components can still opt out (or in) per instance via their
125
+ * `responsive` option.
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * bootstrapApplication(AppComponent, {
130
+ * providers: [provideWrOverlay(), provideWrResponsiveOverlays()],
131
+ * });
132
+ *
133
+ * // Custom breakpoint:
134
+ * provideWrResponsiveOverlays({ breakpoint: 768 });
135
+ * ```
136
+ */
137
+ declare function provideWrResponsiveOverlays(config?: Partial<WrResponsiveOverlaysConfig>): EnvironmentProviders;
138
+
71
139
  /**
72
140
  * @license
73
141
  *
@@ -107,4 +175,4 @@ declare const WR_OVERLAY: InjectionToken<Overlay>;
107
175
  */
108
176
  declare const WR_OVERLAY_CONTAINER: InjectionToken<OverlayContainer>;
109
177
 
110
- export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WrOverlayContainer, provideWrOverlay };
178
+ export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, wrPresentAsSheet };
@@ -28,8 +28,15 @@ declare class WrPageHeader {
28
28
  readonly title: _angular_core.InputSignal<string>;
29
29
  /** Secondary line below the title. */
30
30
  readonly subtitle: _angular_core.InputSignal<string>;
31
+ /**
32
+ * Stack the title and actions vertically when the header's own box is too
33
+ * narrow to sit them side by side (a container query on its own width, not
34
+ * the viewport — so it adapts inside a narrow column or split pane).
35
+ * @default false
36
+ */
37
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean, any>;
31
38
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrPageHeader, never>;
32
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrPageHeader, "wr-page-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; }, {}, never, ["[wrPageHeaderBreadcrumbs]", "[wrPageHeaderActions]", "[wrPageHeaderExtra]"], true, never>;
39
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrPageHeader, "wr-page-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, {}, never, ["[wrPageHeaderBreadcrumbs]", "[wrPageHeaderActions]", "[wrPageHeaderExtra]"], true, never>;
33
40
  }
34
41
 
35
42
  export { WrPageHeader };
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef } from '@angular/core';
3
+ import { BooleanInput } from '@angular/cdk/coercion';
3
4
 
4
5
  /**
5
6
  * @license
@@ -8,7 +9,7 @@ import { TemplateRef } from '@angular/core';
8
9
  * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
9
10
  */
10
11
 
11
- type WrPopoverPosition = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right';
12
+ type WrPopoverPosition = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
12
13
 
13
14
  declare class WrPopover {
14
15
  /**
@@ -37,12 +38,20 @@ declare class WrPopover {
37
38
  readonly showDelay: _angular_core.InputSignalWithTransform<number, unknown>;
38
39
  /** Tooltip only — delay before hiding, in ms. @default 60 */
39
40
  readonly hideDelay: _angular_core.InputSignalWithTransform<number, unknown>;
41
+ /**
42
+ * Popover mode only — present the panel as a full-width bottom-sheet on
43
+ * small viewports instead of an anchored panel. `undefined` follows the
44
+ * app-wide `provideWrResponsiveOverlays()` setting; `true`/`false`
45
+ * overrides it. Tooltips never become sheets. @default undefined
46
+ */
47
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean | undefined, BooleanInput>;
40
48
  /** Fires after the panel opens. */
41
49
  readonly opened: _angular_core.OutputEmitterRef<void>;
42
50
  /** Fires after the panel closes. */
43
51
  readonly closed: _angular_core.OutputEmitterRef<void>;
44
52
  private readonly host;
45
53
  private readonly overlay;
54
+ private readonly responsiveConfig;
46
55
  private readonly vcr;
47
56
  private readonly scrollStrategies;
48
57
  private readonly destroyRef;
@@ -83,7 +92,7 @@ declare class WrPopover {
83
92
  private scheduleHoverClose;
84
93
  private clearHoverClose;
85
94
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrPopover, never>;
86
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrPopover, "[wrPopover]", never, { "content": { "alias": "wrPopover"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "showDelay": { "alias": "showDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "hideDelay"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
95
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<WrPopover, "[wrPopover]", never, { "content": { "alias": "wrPopover"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "showDelay": { "alias": "showDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "hideDelay"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
87
96
  }
88
97
 
89
98
  export { WrPopover };
@@ -1,6 +1,7 @@
1
1
  import * as ngwr_i18n from 'ngwr/i18n';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { InjectionToken, Signal, TemplateRef, ElementRef } from '@angular/core';
4
+ import { BooleanInput } from '@angular/cdk/coercion';
4
5
  import { ControlValueAccessor } from '@angular/forms';
5
6
  import { Observable } from 'rxjs';
6
7
 
@@ -154,6 +155,13 @@ declare class WrSelect implements ControlValueAccessor, WrSelectContext {
154
155
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
155
156
  /** Pill-shaped corners on the trigger. @default false */
156
157
  readonly rounded: _angular_core.InputSignalWithTransform<boolean, any>;
158
+ /**
159
+ * Present the option panel as a full-width bottom-sheet on small
160
+ * viewports instead of an anchored dropdown. `undefined` follows the
161
+ * app-wide `provideWrResponsiveOverlays()` setting; `true`/`false`
162
+ * overrides it. @default undefined
163
+ */
164
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean | undefined, BooleanInput>;
157
165
  /**
158
166
  * Behavior mode. `<wr-select>` is the unified combobox primitive —
159
167
  * pick the shape via `[mode]`:
@@ -309,6 +317,7 @@ declare class WrSelect implements ControlValueAccessor, WrSelectContext {
309
317
  protected readonly searchDisplay: _angular_core.Signal<string>;
310
318
  private readonly host;
311
319
  private readonly overlay;
320
+ private readonly responsiveConfig;
312
321
  private readonly vcr;
313
322
  private readonly scrollStrategies;
314
323
  private readonly destroyRef;
@@ -346,7 +355,7 @@ declare class WrSelect implements ControlValueAccessor, WrSelectContext {
346
355
  private openOverlay;
347
356
  private closeOverlay;
348
357
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSelect, never>;
349
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSelect, "wr-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "loader": { "alias": "loader"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "freeText": { "alias": "freeText"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
358
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSelect, "wr-select", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "loader": { "alias": "loader"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "freeText": { "alias": "freeText"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "maxTagCount": { "alias": "maxTagCount"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
350
359
  }
351
360
 
352
361
  /**
@@ -80,6 +80,13 @@ declare class WrStepper implements WrStepperContext {
80
80
  readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
81
81
  /** Lock steps after the latest completed one. @default false */
82
82
  readonly linear: _angular_core.InputSignalWithTransform<boolean, any>;
83
+ /**
84
+ * Drop a horizontal stepper to a vertical layout when its own box is too
85
+ * narrow for the row (a container query on its own width, not the
86
+ * viewport — so it adapts inside a narrow column or side panel). No effect
87
+ * when `orientation` is already `vertical`. @default false
88
+ */
89
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean, any>;
83
90
  protected readonly steps: _angular_core.Signal<readonly WrStep[]>;
84
91
  protected readonly classes: _angular_core.Signal<string>;
85
92
  constructor();
@@ -92,7 +99,7 @@ declare class WrStepper implements WrStepperContext {
92
99
  next(): void;
93
100
  prev(): void;
94
101
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrStepper, never>;
95
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrStepper, "wr-stepper", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; }, ["steps"], ["*"], true, never>;
102
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrStepper, "wr-stepper", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; }, ["steps"], ["*"], true, never>;
96
103
  }
97
104
 
98
105
  export { WR_STEPPER, WrStep, WrStepper };
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'21.2.13'`), not ngwr's.
18
18
  */
19
- declare const NGWR_VERSION = "7.0.0";
19
+ declare const NGWR_VERSION = "7.2.0";
20
20
 
21
21
  /**
22
22
  * @license