valtech-components 2.0.773 → 2.0.775

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.
@@ -52,7 +52,7 @@ import 'prismjs/components/prism-json';
52
52
  * Current version of valtech-components.
53
53
  * This is automatically updated during the publish process.
54
54
  */
55
- const VERSION = '2.0.773';
55
+ const VERSION = '2.0.775';
56
56
 
57
57
  /**
58
58
  * Servicio para gestionar presets de componentes.
@@ -5834,19 +5834,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5834
5834
  * transform="translate(col*100 row*100)">` con un `<rect width=100 height=100
5835
5835
  * fill=bg/>` de fondo.
5836
5836
  */
5837
+ /**
5838
+ * Chevrons stroke-based con linecap/linejoin redondos — visualmente coherente
5839
+ * con el símbolo de marca Valtech (`>_`). Stroke-width 18 (default), 12 para
5840
+ * variants `small-*`.
5841
+ */
5842
+ const CHEV_STROKE = 18;
5843
+ const CHEV_SMALL_STROKE = 12;
5844
+ const chevStyle = (f, w = CHEV_STROKE) => `stroke="${f}" stroke-width="${w}" stroke-linecap="round" stroke-linejoin="round" fill="none"`;
5837
5845
  const PATTERN_MOTIFS = {
5838
- 'chev-r': f => `<path d="M22 18 L58 50 L22 82 L42 82 L78 50 L42 18 Z" fill="${f}"/>`,
5839
- 'chev-l': f => `<path d="M78 18 L42 50 L78 82 L58 82 L22 50 L58 18 Z" fill="${f}"/>`,
5840
- 'chev-d': f => `<path d="M18 22 L50 58 L82 22 L82 42 L50 78 L18 42 Z" fill="${f}"/>`,
5841
- 'chev-u': f => `<path d="M18 78 L50 42 L82 78 L82 58 L50 22 L18 58 Z" fill="${f}"/>`,
5846
+ 'chev-r': f => `<path d="M22 18 L72 50 L22 82" ${chevStyle(f)}/>`,
5847
+ 'chev-l': f => `<path d="M78 18 L28 50 L78 82" ${chevStyle(f)}/>`,
5848
+ 'chev-d': f => `<path d="M18 22 L50 72 L82 22" ${chevStyle(f)}/>`,
5849
+ 'chev-u': f => `<path d="M18 78 L50 28 L82 78" ${chevStyle(f)}/>`,
5842
5850
  'tri-tl': f => `<polygon points="0,0 100,0 0,100" fill="${f}"/>`,
5843
5851
  'tri-tr': f => `<polygon points="0,0 100,0 100,100" fill="${f}"/>`,
5844
5852
  'tri-bl': f => `<polygon points="0,0 100,100 0,100" fill="${f}"/>`,
5845
5853
  'tri-br': f => `<polygon points="100,0 100,100 0,100" fill="${f}"/>`,
5846
5854
  solid: () => ``,
5847
5855
  diamond: f => `<polygon points="50,12 88,50 50,88 12,50" fill="${f}"/>`,
5848
- 'small-r': f => `<path d="M38 32 L62 50 L38 68 L48 68 L72 50 L48 32 Z" fill="${f}"/>`,
5849
- 'small-l': f => `<path d="M62 32 L38 50 L62 68 L52 68 L28 50 L52 32 Z" fill="${f}"/>`,
5856
+ 'small-r': f => `<path d="M38 32 L62 50 L38 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
5857
+ 'small-l': f => `<path d="M62 32 L38 50 L62 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
5850
5858
  'arrow-r': f => `<path d="M10 42 L60 42 L60 28 L92 50 L60 72 L60 58 L10 58 Z" fill="${f}"/>`,
5851
5859
  'arrow-l': f => `<path d="M90 42 L40 42 L40 28 L8 50 L40 72 L40 58 L90 58 Z" fill="${f}"/>`,
5852
5860
  'house-d': f => `<polygon points="50,20 88,50 12,50" fill="${f}"/><rect x="28" y="50" width="44" height="32" fill="${f}"/>`,
@@ -5906,6 +5914,31 @@ function mulberry32(seed) {
5906
5914
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
5907
5915
  };
5908
5916
  }
