quang 19.0.19-2

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 (127) hide show
  1. package/README.md +25 -0
  2. package/auth/README.md +160 -0
  3. package/auth/auth-providers.d.ts +39 -0
  4. package/auth/auth.service.d.ts +52 -0
  5. package/auth/directives/has-at-least-one-role.directive.d.ts +26 -0
  6. package/auth/directives/has-every-role.directive.d.ts +26 -0
  7. package/auth/directives/is-authenticated.directive.d.ts +14 -0
  8. package/auth/directives/is-not-authenticated.directive.d.ts +14 -0
  9. package/auth/guards/index.d.ts +2 -0
  10. package/auth/guards/is-allowed.guard.d.ts +2 -0
  11. package/auth/guards/is-authenticated.guard.d.ts +2 -0
  12. package/auth/index.d.ts +9 -0
  13. package/auth/logout-on-error.interceptor.d.ts +9 -0
  14. package/auth/mobile/index.d.ts +1 -0
  15. package/auth/mobile/mobile-auth-feature.d.ts +2 -0
  16. package/auth/token-storage/index.d.ts +3 -0
  17. package/auth/token-storage/local-storage-feature.d.ts +2 -0
  18. package/auth/token-storage/memory-storage-feature.d.ts +12 -0
  19. package/auth/token-storage/session-storage-feature.d.ts +2 -0
  20. package/components/autocomplete/autocomplete.component.d.ts +43 -0
  21. package/components/autocomplete/index.d.ts +1 -0
  22. package/components/checkbox/checkbox.component.d.ts +11 -0
  23. package/components/checkbox/index.d.ts +1 -0
  24. package/components/date/date.component.d.ts +85 -0
  25. package/components/date/global-date.component.scss +1 -0
  26. package/components/date/index.d.ts +1 -0
  27. package/components/input/index.d.ts +1 -0
  28. package/components/input/input.component.d.ts +15 -0
  29. package/components/paginator/index.d.ts +5 -0
  30. package/components/paginator/paginator-language.service.d.ts +10 -0
  31. package/components/paginator/paginator.component.d.ts +30 -0
  32. package/components/paginator/paginator.module.d.ts +7 -0
  33. package/components/paginator/paginator.service.d.ts +6 -0
  34. package/components/paginator/paginatorIntl.d.ts +12 -0
  35. package/components/select/index.d.ts +1 -0
  36. package/components/select/select.component.d.ts +29 -0
  37. package/components/shared/ErrorData.d.ts +4 -0
  38. package/components/shared/index.d.ts +4 -0
  39. package/components/shared/makeId.d.ts +1 -0
  40. package/components/shared/option-list/option-list.component.d.ts +50 -0
  41. package/components/shared/quang-base-component.directive.d.ts +50 -0
  42. package/components/table/index.d.ts +1 -0
  43. package/components/table/table.component.d.ts +66 -0
  44. package/components/wysiwyg/global-wysiswyg.component.scss +1 -0
  45. package/components/wysiwyg/index.d.ts +1 -0
  46. package/components/wysiwyg/wysiwyg.component.d.ts +46 -0
  47. package/device/index.d.ts +1 -0
  48. package/device/resize-observable.service.d.ts +11 -0
  49. package/fesm2022/quang-auth-mobile.mjs +48 -0
  50. package/fesm2022/quang-auth-mobile.mjs.map +1 -0
  51. package/fesm2022/quang-auth.mjs +473 -0
  52. package/fesm2022/quang-auth.mjs.map +1 -0
  53. package/fesm2022/quang-components-autocomplete.mjs +196 -0
  54. package/fesm2022/quang-components-autocomplete.mjs.map +1 -0
  55. package/fesm2022/quang-components-checkbox.mjs +53 -0
  56. package/fesm2022/quang-components-checkbox.mjs.map +1 -0
  57. package/fesm2022/quang-components-date.mjs +392 -0
  58. package/fesm2022/quang-components-date.mjs.map +1 -0
  59. package/fesm2022/quang-components-input.mjs +54 -0
  60. package/fesm2022/quang-components-input.mjs.map +1 -0
  61. package/fesm2022/quang-components-paginator.mjs +157 -0
  62. package/fesm2022/quang-components-paginator.mjs.map +1 -0
  63. package/fesm2022/quang-components-select.mjs +123 -0
  64. package/fesm2022/quang-components-select.mjs.map +1 -0
  65. package/fesm2022/quang-components-shared.mjs +386 -0
  66. package/fesm2022/quang-components-shared.mjs.map +1 -0
  67. package/fesm2022/quang-components-table.mjs +162 -0
  68. package/fesm2022/quang-components-table.mjs.map +1 -0
  69. package/fesm2022/quang-components-wysiwyg.mjs +230 -0
  70. package/fesm2022/quang-components-wysiwyg.mjs.map +1 -0
  71. package/fesm2022/quang-device.mjs +42 -0
  72. package/fesm2022/quang-device.mjs.map +1 -0
  73. package/fesm2022/quang-forms.mjs +188 -0
  74. package/fesm2022/quang-forms.mjs.map +1 -0
  75. package/fesm2022/quang-loader.mjs +116 -0
  76. package/fesm2022/quang-loader.mjs.map +1 -0
  77. package/fesm2022/quang-overlay-modal.mjs +118 -0
  78. package/fesm2022/quang-overlay-modal.mjs.map +1 -0
  79. package/fesm2022/quang-overlay-popover.mjs +70 -0
  80. package/fesm2022/quang-overlay-popover.mjs.map +1 -0
  81. package/fesm2022/quang-overlay-shared.mjs +359 -0
  82. package/fesm2022/quang-overlay-shared.mjs.map +1 -0
  83. package/fesm2022/quang-overlay-toast.mjs +105 -0
  84. package/fesm2022/quang-overlay-toast.mjs.map +1 -0
  85. package/fesm2022/quang-overlay-tooltip.mjs +56 -0
  86. package/fesm2022/quang-overlay-tooltip.mjs.map +1 -0
  87. package/fesm2022/quang-shared.mjs +29 -0
  88. package/fesm2022/quang-shared.mjs.map +1 -0
  89. package/fesm2022/quang-translation.mjs +119 -0
  90. package/fesm2022/quang-translation.mjs.map +1 -0
  91. package/fesm2022/quang.mjs +23 -0
  92. package/fesm2022/quang.mjs.map +1 -0
  93. package/forms/README.md +6 -0
  94. package/forms/form-group-model.d.ts +18 -0
  95. package/forms/index.d.ts +2 -0
  96. package/forms/validators.d.ts +43 -0
  97. package/index.d.ts +30 -0
  98. package/loader/README.md +14 -0
  99. package/loader/index.d.ts +4 -0
  100. package/loader/loader-providers.d.ts +23 -0
  101. package/loader/loader.component.d.ts +23 -0
  102. package/loader/loader.interceptor.d.ts +10 -0
  103. package/loader/loader.service.d.ts +9 -0
  104. package/overlay/modal/index.d.ts +1 -0
  105. package/overlay/modal/modal.component.d.ts +29 -0
  106. package/overlay/popover/index.d.ts +1 -0
  107. package/overlay/popover/popover.component.d.ts +13 -0
  108. package/overlay/popover/popover.directive.d.ts +11 -0
  109. package/overlay/shared/CustomViewportRuler.d.ts +63 -0
  110. package/overlay/shared/index.d.ts +3 -0
  111. package/overlay/shared/quang-base-overlay.component.d.ts +9 -0
  112. package/overlay/shared/quang-base-overlay.directive.d.ts +44 -0
  113. package/overlay/toast/index.d.ts +2 -0
  114. package/overlay/toast/toast.component.d.ts +13 -0
  115. package/overlay/toast/toast.service.d.ts +27 -0
  116. package/overlay/tooltip/index.d.ts +2 -0
  117. package/overlay/tooltip/tooltip.component.d.ts +11 -0
  118. package/overlay/tooltip/tooltip.directive.d.ts +11 -0
  119. package/package.json +146 -0
  120. package/shared/index.d.ts +1 -0
  121. package/shared/intercept-utils.d.ts +13 -0
  122. package/translation/README.md +21 -0
  123. package/translation/index.d.ts +4 -0
  124. package/translation/translation-loader.service.d.ts +10 -0
  125. package/translation/translation-providers.d.ts +28 -0
  126. package/translation/translation.service.d.ts +15 -0
  127. package/translation/translations.tokens.d.ts +5 -0
