valtech-components 2.0.867 → 2.0.868

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.
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "2.0.867";
5
+ export declare const VERSION = "2.0.868";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.867",
3
+ "version": "2.0.868",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -277,8 +277,6 @@ export * from './lib/services/firebase';
277
277
  export * from './lib/services/auth';
278
278
  export * from './lib/services/i18n';
279
279
  export * from './lib/services/preferences';
280
- export * from './lib/services/network-status';
281
- export * from './lib/components/molecules/network-banner/network-banner.component';
282
280
  export * from './lib/services/page-refresh/page-refresh.service';
283
281
  export * from './lib/services/refreshable-stream';
284
282
  export * from './lib/services/app-config';
@@ -1,98 +0,0 @@
1
- import { Component, computed, inject } from '@angular/core';
2
- import { I18nService } from '../../../services/i18n';
3
- import { NetworkStatusService } from '../../../services/network-status/network-status.service';
4
- import * as i0 from "@angular/core";
5
- const NAMESPACE = 'NetworkBanner';
6
- /**
7
- * val-network-banner
8
- *
9
- * Banner de estado de red que empuja el contenido hacia abajo (no fixed/overlay).
10
- * - Offline: banner rojo sin cierre, persiste hasta reconexion.
11
- * - Reconexion: banner verde con boton de cierre y countdown 10s.
12
- * - Online desde inicio: no renderiza nada.
13
- *
14
- * Colocar como primer hijo dentro de ion-content, antes de val-container.
15
- *
16
- * @example
17
- * <val-network-banner />
18
- */
19
- export class NetworkBannerComponent {
20
- constructor() {
21
- this.i18n = inject(I18nService);
22
- this.network = inject(NetworkStatusService);
23
- this.showBanner = computed(() => !this.network.isOnline() || this.network.justReconnected());
24
- this.isOffline = computed(() => !this.network.isOnline());
25
- this.isReconnected = computed(() => this.network.justReconnected());
26
- this.countdown = this.network.countdown;
27
- this.closeLabel = computed(() => {
28
- this.i18n.lang();
29
- const s = String(this.countdown() ?? 0);
30
- return this.t('closeCountdown').replace('{s}', s);
31
- });
32
- }
33
- t(key) {
34
- return this.i18n.t(key, NAMESPACE);
35
- }
36
- dismiss() {
37
- this.network.dismiss();
38
- }
39
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NetworkBannerComponent, isStandalone: true, selector: "val-network-banner", ngImport: i0, template: `
41
- <div
42
- class="network-banner"
43
- [class.network-banner--visible]="showBanner()"
44
- [class.network-banner--offline]="isOffline()"
45
- [class.network-banner--reconnected]="isReconnected()"
46
- role="alert"
47
- [attr.aria-live]="isOffline() ? 'assertive' : 'polite'"
48
- >
49
- <div class="network-banner__content">
50
- <span class="network-banner__icon">{{ isOffline() ? '&#9888;' : '&#10003;' }}</span>
51
- <span class="network-banner__text">
52
- @if (isOffline()) {
53
- <strong>{{ t('offlineTitle') }}</strong>
54
- {{ t('offlineBody') }}
55
- } @else {
56
- <strong>{{ t('reconnectedTitle') }}</strong>
57
- }
58
- </span>
59
- @if (isReconnected()) {
60
- <button class="network-banner__close" (click)="dismiss()" [attr.aria-label]="t('close')">
61
- {{ closeLabel() }} &#x2715;
62
- </button>
63
- }
64
- </div>
65
- </div>
66
- `, isInline: true, styles: [".network-banner{max-height:0;overflow:hidden;transition:max-height .35s ease-out}.network-banner--visible{max-height:100px}.network-banner__content{display:flex;align-items:center;gap:.5rem;padding:.6rem 1rem;font-size:.875rem;line-height:1.4}.network-banner--offline .network-banner__content{background:var(--ion-color-danger, #eb445a);color:#fff}.network-banner--reconnected .network-banner__content{background:var(--ion-color-success, #2dd36f);color:#fff}.network-banner__icon{flex-shrink:0;font-size:1rem}.network-banner__text{flex:1}.network-banner__close{background:#fff3;border:1px solid rgba(255,255,255,.4);border-radius:4px;color:#fff;cursor:pointer;font-size:.8rem;padding:.25rem .5rem;white-space:nowrap}.network-banner__close:hover{background:#ffffff59}\n"] }); }
67
- }
68
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkBannerComponent, decorators: [{
69
- type: Component,
70
- args: [{ selector: 'val-network-banner', standalone: true, template: `
71
- <div
72
- class="network-banner"
73
- [class.network-banner--visible]="showBanner()"
74
- [class.network-banner--offline]="isOffline()"
75
- [class.network-banner--reconnected]="isReconnected()"
76
- role="alert"
77
- [attr.aria-live]="isOffline() ? 'assertive' : 'polite'"
78
- >
79
- <div class="network-banner__content">
80
- <span class="network-banner__icon">{{ isOffline() ? '&#9888;' : '&#10003;' }}</span>
81
- <span class="network-banner__text">
82
- @if (isOffline()) {
83
- <strong>{{ t('offlineTitle') }}</strong>
84
- {{ t('offlineBody') }}
85
- } @else {
86
- <strong>{{ t('reconnectedTitle') }}</strong>
87
- }
88
- </span>
89
- @if (isReconnected()) {
90
- <button class="network-banner__close" (click)="dismiss()" [attr.aria-label]="t('close')">
91
- {{ closeLabel() }} &#x2715;
92
- </button>
93
- }
94
- </div>
95
- </div>
96
- `, styles: [".network-banner{max-height:0;overflow:hidden;transition:max-height .35s ease-out}.network-banner--visible{max-height:100px}.network-banner__content{display:flex;align-items:center;gap:.5rem;padding:.6rem 1rem;font-size:.875rem;line-height:1.4}.network-banner--offline .network-banner__content{background:var(--ion-color-danger, #eb445a);color:#fff}.network-banner--reconnected .network-banner__content{background:var(--ion-color-success, #2dd36f);color:#fff}.network-banner__icon{flex-shrink:0;font-size:1rem}.network-banner__text{flex:1}.network-banner__close{background:#fff3;border:1px solid rgba(255,255,255,.4);border-radius:4px;color:#fff;cursor:pointer;font-size:.8rem;padding:.25rem .5rem;white-space:nowrap}.network-banner__close:hover{background:#ffffff59}\n"] }]
97
- }] });
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9uZXR3b3JrLWJhbm5lci9uZXR3b3JrLWJhbm5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5REFBeUQsQ0FBQzs7QUFFL0YsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7R0FZRztBQXdGSCxNQUFNLE9BQU8sc0JBQXNCO0lBdkZuQztRQXdGbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFL0MsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUVuQyxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztLQVNKO0lBUEMsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzsrR0FyQlUsc0JBQXNCO21HQUF0QixzQkFBc0IsOEVBcEZ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQ7OzRGQTBEVSxzQkFBc0I7a0JBdkZsQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFlBQ047Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmV0d29ya1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uZXR3b3JrLXN0YXR1cy9uZXR3b3JrLXN0YXR1cy5zZXJ2aWNlJztcblxuY29uc3QgTkFNRVNQQUNFID0gJ05ldHdvcmtCYW5uZXInO1xuXG4vKipcbiAqIHZhbC1uZXR3b3JrLWJhbm5lclxuICpcbiAqIEJhbm5lciBkZSBlc3RhZG8gZGUgcmVkIHF1ZSBlbXB1amEgZWwgY29udGVuaWRvIGhhY2lhIGFiYWpvIChubyBmaXhlZC9vdmVybGF5KS5cbiAqIC0gT2ZmbGluZTogYmFubmVyIHJvam8gc2luIGNpZXJyZSwgcGVyc2lzdGUgaGFzdGEgcmVjb25leGlvbi5cbiAqIC0gUmVjb25leGlvbjogYmFubmVyIHZlcmRlIGNvbiBib3RvbiBkZSBjaWVycmUgeSBjb3VudGRvd24gMTBzLlxuICogLSBPbmxpbmUgZGVzZGUgaW5pY2lvOiBubyByZW5kZXJpemEgbmFkYS5cbiAqXG4gKiBDb2xvY2FyIGNvbW8gcHJpbWVyIGhpam8gZGVudHJvIGRlIGlvbi1jb250ZW50LCBhbnRlcyBkZSB2YWwtY29udGFpbmVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8dmFsLW5ldHdvcmstYmFubmVyIC8+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1uZXR3b3JrLWJhbm5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJuZXR3b3JrLWJhbm5lclwiXG4gICAgICBbY2xhc3MubmV0d29yay1iYW5uZXItLXZpc2libGVdPVwic2hvd0Jhbm5lcigpXCJcbiAgICAgIFtjbGFzcy5uZXR3b3JrLWJhbm5lci0tb2ZmbGluZV09XCJpc09mZmxpbmUoKVwiXG4gICAgICBbY2xhc3MubmV0d29yay1iYW5uZXItLXJlY29ubmVjdGVkXT1cImlzUmVjb25uZWN0ZWQoKVwiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgW2F0dHIuYXJpYS1saXZlXT1cImlzT2ZmbGluZSgpID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cIm5ldHdvcmstYmFubmVyX19jb250ZW50XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmV0d29yay1iYW5uZXJfX2ljb25cIj57eyBpc09mZmxpbmUoKSA/ICcmIzk4ODg7JyA6ICcmIzEwMDAzOycgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmV0d29yay1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICBAaWYgKGlzT2ZmbGluZSgpKSB7XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ29mZmxpbmVUaXRsZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICB7eyB0KCdvZmZsaW5lQm9keScpIH19XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ3JlY29ubmVjdGVkVGl0bGUnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICBAaWYgKGlzUmVjb25uZWN0ZWQoKSkge1xuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuZXR3b3JrLWJhbm5lcl9fY2xvc2VcIiAoY2xpY2spPVwiZGlzbWlzcygpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjbG9zZScpXCI+XG4gICAgICAgICAgICB7eyBjbG9zZUxhYmVsKCkgfX0gJiN4MjcxNTtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5uZXR3b3JrLWJhbm5lciB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMzUwbXMgZWFzZS1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tdmlzaWJsZSB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDEwMHB4O1xuICAgICAgfVxuXG4gICAgICAubmV0d29yay1iYW5uZXJfX2NvbnRlbnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgICAgcGFkZGluZzogMC42cmVtIDFyZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tb2ZmbGluZSAubmV0d29yay1iYW5uZXJfX2NvbnRlbnQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLCAjZWI0NDVhKTtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tcmVjb25uZWN0ZWQgLm5ldHdvcmstYmFubmVyX19jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3MsICMyZGQzNmYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19pY29uIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX190ZXh0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19jbG9zZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19jbG9zZTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmV0d29ya0Jhbm5lckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29yayA9IGluamVjdChOZXR3b3JrU3RhdHVzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgc2hvd0Jhbm5lciA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLm5ldHdvcmsuaXNPbmxpbmUoKSB8fCB0aGlzLm5ldHdvcmsuanVzdFJlY29ubmVjdGVkKCkpO1xuICByZWFkb25seSBpc09mZmxpbmUgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5uZXR3b3JrLmlzT25saW5lKCkpO1xuICByZWFkb25seSBpc1JlY29ubmVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5uZXR3b3JrLmp1c3RSZWNvbm5lY3RlZCgpKTtcbiAgcmVhZG9ubHkgY291bnRkb3duID0gdGhpcy5uZXR3b3JrLmNvdW50ZG93bjtcblxuICByZWFkb25seSBjbG9zZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgY29uc3QgcyA9IFN0cmluZyh0aGlzLmNvdW50ZG93bigpID8/IDApO1xuICAgIHJldHVybiB0aGlzLnQoJ2Nsb3NlQ291bnRkb3duJykucmVwbGFjZSgne3N9Jywgcyk7XG4gIH0pO1xuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMubmV0d29yay5kaXNtaXNzKCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export { NetworkStatusService } from './network-status.service';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL25ldHdvcmstc3RhdHVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgTmV0d29ya1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmstc3RhdHVzLnNlcnZpY2UnO1xuIl19
@@ -1,59 +0,0 @@
1
- import { Injectable, signal } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class NetworkStatusService {
4
- constructor() {
5
- this._isOnline = signal(typeof navigator !== 'undefined' ? navigator.onLine : true);
6
- this._justReconnected = signal(false);
7
- this._countdown = signal(null);
8
- this.isOnline = this._isOnline.asReadonly();
9
- this.justReconnected = this._justReconnected.asReadonly();
10
- this.countdown = this._countdown.asReadonly();
11
- if (typeof window !== 'undefined') {
12
- window.addEventListener('online', () => this.onOnline());
13
- window.addEventListener('offline', () => this.onOffline());
14
- }
15
- }
16
- onOnline() {
17
- if (!this._isOnline()) {
18
- this._isOnline.set(true);
19
- this._justReconnected.set(true);
20
- this.startCountdown();
21
- }
22
- }
23
- onOffline() {
24
- this._isOnline.set(false);
25
- this._justReconnected.set(false);
26
- this.clearCountdown();
27
- }
28
- startCountdown() {
29
- this.clearCountdown();
30
- this._countdown.set(10);
31
- this._countdownTimer = setInterval(() => {
32
- const current = this._countdown();
33
- if (current === null || current <= 1) {
34
- this.dismiss();
35
- }
36
- else {
37
- this._countdown.set(current - 1);
38
- }
39
- }, 1000);
40
- }
41
- clearCountdown() {
42
- if (this._countdownTimer) {
43
- clearInterval(this._countdownTimer);
44
- this._countdownTimer = undefined;
45
- }
46
- this._countdown.set(null);
47
- }
48
- dismiss() {
49
- this._justReconnected.set(false);
50
- this.clearCountdown();
51
- }
52
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
53
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, providedIn: 'root' }); }
54
- }
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, decorators: [{
56
- type: Injectable,
57
- args: [{ providedIn: 'root' }]
58
- }], ctorParameters: () => [] });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1zdGF0dXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvbmV0d29yay1zdGF0dXMvbmV0d29yay1zdGF0dXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHbkQsTUFBTSxPQUFPLG9CQUFvQjtJQVUvQjtRQVRRLGNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFHeEMsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkMsb0JBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckQsY0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7UUFHaEQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFTyxRQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBdkRVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZXR3b3JrU3RhdHVzU2VydmljZSB7XG4gIHByaXZhdGUgX2lzT25saW5lID0gc2lnbmFsKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLm9uTGluZSA6IHRydWUpO1xuICBwcml2YXRlIF9qdXN0UmVjb25uZWN0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9jb3VudGRvd24gPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX2NvdW50ZG93blRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuXG4gIHJlYWRvbmx5IGlzT25saW5lID0gdGhpcy5faXNPbmxpbmUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBqdXN0UmVjb25uZWN0ZWQgPSB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBjb3VudGRvd24gPSB0aGlzLl9jb3VudGRvd24uYXNSZWFkb25seSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICgpID0+IHRoaXMub25PbmxpbmUoKSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsICgpID0+IHRoaXMub25PZmZsaW5lKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25PbmxpbmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc09ubGluZSgpKSB7XG4gICAgICB0aGlzLl9pc09ubGluZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zdGFydENvdW50ZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25PZmZsaW5lKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzT25saW5lLnNldChmYWxzZSk7XG4gICAgdGhpcy5fanVzdFJlY29ubmVjdGVkLnNldChmYWxzZSk7XG4gICAgdGhpcy5jbGVhckNvdW50ZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duKCk7XG4gICAgdGhpcy5fY291bnRkb3duLnNldCgxMCk7XG4gICAgdGhpcy5fY291bnRkb3duVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY291bnRkb3duKCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50IDw9IDEpIHtcbiAgICAgICAgdGhpcy5kaXNtaXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb3VudGRvd24uc2V0KGN1cnJlbnQgLSAxKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDb3VudGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvdW50ZG93blRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2NvdW50ZG93blRpbWVyKTtcbiAgICAgIHRoaXMuX2NvdW50ZG93blRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9jb3VudGRvd24uc2V0KG51bGwpO1xuICB9XG5cbiAgZGlzbWlzcygpOiB2b2lkIHtcbiAgICB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duKCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,27 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- /**
3
- * val-network-banner
4
- *
5
- * Banner de estado de red que empuja el contenido hacia abajo (no fixed/overlay).
6
- * - Offline: banner rojo sin cierre, persiste hasta reconexion.
7
- * - Reconexion: banner verde con boton de cierre y countdown 10s.
8
- * - Online desde inicio: no renderiza nada.
9
- *
10
- * Colocar como primer hijo dentro de ion-content, antes de val-container.
11
- *
12
- * @example
13
- * <val-network-banner />
14
- */
15
- export declare class NetworkBannerComponent {
16
- private readonly i18n;
17
- private readonly network;
18
- readonly showBanner: import("@angular/core").Signal<boolean>;
19
- readonly isOffline: import("@angular/core").Signal<boolean>;
20
- readonly isReconnected: import("@angular/core").Signal<boolean>;
21
- readonly countdown: import("@angular/core").Signal<number>;
22
- readonly closeLabel: import("@angular/core").Signal<string>;
23
- t(key: string): string;
24
- dismiss(): void;
25
- static ɵfac: i0.ɵɵFactoryDeclaration<NetworkBannerComponent, never>;
26
- static ɵcmp: i0.ɵɵComponentDeclaration<NetworkBannerComponent, "val-network-banner", never, {}, {}, never, never, true, never>;
27
- }
@@ -1 +0,0 @@
1
- export { NetworkStatusService } from './network-status.service';
@@ -1,18 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- export declare class NetworkStatusService {
3
- private _isOnline;
4
- private _justReconnected;
5
- private _countdown;
6
- private _countdownTimer?;
7
- readonly isOnline: import("@angular/core").Signal<boolean>;
8
- readonly justReconnected: import("@angular/core").Signal<boolean>;
9
- readonly countdown: import("@angular/core").Signal<number>;
10
- constructor();
11
- private onOnline;
12
- private onOffline;
13
- private startCountdown;
14
- private clearCountdown;
15
- dismiss(): void;
16
- static ɵfac: i0.ɵɵFactoryDeclaration<NetworkStatusService, never>;
17
- static ɵprov: i0.ɵɵInjectableDeclaration<NetworkStatusService>;
18
- }