5917
+ /**
5918
+ * Genera UN tile con motif/bg/fg respetando densidades + contraste.
5919
+ * Caller pasa rng (Math.random o seeded) — útil para reshuffle individual de
5920
+ * tiles en `val-pattern` sin regenerar la grid completa.
5921
+ */
5922
+ function generateRandomTile(palette, chevronDensity = 0.55, rng = Math.random) {
5923
+ const roll = rng();
5924
+ let key;
5925
+ if (roll < chevronDensity)
5926
+ key = CHEV_KEYS[Math.floor(rng() * CHEV_KEYS.length)];
5927
+ else if (roll < chevronDensity + 0.2)
5928
+ key = SOLID_KEYS[Math.floor(rng() * SOLID_KEYS.length)];
5929
+ else if (roll < chevronDensity + 0.35)
5930
+ key = SHAPE_KEYS[Math.floor(rng() * SHAPE_KEYS.length)];
5931
+ else
5932
+ key = TRI_KEYS[Math.floor(rng() * TRI_KEYS.length)];
5933
+ const bgIdx = Math.floor(rng() * palette.length);
5934
+ let fgIdx = Math.floor(rng() * palette.length);
5935
+ let tries = 0;
5936
+ while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
5937
+ fgIdx = Math.floor(rng() * palette.length);
5938
+ tries++;
5939
+ }
5940
+ return { motif: key, bg: palette[bgIdx], fg: palette[fgIdx] };
5941
+ }
5909
5942
  /** Genera matriz de tiles aplicando densidades + reglas de contraste. */
5910
5943
  function generatePatternTiles(cfg) {
5911
5944
  const { cols, rows, seed, palette } = cfg;
@@ -5913,25 +5946,7 @@ function generatePatternTiles(cfg) {
5913
5946
  const r = mulberry32(seed);
5914
5947
  const tiles = [];
5915
5948
  for (let i = 0; i < cols * rows; i++) {
5916
- const roll = r();
5917
- let key;
5918
- if (roll < chevronDensity)
5919
- key = CHEV_KEYS[Math.floor(r() * CHEV_KEYS.length)];
5920
- else if (roll < chevronDensity + 0.2)
5921
- key = SOLID_KEYS[Math.floor(r() * SOLID_KEYS.length)];
5922
- else if (roll < chevronDensity + 0.35)
5923
- key = SHAPE_KEYS[Math.floor(r() * SHAPE_KEYS.length)];
5924
- else
5925
- key = TRI_KEYS[Math.floor(r() * TRI_KEYS.length)];
5926
- // Pick bg + contrasting fg (índices con distancia ≥3 en la palette).
5927
- const bgIdx = Math.floor(r() * palette.length);
5928
- let fgIdx = Math.floor(r() * palette.length);
5929
- let tries = 0;
5930
- while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
5931
- fgIdx = Math.floor(r() * palette.length);
5932
- tries++;
5933
- }
5934
- tiles.push({ motif: key, bg: palette[bgIdx], fg: palette[fgIdx] });
5949
+ tiles.push(generateRandomTile(palette, chevronDensity, r));
5935
5950
  }
5936
5951
  return tiles;
5937
5952
  }
@@ -6004,6 +6019,9 @@ class PatternComponent {
6004
6019
  if (value.reshuffleInterval !== undefined && value.reshuffleInterval > 0) {
6005
6020
  this.reshuffleInterval.set(value.reshuffleInterval);
6006
6021
  }
6022
+ if (value.tilesPerTick !== undefined && value.tilesPerTick > 0) {
6023
+ this.tilesPerTick.set(Math.floor(value.tilesPerTick));
6024
+ }
6007
6025
  if (value.animated !== undefined)
6008
6026
  this.animated.set(!!value.animated);
6009
6027
  }