@@ -0,0 +1,359 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, signal, Component, inject, DestroyRef, computed, ElementRef, HostListener, Directive, Optional, Inject, Injectable } from '@angular/core';
3
+ import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
4
+ import { ComponentPortal } from '@angular/cdk/portal';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { DEFAULT_RESIZE_TIME } from '@angular/cdk/scrolling';
7
+ import { DOCUMENT } from '@angular/common';
8
+ import { Subject, auditTime } from 'rxjs';
9
+ import * as i1 from '@angular/cdk/platform';
10
+
11
+ class QuangBaseOverlayComponent {
12
+ constructor() {
13
+ this.content = input.required();
14
+ this.payload = input();
15
+ this.positionPair = signal(null);
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangBaseOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.5", type: QuangBaseOverlayComponent, isStandalone: true, selector: "quang-base-overlay-component", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: ``, isInline: true }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangBaseOverlayComponent, decorators: [{
21
+ type: Component,
22
+ args: [{
23
+ selector: 'quang-base-overlay-component',
24
+ template: ``,
25
+ }]
26
+ }] });
27
+
28
+ class QuangBaseOverlayDirective {
29
+ constructor() {
30
+ this.targetComponentType = signal(undefined);
31
+ /**
32
+ * The amount of pixels needed for the popover to automatically disappear. If undefined the popover will not disappear on scroll
33
+ * Default: 100
34
+ * @default 100
35
+ */
36
+ this.scrollCloseThreshold = input(100);
37
+ this.showMethod = input('click');
38
+ this.content = input.required();
39
+ this.quangOverlayPayload = input();
40
+ this.closeOnClickOutside = true;
41
+ this.overlayPosition = input('top');
42
+ this.destroyRef = inject(DestroyRef);
43
+ this.top = signal({
44
+ originX: 'center',
45
+ originY: 'top',
46
+ overlayX: 'center',
47
+ overlayY: 'bottom',
48
+ offsetY: -8,
49
+ });
50
+ this.topLeft = signal({
51
+ originX: 'start',
52
+ originY: 'top',
53
+ overlayX: 'end',
54
+ overlayY: 'bottom',
55
+ offsetY: -8,
56
+ offsetX: 40,
57
+ });
58
+ this.topRight = signal({
59
+ originX: 'end',
60
+ originY: 'top',
61
+ overlayX: 'end',
62
+ overlayY: 'bottom',
63
+ offsetY: -8,
64
+ offsetX: 40,
65
+ });
66
+ this.bottom = signal({
67
+ originX: 'center',
68
+ originY: 'bottom',
69
+ overlayX: 'center',
70
+ overlayY: 'top',
71
+ offsetY: 8,
72
+ });
73
+ this.bottomLeft = signal({
74
+ originX: 'start',
75
+ originY: 'bottom',
76
+ overlayX: 'end',
77
+ overlayY: 'top',
78
+ offsetY: 8,
79
+ offsetX: 40,
80
+ });
81
+ this.bottomRight = signal({
82
+ originX: 'end',
83
+ originY: 'bottom',
84
+ overlayX: 'end',
85
+ overlayY: 'top',
86
+ offsetY: 8,
87
+ offsetX: 40,
88
+ });
89
+ this.left = signal({
90
+ originX: 'start',
91
+ originY: 'center',
92
+ overlayX: 'end',
93
+ overlayY: 'center',
94
+ offsetX: -8,
95
+ });
96
+ this.right = signal({
97
+ originX: 'end',
98
+ originY: 'center',
99
+ overlayX: 'start',
100
+ overlayY: 'center',
101
+ offsetX: 8,
102
+ });
103
+ this.tooltipPosition = computed(() => {
104
+ switch (this.overlayPosition()) {
105
+ case 'top':
106
+ return [this.top(), this.bottom()];
107
+ case 'top-left':
108
+ return [this.topLeft(), this.bottomLeft()];
109
+ case 'top-right':
110
+ return [this.topRight(), this.bottomRight()];
111
+ case 'bottom':
112
+ return [this.bottom(), this.top()];
113
+ case 'bottom-left':
114
+ return [this.bottomLeft(), this.topLeft()];
115
+ case 'bottom-right':
116
+ return [this.bottomRight(), this.topRight()];
117
+ case 'left':
118
+ return [this.left(), this.right()];
119
+ case 'right':
120
+ return [this.right(), this.left()];
121
+ default:
122
+ return [this.top(), this.bottom()];
123
+ }
124
+ });
125
+ this.overlayRef = signal(null);
126
+ this.overlay = signal(inject(Overlay));
127
+ this.overlayPositionBuilder = signal(inject(OverlayPositionBuilder));
128
+ this.elementRef = signal(inject(ElementRef));
129
+ this.positionStrategy = signal(undefined);
130
+ this.componentOverlayRef = signal(null);
131
+ }
132
+ onClick() {
133
+ if (this.showMethod() === 'click')
134
+ this.showHideOverlay();
135
+ }
136
+ onHover() {
137
+ if (this.showMethod() === 'hover')
138
+ this.showHideOverlay();
139
+ }
140
+ onLeave() {
141
+ if (this.showMethod() === 'hover')
142
+ this.detachOverlay();
143
+ }
144
+ attachOverlay() {
145
+ const targetComponentType = this.targetComponentType();
146
+ if (!targetComponentType) {
147
+ return;
148
+ }
149
+ this.positionStrategy.set(this.overlayPositionBuilder().flexibleConnectedTo(this.elementRef()).withPositions(this.tooltipPosition()));
150
+ this.overlayRef.set(this.overlay().create({
151
+ positionStrategy: this.positionStrategy(),
152
+ scrollStrategy: this.scrollCloseThreshold()
153
+ ? this.overlay().scrollStrategies.close({ threshold: this.scrollCloseThreshold() })
154
+ : this.overlay().scrollStrategies.noop(),
155
+ hasBackdrop: this.showMethod() === 'click',
156
+ backdropClass: '',
157
+ }));
158
+ const componentPortal = new ComponentPortal(targetComponentType);
159
+ const createdOverlay = this.overlayRef();
160
+ if (createdOverlay) {
161
+ this.componentOverlayRef.set(createdOverlay.attach(componentPortal));
162
+ const componentOverlayRefInstance = this.componentOverlayRef()?.instance;
163
+ if (componentOverlayRefInstance) {
164
+ componentOverlayRefInstance.content = this.content;
165
+ componentOverlayRefInstance.payload = this.quangOverlayPayload;
166
+ }
167
+ }
168
+ this.positionStrategy()
169
+ ?.positionChanges.pipe(takeUntilDestroyed(this.destroyRef))
170
+ .subscribe((position) => {
171
+ const positionRef = position;
172
+ const componentOverlayRefInstance = this.componentOverlayRef()?.instance;
173
+ if (componentOverlayRefInstance) {
174
+ componentOverlayRefInstance.positionPair.set(positionRef.connectionPair);
175
+ }
176
+ });
177
+ this.overlayRef()
178
+ ?.backdropClick()
179
+ .pipe(takeUntilDestroyed(this.destroyRef))
180
+ .subscribe(() => {
181
+ if (this.closeOnClickOutside) {
182
+ this.detachOverlay();
183
+ }
184
+ });
185
+ }
186
+ detachOverlay() {
187
+ this.overlayRef()?.detach();
188
+ this.overlayRef()?.dispose();
189
+ }
190
+ showHideOverlay() {
191
+ if (this.overlayRef()?.hasAttached()) {
192
+ this.detachOverlay();
193
+ }
194
+ else {
195
+ this.attachOverlay();
196
+ }
197
+ }
198
+ ngOnDestroy() {
199
+ this.detachOverlay();
200
+ }
201
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangBaseOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
202
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.5", type: QuangBaseOverlayDirective, isStandalone: true, inputs: { scrollCloseThreshold: { classPropertyName: "scrollCloseThreshold", publicName: "scrollCloseThreshold", isSignal: true, isRequired: false, transformFunction: null }, showMethod: { classPropertyName: "showMethod", publicName: "showMethod", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, quangOverlayPayload: { classPropertyName: "quangOverlayPayload", publicName: "quangOverlayPayload", isSignal: true, isRequired: false, transformFunction: null }, overlayPosition: { classPropertyName: "overlayPosition", publicName: "overlayPosition", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()", "mouseenter": "onHover()", "mouseleave": "onLeave()" } }, ngImport: i0 }); }
203
+ }
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangBaseOverlayDirective, decorators: [{
205
+ type: Directive
206
+ }], propDecorators: { onClick: [{
207
+ type: HostListener,
208
+ args: ['click']
209
+ }], onHover: [{
210
+ type: HostListener,
211
+ args: ['mouseenter']
212
+ }], onLeave: [{
213
+ type: HostListener,
214
+ args: ['mouseleave']
215
+ }] } });
216
+
217
+ /* eslint-disable */
218
+ /**
219
+ * Class cloe of [ViewportRuler](https://github.com/angular/components/blob/master/src/cdk/scrolling/viewport-ruler.ts)
220
+ * To fix the wrong reported size of the viewport on mobile devices with hidden url bars
221
+ * Issues references:
222
+ * https://github.com/angular/components/issues/18890
223
+ * https://github.com/angular/components/issues/27739
224
+ *
225
+ * To use this component provide it instead of `ViewportRuler`
226
+ *
227
+ * @example
228
+ * providers: [
229
+ * {
230
+ * provide: ViewportRuler,
231
+ * useClass: CustomViewportRuler
232
+ * }
233
+ * ]
234
+ */
235
+ class CustomViewportRuler {
236
+ constructor(_platform, ngZone, document) {
237
+ this._platform = _platform;
238
+ /** Cached viewport dimensions. */
239
+ this._viewportSize = null;
240
+ /** Stream of viewport change events. */
241
+ this._change = new Subject();
242
+ /** Event listener that will be used to handle the viewport change events. */
243
+ this._changeListener = (event) => {
244
+ this._change.next(event);
245
+ };
246
+ this._document = document;
247
+ ngZone.runOutsideAngular(() => {
248
+ if (_platform.isBrowser) {
249
+ const window = this._getWindow();
250
+ // Note that bind the events ourselves, rather than going through something like RxJS's
251
+ // `fromEvent` so that we can ensure that they're bound outside of the NgZone.
252
+ window.addEventListener('resize', this._changeListener);
253
+ window.addEventListener('orientationchange', this._changeListener);
254
+ }
255
+ // Clear the cached position so that the viewport is re-measured next time it is required.
256
+ // We don't need to keep track of the subscription, because it is completed on destroy.
257
+ this.change().subscribe(() => (this._viewportSize = null));
258
+ });
259
+ }
260
+ ngOnDestroy() {
261
+ if (this._platform.isBrowser) {
262
+ const window = this._getWindow();
263
+ window.removeEventListener('resize', this._changeListener);
264
+ window.removeEventListener('orientationchange', this._changeListener);
265
+ }
266
+ this._change.complete();
267
+ }
268
+ /** Returns the viewport's width and height. */
269
+ getViewportSize() {
270
+ if (!this._viewportSize) {
271
+ this._updateViewportSize();
272
+ }
273
+ const output = { width: this._viewportSize.width, height: this._viewportSize.height };
274
+ // If we're not on a browser, don't cache the size since it'll be mocked out anyway.
275
+ if (!this._platform.isBrowser) {
276
+ this._viewportSize = null;
277
+ }
278
+ return output;
279
+ }
280
+ /** Gets a DOMRect for the viewport's bounds. */
281
+ getViewportRect() {
282
+ // Use the document element's bounding rect rather than the window scroll properties
283
+ // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll
284
+ // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different
285
+ // conceptual viewports. Under most circumstances these viewports are equivalent, but they
286
+ // can disagree when the page is pinch-zoomed (on devices that support touch).
287
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4
288
+ // We use the documentElement instead of the body because, by default (without a css reset)
289
+ // browsers typically give the document body an 8px margin, which is not included in
290
+ // getBoundingClientRect().
291
+ const scrollPosition = this.getViewportScrollPosition();
292
+ const { width, height } = this.getViewportSize();
293
+ return {
294
+ top: scrollPosition.top,
295
+ left: scrollPosition.left,
296
+ bottom: scrollPosition.top + height,
297
+ right: scrollPosition.left + width,
298
+ height,
299
+ width,
300
+ };
301
+ }
302
+ /** Gets the (top, left) scroll position of the viewport. */
303
+ getViewportScrollPosition() {
304
+ // While we can get a reference to the fake document
305
+ // during SSR, it doesn't have getBoundingClientRect.
306
+ if (!this._platform.isBrowser) {
307
+ return { top: 0, left: 0 };
308
+ }
309
+ // The top-left-corner of the viewport is determined by the scroll position of the document
310
+ // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about
311
+ // whether `document.body` or `document.documentElement` is the scrolled element, so reading
312
+ // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of
313
+ // `document.documentElement` works consistently, where the `top` and `left` values will
314
+ // equal negative the scroll position.
315
+ const document = this._document;
316
+ const window = this._getWindow();
317
+ const documentElement = document.documentElement;
318
+ const documentRect = documentElement.getBoundingClientRect();
319
+ const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0;
320
+ const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0;
321
+ return { top, left };
322
+ }
323
+ /**
324
+ * Returns a stream that emits whenever the size of the viewport changes.
325
+ * This stream emits outside of the Angular zone.
326
+ * @param throttleTime Time in milliseconds to throttle the stream.
327
+ */
328
+ change(throttleTime = DEFAULT_RESIZE_TIME) {
329
+ return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;
330
+ }
331
+ /** Use defaultView of injected document if available or fallback to global window reference */
332
+ _getWindow() {
333
+ return this._document.defaultView || window;
334
+ }
335
+ /** Updates the cached viewport size. */
336
+ _updateViewportSize() {
337
+ this._viewportSize = this._platform.isBrowser
338
+ ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }
339
+ : { width: 0, height: 0 };
340
+ }
341
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CustomViewportRuler, deps: [{ token: i1.Platform }, { token: i0.NgZone }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
342
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CustomViewportRuler, providedIn: 'root' }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CustomViewportRuler, decorators: [{
345
+ type: Injectable,
346
+ args: [{ providedIn: 'root' }]
347
+ }], ctorParameters: () => [{ type: i1.Platform }, { type: i0.NgZone }, { type: undefined, decorators: [{
348
+ type: Optional
349
+ }, {
350
+ type: Inject,
351
+ args: [DOCUMENT]
352
+ }] }] });
353
+
354
+ /**
355
+ * Generated bundle index. Do not edit.
356
+ */
357
+
358
+ export { CustomViewportRuler, QuangBaseOverlayComponent, QuangBaseOverlayDirective };
359
+ //# sourceMappingURL=quang-overlay-shared.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quang-overlay-shared.mjs","sources":["../../../projects/quang/overlay/shared/quang-base-overlay.component.ts","../../../projects/quang/overlay/shared/quang-base-overlay.directive.ts","../../../projects/quang/overlay/shared/CustomViewportRuler.ts","../../../projects/quang/overlay/shared/quang-overlay-shared.ts"],"sourcesContent":["import { ConnectionPositionPair } from '@angular/cdk/overlay'\nimport { Component, input, signal } from '@angular/core'\n\n@Component({\n selector: 'quang-base-overlay-component',\n\n template: ``,\n})\nexport abstract class QuangBaseOverlayComponent {\n content = input.required<any>()\n\n payload = input<any>()\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n}\n","import {\n ConnectedOverlayPositionChange,\n ConnectedPosition,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayPositionBuilder,\n OverlayRef,\n} from '@angular/cdk/overlay'\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal'\nimport {\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\n\nimport { QuangBaseOverlayComponent } from './quang-base-overlay.component'\n\n@Directive()\nexport abstract class QuangBaseOverlayDirective<T extends QuangBaseOverlayComponent> implements OnDestroy {\n targetComponentType = signal<ComponentType<T> | undefined>(undefined)\n\n /**\n * The amount of pixels needed for the popover to automatically disappear. If undefined the popover will not disappear on scroll\n * Default: 100\n * @default 100\n */\n scrollCloseThreshold = input<number | undefined>(100)\n\n showMethod = input<'click' | 'hover'>('click')\n\n content = input.required<any>()\n\n quangOverlayPayload = input<any>()\n\n closeOnClickOutside = true\n\n overlayPosition = input<\n 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right' | 'left' | 'right'\n >('top')\n\n destroyRef = inject(DestroyRef)\n\n private top = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n })\n\n private topLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private topRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n offsetX: 40,\n })\n\n private bottom = signal<ConnectedPosition>({\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n })\n\n private bottomLeft = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private bottomRight = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n offsetX: 40,\n })\n\n private left = signal<ConnectedPosition>({\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n })\n\n private right = signal<ConnectedPosition>({\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n })\n\n tooltipPosition = computed((): ConnectedPosition[] => {\n switch (this.overlayPosition()) {\n case 'top':\n return [this.top(), this.bottom()]\n case 'top-left':\n return [this.topLeft(), this.bottomLeft()]\n case 'top-right':\n return [this.topRight(), this.bottomRight()]\n case 'bottom':\n return [this.bottom(), this.top()]\n case 'bottom-left':\n return [this.bottomLeft(), this.topLeft()]\n case 'bottom-right':\n return [this.bottomRight(), this.topRight()]\n case 'left':\n return [this.left(), this.right()]\n case 'right':\n return [this.right(), this.left()]\n default:\n return [this.top(), this.bottom()]\n }\n })\n\n private overlayRef = signal<OverlayRef | null>(null)\n\n private readonly overlay = signal(inject(Overlay))\n\n private readonly overlayPositionBuilder = signal(inject(OverlayPositionBuilder))\n\n private readonly elementRef = signal(inject(ElementRef))\n\n private positionStrategy = signal<FlexibleConnectedPositionStrategy | undefined>(undefined)\n\n private componentOverlayRef = signal<ComponentRef<T> | null>(null)\n\n @HostListener('click') onClick(): void {\n if (this.showMethod() === 'click') this.showHideOverlay()\n }\n\n @HostListener('mouseenter') onHover(): void {\n if (this.showMethod() === 'hover') this.showHideOverlay()\n }\n\n @HostListener('mouseleave') onLeave(): void {\n if (this.showMethod() === 'hover') this.detachOverlay()\n }\n\n attachOverlay(): void {\n const targetComponentType = this.targetComponentType()\n if (!targetComponentType) {\n return\n }\n this.positionStrategy.set(\n this.overlayPositionBuilder().flexibleConnectedTo(this.elementRef()).withPositions(this.tooltipPosition())\n )\n\n this.overlayRef.set(\n this.overlay().create({\n positionStrategy: this.positionStrategy(),\n scrollStrategy: this.scrollCloseThreshold()\n ? this.overlay().scrollStrategies.close({ threshold: this.scrollCloseThreshold() })\n : this.overlay().scrollStrategies.noop(),\n hasBackdrop: this.showMethod() === 'click',\n backdropClass: '',\n })\n )\n\n const componentPortal = new ComponentPortal(targetComponentType)\n const createdOverlay = this.overlayRef()\n if (createdOverlay) {\n this.componentOverlayRef.set(createdOverlay.attach(componentPortal))\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.content = this.content\n componentOverlayRefInstance.payload = this.quangOverlayPayload\n }\n }\n this.positionStrategy()\n ?.positionChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((position) => {\n const positionRef: ConnectedOverlayPositionChange = position as ConnectedOverlayPositionChange\n const componentOverlayRefInstance = this.componentOverlayRef()?.instance\n if (componentOverlayRefInstance) {\n componentOverlayRefInstance.positionPair.set(positionRef.connectionPair)\n }\n })\n this.overlayRef()\n ?.backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.closeOnClickOutside) {\n this.detachOverlay()\n }\n })\n }\n\n detachOverlay(): void {\n this.overlayRef()?.detach()\n this.overlayRef()?.dispose()\n }\n\n showHideOverlay(): void {\n if (this.overlayRef()?.hasAttached()) {\n this.detachOverlay()\n } else {\n this.attachOverlay()\n }\n }\n\n ngOnDestroy(): void {\n this.detachOverlay()\n }\n}\n","import { Platform } from '@angular/cdk/platform'\nimport { DEFAULT_RESIZE_TIME, ViewportScrollPosition } from '@angular/cdk/scrolling'\nimport { DOCUMENT } from '@angular/common'\nimport { Inject, Injectable, NgZone, OnDestroy, Optional } from '@angular/core'\n\nimport { Observable, Subject, auditTime } from 'rxjs'\n\n/* eslint-disable */\n/**\n * Class cloe of [ViewportRuler](https://github.com/angular/components/blob/master/src/cdk/scrolling/viewport-ruler.ts)\n * To fix the wrong reported size of the viewport on mobile devices with hidden url bars\n * Issues references:\n * https://github.com/angular/components/issues/18890\n * https://github.com/angular/components/issues/27739\n *\n * To use this component provide it instead of `ViewportRuler`\n *\n * @example\n * providers: [\n * {\n * provide: ViewportRuler,\n * useClass: CustomViewportRuler\n * }\n * ]\n */\n@Injectable({ providedIn: 'root' })\nexport class CustomViewportRuler implements OnDestroy {\n /** Used to reference correct document/window */\n protected _document: Document\n /** Cached viewport dimensions. */\n private _viewportSize: { width: number; height: number } | null = null\n /** Stream of viewport change events. */\n private readonly _change = new Subject<Event>()\n\n constructor(\n private _platform: Platform,\n ngZone: NgZone,\n @Optional() @Inject(DOCUMENT) document: any\n ) {\n this._document = document\n\n ngZone.runOutsideAngular(() => {\n if (_platform.isBrowser) {\n const window = this._getWindow()\n\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener)\n window.addEventListener('orientationchange', this._changeListener)\n }\n\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => (this._viewportSize = null))\n })\n }\n\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow()\n window.removeEventListener('resize', this._changeListener)\n window.removeEventListener('orientationchange', this._changeListener)\n }\n\n this._change.complete()\n }\n\n /** Returns the viewport's width and height. */\n getViewportSize(): Readonly<{ width: number; height: number }> {\n if (!this._viewportSize) {\n this._updateViewportSize()\n }\n\n const output = { width: this._viewportSize!.width, height: this._viewportSize!.height }\n\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null!\n }\n\n return output\n }\n\n /** Gets a DOMRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition()\n const { width, height } = this.getViewportSize()\n\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width,\n }\n }\n\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition(): ViewportScrollPosition {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return { top: 0, left: 0 }\n }\n\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document\n const window = this._getWindow()\n const documentElement = document.documentElement!\n const documentRect = documentElement.getBoundingClientRect()\n\n const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0\n\n const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0\n\n return { top, left }\n }\n\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime: number = DEFAULT_RESIZE_TIME): Observable<Event> {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change\n }\n\n /** Event listener that will be used to handle the viewport change events. */\n private _changeListener = (event: Event) => {\n this._change.next(event)\n }\n\n /** Use defaultView of injected document if available or fallback to global window reference */\n private _getWindow(): Window {\n return this._document.defaultView || window\n }\n\n /** Updates the cached viewport size. */\n private _updateViewportSize() {\n this._viewportSize = this._platform.isBrowser\n ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }\n : { width: 0, height: 0 }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAQsB,yBAAyB,CAAA;AAL/C,IAAA,WAAA,GAAA;AAME,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAO;QAE/B,IAAO,CAAA,OAAA,GAAG,KAAK,EAAO;AAEtB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgC,IAAI,CAAC;AAC3D;8GANqB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,+VAFnC,CAAE,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;2FAEQ,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAL9C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AAExC,oBAAA,QAAQ,EAAE,CAAE,CAAA;AACb,iBAAA;;;MCmBqB,yBAAyB,CAAA;AAD/C,IAAA,WAAA,GAAA;AAEE,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAA+B,SAAS,CAAC;AAErE;;;;AAIG;AACH,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAqB,GAAG,CAAC;AAErD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAoB,OAAO,CAAC;AAE9C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAO;QAE/B,IAAmB,CAAA,mBAAA,GAAG,KAAK,EAAO;QAElC,IAAmB,CAAA,mBAAA,GAAG,IAAI;AAE1B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAErB,KAAK,CAAC;AAER,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAEvB,IAAG,CAAA,GAAA,GAAG,MAAM,CAAoB;AACtC,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACZ,SAAA,CAAC;QAEM,IAAO,CAAA,OAAA,GAAG,MAAM,CAAoB;AAC1C,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACX,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC;QAEM,IAAQ,CAAA,QAAA,GAAG,MAAM,CAAoB;AAC3C,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACX,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC;QAEM,IAAM,CAAA,MAAA,GAAG,MAAM,CAAoB;AACzC,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA,CAAC;QAEM,IAAU,CAAA,UAAA,GAAG,MAAM,CAAoB;AAC7C,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC;QAEM,IAAW,CAAA,WAAA,GAAG,MAAM,CAAoB;AAC9C,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC;QAEM,IAAI,CAAA,IAAA,GAAG,MAAM,CAAoB;AACvC,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACZ,SAAA,CAAC;QAEM,IAAK,CAAA,KAAA,GAAG,MAAM,CAAoB;AACxC,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA,CAAC;AAEF,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAA0B;AACnD,YAAA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC5B,gBAAA,KAAK,KAAK;oBACR,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACpC,gBAAA,KAAK,UAAU;oBACb,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AAC5C,gBAAA,KAAK,WAAW;oBACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AAC9C,gBAAA,KAAK,QAAQ;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;AACpC,gBAAA,KAAK,aAAa;oBAChB,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5C,gBAAA,KAAK,cAAc;oBACjB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9C,gBAAA,KAAK,MAAM;oBACT,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACpC,gBAAA,KAAK,OAAO;oBACV,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACpC,gBAAA;oBACE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;AAExC,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAoB,IAAI,CAAC;QAEnC,IAAO,CAAA,OAAA,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAsB,CAAA,sBAAA,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE/D,IAAU,CAAA,UAAA,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAgD,SAAS,CAAC;AAEnF,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAyB,IAAI,CAAC;AA+EnE;IA7EwB,OAAO,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,eAAe,EAAE;;IAG/B,OAAO,GAAA;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,eAAe,EAAE;;IAG/B,OAAO,GAAA;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,aAAa,EAAE;;IAGzD,aAAa,GAAA;AACX,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACtD,IAAI,CAAC,mBAAmB,EAAE;YACxB;;QAEF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAC3G;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;AACpB,YAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzC,YAAA,cAAc,EAAE,IAAI,CAAC,oBAAoB;AACvC,kBAAE,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE;kBAChF,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAC1C,YAAA,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO;AAC1C,YAAA,aAAa,EAAE,EAAE;AAClB,SAAA,CAAC,CACH;AAED,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,mBAAmB,CAAC;AAChE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE;QACxC,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACpE,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ;YACxE,IAAI,2BAA2B,EAAE;AAC/B,gBAAA,2BAA2B,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAClD,gBAAA,2BAA2B,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB;;;QAGlE,IAAI,CAAC,gBAAgB;cACjB,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACzD,aAAA,SAAS,CAAC,CAAC,QAAQ,KAAI;YACtB,MAAM,WAAW,GAAmC,QAA0C;YAC9F,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ;YACxE,IAAI,2BAA2B,EAAE;gBAC/B,2BAA2B,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;;AAE5E,SAAC,CAAC;QACJ,IAAI,CAAC,UAAU;AACb,cAAE,aAAa;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,IAAI,CAAC,aAAa,EAAE;;AAExB,SAAC,CAAC;;IAGN,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE;;IAG9B,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE;YACpC,IAAI,CAAC,aAAa,EAAE;;aACf;YACL,IAAI,CAAC,aAAa,EAAE;;;IAIxB,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,EAAE;;8GA1MF,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAD9C;8BAgIwB,OAAO,EAAA,CAAA;sBAA7B,YAAY;uBAAC,OAAO;gBAIO,OAAO,EAAA,CAAA;sBAAlC,YAAY;uBAAC,YAAY;gBAIE,OAAO,EAAA,CAAA;sBAAlC,YAAY;uBAAC,YAAY;;;AC1J5B;AACA;;;;;;;;;;;;;;;;AAgBG;MAEU,mBAAmB,CAAA;AAQ9B,IAAA,WAAA,CACU,SAAmB,EAC3B,MAAc,EACgB,QAAa,EAAA;QAFnC,IAAS,CAAA,SAAA,GAAT,SAAS;;QALX,IAAa,CAAA,aAAA,GAA6C,IAAI;;AAErD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAS;;AA+GvC,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,KAAY,KAAI;AACzC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,SAAC;AA1GC,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AAEzB,QAAA,MAAM,CAAC,iBAAiB,CAAC,MAAK;AAC5B,YAAA,IAAI,SAAS,CAAC,SAAS,EAAE;AACvB,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;;;gBAIhC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC;gBACvD,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC;;;;AAKpE,YAAA,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAC5D,SAAC,CAAC;;IAGJ,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;YAChC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC;YAC1D,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC;;AAGvE,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;;;IAIzB,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,mBAAmB,EAAE;;AAG5B,QAAA,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,aAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,aAAc,CAAC,MAAM,EAAE;;AAGvF,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAK;;AAG5B,QAAA,OAAO,MAAM;;;IAIf,eAAe,GAAA;;;;;;;;;;AAUb,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACvD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;QAEhD,OAAO;YACL,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,IAAI,EAAE,cAAc,CAAC,IAAI;AACzB,YAAA,MAAM,EAAE,cAAc,CAAC,GAAG,GAAG,MAAM;AACnC,YAAA,KAAK,EAAE,cAAc,CAAC,IAAI,GAAG,KAAK;YAClC,MAAM;YACN,KAAK;SACN;;;IAIH,yBAAyB,GAAA;;;AAGvB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;YAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;;;;;;;;AAS5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAgB;AACjD,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,qBAAqB,EAAE;QAE5D,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC,SAAS,IAAI,CAAC;QAE5G,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU,IAAI,CAAC;AAEhH,QAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;;AAGtB;;;;AAIG;IACH,MAAM,CAAC,eAAuB,mBAAmB,EAAA;QAC/C,OAAO,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO;;;IAS7E,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,MAAM;;;IAIrC,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,cAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,YAAY;cAC5F,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;;AAlIlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,gEAWR,QAAQ,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAXnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAY7B;;0BAAY,MAAM;2BAAC,QAAQ;;;ACrChC;;AAEG;;;;"}
@@ -0,0 +1,105 @@
1
+ import { OverlayModule } from '@angular/cdk/overlay';
2
+ import { NgClass, DatePipe, NgIf, NgTemplateOutlet } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { computed, signal, Injectable, inject, input, ChangeDetectionStrategy, Component } from '@angular/core';
5
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
6
+ import { TranslocoPipe } from '@jsverse/transloco';
7
+ import { map, of, timer, switchAll } from 'rxjs';
8
+ import { signalState, patchState } from '@ngrx/signals';
9
+
10
+ class QuangToastService {
11
+ constructor() {
12
+ this.toastState = signalState({
13
+ count: 0,
14
+ currentTimeout: null,
15
+ });
16
+ this.isShowing = computed(() => this.toastState.count() > 0);
17
+ this.count = this.toastState.count;
18
+ this.currentTimeout = this.toastState.currentTimeout;
19
+ this.currentToast = signal(null);
20
+ }
21
+ openToast(toastData) {
22
+ patchState(this.toastState, {
23
+ count: this.count() + 1,
24
+ });
25
+ this.currentToast.set(toastData);
26
+ if (this.count() > 1) {
27
+ clearTimeout(this.currentTimeout());
28
+ patchState(this.toastState, {
29
+ count: this.count() - 1,
30
+ currentTimeout: null,
31
+ });
32
+ }
33
+ patchState(this.toastState, {
34
+ currentTimeout: setTimeout(() => {
35
+ this.closeToast();
36
+ }, toastData.timing),
37
+ });
38
+ }
39
+ closeToast() {
40
+ this.currentToast.set(null);
41
+ patchState(this.toastState, { count: this.count() - 1 });
42
+ }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
44
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangToastService, providedIn: 'root' }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangToastService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root',
50
+ }]
51
+ }] });
52
+
53
+ /**
54
+ * Toast component that can be displayed by calling the `QuangToastService.openToast()` method,
55
+ * passing an object of config {@link ToastData}.
56
+ *
57
+ * @usageNotes
58
+ * The {@link ToastData.customTemplate} property is used to display the custom template inside the toast.
59
+ *
60
+ * The toast header can be hidden by setting the {@link ToastData.hideHeader} boolean to `true`.
61
+ *
62
+ * If the toast header is visible, setting the {@link ToastData.type} property will change the background color
63
+ * of a squared indicator positioned next to the header's title.
64
+ *
65
+ * The component can also display a {@link ToastData.customIcon} in the toast header instead of the squared indicator.
66
+ *
67
+ * @example
68
+ * <quang-toast></quang-toast>
69
+ * this.quangToast.openToast({
70
+ type,
71
+ title: type,
72
+ position: 'bottom-center',
73
+ text: 'custom text here',
74
+ showCloseButton: true,
75
+ timing: 50000000,
76
+ })
77
+ */
78
+ class QuangToastComponent {
79
+ constructor() {
80
+ this.toastService = signal(inject(QuangToastService));
81
+ this.isShowing = this.toastService().isShowing;
82
+ this.showAtLeastFor = input(500);
83
+ this.showToastBuffer$ = toObservable(this.isShowing).pipe(map((isShowing) => isShowing
84
+ ? of(isShowing)
85
+ : timer(this.toastService().currentToast()?.timing ?? this.showAtLeastFor()).pipe(map(() => isShowing))), switchAll());
86
+ this.showToast = toSignal(this.showToastBuffer$);
87
+ this._currentToast = this.toastService().currentToast;
88
+ }
89
+ close() {
90
+ this.toastService().closeToast();
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.5", type: QuangToastComponent, isStandalone: true, selector: "quang-toast", inputs: { showAtLeastFor: { classPropertyName: "showAtLeastFor", publicName: "showAtLeastFor", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [class.hide]=\"!isShowing()\"\n [class.show]=\"isShowing()\"\n [ngClass]=\"[_currentToast()?.position ?? '', _currentToast()?.type ?? '']\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n class=\"toast fade\"\n role=\"alert\"\n>\n <div\n *ngIf=\"!_currentToast()?.hideHeader\"\n class=\"toast-header\"\n >\n <span\n [ngClass]=\"_currentToast()?.type\"\n *ngIf=\"!_currentToast()?.customIcon\"\n class=\"rounded me-2\"\n ></span>\n <img\n [src]=\"_currentToast()?.customIcon\"\n *ngIf=\"_currentToast()?.customIcon\"\n alt=\"\"\n />\n <strong\n *ngIf=\"_currentToast()?.title\"\n class=\"me-auto\"\n >{{ _currentToast()?.title | transloco }}</strong\n >\n <small *ngIf=\"_currentToast()?.date\">{{ _currentToast()?.date ?? '' | date: _currentToast()?.dateFormat }}</small>\n <button\n (click)=\"close()\"\n *ngIf=\"_currentToast()?.showCloseButton\"\n aria-label=\"Close\"\n class=\"ms-2 mb-1 btn-close\"\n data-dismiss=\"toast\"\n type=\"button\"\n >\n <span aria-hidden=\"true\"></span>\n </button>\n </div>\n <div\n *ngIf=\"_currentToast()?.text\"\n class=\"toast-body\"\n >\n {{ _currentToast()?.text?.trim() | transloco: { textValue: _currentToast()?.textValue?.trim() } }}\n </div>\n <ng-container *ngTemplateOutlet=\"_currentToast()?.customTemplate ?? null\"></ng-container>\n</div>\n", styles: [".toast{position:fixed;min-width:200px;z-index:999999}.toast.top-left{top:2rem;left:1rem}.toast.top-right{top:2rem;right:1rem}.toast.bottom-left{bottom:1rem;left:1rem}.toast.bottom-right{bottom:1rem;right:1rem}.toast.center{top:50%;left:50%;transform:translate(-50%,-50%)}.toast.top-center{top:2rem;left:50%;transform:translate(-50%)}.toast.bottom-center{bottom:1rem;left:50%;transform:translate(-50%)}.toast .toast-header{background-color:unset}.toast .toast-header .rounded{height:1.125rem;width:1.125rem;display:inline-block}.toast .toast-header .rounded.success{background:#28a745}.toast .toast-header .rounded.warning{background:#ffc107}.toast .toast-header .rounded.error{background:#dc3545}.toast .toast-header button:focus{box-shadow:unset}.toast small{margin-left:1rem}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangToastComponent, decorators: [{
96
+ type: Component,
97
+ args: [{ selector: 'quang-toast', imports: [OverlayModule, NgClass, TranslocoPipe, DatePipe, NgIf, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class.hide]=\"!isShowing()\"\n [class.show]=\"isShowing()\"\n [ngClass]=\"[_currentToast()?.position ?? '', _currentToast()?.type ?? '']\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n class=\"toast fade\"\n role=\"alert\"\n>\n <div\n *ngIf=\"!_currentToast()?.hideHeader\"\n class=\"toast-header\"\n >\n <span\n [ngClass]=\"_currentToast()?.type\"\n *ngIf=\"!_currentToast()?.customIcon\"\n class=\"rounded me-2\"\n ></span>\n <img\n [src]=\"_currentToast()?.customIcon\"\n *ngIf=\"_currentToast()?.customIcon\"\n alt=\"\"\n />\n <strong\n *ngIf=\"_currentToast()?.title\"\n class=\"me-auto\"\n >{{ _currentToast()?.title | transloco }}</strong\n >\n <small *ngIf=\"_currentToast()?.date\">{{ _currentToast()?.date ?? '' | date: _currentToast()?.dateFormat }}</small>\n <button\n (click)=\"close()\"\n *ngIf=\"_currentToast()?.showCloseButton\"\n aria-label=\"Close\"\n class=\"ms-2 mb-1 btn-close\"\n data-dismiss=\"toast\"\n type=\"button\"\n >\n <span aria-hidden=\"true\"></span>\n </button>\n </div>\n <div\n *ngIf=\"_currentToast()?.text\"\n class=\"toast-body\"\n >\n {{ _currentToast()?.text?.trim() | transloco: { textValue: _currentToast()?.textValue?.trim() } }}\n </div>\n <ng-container *ngTemplateOutlet=\"_currentToast()?.customTemplate ?? null\"></ng-container>\n</div>\n", styles: [".toast{position:fixed;min-width:200px;z-index:999999}.toast.top-left{top:2rem;left:1rem}.toast.top-right{top:2rem;right:1rem}.toast.bottom-left{bottom:1rem;left:1rem}.toast.bottom-right{bottom:1rem;right:1rem}.toast.center{top:50%;left:50%;transform:translate(-50%,-50%)}.toast.top-center{top:2rem;left:50%;transform:translate(-50%)}.toast.bottom-center{bottom:1rem;left:50%;transform:translate(-50%)}.toast .toast-header{background-color:unset}.toast .toast-header .rounded{height:1.125rem;width:1.125rem;display:inline-block}.toast .toast-header .rounded.success{background:#28a745}.toast .toast-header .rounded.warning{background:#ffc107}.toast .toast-header .rounded.error{background:#dc3545}.toast .toast-header button:focus{box-shadow:unset}.toast small{margin-left:1rem}\n"] }]
98
+ }] });
99
+
100
+ /**
101
+ * Generated bundle index. Do not edit.
102
+ */
103
+
104
+ export { QuangToastComponent, QuangToastService };
105
+ //# sourceMappingURL=quang-overlay-toast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quang-overlay-toast.mjs","sources":["../../../projects/quang/overlay/toast/toast.service.ts","../../../projects/quang/overlay/toast/toast.component.ts","../../../projects/quang/overlay/toast/toast.component.html","../../../projects/quang/overlay/toast/quang-overlay-toast.ts"],"sourcesContent":["import { Injectable, TemplateRef, computed, signal } from '@angular/core'\n\nimport { patchState, signalState } from '@ngrx/signals'\n\nexport interface ToastData {\n type: 'success' | 'warning' | 'error'\n title?: string\n position: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'center' | 'top-center' | 'bottom-center'\n timing: number\n text?: string\n textValue?: string\n showCloseButton?: boolean\n date?: Date\n dateFormat?: string\n customTemplate?: TemplateRef<any>\n customIcon?: string\n hideHeader?: boolean\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class QuangToastService {\n private toastState = signalState({\n count: 0,\n currentTimeout: null as ReturnType<typeof setTimeout> | number | null,\n })\n\n public isShowing = computed(() => this.toastState.count() > 0)\n\n count = this.toastState.count\n currentTimeout = this.toastState.currentTimeout\n\n public openToast(toastData: ToastData): void {\n patchState(this.toastState, {\n count: this.count() + 1,\n })\n\n this.currentToast.set(toastData)\n\n if (this.count() > 1) {\n clearTimeout(this.currentTimeout() as number)\n patchState(this.toastState, {\n count: this.count() - 1,\n currentTimeout: null,\n })\n }\n patchState(this.toastState, {\n currentTimeout: setTimeout(() => {\n this.closeToast()\n }, toastData.timing),\n })\n }\n\n public closeToast(): void {\n this.currentToast.set(null)\n patchState(this.toastState, { count: this.count() - 1 })\n }\n\n public currentToast = signal<ToastData | null>(null)\n}\n","import { OverlayModule } from '@angular/cdk/overlay'\nimport { DatePipe, NgClass, NgIf, NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, inject, input, signal } from '@angular/core'\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { map, of, switchAll, timer } from 'rxjs'\n\nimport { QuangToastService } from './toast.service'\n\n@Component({\n selector: 'quang-toast',\n imports: [OverlayModule, NgClass, TranslocoPipe, DatePipe, NgIf, NgTemplateOutlet],\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Toast component that can be displayed by calling the `QuangToastService.openToast()` method,\n * passing an object of config {@link ToastData}.\n *\n * @usageNotes\n * The {@link ToastData.customTemplate} property is used to display the custom template inside the toast.\n *\n * The toast header can be hidden by setting the {@link ToastData.hideHeader} boolean to `true`.\n *\n * If the toast header is visible, setting the {@link ToastData.type} property will change the background color\n * of a squared indicator positioned next to the header's title.\n *\n * The component can also display a {@link ToastData.customIcon} in the toast header instead of the squared indicator.\n *\n * @example\n * <quang-toast></quang-toast>\n * this.quangToast.openToast({\n type,\n title: type,\n position: 'bottom-center',\n text: 'custom text here',\n showCloseButton: true,\n timing: 50000000,\n })\n */\nexport class QuangToastComponent {\n toastService = signal(inject(QuangToastService))\n\n readonly isShowing = this.toastService().isShowing\n showAtLeastFor = input<number>(500)\n\n private showToastBuffer$ = toObservable(this.isShowing).pipe(\n map((isShowing) =>\n isShowing\n ? of(isShowing)\n : timer(this.toastService().currentToast()?.timing ?? this.showAtLeastFor()).pipe(map(() => isShowing))\n ),\n switchAll()\n )\n\n showToast = toSignal(this.showToastBuffer$)\n\n readonly _currentToast = this.toastService().currentToast\n\n close(): void {\n this.toastService().closeToast()\n }\n}\n","<div\n [class.hide]=\"!isShowing()\"\n [class.show]=\"isShowing()\"\n [ngClass]=\"[_currentToast()?.position ?? '', _currentToast()?.type ?? '']\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n class=\"toast fade\"\n role=\"alert\"\n>\n <div\n *ngIf=\"!_currentToast()?.hideHeader\"\n class=\"toast-header\"\n >\n <span\n [ngClass]=\"_currentToast()?.type\"\n *ngIf=\"!_currentToast()?.customIcon\"\n class=\"rounded me-2\"\n ></span>\n <img\n [src]=\"_currentToast()?.customIcon\"\n *ngIf=\"_currentToast()?.customIcon\"\n alt=\"\"\n />\n <strong\n *ngIf=\"_currentToast()?.title\"\n class=\"me-auto\"\n >{{ _currentToast()?.title | transloco }}</strong\n >\n <small *ngIf=\"_currentToast()?.date\">{{ _currentToast()?.date ?? '' | date: _currentToast()?.dateFormat }}</small>\n <button\n (click)=\"close()\"\n *ngIf=\"_currentToast()?.showCloseButton\"\n aria-label=\"Close\"\n class=\"ms-2 mb-1 btn-close\"\n data-dismiss=\"toast\"\n type=\"button\"\n >\n <span aria-hidden=\"true\"></span>\n </button>\n </div>\n <div\n *ngIf=\"_currentToast()?.text\"\n class=\"toast-body\"\n >\n {{ _currentToast()?.text?.trim() | transloco: { textValue: _currentToast()?.textValue?.trim() } }}\n </div>\n <ng-container *ngTemplateOutlet=\"_currentToast()?.customTemplate ?? null\"></ng-container>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, signal, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
3
+ import { QuangBaseOverlayDirective } from 'quang/overlay/shared';
4
+ import { trigger, state, transition, style, animate } from '@angular/animations';
5
+ import { OverlayModule } from '@angular/cdk/overlay';
6
+
7
+ class QuangTooltipComponent {
8
+ constructor() {
9
+ this.content = input('');
10
+ this.quangTooltipPosition = input('top');
11
+ this.positionPair = signal(null);
12
+ this.payload = input();
13
+ }
14
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.5", type: QuangTooltipComponent, isStandalone: true, selector: "quang-tooltip", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, quangTooltipPosition: { classPropertyName: "quangTooltipPosition", publicName: "quangTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n @tooltip\n class=\"quang-tooltip\"\n>\n {{ content() }}\n</div>\n", styles: [".quang-tooltip{background-color:var(--bs-body-color);color:var(--bs-body-bg);padding:.5rem;border-radius:5px;font-size:.75rem;opacity:0}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }], animations: [
16
+ trigger('tooltip', [
17
+ state('*', style({ opacity: 1 })),
18
+ transition(':enter', [style({ opacity: 0 }), animate(200, style({ opacity: 1 }))]),
19
+ transition(':leave', [style({ opacity: 1 }), animate(300, style({ opacity: 0 }))]),
20
+ ]),
21
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangTooltipComponent, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'quang-tooltip', imports: [OverlayModule], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
26
+ trigger('tooltip', [
27
+ state('*', style({ opacity: 1 })),
28
+ transition(':enter', [style({ opacity: 0 }), animate(200, style({ opacity: 1 }))]),
29
+ transition(':leave', [style({ opacity: 1 }), animate(300, style({ opacity: 0 }))]),
30
+ ]),
31
+ ], template: "<div\n @tooltip\n class=\"quang-tooltip\"\n>\n {{ content() }}\n</div>\n", styles: [".quang-tooltip{background-color:var(--bs-body-color);color:var(--bs-body-bg);padding:.5rem;border-radius:5px;font-size:.75rem;opacity:0}\n"] }]
32
+ }] });
33
+
34
+ class QuangTooltipDirective extends QuangBaseOverlayDirective {
35
+ constructor() {
36
+ super(...arguments);
37
+ this.targetComponentType = signal(QuangTooltipComponent);
38
+ this.content = input.required({ alias: 'quangTooltip' });
39
+ this.showMethod = input('hover');
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangTooltipDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
42
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.5", type: QuangTooltipDirective, isStandalone: true, selector: "[quangTooltip]", inputs: { content: { classPropertyName: "content", publicName: "quangTooltip", isSignal: true, isRequired: true, transformFunction: null }, showMethod: { classPropertyName: "showMethod", publicName: "showMethod", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0 }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: QuangTooltipDirective, decorators: [{
45
+ type: Directive,
46
+ args: [{
47
+ selector: '[quangTooltip]',
48
+ }]
49
+ }] });
50
+
51
+ /**
52
+ * Generated bundle index. Do not edit.
53
+ */
54
+
55
+ export { QuangTooltipComponent, QuangTooltipDirective };
56
+ //# sourceMappingURL=quang-overlay-tooltip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quang-overlay-tooltip.mjs","sources":["../../../projects/quang/overlay/tooltip/tooltip.component.ts","../../../projects/quang/overlay/tooltip/tooltip.component.html","../../../projects/quang/overlay/tooltip/tooltip.directive.ts","../../../projects/quang/overlay/tooltip/quang-overlay-tooltip.ts"],"sourcesContent":["import { animate, state, style, transition, trigger } from '@angular/animations'\nimport { ConnectionPositionPair, OverlayModule } from '@angular/cdk/overlay'\nimport { ChangeDetectionStrategy, Component, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayComponent } from 'quang/overlay/shared'\n\n@Component({\n selector: 'quang-tooltip',\n imports: [OverlayModule],\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n animations: [\n trigger('tooltip', [\n state('*', style({ opacity: 1 })),\n transition(':enter', [style({ opacity: 0 }), animate(200, style({ opacity: 1 }))]),\n transition(':leave', [style({ opacity: 1 }), animate(300, style({ opacity: 0 }))]),\n ]),\n ],\n})\nexport class QuangTooltipComponent implements QuangBaseOverlayComponent {\n content = input<string>('')\n\n quangTooltipPosition = input<'top' | 'bottom' | 'left' | 'right'>('top')\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n\n payload = input<unknown>()\n}\n","<div\n @tooltip\n class=\"quang-tooltip\"\n>\n {{ content() }}\n</div>\n","import { ComponentType } from '@angular/cdk/portal'\nimport { Directive, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayDirective } from 'quang/overlay/shared'\n\nimport { QuangTooltipComponent } from './tooltip.component'\n\n@Directive({\n selector: '[quangTooltip]',\n})\nexport class QuangTooltipDirective extends QuangBaseOverlayDirective<QuangTooltipComponent> {\n override targetComponentType = signal<ComponentType<QuangTooltipComponent> | undefined>(QuangTooltipComponent)\n\n override content = input.required<string>({ alias: 'quangTooltip' })\n\n override showMethod = input<'click' | 'hover'>('hover')\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}