@@ -6016,15 +6034,16 @@ class PatternComponent {
6016
6034
  this.chevronDensity = signal(0.55);
6017
6035
  this.preserveAspect = signal('slice');
6018
6036
  this.animated = signal(false);
6019
- this.reshuffleInterval = signal(8000);
6020
- /** Tiles computed — se regenera cuando cambia seed/cols/rows/palette/density. */
6021
- this.tiles = computed(() => generatePatternTiles({
6022
- cols: this.cols(),
6023
- rows: this.rows(),
6024
- seed: this.seed(),
6025
- palette: this.paletteRef(),
6026
- chevronDensity: this.chevronDensity(),
6027
- }));
6037
+ /** ms entre updates individuales de tiles (modo animated). Default 1200ms. */
6038
+ this.reshuffleInterval = signal(1200);
6039
+ /** Cuántos tiles cambiar por tick (default 1 → cambio sutil). */
6040
+ this.tilesPerTick = signal(1);
6041
+ /**
6042
+ * Tiles signal — mutable. Se regenera completa cuando cambia seed/cols/rows/
6043
+ * palette/density. En modo animated, tiles individuales se sobrescriben sin
6044
+ * tocar el resto (efecto staggered).
6045
+ */
6046
+ this.tiles = signal([]);
6028
6047
  /** SVG completo como string sanitized para `[innerHTML]`. */
6029
6048
  this.svgHtml = computed(() => {
6030
6049
  const cols = this.cols();
@@ -6035,18 +6054,30 @@ class PatternComponent {
6035
6054
  const svg = `<svg viewBox="0 0 ${cols * 100} ${rows * 100}" preserveAspectRatio="${aspect}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">${inner}</svg>`;
6036
6055
  return this.sanitizer.bypassSecurityTrustHtml(svg);
6037
6056
  });
6038
- // Animated reshuffle: cada N ms cambia seed para reshuffle visual.
6057
+ // Regenera grid completa cuando cambian props estructurales (cols/rows/
6058
+ // palette/density/seed). El seed solo cambia explícitamente via props o
6059
+ // mount inicial — NO se muta en modo animated.
6060
+ effect(() => {
6061
+ const cols = this.cols();
6062
+ const rows = this.rows();
6063
+ const seed = this.seed();
6064
+ const palette = this.paletteRef();
6065
+ const density = this.chevronDensity();
6066
+ this.tiles.set(generatePatternTiles({ cols, rows, seed, palette, chevronDensity: density }));
6067
+ });
6068
+ // Modo animated: cada `reshuffleInterval` ms, sobrescribe `tilesPerTick`
6069
+ // tiles random — efecto staggered (no toda la grid de una). Si el user
6070
+ // desactiva animated, el timer se limpia automáticamente.
6039
6071
  effect(onCleanup => {
6040
6072
  const isAnimated = this.animated();
6041
6073
  const interval = this.reshuffleInterval();
6074
+ const perTick = this.tilesPerTick();
6042
6075
  if (this.timer)
6043
6076
  clearInterval(this.timer);
6044
6077
  this.timer = undefined;
6045
6078
  if (!isAnimated)
6046
6079
  return;
6047
- this.timer = setInterval(() => {
6048
- this.seed.set(this.randomSeed());
6049
- }, interval);
6080
+ this.timer = setInterval(() => this.mutateRandomTiles(perTick), interval);
6050
6081
  onCleanup(() => {
6051
6082
  if (this.timer) {
6052
6083
  clearInterval(this.timer);
@@ -6055,6 +6086,23 @@ class PatternComponent {
6055
6086
  });
6056
6087
  });
6057
6088
  }
6089
+ /**
6090
+ * Reemplaza `count` tiles random del grid actual con tiles nuevos generados.
6091
+ * Usado por el modo animated para staggered reshuffle.
6092
+ */
6093
+ mutateRandomTiles(count) {
6094
+ const current = this.tiles();
6095
+ if (current.length === 0)
6096
+ return;
6097
+ const next = [...current];
6098
+ const palette = this.paletteRef();
6099
+ const density = this.chevronDensity();
6100
+ for (let n = 0; n < count; n++) {
6101
+ const idx = Math.floor(Math.random() * next.length);
6102
+ next[idx] = generateRandomTile(palette, density);
6103
+ }
6104
+ this.tiles.set(next);
6105
+ }
6058
6106
  ngOnDestroy() {
6059
6107
  if (this.timer)
6060
6108
  clearInterval(this.timer);
@@ -25947,6 +25995,198 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
25947
25995
  type: Input
25948
25996
  }] } });
25949
25997
 
25998
+ /**
25999
+ * `val-cookie-banner` — bottom/top fixed banner asking the user to choose
26000
+ * a cookie consent option. Presentational only: emits events on each
26001
+ * action, the parent decides what to do (typically wiring to
26002
+ * `AnalyticsService` from `valtech-components`).
26003
+ *
26004
+ * @example
26005
+ * <val-cookie-banner
26006
+ * [props]="bannerProps()"
26007
+ * (accept)="onAccept()"
26008
+ * (reject)="onReject()"
26009
+ * (customize)="onCustomize()"
26010
+ * (dismiss)="onDismiss()"
26011
+ * />
26012
+ *
26013
+ * Wire `props.visible` to `analytics.consentState().hasDecided === false`
26014
+ * so the banner auto-hides once the user makes a choice.
26015
+ */
26016
+ class CookieBannerComponent {
26017
+ constructor() {
26018
+ /** Fired when the user clicks the primary "accept" button. */
26019
+ this.accept = new EventEmitter();
26020
+ /** Fired when the user clicks the secondary "reject" button. */
26021
+ this.reject = new EventEmitter();
26022
+ /** Fired when the user clicks the tertiary "customize/configure" button. */
26023
+ this.customize = new EventEmitter();
26024
+ /** Fired when the user clicks the dismiss (X) icon. */
26025
+ this.dismiss = new EventEmitter();
26026
+ addIcons({ closeOutline });
26027
+ }
26028
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CookieBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26029
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CookieBannerComponent, isStandalone: true, selector: "val-cookie-banner", inputs: { props: "props" }, outputs: { accept: "accept", reject: "reject", customize: "customize", dismiss: "dismiss" }, ngImport: i0, template: `
26030
+ @if (props?.visible) {
26031
+ <div
26032
+ class="val-cookie-banner"
26033
+ [class.val-cookie-banner--top]="props.position === 'top'"
26034
+ [class.val-cookie-banner--bottom]="props.position !== 'top'"
26035
+ [class.val-cookie-banner--translucent]="props.translucent"
26036
+ role="dialog"
26037
+ aria-modal="false"
26038
+ aria-live="polite"
26039
+ >
26040
+ <div class="val-cookie-banner__inner" [style.max-width]="props.maxWidth || '1200px'">
26041
+ @if (props.dismissible) {
26042
+ <button
26043
+ type="button"
26044
+ class="val-cookie-banner__dismiss"
26045
+ [attr.aria-label]="'dismiss'"
26046
+ (click)="dismiss.emit()"
26047
+ >
26048
+ <ion-icon name="close-outline"></ion-icon>
26049
+ </button>
26050
+ }
26051
+
26052
+ <div class="val-cookie-banner__copy">
26053
+ @if (props.title) {
26054
+ <h3 class="val-cookie-banner__title">{{ props.title }}</h3>
26055
+ }
26056
+ <p class="val-cookie-banner__message">
26057
+ {{ props.message }}
26058
+ @if (props.policyLinkText && props.policyHref) {
26059
+ <a class="val-cookie-banner__policy" [href]="props.policyHref" target="_blank" rel="noopener">
26060
+ {{ props.policyLinkText }}
26061
+ </a>
26062
+ }
26063
+ </p>
26064
+ </div>
26065
+
26066
+ <div class="val-cookie-banner__actions">
26067
+ <ion-button fill="clear" size="small" [color]="props.rejectColor || 'medium'" (click)="reject.emit()">
26068
+ {{ props.rejectText }}
26069
+ </ion-button>
26070
+
26071
+ @if (props.customizeText) {
26072
+ @if (props.customizeRouterLink) {
26073
+ <ion-button
26074
+ fill="outline"
26075
+ size="small"
26076
+ [color]="props.customizeColor || 'dark'"
26077
+ [routerLink]="props.customizeRouterLink"
26078
+ (click)="customize.emit()"
26079
+ >
26080
+ {{ props.customizeText }}
26081
+ </ion-button>
26082
+ } @else {
26083
+ <ion-button
26084
+ fill="outline"
26085
+ size="small"
26086
+ [color]="props.customizeColor || 'dark'"
26087
+ (click)="customize.emit()"
26088
+ >
26089
+ {{ props.customizeText }}
26090
+ </ion-button>
26091
+ }
26092
+ }
26093
+
26094
+ <ion-button fill="solid" size="small" [color]="props.acceptColor || 'primary'" (click)="accept.emit()">
26095
+ {{ props.acceptText }}
26096
+ </ion-button>
26097
+ </div>
26098
+ </div>
26099
+ </div>
26100
+ }
26101
+ `, isInline: true, styles: [":host{display:contents}.val-cookie-banner{position:fixed;left:0;right:0;z-index:1000;padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-color:var(--val-border-color, rgba(0, 0, 0, .08));border-style:solid;border-width:0;box-shadow:0 -2px 16px #00000014;animation:val-cookie-banner-in .25s ease-out}.val-cookie-banner--bottom{bottom:0;border-top-width:1px}.val-cookie-banner--top{top:0;border-bottom-width:1px;padding:calc(12px + env(safe-area-inset-top,0px)) 16px 12px;box-shadow:0 2px 16px #00000014}.val-cookie-banner--translucent{background:#ffffffd9;backdrop-filter:saturate(180%) blur(16px);-webkit-backdrop-filter:saturate(180%) blur(16px)}@media (prefers-color-scheme: dark){.val-cookie-banner--translucent{background:#141414d9}}.val-cookie-banner__inner{margin:0 auto;display:flex;flex-direction:row;align-items:center;gap:16px;position:relative}.val-cookie-banner__dismiss{position:absolute;top:-8px;right:-4px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;border-radius:50%;cursor:pointer;color:var(--ion-color-medium);transition:color .15s ease,background .15s ease}.val-cookie-banner__dismiss:hover{color:var(--ion-color-dark);background:var(--ion-color-light-shade, rgba(0, 0, 0, .04))}.val-cookie-banner__dismiss ion-icon{font-size:18px}.val-cookie-banner__copy{flex:1 1 auto;min-width:0}.val-cookie-banner__title{margin:0 0 4px;font-size:14px;font-weight:600;color:var(--ion-color-dark)}.val-cookie-banner__message{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.val-cookie-banner__policy{margin-left:4px;color:var(--ion-color-primary);text-decoration:underline;text-underline-offset:2px}.val-cookie-banner__actions{display:inline-flex;flex-direction:row;align-items:center;gap:8px;flex-shrink:0}@media (max-width: 768px){.val-cookie-banner__inner{flex-direction:column;align-items:stretch;gap:12px}.val-cookie-banner__actions{flex-wrap:wrap;justify-content:flex-end}}@media (max-width: 480px){.val-cookie-banner__actions{flex-direction:column;align-items:stretch}.val-cookie-banner__actions ion-button{width:100%}}@keyframes val-cookie-banner-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.val-cookie-banner--top{animation-name:val-cookie-banner-in-top}@keyframes val-cookie-banner-in-top{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){.val-cookie-banner{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26102
+ }
26103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CookieBannerComponent, decorators: [{
26104
+ type: Component,
26105
+ args: [{ selector: 'val-cookie-banner', standalone: true, imports: [CommonModule, RouterLink, IonButton, IonIcon], template: `
26106
+ @if (props?.visible) {
26107
+ <div
26108
+ class="val-cookie-banner"
26109
+ [class.val-cookie-banner--top]="props.position === 'top'"
26110
+ [class.val-cookie-banner--bottom]="props.position !== 'top'"
26111
+ [class.val-cookie-banner--translucent]="props.translucent"
26112
+ role="dialog"
26113
+ aria-modal="false"
26114
+ aria-live="polite"
26115
+ >
26116
+ <div class="val-cookie-banner__inner" [style.max-width]="props.maxWidth || '1200px'">
26117
+ @if (props.dismissible) {
26118
+ <button
26119
+ type="button"
26120
+ class="val-cookie-banner__dismiss"
26121
+ [attr.aria-label]="'dismiss'"
26122
+ (click)="dismiss.emit()"
26123
+ >
26124
+ <ion-icon name="close-outline"></ion-icon>
26125
+ </button>
26126
+ }
26127
+
26128
+ <div class="val-cookie-banner__copy">
26129
+ @if (props.title) {
26130
+ <h3 class="val-cookie-banner__title">{{ props.title }}</h3>
26131
+ }
26132
+ <p class="val-cookie-banner__message">
26133
+ {{ props.message }}
26134
+ @if (props.policyLinkText && props.policyHref) {
26135
+ <a class="val-cookie-banner__policy" [href]="props.policyHref" target="_blank" rel="noopener">
26136
+ {{ props.policyLinkText }}
26137
+ </a>
26138
+ }
26139
+ </p>
26140
+ </div>
26141
+
26142
+ <div class="val-cookie-banner__actions">
26143
+ <ion-button fill="clear" size="small" [color]="props.rejectColor || 'medium'" (click)="reject.emit()">
26144
+ {{ props.rejectText }}
26145
+ </ion-button>
26146
+
26147
+ @if (props.customizeText) {
26148
+ @if (props.customizeRouterLink) {
26149
+ <ion-button
26150
+ fill="outline"
26151
+ size="small"
26152
+ [color]="props.customizeColor || 'dark'"
26153
+ [routerLink]="props.customizeRouterLink"
26154
+ (click)="customize.emit()"
26155
+ >
26156
+ {{ props.customizeText }}
26157
+ </ion-button>
26158
+ } @else {
26159
+ <ion-button
26160
+ fill="outline"
26161
+ size="small"
26162
+ [color]="props.customizeColor || 'dark'"
26163
+ (click)="customize.emit()"
26164
+ >
26165
+ {{ props.customizeText }}
26166
+ </ion-button>
26167
+ }
26168
+ }
26169
+
26170
+ <ion-button fill="solid" size="small" [color]="props.acceptColor || 'primary'" (click)="accept.emit()">
26171
+ {{ props.acceptText }}
26172
+ </ion-button>
26173
+ </div>
26174
+ </div>
26175
+ </div>
26176
+ }
26177
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}.val-cookie-banner{position:fixed;left:0;right:0;z-index:1000;padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-color:var(--val-border-color, rgba(0, 0, 0, .08));border-style:solid;border-width:0;box-shadow:0 -2px 16px #00000014;animation:val-cookie-banner-in .25s ease-out}.val-cookie-banner--bottom{bottom:0;border-top-width:1px}.val-cookie-banner--top{top:0;border-bottom-width:1px;padding:calc(12px + env(safe-area-inset-top,0px)) 16px 12px;box-shadow:0 2px 16px #00000014}.val-cookie-banner--translucent{background:#ffffffd9;backdrop-filter:saturate(180%) blur(16px);-webkit-backdrop-filter:saturate(180%) blur(16px)}@media (prefers-color-scheme: dark){.val-cookie-banner--translucent{background:#141414d9}}.val-cookie-banner__inner{margin:0 auto;display:flex;flex-direction:row;align-items:center;gap:16px;position:relative}.val-cookie-banner__dismiss{position:absolute;top:-8px;right:-4px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;border-radius:50%;cursor:pointer;color:var(--ion-color-medium);transition:color .15s ease,background .15s ease}.val-cookie-banner__dismiss:hover{color:var(--ion-color-dark);background:var(--ion-color-light-shade, rgba(0, 0, 0, .04))}.val-cookie-banner__dismiss ion-icon{font-size:18px}.val-cookie-banner__copy{flex:1 1 auto;min-width:0}.val-cookie-banner__title{margin:0 0 4px;font-size:14px;font-weight:600;color:var(--ion-color-dark)}.val-cookie-banner__message{margin:0;font-size:13px;line-height:1.45;color:var(--ion-color-dark)}.val-cookie-banner__policy{margin-left:4px;color:var(--ion-color-primary);text-decoration:underline;text-underline-offset:2px}.val-cookie-banner__actions{display:inline-flex;flex-direction:row;align-items:center;gap:8px;flex-shrink:0}@media (max-width: 768px){.val-cookie-banner__inner{flex-direction:column;align-items:stretch;gap:12px}.val-cookie-banner__actions{flex-wrap:wrap;justify-content:flex-end}}@media (max-width: 480px){.val-cookie-banner__actions{flex-direction:column;align-items:stretch}.val-cookie-banner__actions ion-button{width:100%}}@keyframes val-cookie-banner-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.val-cookie-banner--top{animation-name:val-cookie-banner-in-top}@keyframes val-cookie-banner-in-top{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){.val-cookie-banner{animation:none}}\n"] }]
26178
+ }], ctorParameters: () => [], propDecorators: { props: [{
26179
+ type: Input
26180
+ }], accept: [{
26181
+ type: Output
26182
+ }], reject: [{
26183
+ type: Output
26184
+ }], customize: [{
26185
+ type: Output
26186
+ }], dismiss: [{
26187
+ type: Output
26188
+ }] } });
26189
+
25950
26190
  /**
25951
26191
  * ToolbarComponent
25952
26192
  *
@@ -43238,5 +43478,5 @@ function buildFooterLinks(links, t, resolver) {
43238
43478
  * Generated bundle index. Do not edit.
43239
43479
  */
43240
43480
 
43241
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43481
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43242
43482
  //# sourceMappingURL=valtech-components.mjs.map