@bravobit/bb-foundation 0.58.0 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/fesm2022/bravobit-bb-foundation-auth.mjs +22 -22
  2. package/fesm2022/bravobit-bb-foundation-collections.mjs +43 -43
  3. package/fesm2022/bravobit-bb-foundation-dashboard.mjs +25 -25
  4. package/fesm2022/bravobit-bb-foundation-dialog.mjs +35 -35
  5. package/fesm2022/bravobit-bb-foundation-dialog.mjs.map +1 -1
  6. package/fesm2022/bravobit-bb-foundation-elements.mjs +111 -111
  7. package/fesm2022/bravobit-bb-foundation-elements.mjs.map +1 -1
  8. package/fesm2022/bravobit-bb-foundation-http.mjs +10 -10
  9. package/fesm2022/bravobit-bb-foundation-localize.mjs +171 -17
  10. package/fesm2022/bravobit-bb-foundation-localize.mjs.map +1 -1
  11. package/fesm2022/bravobit-bb-foundation-masking.mjs +16 -16
  12. package/fesm2022/bravobit-bb-foundation-notifications.mjs +13 -13
  13. package/fesm2022/bravobit-bb-foundation-permissions.mjs +10 -10
  14. package/fesm2022/bravobit-bb-foundation-recaptcha.mjs +10 -10
  15. package/fesm2022/bravobit-bb-foundation-select.mjs +27 -24
  16. package/fesm2022/bravobit-bb-foundation-select.mjs.map +1 -1
  17. package/fesm2022/bravobit-bb-foundation-storage.mjs +3 -3
  18. package/fesm2022/bravobit-bb-foundation-table.mjs +22 -22
  19. package/fesm2022/bravobit-bb-foundation-tooltip.mjs +10 -10
  20. package/fesm2022/bravobit-bb-foundation-utils.mjs +16 -16
  21. package/fesm2022/bravobit-bb-foundation.mjs +68 -23
  22. package/fesm2022/bravobit-bb-foundation.mjs.map +1 -1
  23. package/package.json +5 -5
  24. package/types/bravobit-bb-foundation-localize.d.ts +155 -1
  25. package/types/bravobit-bb-foundation-select.d.ts +2 -1
  26. package/types/bravobit-bb-foundation.d.ts +8 -1
@@ -1,9 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, InjectionToken, DOCUMENT, RendererFactory2, PLATFORM_ID, REQUEST, makeEnvironmentProviders } from '@angular/core';
2
+ import { Injectable, inject, InjectionToken, DOCUMENT, RendererFactory2, PLATFORM_ID, REQUEST, makeEnvironmentProviders, signal, linkedSignal, HostAttributeToken } from '@angular/core';
3
3
  import { Platform } from '@angular/cdk/platform';
4
4
  import { isPlatformBrowser, formatDate } from '@angular/common';
5
5
  import { map, distinctUntilChanged, shareReplay, debounceTime, startWith } from 'rxjs/operators';
6
6
  import { of, fromEvent, Observable, merge, Subscription, isObservable, BehaviorSubject } from 'rxjs';
7
+ import { ActivatedRoute, Router } from '@angular/router';
8
+ import { toSignal } from '@angular/core/rxjs-interop';
7
9
 
8
10
  class FileLoader {
9
11
  fromDataUrl(value, name = 'file') {
@@ -78,10 +80,10 @@ class FileLoader {
78
80
  anyBlob.name = fileName;
79
81
  return anyBlob;
80
82
  };
81
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: FileLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
82
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: FileLoader, providedIn: 'root' });
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FileLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
84
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FileLoader, providedIn: 'root' });
83
85
  }
84
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: FileLoader, decorators: [{
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FileLoader, decorators: [{
85
87
  type: Injectable,
86
88
  args: [{
87
89
  providedIn: 'root'
@@ -236,10 +238,10 @@ class Exif {
236
238
  }
237
239
  return -1;
238
240
  };
239
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Exif, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
240
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Exif, providedIn: 'root' });
241
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Exif, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
242
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Exif, providedIn: 'root' });
241
243
  }
242
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Exif, decorators: [{
244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Exif, decorators: [{
243
245
  type: Injectable,
244
246
  args: [{
245
247
  providedIn: 'root'
@@ -353,10 +355,10 @@ class ImageConverter {
353
355
  }
354
356
  return { xOffset, yOffset, width, height };
355
357
  };
356
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ImageConverter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
357
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ImageConverter, providedIn: 'root' });
358
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ImageConverter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
359
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ImageConverter, providedIn: 'root' });
358
360
  }
359
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ImageConverter, decorators: [{
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ImageConverter, decorators: [{
360
362
  type: Injectable,
361
363
  args: [{
362
364
  providedIn: 'root'
@@ -437,10 +439,10 @@ class Files {
437
439
  anchor.click();
438
440
  }
439
441
  }
440
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Files, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
441
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Files, providedIn: 'root' });
442
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Files, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
443
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Files, providedIn: 'root' });
442
444
  }
443
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Files, decorators: [{
445
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Files, decorators: [{
444
446
  type: Injectable,
445
447
  args: [{
446
448
  providedIn: 'root'
@@ -511,10 +513,10 @@ class Languages {
511
513
  .filter(item => !!item)
512
514
  .sort((a, b) => b.quality - a.quality);
513
515
  }
514
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Languages, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
515
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Languages, providedIn: 'root' });
516
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Languages, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
517
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Languages, providedIn: 'root' });
516
518
  }
517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Languages, decorators: [{
519
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Languages, decorators: [{
518
520
  type: Injectable,
519
521
  args: [{
520
522
  providedIn: 'root'
@@ -550,10 +552,10 @@ class Network {
550
552
  // a user is online/offline.
551
553
  this._online$ = merge(now$, online$, offline$).pipe(distinctUntilChanged(), shareReplay({ refCount: true, bufferSize: 1 }));
552
554
  }
553
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Network, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
554
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Network, providedIn: 'root' });
555
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Network, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
556
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Network, providedIn: 'root' });
555
557
  }
556
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Network, decorators: [{
558
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Network, decorators: [{
557
559
  type: Injectable,
558
560
  args: [{
559
561
  providedIn: 'root'
@@ -596,10 +598,10 @@ class Patch {
596
598
  // Save the subscription so we can destroy it later.
597
599
  this._subscription.add(subscription);
598
600
  }
599
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Patch, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
600
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Patch, providedIn: 'root' });
601
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Patch, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
602
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Patch, providedIn: 'root' });
601
603
  }
602
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: Patch, decorators: [{
604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Patch, decorators: [{
603
605
  type: Injectable,
604
606
  args: [{
605
607
  providedIn: 'root'
@@ -1009,6 +1011,49 @@ function provideRouteCache(token, value) {
1009
1011
  ]);
1010
1012
  }
1011
1013
 
1014
+ function injectRouteParam(key, format = (value => value)) {
1015
+ const route = inject(ActivatedRoute);
1016
+ const initialValue = format(route.snapshot.paramMap.get(key));
1017
+ return toSignal(route.paramMap.pipe(map(paramMap => format(paramMap.get(key))), distinctUntilChanged()), { initialValue });
1018
+ }
1019
+ function injectRouteParamId(key) {
1020
+ return injectRouteParam(key, rawValue => {
1021
+ if (rawValue === null || rawValue === undefined) {
1022
+ return null;
1023
+ }
1024
+ if (!/^\d+$/.test(rawValue)) {
1025
+ return null;
1026
+ }
1027
+ const numberValue = Number(rawValue);
1028
+ return Number.isSafeInteger(numberValue) && numberValue > 0
1029
+ ? numberValue
1030
+ : null;
1031
+ });
1032
+ }
1033
+ function injectRouteQueryParam(key, format = (value => value)) {
1034
+ const route = inject(ActivatedRoute);
1035
+ const initialValue = format(route.snapshot.queryParamMap.get(key));
1036
+ return toSignal(route.queryParamMap.pipe(map(queryParamMap => format(queryParamMap.get(key))), distinctUntilChanged()), { initialValue });
1037
+ }
1038
+ function injectRouterInfo(key) {
1039
+ const router = inject(Router);
1040
+ const info = router?.currentNavigation()?.extras?.info;
1041
+ return signal(info?.[key] ?? null).asReadonly();
1042
+ }
1043
+ function injectLinkedRouteData(key) {
1044
+ const route = inject(ActivatedRoute);
1045
+ const initialValue = route.snapshot.data?.[key] ?? null;
1046
+ const source = toSignal(route.data.pipe(map(data => data?.[key] ?? null), distinctUntilChanged()), { initialValue });
1047
+ return linkedSignal({ source, computation: value => value });
1048
+ }
1049
+ function injectAttribute(key, defaultValue = null) {
1050
+ const attribute = inject(new HostAttributeToken(key), { optional: true }) ?? null;
1051
+ if (attribute === null || attribute === undefined) {
1052
+ return signal(defaultValue).asReadonly();
1053
+ }
1054
+ return signal(attribute).asReadonly();
1055
+ }
1056
+
1012
1057
  /*
1013
1058
  * Public API Surface of bb-foundation
1014
1059
  */
@@ -1017,5 +1062,5 @@ function provideRouteCache(token, value) {
1017
1062
  * Generated bundle index. Do not edit.
1018
1063
  */
1019
1064
 
1020
- export { ACCEPT_LANGUAGE, BbRegex, BbValidator, COOKIE, Exif, FileLoader, Files, GLOBAL_FOCUS_MODE, ImageConverter, LOCATION, Languages, NAVIGATOR, Network, Patch, RouteCache, WINDOW, arrayToMap, clamp, createDate, formatFileSize, generatePassword, hexToHsl, hexToHsv, hexToRgb, hslToHex, hslToHsv, hsvToHex, hsvToHsl, hsvToRgb, isDate, isFileLike, isValidDate, isValidFileSize, isValidFileType, observableAttribute, parseDate, provideGlobalFocusMode, provideRouteCache, rgbToHex, rgbToHsv };
1065
+ export { ACCEPT_LANGUAGE, BbRegex, BbValidator, COOKIE, Exif, FileLoader, Files, GLOBAL_FOCUS_MODE, ImageConverter, LOCATION, Languages, NAVIGATOR, Network, Patch, RouteCache, WINDOW, arrayToMap, clamp, createDate, formatFileSize, generatePassword, hexToHsl, hexToHsv, hexToRgb, hslToHex, hslToHsv, hsvToHex, hsvToHsl, hsvToRgb, injectAttribute, injectLinkedRouteData, injectRouteParam, injectRouteParamId, injectRouteQueryParam, injectRouterInfo, isDate, isFileLike, isValidDate, isValidFileSize, isValidFileType, observableAttribute, parseDate, provideGlobalFocusMode, provideRouteCache, rgbToHex, rgbToHsv };
1021
1066
  //# sourceMappingURL=bravobit-bb-foundation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bravobit-bb-foundation.mjs","sources":["../../../projects/bb-foundation/src/lib/core/services/file-loader.service.ts","../../../projects/bb-foundation/src/lib/core/services/exif.service.ts","../../../projects/bb-foundation/src/lib/core/services/image-converter.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/window.token.ts","../../../projects/bb-foundation/src/lib/core/services/files.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/navigator.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/accept-language.token.ts","../../../projects/bb-foundation/src/lib/core/services/languages.service.ts","../../../projects/bb-foundation/src/lib/core/services/network.service.ts","../../../projects/bb-foundation/src/lib/core/services/patch.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/cookie.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/location.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/global-focus-mode.token.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/regex.ts","../../../projects/bb-foundation/src/lib/core/functions/format.utils.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/validator.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/coercion.ts","../../../projects/bb-foundation/src/lib/core/functions/utils.ts","../../../projects/bb-foundation/src/lib/core/colors/rgb.ts","../../../projects/bb-foundation/src/lib/core/colors/hsv.ts","../../../projects/bb-foundation/src/lib/core/colors/hex.ts","../../../projects/bb-foundation/src/lib/core/colors/hsl.ts","../../../projects/bb-foundation/src/lib/core/functions/date.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/password.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/array.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/file.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/route-cache.utils.ts","../../../projects/bb-foundation/src/public_api.ts","../../../projects/bb-foundation/src/bravobit-bb-foundation.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FileLoader {\n\n fromDataUrl(value: string, name: string = 'file') {\n if (!value) {\n return null;\n }\n\n try {\n // Convert base64 to raw binary data held in a string.\n const byteString = window.atob(value.split(',')[1]);\n\n // Separate out the mime component.\n const mimeString = value\n .split(',')[0]\n .split(':')[1]\n .split(';')[0];\n\n // Write the bytes of the string to an ArrayBuffer.\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n for (let index = 0; index < byteString.length; index++) {\n uint8Array[index] = byteString.charCodeAt(index);\n }\n\n const dataView = new DataView(arrayBuffer);\n const blob = new Blob([dataView.buffer], {type: mimeString});\n\n return this.createFile(blob, name);\n } catch {\n return null;\n }\n }\n\n asDataUrl(file: File | Blob) {\n return this.read<string>(file, 'dataurl');\n }\n\n asArrayBuffer(file: File | Blob) {\n return this.read<ArrayBuffer>(file, 'arraybuffer');\n }\n\n private async read<T = string | ArrayBuffer>(file: File | Blob, type: 'dataurl' | 'arraybuffer') {\n return new Promise<T>((resolve, reject) => {\n const isFileLike = this.isFile(file) || this.isBlob(file);\n if (!file || !isFileLike) {\n return reject('Invalid file');\n }\n\n const reader = new FileReader();\n reader.onerror = () => reject('Error file read');\n reader.onabort = () => reject('Abort file read');\n reader.onload = () => {\n const result = reader.result as unknown;\n return resolve(result as T);\n };\n\n if (type === 'dataurl') {\n reader.readAsDataURL(file);\n } else if (type === 'arraybuffer') {\n reader.readAsArrayBuffer(file);\n }\n });\n }\n\n private isFile = (input: unknown) => {\n return 'File' in window && input instanceof File;\n };\n\n private isBlob = (input: unknown) => {\n return 'Blob' in window && input instanceof Blob;\n };\n\n private createFile(blob: Blob, name: string) {\n if (!navigator['msSaveBlob']) {\n return new File([blob], name, {lastModified: Date.now(), type: blob?.type});\n }\n\n const blobFile = new Blob([blob], {type: blob?.type});\n return this.blobToFile(blobFile, name);\n }\n\n private blobToFile = (blob: Blob, fileName: string) => {\n const anyBlob: any = blob;\n anyBlob.lastModifiedDate = new Date();\n anyBlob.name = fileName;\n return anyBlob as File;\n };\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {FileLoader} from './file-loader.service';\nimport {Platform} from '@angular/cdk/platform';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Exif {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _fileLoader: FileLoader = inject(FileLoader);\n\n async strip(file: File, quality: number = 100) {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return file;\n }\n\n // Validate the file exists and is\n // an instance of a File object.\n if (!file || !(file instanceof File)) {\n return file;\n }\n\n // Only jpeg images need correction.\n if (!['image/jpeg'].includes(file.type)) {\n return file;\n }\n\n try {\n // Read the file as an array buffer and data url.\n const arrayBuffer = await this._fileLoader.asArrayBuffer(file);\n const dataUrl = await this._fileLoader.asDataUrl(file);\n\n // Create an image element.\n const imageElement = await this.createImageElement(dataUrl);\n\n // Get the orientation by using the buffer.\n const orientation = this.getOrientation(arrayBuffer);\n\n // Transform the image to remove the orientation.\n const canvasType = this.getSupportedCanvasType(file.type);\n const imageUrl = this.transformImage(imageElement, canvasType, orientation, quality);\n\n // Validate the image url exists.\n if (!imageUrl) {\n return file;\n }\n\n // Transform the image url to a file.\n return this._fileLoader.fromDataUrl(imageUrl, file.name);\n } catch {\n // When something goes wrong we\n // just return the default file.\n return file;\n }\n }\n\n private async createImageElement(dataUrl: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = dataUrl;\n image.onerror = () => reject('Error image create');\n image.onabort = () => reject('Abort image create');\n image.onload = () => resolve(image);\n });\n }\n\n private transformImage = (image: HTMLImageElement, type: string, orientation: number, quality: number = 100) => {\n // Create the canvas and context.\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // Validate the context exists.\n if (!context) {\n return null;\n }\n\n // Set the canvas size based on the image.\n const {width, height} = image;\n canvas.width = width;\n canvas.height = height;\n\n // Validate the orientation is correct\n // else flip the canvas sizes.\n if (4 < orientation && orientation < 9) {\n canvas.width = height;\n canvas.height = width;\n }\n\n // Transform the context based on the orientation.\n switch (orientation) {\n case 2:\n context.transform(-1, 0, 0, 1, width, 0);\n break;\n case 3:\n context.transform(-1, 0, 0, -1, width, height);\n break;\n case 4:\n context.transform(1, 0, 0, -1, 0, height);\n break;\n case 5:\n context.transform(0, 1, 1, 0, 0, 0);\n break;\n case 6:\n context.transform(0, 1, -1, 0, height, 0);\n break;\n case 7:\n context.transform(0, -1, -1, 0, height, width);\n break;\n case 8:\n context.transform(0, -1, 1, 0, 0, width);\n break;\n default:\n break;\n }\n\n // Draw the image on the context and return the data URL.\n context.drawImage(image, 0, 0, width, height);\n return canvas.toDataURL(type, quality / 100);\n };\n\n private getSupportedCanvasType = (fileType: string) => {\n switch (fileType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'image/jpeg';\n case 'image/x-windows-bmp':\n case 'image/bmp':\n return 'image/bmp';\n default:\n return 'image/png';\n }\n };\n\n private getOrientation = (buffer: ArrayBuffer) => {\n // Create a new data view.\n const view = new DataView(buffer);\n\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n\n const length = view.byteLength;\n let offset = 2;\n\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) {\n return -1;\n }\n\n const marker = view.getUint16(offset, false);\n offset += 2;\n\n if (marker === 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) === 0x4949;\n offset += view.getUint32(offset + 4, little);\n\n const tags = view.getUint16(offset, little);\n offset += 2;\n\n for (let index = 0; index < tags; index++) {\n if (view.getUint16(offset + index * 12, little) === 0x0112) {\n return view.getUint16(offset + index * 12 + 8, little);\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n\n return -1;\n };\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {FileLoader} from './file-loader.service';\nimport {Platform} from '@angular/cdk/platform';\nimport {Exif} from './exif.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ImageConverter {\n\n // Dependencies.\n private readonly _exif: Exif = inject(Exif);\n private readonly _platform: Platform = inject(Platform);\n private readonly _fileLoader: FileLoader = inject(FileLoader);\n\n // Data.\n private readonly _types = ['image/png', 'image/jpeg', 'image/webp'];\n\n async toDataUri(contents: string | File | HTMLImageElement, options: { width: number, height: number } | null = null) {\n // Check if the current platform is a browser.\n if (!this._platform.isBrowser) {\n return null;\n }\n\n // Get the image.\n const image = await this.getImage(contents);\n\n // Get the canvas width and height.\n const canvasWidth = options?.width || image?.width;\n const canvasHeight = options?.height || image?.height;\n\n // Get the canvas and context.\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // Validate the context exists.\n if (!context) {\n return null;\n }\n\n // Set the width and height.\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n\n // When the canvas sizes are 0 we have failed.\n if (canvas?.width === 0 && canvas?.height === 0) {\n return null;\n }\n\n // Check if dimensions where supplied, else create the image.\n if (!options) {\n // Draw the image.\n context.drawImage(image, 0, 0);\n\n // Convert the canvas to a data url.\n return canvas.toDataURL(this._types[0]);\n }\n\n // Get the dimensions and offsets.\n const {width, height, xOffset, yOffset} = this.calculateOffsetAndDimensions(image, canvasWidth, canvasHeight);\n\n // Draw the image.\n context.drawImage(image, 0, 0, image.width, image.height, xOffset, yOffset, width, height);\n\n // Convert the canvas to a data url.\n return canvas.toDataURL(this._types[0]);\n }\n\n async fileToImage(file: File, types: string[] = this._types) {\n // Check if the file matches an image.\n if (!types.includes(file.type)) {\n throw new Error('The selected file does not meet the required format.');\n }\n\n let stripped: File | null = null;\n try {\n stripped = await this._exif.strip(file, 90);\n } catch {\n // Do nothing.\n }\n\n // Ge the data uri.\n const dataUri = await this._fileLoader.asDataUrl(stripped ?? file);\n\n // Convert the data URI to a image element.\n return await this.stringToImage(dataUri);\n }\n\n stringToImage(src: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = src;\n image.onload = () => resolve(image);\n image.onerror = error => reject(error);\n });\n }\n\n private async getImage(contents: string | File | HTMLImageElement) {\n // If the contents is already an HTML image element just return it.\n if (contents instanceof HTMLImageElement) {\n return contents;\n }\n\n // If the contents is a file convert it to an HTML image element.\n if (contents instanceof File) {\n return this.fileToImage(contents);\n }\n\n // If the contents is a string convert it to an HTML image element.\n return this.stringToImage(contents);\n }\n\n private calculateOffsetAndDimensions = (image: HTMLImageElement, canvasWidth: number, canvasHeight: number) => {\n const originalWidth = image.width;\n const originalHeight = image.height;\n\n const widthRatio = canvasWidth / originalWidth;\n const heightRatio = canvasHeight / originalHeight;\n\n let width: number;\n let height: number;\n\n if (originalWidth > originalHeight) {\n height = originalHeight * heightRatio;\n width = (originalWidth / originalHeight) * height;\n } else {\n width = originalWidth * widthRatio;\n height = (originalHeight / originalWidth) * width;\n }\n\n let xOffset = 0;\n let yOffset = 0;\n\n if (canvasHeight === height) {\n xOffset = -((width - canvasWidth) / 2);\n } else if (canvasWidth === width) {\n yOffset = -((height - canvasHeight) / 2);\n }\n\n return {xOffset, yOffset, width, height};\n };\n\n}\n","import {inject, InjectionToken, DOCUMENT} from '@angular/core';\n\nexport const WINDOW = new InjectionToken<Window>(\n 'An abstraction over global window object',\n {\n factory: () => {\n const {defaultView} = inject(DOCUMENT);\n\n if (!defaultView) {\n throw new Error('Window is not available');\n }\n\n return defaultView;\n }\n }\n);\n","import {inject, Injectable, Renderer2, RendererFactory2} from '@angular/core';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Files {\n\n private readonly _platform: Platform = inject(Platform);\n private readonly _renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null);\n private readonly _window: Window = inject(WINDOW, {optional: true});\n\n download(file: File, name?: string): void;\n download(blob: Blob, name: string): void;\n download(blobOrFile: File | Blob, name?: string) {\n if (!this._platform.isBrowser) {\n return;\n }\n\n const anchor = this.createAnchorElement(blobOrFile, name);\n this.revokeUrlAndPressAnchor(anchor);\n }\n\n fromDataUri(dataUri: string, name: string) {\n if (!dataUri) {\n return null;\n }\n\n try {\n const byteString = this._window.atob(dataUri.split(',')[1]);\n\n // Separate out the mime component.\n const mimeString = dataUri\n .split(',')[0]\n .split(':')[1]\n .split(';')[0];\n\n // Write the bytes of the string to an ArrayBuffer.\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n for (let index = 0; index < byteString.length; index++) {\n uint8Array[index] = byteString.charCodeAt(index);\n }\n\n const dataView = new DataView(arrayBuffer);\n const blob = new Blob([dataView.buffer], {type: mimeString});\n return this.create(blob, name);\n } catch {\n return null;\n }\n }\n\n create(blob: Blob, name: string) {\n if (!navigator['msSaveBlob']) {\n return new File([blob], name, {lastModified: Date.now(), type: blob?.type});\n }\n\n const anyBlob: any = new Blob([blob], {type: blob?.type});\n anyBlob.lastModifiedDate = new Date();\n anyBlob.name = name;\n return anyBlob as File;\n }\n\n private createAnchorElement(blobOrFile: File | Blob, name?: string) {\n const anchor = this._renderer.createElement('a');\n this._renderer.setProperty(anchor, 'download', name ?? blobOrFile?.['name']);\n this._renderer.setProperty(anchor, 'rel', 'noopener');\n this._renderer.setProperty(anchor, 'href', URL.createObjectURL(blobOrFile));\n return anchor;\n }\n\n private revokeUrlAndPressAnchor(anchor: HTMLAnchorElement) {\n setTimeout(() => URL.revokeObjectURL(anchor?.href), 40_000);\n setTimeout(() => this.pressAnchor(anchor), 0);\n }\n\n private pressAnchor(anchor: HTMLAnchorElement) {\n try {\n anchor.dispatchEvent(new MouseEvent('click'));\n } catch {\n anchor.click();\n }\n }\n\n}\n","import {inject, InjectionToken} from '@angular/core';\nimport {WINDOW} from './window.token';\n\nexport const NAVIGATOR = new InjectionToken<Navigator>(\n 'An abstraction over window.navigator object',\n {\n factory: () => inject(WINDOW).navigator\n }\n);","import {inject, InjectionToken, PLATFORM_ID, REQUEST} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {NAVIGATOR} from './navigator.token';\n\nexport const ACCEPT_LANGUAGE = new InjectionToken<string>(\n 'An abstraction for the accept-language header or navigator.language',\n {\n factory: () => {\n const platformId = inject(PLATFORM_ID);\n const request = inject(REQUEST, {optional: true});\n const navigator = inject(NAVIGATOR, {optional: true});\n\n const isBrowser = isPlatformBrowser(platformId);\n if (isBrowser) {\n if (typeof navigator !== 'object') {\n return null;\n }\n\n let t = 'anguage';\n let n = navigator;\n let f = n['l' + t + 's'];\n\n const data = f && f.length ? f : (t = n['l' + t] ||\n n['browserL' + t] ||\n n['userL' + t]) ? [t] : t;\n\n return typeof data === 'string'\n ? data\n : data.join(';');\n }\n\n return request?.headers?.get('accept-language') ?? null;\n }\n }\n);\n","import {ACCEPT_LANGUAGE} from '../tokens/accept-language.token';\nimport {inject, Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Languages {\n\n // Dependencies.\n private readonly _acceptLanguage: string = inject(ACCEPT_LANGUAGE, {optional: true});\n\n // Data.\n private readonly _data: { code: string, script?: string, region?: string, quality: number }[] = [];\n\n constructor() {\n this._data = this.initialize();\n }\n\n get all() {\n return this._data;\n }\n\n private initialize() {\n // Parse all languages by using a regex.\n const strings = (this._acceptLanguage ?? '')\n .match(/((([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\\*)(;q=[0-1](\\.[0-9]+)?)?)*/g);\n\n // Get the content by parsing the strings.\n const content = strings.map(item => {\n if (!item) {\n return null;\n }\n\n const bits = item.split(';');\n const ietf = bits[0].split('-');\n const hasScript = ietf.length === 3;\n\n return {\n code: ietf[0],\n script: hasScript ? ietf[1] : null,\n region: hasScript ? ietf[2] : ietf[1],\n quality: bits[1] ? parseFloat(bits[1].split('=')[1]) : 1.0\n };\n });\n\n // Filter out all the empty items\n // and sort them by the quality.\n return content\n .filter(item => !!item)\n .sort((a, b) => b.quality - a.quality);\n }\n\n}\n","import {distinctUntilChanged, map, shareReplay} from 'rxjs/operators';\nimport {fromEvent, merge, Observable, of} from 'rxjs';\nimport {NAVIGATOR} from '../tokens/navigator.token';\nimport {inject, Injectable} from '@angular/core';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Network {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n private readonly _navigator?: Navigator = inject(NAVIGATOR, {optional: true});\n\n // Data.\n private _online$: Observable<boolean> = of(true);\n\n constructor() {\n this.getOnlineObservable();\n }\n\n online() {\n return this._online$;\n }\n\n private getOnlineObservable() {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return;\n }\n\n // Get all the events from the window.\n const online$ = fromEvent(this._window, 'online').pipe(map(() => true));\n const offline$ = fromEvent(this._window, 'offline').pipe(map(() => false));\n const now$ = new Observable<boolean>(subscriber => {\n subscriber.next(this._navigator?.onLine);\n subscriber.complete();\n });\n\n // Merge all event so we get notified when\n // a user is online/offline.\n this._online$ = merge(now$, online$, offline$).pipe(\n distinctUntilChanged(),\n shareReplay({refCount: true, bufferSize: 1})\n );\n }\n\n}\n","import {inject, Injectable, OnDestroy, DOCUMENT} from '@angular/core';\nimport {debounceTime, startWith} from 'rxjs/operators';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\nimport {fromEvent, Subscription} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Patch implements OnDestroy {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n private readonly _document?: Document = inject(DOCUMENT, {optional: true});\n\n // State.\n private _hasPatchedMobileVerticalHeight: boolean = false;\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n mobileVerticalHeight() {\n // Check if the user has already patched\n // the mobile vertical height.\n if (this._hasPatchedMobileVerticalHeight) {\n return;\n }\n\n this.periodicallySetDocumentVerticalProperty();\n this._hasPatchedMobileVerticalHeight = true;\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private periodicallySetDocumentVerticalProperty() {\n // Validate we are using a browser.\n if (!this._platform.isBrowser || !this._window) {\n return;\n }\n\n // Listen to a debounced window resize event.\n const resize$ = fromEvent(this._window, 'resize').pipe(\n debounceTime(25),\n startWith(0)\n );\n\n // Subscribe to the resize observable.\n const subscription = resize$.subscribe(() => {\n const verticalHeight = (this._window?.innerHeight ?? 0) * 0.01;\n this._document?.documentElement?.style?.setProperty('--vh', `${verticalHeight}px`);\n });\n\n // Save the subscription so we can destroy it later.\n this._subscription.add(subscription);\n }\n\n}\n","import {inject, InjectionToken, PLATFORM_ID, REQUEST, DOCUMENT} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\n\nexport const COOKIE = new InjectionToken<string | null>(\n 'An abstraction on the document.cookie or cookie header from the request object',\n {\n factory: () => {\n const platformId = inject(PLATFORM_ID);\n const request = inject(REQUEST, {optional: true});\n const document = inject(DOCUMENT, {optional: true});\n\n const isBrowser = isPlatformBrowser(platformId);\n if (isBrowser) {\n return document?.cookie ?? null;\n }\n\n return request?.headers?.get('cookie') ?? null;\n }\n }\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {WINDOW} from './window.token';\n\nexport const LOCATION = new InjectionToken<Location>(\n 'An abstraction over window.location object',\n {\n factory: () => inject(WINDOW).location\n }\n);","import {EnvironmentProviders, InjectionToken, makeEnvironmentProviders} from '@angular/core';\n\nexport type FocusMode = 'only-desktop' | 'all';\n\nexport const GLOBAL_FOCUS_MODE = new InjectionToken<FocusMode>(\n 'The focus mode',\n {\n factory: () => 'only-desktop'\n }\n);\n\nexport function provideGlobalFocusMode(mode: FocusMode): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: GLOBAL_FOCUS_MODE, useValue: mode}\n ]);\n}\n","export const BbRegex = {\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n fullNumber: /^\\d*[1-9]\\d*$/,\n url: new RegExp(\n '^' +\n // protocol identifier (optional)\n // short syntax // still required\n '(?:(?:(?:https?|ftp):)?\\\\/\\\\/)' +\n // user:pass BasicAuth (optional)\n '(?:\\\\S+(?::\\\\S*)?@)?' +\n '(?:' +\n // IP address exclusion\n // private & local networks\n '(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})' +\n '(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})' +\n '(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})' +\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broadcast addresses\n // (first & last IP address of each class)\n '(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])' +\n '(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}' +\n '(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))' +\n '|' +\n // host & domain names, may end with dot\n // can be replaced by a shortest alternative\n // (?![-_])(?:[-\\\\w\\\\u00a1-\\\\uffff]{0,63}[^-_]\\\\.)+\n '(?:' +\n '(?:' +\n '[a-z0-9\\\\u00a1-\\\\uffff]' +\n '[a-z0-9\\\\u00a1-\\\\uffff_-]{0,62}' +\n ')?' +\n '[a-z0-9\\\\u00a1-\\\\uffff]\\\\.' +\n ')+' +\n // TLD identifier name, may end with dot\n '(?:[a-z\\\\u00a1-\\\\uffff]{2,}\\\\.?)' +\n ')' +\n // port number (optional)\n '(?::\\\\d{2,5})?' +\n // resource path (optional)\n '(?:[/?#]\\\\S*)?' +\n '$', 'i'\n )\n};\n","export function formatFileSize(value: number, decimals: number = 2) {\n if (value === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const index = Math.floor(Math.log(value) / Math.log(k));\n\n return parseFloat((value / Math.pow(k, index)).toFixed(dm)) + ' ' + sizes[index];\n}\n","import {AbstractControl, ValidatorFn} from '@angular/forms';\nimport {formatFileSize} from '../functions/format.utils';\nimport {formatDate} from '@angular/common';\nimport {BbRegex} from './regex';\n\nexport class BbValidator {\n\n static email(control: AbstractControl) {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n return BbRegex.email.test(control.value) ? null : {email: true};\n }\n\n static fullNumber(control: AbstractControl) {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n return BbRegex.fullNumber.test(control.value) ? null : {fullNumber: true};\n }\n\n static maxFileSize(bytes: number) {\n const validator: ValidatorFn = (control: AbstractControl) => {\n const value = control.value;\n if (value === null || value === undefined || !(value instanceof File)) {\n return null;\n }\n\n if (value.size <= bytes) {\n return null;\n }\n\n return {maxFileSize: {maxSize: formatFileSize(bytes)}};\n };\n return validator;\n }\n\n static confirm(fieldName: string, error: string = 'confirm') {\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const field = control?.parent?.get(fieldName);\n\n return control?.value === field?.value\n ? null\n : {[error]: true};\n };\n return validator;\n }\n\n static maxDate(date: Date, error: string = 'maxDate') {\n const formattedDate = date.toString() !== 'Invalid Date'\n ? formatDate(date, 'yyyy-MM-dd', 'en-US')\n : null;\n\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const controlDate = new Date(control.value);\n\n return controlDate.getTime() > date.getTime()\n ? {[error]: {date: formattedDate}}\n : null;\n };\n return validator;\n }\n\n static minDate(date: Date, error: string = 'minDate') {\n const formattedDate = date.toString() !== 'Invalid Date'\n ? formatDate(date, 'yyyy-MM-dd', 'en-US')\n : null;\n\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const controlDate = new Date(control.value);\n\n return controlDate.getTime() < date.getTime()\n ? {[error]: {date: formattedDate}}\n : null;\n };\n return validator;\n }\n\n}\n\nfunction isEmptyInputValue(value: any) {\n // We don't check for string here so it also works with arrays.\n return value == null || value.length === 0;\n}\n","import {isObservable, Observable, of} from 'rxjs';\n\nexport function observableAttribute(value: unknown): Observable<any> {\n return isObservable(value) ? value : of(value);\n}\n","export function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n","import {clamp} from '../functions/utils';\n\nexport function rgbToHex(red: number, green: number, blue: number, alpha: number = 1) {\n const hex = ((blue | green << 8 | red << 16) | 1 << 24)\n .toString(16)\n .slice(1);\n\n if (alpha >= 1) {\n return `#${hex}`;\n }\n\n const hexAlpha = (Math.round(255 * alpha) | 1 << 8)\n .toString(16)\n .slice(1);\n return `#${hex}${hexAlpha}`;\n}\n\nexport function rgbToHsv(red: number, green: number, blue: number, alpha: number = 1) {\n const r = red / 255;\n const g = green / 255;\n const b = blue / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n const value = max;\n const saturation = max === 0 ? 0 : delta / max;\n let hue = 0;\n\n switch (max) {\n case min:\n hue = 0;\n break;\n case r:\n hue = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n hue = (b - r) / delta + 2;\n break;\n case b:\n hue = (r - g) / delta + 4;\n break;\n }\n\n return {\n hue: hue * 60 % 360,\n saturation: clamp(saturation * 100, 0, 100),\n value: clamp(value * 100, 0, 100),\n alpha: alpha\n };\n}\n","import {clamp} from '../functions/utils';\nimport {rgbToHex} from './rgb';\n\nexport function hsvToHex(hue: number, saturation: number, value: number, alpha: number = 1) {\n const {red, green, blue, alpha: rgbAlpha} = hsvToRgb(hue, saturation, value, alpha);\n return rgbToHex(red, green, blue, rgbAlpha);\n}\n\nexport function hsvToRgb(hue: number, saturation: number, value: number, alpha: number = 1) {\n const h = hue / 60;\n const s = saturation / 100;\n const v = value / 100;\n const i = Math.floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n const mod = i % 6;\n const r = [v, q, p, p, t, v][mod];\n const g = [t, v, v, q, p, p][mod];\n const b = [p, p, t, v, v, q][mod];\n return {\n red: clamp(r * 255, 0, 255),\n green: clamp(g * 255, 0, 255),\n blue: clamp(b * 255, 0, 255),\n alpha: alpha\n };\n}\n\nexport function hsvToHsl(hue: number, saturation: number, value: number, alpha: number = 1) {\n const s = saturation / 100;\n const v = value / 100;\n const l = (2 - s) * v;\n const divisor = l <= 1 ? l : 2 - l; // Avoid division by zero when lightness is close to zero\n const newSaturation = divisor < 1e-9 ? 0 : s * v / divisor;\n\n return {\n hue: hue,\n saturation: clamp(newSaturation * 100, 0, 100),\n lightness: clamp(l * 50, 0, 100),\n alpha: alpha\n };\n}\n","import {rgbToHsv} from './rgb';\nimport {hsvToHsl} from './hsv';\n\nexport function hexToHsv(hex: string) {\n const {red, green, blue, alpha} = hexToRgb(hex);\n return rgbToHsv(red, green, blue, alpha);\n}\n\nexport function hexToRgb(hex: string) {\n const hexCharacters = 'a-f\\\\d';\n const match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;\n const match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;\n const nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');\n const validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');\n\n if (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {\n throw new TypeError('expected a valid hex string');\n }\n\n hex = hex.replace(/^#/, '');\n let alphaFromHex = 1;\n\n if (hex.length === 8) {\n alphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;\n hex = hex.slice(0, 6);\n }\n\n if (hex.length === 4) {\n alphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n hex = hex.slice(0, 3);\n }\n\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n const number = Number.parseInt(hex, 16);\n return {\n red: number >> 16,\n green: (number >> 8) & 255,\n blue: number & 255,\n alpha: alphaFromHex\n };\n}\n\nexport function hexToHsl(hex: string) {\n const hsv = hexToHsv(hex);\n return hsvToHsl(hsv.hue, hsv.saturation, hsv.value, hsv.alpha);\n}\n","import {clamp} from '../functions/utils';\nimport {hsvToHex} from './hsv';\n\nexport function hslToHsv(hue: number, saturation: number, lightness: number, alpha: number = 1) {\n const l = lightness * 2;\n const s = saturation * (l <= 100 ? l : 200 - l) / 100; // Avoid division by zero when l + s is near 0\n const newSaturation = l + s < 1e-9 ? 0 : 2 * s / (l + s);\n return {\n hue: hue,\n saturation: clamp(newSaturation * 100, 0, 100),\n value: clamp((l + s) / 2, 0, 100),\n alpha: alpha\n };\n}\n\nexport function hslToHex(hue: number, saturation: number, lightness: number, alpha: number = 1) {\n const hsv = hslToHsv(hue, saturation, lightness, alpha);\n return hsvToHex(hsv.hue, hsv.saturation, hsv.value, hsv.alpha);\n}\n","export function parseDate(value: string | number | Date): Date | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (typeof value === 'string') {\n if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/.test(value)) {\n return createDate(new Date(`${value}Z`));\n }\n\n if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(value)) {\n const [y, m, d] = value.split('-');\n const year = Number(y);\n const month = Number(m) - 1;\n const day = Number(d);\n return createDate(new Date(year, month, day));\n }\n }\n\n return createDate(new Date(value));\n}\n\nexport function createDate(date: Date) {\n return isValidDate(date) ? date : null;\n}\n\nexport function isValidDate(date: unknown) {\n if (!isDate(date)) {\n return false;\n }\n\n return !isNaN(Number(date));\n}\n\nexport function isDate(value: unknown): value is Date {\n return (value instanceof Date || (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'));\n}\n","export function generatePassword(length: number = 12) {\n const chars = 'abcdefghijklmnopqrstuvwxyz';\n const upperChars = chars.toUpperCase();\n const numberChars = '0123456789';\n const specialChars = '!@#?$%^&*+=';\n const usableChars = chars + upperChars + numberChars + specialChars;\n\n let generatedPassword = '';\n\n for (let index = 0; index < length - 4; index++) {\n generatedPassword += usableChars[Math.floor(Math.random() * (usableChars.length))];\n }\n\n generatedPassword += chars[Math.floor(Math.random() * (chars.length))];\n generatedPassword += upperChars[Math.floor(Math.random() * (upperChars.length))];\n generatedPassword += numberChars[Math.floor(Math.random() * (numberChars.length))];\n generatedPassword += specialChars[Math.floor(Math.random() * (specialChars.length))];\n\n return generatedPassword;\n}\n","export function arrayToMap<T extends object, K extends keyof T>(\n items: T[],\n field: K\n): Readonly<Record<string, T>> {\n const map = Object.create(null) as Record<string, T>;\n for (const item of items) {\n if (item) {\n map[String(item[field])] = item;\n }\n }\n return map;\n}\n","export function isFileLike(input: unknown) {\n return 'File' in window && input instanceof File\n || 'Blob' in window && input instanceof Blob;\n}\n\nexport function isValidFileType(file: File, accept: string | null | undefined) {\n if (!isFileLike(file)) {\n return false;\n }\n\n if (accept === null || accept === undefined || accept === '*') {\n return true;\n }\n\n const regexString = accept\n .replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n .replace(/,/g, '|');\n const mimeTypeRegex = new RegExp(regexString);\n return mimeTypeRegex.test(file?.type);\n}\n\nexport function isValidFileSize(file: File, max: number) {\n if (!isFileLike(file)) {\n return false;\n }\n\n return file?.size <= max;\n}\n","import {InjectionToken, makeEnvironmentProviders} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\nexport class RouteCache<T> {\n\n protected readonly value$: BehaviorSubject<T | null>;\n\n constructor(initialValue?: T) {\n this.value$ = new BehaviorSubject<T | null>(initialValue ?? null);\n }\n\n asObservable() {\n return this.value$.asObservable();\n }\n\n get() {\n return this.value$.getValue();\n }\n\n set(value: T) {\n this.value$.next(value);\n }\n\n}\n\nexport function provideRouteCache<T>(token: InjectionToken<RouteCache<T>>, value: RouteCache<T>) {\n return makeEnvironmentProviders([\n {provide: token, useValue: value}\n ]);\n}\n","/*\n * Public API Surface of bb-foundation\n */\n\nexport * from './lib/core/services/image-converter.service';\nexport * from './lib/core/services/file-loader.service';\nexport * from './lib/core/services/files.service';\nexport * from './lib/core/services/languages.service';\nexport * from './lib/core/services/network.service';\nexport * from './lib/core/services/patch.service';\nexport * from './lib/core/services/exif.service';\n\nexport * from './lib/core/tokens/accept-language.token';\nexport * from './lib/core/tokens/cookie.token';\nexport * from './lib/core/tokens/window.token';\nexport * from './lib/core/tokens/navigator.token';\nexport * from './lib/core/tokens/location.token';\nexport * from './lib/core/tokens/global-focus-mode.token';\n\nexport * from './lib/core/miscellaneous/regex';\nexport * from './lib/core/miscellaneous/validator';\nexport * from './lib/core/miscellaneous/coercion';\n\nexport * from './lib/core/colors/hex';\nexport * from './lib/core/colors/hsl';\nexport * from './lib/core/colors/hsv';\nexport * from './lib/core/colors/rgb';\n\nexport * from './lib/core/functions/utils';\nexport * from './lib/core/functions/date.utils';\nexport * from './lib/core/functions/password.utils';\nexport * from './lib/core/functions/array.utils';\nexport * from './lib/core/functions/file.utils';\nexport * from './lib/core/functions/format.utils';\nexport * from './lib/core/functions/route-cache.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bravobit-bb-foundation.mjs","sources":["../../../projects/bb-foundation/src/lib/core/services/file-loader.service.ts","../../../projects/bb-foundation/src/lib/core/services/exif.service.ts","../../../projects/bb-foundation/src/lib/core/services/image-converter.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/window.token.ts","../../../projects/bb-foundation/src/lib/core/services/files.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/navigator.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/accept-language.token.ts","../../../projects/bb-foundation/src/lib/core/services/languages.service.ts","../../../projects/bb-foundation/src/lib/core/services/network.service.ts","../../../projects/bb-foundation/src/lib/core/services/patch.service.ts","../../../projects/bb-foundation/src/lib/core/tokens/cookie.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/location.token.ts","../../../projects/bb-foundation/src/lib/core/tokens/global-focus-mode.token.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/regex.ts","../../../projects/bb-foundation/src/lib/core/functions/format.utils.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/validator.ts","../../../projects/bb-foundation/src/lib/core/miscellaneous/coercion.ts","../../../projects/bb-foundation/src/lib/core/functions/utils.ts","../../../projects/bb-foundation/src/lib/core/colors/rgb.ts","../../../projects/bb-foundation/src/lib/core/colors/hsv.ts","../../../projects/bb-foundation/src/lib/core/colors/hex.ts","../../../projects/bb-foundation/src/lib/core/colors/hsl.ts","../../../projects/bb-foundation/src/lib/core/functions/date.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/password.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/array.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/file.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/route-cache.utils.ts","../../../projects/bb-foundation/src/lib/core/functions/inject.utils.ts","../../../projects/bb-foundation/src/public_api.ts","../../../projects/bb-foundation/src/bravobit-bb-foundation.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FileLoader {\n\n fromDataUrl(value: string, name: string = 'file') {\n if (!value) {\n return null;\n }\n\n try {\n // Convert base64 to raw binary data held in a string.\n const byteString = window.atob(value.split(',')[1]);\n\n // Separate out the mime component.\n const mimeString = value\n .split(',')[0]\n .split(':')[1]\n .split(';')[0];\n\n // Write the bytes of the string to an ArrayBuffer.\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n for (let index = 0; index < byteString.length; index++) {\n uint8Array[index] = byteString.charCodeAt(index);\n }\n\n const dataView = new DataView(arrayBuffer);\n const blob = new Blob([dataView.buffer], {type: mimeString});\n\n return this.createFile(blob, name);\n } catch {\n return null;\n }\n }\n\n asDataUrl(file: File | Blob) {\n return this.read<string>(file, 'dataurl');\n }\n\n asArrayBuffer(file: File | Blob) {\n return this.read<ArrayBuffer>(file, 'arraybuffer');\n }\n\n private async read<T = string | ArrayBuffer>(file: File | Blob, type: 'dataurl' | 'arraybuffer') {\n return new Promise<T>((resolve, reject) => {\n const isFileLike = this.isFile(file) || this.isBlob(file);\n if (!file || !isFileLike) {\n return reject('Invalid file');\n }\n\n const reader = new FileReader();\n reader.onerror = () => reject('Error file read');\n reader.onabort = () => reject('Abort file read');\n reader.onload = () => {\n const result = reader.result as unknown;\n return resolve(result as T);\n };\n\n if (type === 'dataurl') {\n reader.readAsDataURL(file);\n } else if (type === 'arraybuffer') {\n reader.readAsArrayBuffer(file);\n }\n });\n }\n\n private isFile = (input: unknown) => {\n return 'File' in window && input instanceof File;\n };\n\n private isBlob = (input: unknown) => {\n return 'Blob' in window && input instanceof Blob;\n };\n\n private createFile(blob: Blob, name: string) {\n if (!navigator['msSaveBlob']) {\n return new File([blob], name, {lastModified: Date.now(), type: blob?.type});\n }\n\n const blobFile = new Blob([blob], {type: blob?.type});\n return this.blobToFile(blobFile, name);\n }\n\n private blobToFile = (blob: Blob, fileName: string) => {\n const anyBlob: any = blob;\n anyBlob.lastModifiedDate = new Date();\n anyBlob.name = fileName;\n return anyBlob as File;\n };\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {FileLoader} from './file-loader.service';\nimport {Platform} from '@angular/cdk/platform';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Exif {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _fileLoader: FileLoader = inject(FileLoader);\n\n async strip(file: File, quality: number = 100) {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return file;\n }\n\n // Validate the file exists and is\n // an instance of a File object.\n if (!file || !(file instanceof File)) {\n return file;\n }\n\n // Only jpeg images need correction.\n if (!['image/jpeg'].includes(file.type)) {\n return file;\n }\n\n try {\n // Read the file as an array buffer and data url.\n const arrayBuffer = await this._fileLoader.asArrayBuffer(file);\n const dataUrl = await this._fileLoader.asDataUrl(file);\n\n // Create an image element.\n const imageElement = await this.createImageElement(dataUrl);\n\n // Get the orientation by using the buffer.\n const orientation = this.getOrientation(arrayBuffer);\n\n // Transform the image to remove the orientation.\n const canvasType = this.getSupportedCanvasType(file.type);\n const imageUrl = this.transformImage(imageElement, canvasType, orientation, quality);\n\n // Validate the image url exists.\n if (!imageUrl) {\n return file;\n }\n\n // Transform the image url to a file.\n return this._fileLoader.fromDataUrl(imageUrl, file.name);\n } catch {\n // When something goes wrong we\n // just return the default file.\n return file;\n }\n }\n\n private async createImageElement(dataUrl: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = dataUrl;\n image.onerror = () => reject('Error image create');\n image.onabort = () => reject('Abort image create');\n image.onload = () => resolve(image);\n });\n }\n\n private transformImage = (image: HTMLImageElement, type: string, orientation: number, quality: number = 100) => {\n // Create the canvas and context.\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // Validate the context exists.\n if (!context) {\n return null;\n }\n\n // Set the canvas size based on the image.\n const {width, height} = image;\n canvas.width = width;\n canvas.height = height;\n\n // Validate the orientation is correct\n // else flip the canvas sizes.\n if (4 < orientation && orientation < 9) {\n canvas.width = height;\n canvas.height = width;\n }\n\n // Transform the context based on the orientation.\n switch (orientation) {\n case 2:\n context.transform(-1, 0, 0, 1, width, 0);\n break;\n case 3:\n context.transform(-1, 0, 0, -1, width, height);\n break;\n case 4:\n context.transform(1, 0, 0, -1, 0, height);\n break;\n case 5:\n context.transform(0, 1, 1, 0, 0, 0);\n break;\n case 6:\n context.transform(0, 1, -1, 0, height, 0);\n break;\n case 7:\n context.transform(0, -1, -1, 0, height, width);\n break;\n case 8:\n context.transform(0, -1, 1, 0, 0, width);\n break;\n default:\n break;\n }\n\n // Draw the image on the context and return the data URL.\n context.drawImage(image, 0, 0, width, height);\n return canvas.toDataURL(type, quality / 100);\n };\n\n private getSupportedCanvasType = (fileType: string) => {\n switch (fileType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'image/jpeg';\n case 'image/x-windows-bmp':\n case 'image/bmp':\n return 'image/bmp';\n default:\n return 'image/png';\n }\n };\n\n private getOrientation = (buffer: ArrayBuffer) => {\n // Create a new data view.\n const view = new DataView(buffer);\n\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n\n const length = view.byteLength;\n let offset = 2;\n\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) {\n return -1;\n }\n\n const marker = view.getUint16(offset, false);\n offset += 2;\n\n if (marker === 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) === 0x4949;\n offset += view.getUint32(offset + 4, little);\n\n const tags = view.getUint16(offset, little);\n offset += 2;\n\n for (let index = 0; index < tags; index++) {\n if (view.getUint16(offset + index * 12, little) === 0x0112) {\n return view.getUint16(offset + index * 12 + 8, little);\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n\n return -1;\n };\n\n}\n","import {inject, Injectable} from '@angular/core';\nimport {FileLoader} from './file-loader.service';\nimport {Platform} from '@angular/cdk/platform';\nimport {Exif} from './exif.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ImageConverter {\n\n // Dependencies.\n private readonly _exif: Exif = inject(Exif);\n private readonly _platform: Platform = inject(Platform);\n private readonly _fileLoader: FileLoader = inject(FileLoader);\n\n // Data.\n private readonly _types = ['image/png', 'image/jpeg', 'image/webp'];\n\n async toDataUri(contents: string | File | HTMLImageElement, options: { width: number, height: number } | null = null) {\n // Check if the current platform is a browser.\n if (!this._platform.isBrowser) {\n return null;\n }\n\n // Get the image.\n const image = await this.getImage(contents);\n\n // Get the canvas width and height.\n const canvasWidth = options?.width || image?.width;\n const canvasHeight = options?.height || image?.height;\n\n // Get the canvas and context.\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n // Validate the context exists.\n if (!context) {\n return null;\n }\n\n // Set the width and height.\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n\n // When the canvas sizes are 0 we have failed.\n if (canvas?.width === 0 && canvas?.height === 0) {\n return null;\n }\n\n // Check if dimensions where supplied, else create the image.\n if (!options) {\n // Draw the image.\n context.drawImage(image, 0, 0);\n\n // Convert the canvas to a data url.\n return canvas.toDataURL(this._types[0]);\n }\n\n // Get the dimensions and offsets.\n const {width, height, xOffset, yOffset} = this.calculateOffsetAndDimensions(image, canvasWidth, canvasHeight);\n\n // Draw the image.\n context.drawImage(image, 0, 0, image.width, image.height, xOffset, yOffset, width, height);\n\n // Convert the canvas to a data url.\n return canvas.toDataURL(this._types[0]);\n }\n\n async fileToImage(file: File, types: string[] = this._types) {\n // Check if the file matches an image.\n if (!types.includes(file.type)) {\n throw new Error('The selected file does not meet the required format.');\n }\n\n let stripped: File | null = null;\n try {\n stripped = await this._exif.strip(file, 90);\n } catch {\n // Do nothing.\n }\n\n // Ge the data uri.\n const dataUri = await this._fileLoader.asDataUrl(stripped ?? file);\n\n // Convert the data URI to a image element.\n return await this.stringToImage(dataUri);\n }\n\n stringToImage(src: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = src;\n image.onload = () => resolve(image);\n image.onerror = error => reject(error);\n });\n }\n\n private async getImage(contents: string | File | HTMLImageElement) {\n // If the contents is already an HTML image element just return it.\n if (contents instanceof HTMLImageElement) {\n return contents;\n }\n\n // If the contents is a file convert it to an HTML image element.\n if (contents instanceof File) {\n return this.fileToImage(contents);\n }\n\n // If the contents is a string convert it to an HTML image element.\n return this.stringToImage(contents);\n }\n\n private calculateOffsetAndDimensions = (image: HTMLImageElement, canvasWidth: number, canvasHeight: number) => {\n const originalWidth = image.width;\n const originalHeight = image.height;\n\n const widthRatio = canvasWidth / originalWidth;\n const heightRatio = canvasHeight / originalHeight;\n\n let width: number;\n let height: number;\n\n if (originalWidth > originalHeight) {\n height = originalHeight * heightRatio;\n width = (originalWidth / originalHeight) * height;\n } else {\n width = originalWidth * widthRatio;\n height = (originalHeight / originalWidth) * width;\n }\n\n let xOffset = 0;\n let yOffset = 0;\n\n if (canvasHeight === height) {\n xOffset = -((width - canvasWidth) / 2);\n } else if (canvasWidth === width) {\n yOffset = -((height - canvasHeight) / 2);\n }\n\n return {xOffset, yOffset, width, height};\n };\n\n}\n","import {inject, InjectionToken, DOCUMENT} from '@angular/core';\n\nexport const WINDOW = new InjectionToken<Window>(\n 'An abstraction over global window object',\n {\n factory: () => {\n const {defaultView} = inject(DOCUMENT);\n\n if (!defaultView) {\n throw new Error('Window is not available');\n }\n\n return defaultView;\n }\n }\n);\n","import {inject, Injectable, Renderer2, RendererFactory2} from '@angular/core';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Files {\n\n private readonly _platform: Platform = inject(Platform);\n private readonly _renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null);\n private readonly _window: Window = inject(WINDOW, {optional: true});\n\n download(file: File, name?: string): void;\n download(blob: Blob, name: string): void;\n download(blobOrFile: File | Blob, name?: string) {\n if (!this._platform.isBrowser) {\n return;\n }\n\n const anchor = this.createAnchorElement(blobOrFile, name);\n this.revokeUrlAndPressAnchor(anchor);\n }\n\n fromDataUri(dataUri: string, name: string) {\n if (!dataUri) {\n return null;\n }\n\n try {\n const byteString = this._window.atob(dataUri.split(',')[1]);\n\n // Separate out the mime component.\n const mimeString = dataUri\n .split(',')[0]\n .split(':')[1]\n .split(';')[0];\n\n // Write the bytes of the string to an ArrayBuffer.\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n for (let index = 0; index < byteString.length; index++) {\n uint8Array[index] = byteString.charCodeAt(index);\n }\n\n const dataView = new DataView(arrayBuffer);\n const blob = new Blob([dataView.buffer], {type: mimeString});\n return this.create(blob, name);\n } catch {\n return null;\n }\n }\n\n create(blob: Blob, name: string) {\n if (!navigator['msSaveBlob']) {\n return new File([blob], name, {lastModified: Date.now(), type: blob?.type});\n }\n\n const anyBlob: any = new Blob([blob], {type: blob?.type});\n anyBlob.lastModifiedDate = new Date();\n anyBlob.name = name;\n return anyBlob as File;\n }\n\n private createAnchorElement(blobOrFile: File | Blob, name?: string) {\n const anchor = this._renderer.createElement('a');\n this._renderer.setProperty(anchor, 'download', name ?? blobOrFile?.['name']);\n this._renderer.setProperty(anchor, 'rel', 'noopener');\n this._renderer.setProperty(anchor, 'href', URL.createObjectURL(blobOrFile));\n return anchor;\n }\n\n private revokeUrlAndPressAnchor(anchor: HTMLAnchorElement) {\n setTimeout(() => URL.revokeObjectURL(anchor?.href), 40_000);\n setTimeout(() => this.pressAnchor(anchor), 0);\n }\n\n private pressAnchor(anchor: HTMLAnchorElement) {\n try {\n anchor.dispatchEvent(new MouseEvent('click'));\n } catch {\n anchor.click();\n }\n }\n\n}\n","import {inject, InjectionToken} from '@angular/core';\nimport {WINDOW} from './window.token';\n\nexport const NAVIGATOR = new InjectionToken<Navigator>(\n 'An abstraction over window.navigator object',\n {\n factory: () => inject(WINDOW).navigator\n }\n);","import {inject, InjectionToken, PLATFORM_ID, REQUEST} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {NAVIGATOR} from './navigator.token';\n\nexport const ACCEPT_LANGUAGE = new InjectionToken<string>(\n 'An abstraction for the accept-language header or navigator.language',\n {\n factory: () => {\n const platformId = inject(PLATFORM_ID);\n const request = inject(REQUEST, {optional: true});\n const navigator = inject(NAVIGATOR, {optional: true});\n\n const isBrowser = isPlatformBrowser(platformId);\n if (isBrowser) {\n if (typeof navigator !== 'object') {\n return null;\n }\n\n let t = 'anguage';\n let n = navigator;\n let f = n['l' + t + 's'];\n\n const data = f && f.length ? f : (t = n['l' + t] ||\n n['browserL' + t] ||\n n['userL' + t]) ? [t] : t;\n\n return typeof data === 'string'\n ? data\n : data.join(';');\n }\n\n return request?.headers?.get('accept-language') ?? null;\n }\n }\n);\n","import {ACCEPT_LANGUAGE} from '../tokens/accept-language.token';\nimport {inject, Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Languages {\n\n // Dependencies.\n private readonly _acceptLanguage: string = inject(ACCEPT_LANGUAGE, {optional: true});\n\n // Data.\n private readonly _data: { code: string, script?: string, region?: string, quality: number }[] = [];\n\n constructor() {\n this._data = this.initialize();\n }\n\n get all() {\n return this._data;\n }\n\n private initialize() {\n // Parse all languages by using a regex.\n const strings = (this._acceptLanguage ?? '')\n .match(/((([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\\*)(;q=[0-1](\\.[0-9]+)?)?)*/g);\n\n // Get the content by parsing the strings.\n const content = strings.map(item => {\n if (!item) {\n return null;\n }\n\n const bits = item.split(';');\n const ietf = bits[0].split('-');\n const hasScript = ietf.length === 3;\n\n return {\n code: ietf[0],\n script: hasScript ? ietf[1] : null,\n region: hasScript ? ietf[2] : ietf[1],\n quality: bits[1] ? parseFloat(bits[1].split('=')[1]) : 1.0\n };\n });\n\n // Filter out all the empty items\n // and sort them by the quality.\n return content\n .filter(item => !!item)\n .sort((a, b) => b.quality - a.quality);\n }\n\n}\n","import {distinctUntilChanged, map, shareReplay} from 'rxjs/operators';\nimport {fromEvent, merge, Observable, of} from 'rxjs';\nimport {NAVIGATOR} from '../tokens/navigator.token';\nimport {inject, Injectable} from '@angular/core';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Network {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n private readonly _navigator?: Navigator = inject(NAVIGATOR, {optional: true});\n\n // Data.\n private _online$: Observable<boolean> = of(true);\n\n constructor() {\n this.getOnlineObservable();\n }\n\n online() {\n return this._online$;\n }\n\n private getOnlineObservable() {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return;\n }\n\n // Get all the events from the window.\n const online$ = fromEvent(this._window, 'online').pipe(map(() => true));\n const offline$ = fromEvent(this._window, 'offline').pipe(map(() => false));\n const now$ = new Observable<boolean>(subscriber => {\n subscriber.next(this._navigator?.onLine);\n subscriber.complete();\n });\n\n // Merge all event so we get notified when\n // a user is online/offline.\n this._online$ = merge(now$, online$, offline$).pipe(\n distinctUntilChanged(),\n shareReplay({refCount: true, bufferSize: 1})\n );\n }\n\n}\n","import {inject, Injectable, OnDestroy, DOCUMENT} from '@angular/core';\nimport {debounceTime, startWith} from 'rxjs/operators';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '../tokens/window.token';\nimport {fromEvent, Subscription} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Patch implements OnDestroy {\n\n // Dependencies.\n private readonly _platform: Platform = inject(Platform);\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n private readonly _document?: Document = inject(DOCUMENT, {optional: true});\n\n // State.\n private _hasPatchedMobileVerticalHeight: boolean = false;\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n mobileVerticalHeight() {\n // Check if the user has already patched\n // the mobile vertical height.\n if (this._hasPatchedMobileVerticalHeight) {\n return;\n }\n\n this.periodicallySetDocumentVerticalProperty();\n this._hasPatchedMobileVerticalHeight = true;\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private periodicallySetDocumentVerticalProperty() {\n // Validate we are using a browser.\n if (!this._platform.isBrowser || !this._window) {\n return;\n }\n\n // Listen to a debounced window resize event.\n const resize$ = fromEvent(this._window, 'resize').pipe(\n debounceTime(25),\n startWith(0)\n );\n\n // Subscribe to the resize observable.\n const subscription = resize$.subscribe(() => {\n const verticalHeight = (this._window?.innerHeight ?? 0) * 0.01;\n this._document?.documentElement?.style?.setProperty('--vh', `${verticalHeight}px`);\n });\n\n // Save the subscription so we can destroy it later.\n this._subscription.add(subscription);\n }\n\n}\n","import {inject, InjectionToken, PLATFORM_ID, REQUEST, DOCUMENT} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\n\nexport const COOKIE = new InjectionToken<string | null>(\n 'An abstraction on the document.cookie or cookie header from the request object',\n {\n factory: () => {\n const platformId = inject(PLATFORM_ID);\n const request = inject(REQUEST, {optional: true});\n const document = inject(DOCUMENT, {optional: true});\n\n const isBrowser = isPlatformBrowser(platformId);\n if (isBrowser) {\n return document?.cookie ?? null;\n }\n\n return request?.headers?.get('cookie') ?? null;\n }\n }\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {WINDOW} from './window.token';\n\nexport const LOCATION = new InjectionToken<Location>(\n 'An abstraction over window.location object',\n {\n factory: () => inject(WINDOW).location\n }\n);","import {EnvironmentProviders, InjectionToken, makeEnvironmentProviders} from '@angular/core';\n\nexport type FocusMode = 'only-desktop' | 'all';\n\nexport const GLOBAL_FOCUS_MODE = new InjectionToken<FocusMode>(\n 'The focus mode',\n {\n factory: () => 'only-desktop'\n }\n);\n\nexport function provideGlobalFocusMode(mode: FocusMode): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: GLOBAL_FOCUS_MODE, useValue: mode}\n ]);\n}\n","export const BbRegex = {\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n fullNumber: /^\\d*[1-9]\\d*$/,\n url: new RegExp(\n '^' +\n // protocol identifier (optional)\n // short syntax // still required\n '(?:(?:(?:https?|ftp):)?\\\\/\\\\/)' +\n // user:pass BasicAuth (optional)\n '(?:\\\\S+(?::\\\\S*)?@)?' +\n '(?:' +\n // IP address exclusion\n // private & local networks\n '(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})' +\n '(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})' +\n '(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})' +\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broadcast addresses\n // (first & last IP address of each class)\n '(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])' +\n '(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}' +\n '(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))' +\n '|' +\n // host & domain names, may end with dot\n // can be replaced by a shortest alternative\n // (?![-_])(?:[-\\\\w\\\\u00a1-\\\\uffff]{0,63}[^-_]\\\\.)+\n '(?:' +\n '(?:' +\n '[a-z0-9\\\\u00a1-\\\\uffff]' +\n '[a-z0-9\\\\u00a1-\\\\uffff_-]{0,62}' +\n ')?' +\n '[a-z0-9\\\\u00a1-\\\\uffff]\\\\.' +\n ')+' +\n // TLD identifier name, may end with dot\n '(?:[a-z\\\\u00a1-\\\\uffff]{2,}\\\\.?)' +\n ')' +\n // port number (optional)\n '(?::\\\\d{2,5})?' +\n // resource path (optional)\n '(?:[/?#]\\\\S*)?' +\n '$', 'i'\n )\n};\n","export function formatFileSize(value: number, decimals: number = 2) {\n if (value === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const index = Math.floor(Math.log(value) / Math.log(k));\n\n return parseFloat((value / Math.pow(k, index)).toFixed(dm)) + ' ' + sizes[index];\n}\n","import {AbstractControl, ValidatorFn} from '@angular/forms';\nimport {formatFileSize} from '../functions/format.utils';\nimport {formatDate} from '@angular/common';\nimport {BbRegex} from './regex';\n\nexport class BbValidator {\n\n static email(control: AbstractControl) {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n return BbRegex.email.test(control.value) ? null : {email: true};\n }\n\n static fullNumber(control: AbstractControl) {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n return BbRegex.fullNumber.test(control.value) ? null : {fullNumber: true};\n }\n\n static maxFileSize(bytes: number) {\n const validator: ValidatorFn = (control: AbstractControl) => {\n const value = control.value;\n if (value === null || value === undefined || !(value instanceof File)) {\n return null;\n }\n\n if (value.size <= bytes) {\n return null;\n }\n\n return {maxFileSize: {maxSize: formatFileSize(bytes)}};\n };\n return validator;\n }\n\n static confirm(fieldName: string, error: string = 'confirm') {\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const field = control?.parent?.get(fieldName);\n\n return control?.value === field?.value\n ? null\n : {[error]: true};\n };\n return validator;\n }\n\n static maxDate(date: Date, error: string = 'maxDate') {\n const formattedDate = date.toString() !== 'Invalid Date'\n ? formatDate(date, 'yyyy-MM-dd', 'en-US')\n : null;\n\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const controlDate = new Date(control.value);\n\n return controlDate.getTime() > date.getTime()\n ? {[error]: {date: formattedDate}}\n : null;\n };\n return validator;\n }\n\n static minDate(date: Date, error: string = 'minDate') {\n const formattedDate = date.toString() !== 'Invalid Date'\n ? formatDate(date, 'yyyy-MM-dd', 'en-US')\n : null;\n\n const validator: ValidatorFn = (control: AbstractControl) => {\n if (isEmptyInputValue(control.value)) {\n return null;\n }\n\n const controlDate = new Date(control.value);\n\n return controlDate.getTime() < date.getTime()\n ? {[error]: {date: formattedDate}}\n : null;\n };\n return validator;\n }\n\n}\n\nfunction isEmptyInputValue(value: any) {\n // We don't check for string here so it also works with arrays.\n return value == null || value.length === 0;\n}\n","import {isObservable, Observable, of} from 'rxjs';\n\nexport function observableAttribute(value: unknown): Observable<any> {\n return isObservable(value) ? value : of(value);\n}\n","export function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n","import {clamp} from '../functions/utils';\n\nexport function rgbToHex(red: number, green: number, blue: number, alpha: number = 1) {\n const hex = ((blue | green << 8 | red << 16) | 1 << 24)\n .toString(16)\n .slice(1);\n\n if (alpha >= 1) {\n return `#${hex}`;\n }\n\n const hexAlpha = (Math.round(255 * alpha) | 1 << 8)\n .toString(16)\n .slice(1);\n return `#${hex}${hexAlpha}`;\n}\n\nexport function rgbToHsv(red: number, green: number, blue: number, alpha: number = 1) {\n const r = red / 255;\n const g = green / 255;\n const b = blue / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n const value = max;\n const saturation = max === 0 ? 0 : delta / max;\n let hue = 0;\n\n switch (max) {\n case min:\n hue = 0;\n break;\n case r:\n hue = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n hue = (b - r) / delta + 2;\n break;\n case b:\n hue = (r - g) / delta + 4;\n break;\n }\n\n return {\n hue: hue * 60 % 360,\n saturation: clamp(saturation * 100, 0, 100),\n value: clamp(value * 100, 0, 100),\n alpha: alpha\n };\n}\n","import {clamp} from '../functions/utils';\nimport {rgbToHex} from './rgb';\n\nexport function hsvToHex(hue: number, saturation: number, value: number, alpha: number = 1) {\n const {red, green, blue, alpha: rgbAlpha} = hsvToRgb(hue, saturation, value, alpha);\n return rgbToHex(red, green, blue, rgbAlpha);\n}\n\nexport function hsvToRgb(hue: number, saturation: number, value: number, alpha: number = 1) {\n const h = hue / 60;\n const s = saturation / 100;\n const v = value / 100;\n const i = Math.floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n const mod = i % 6;\n const r = [v, q, p, p, t, v][mod];\n const g = [t, v, v, q, p, p][mod];\n const b = [p, p, t, v, v, q][mod];\n return {\n red: clamp(r * 255, 0, 255),\n green: clamp(g * 255, 0, 255),\n blue: clamp(b * 255, 0, 255),\n alpha: alpha\n };\n}\n\nexport function hsvToHsl(hue: number, saturation: number, value: number, alpha: number = 1) {\n const s = saturation / 100;\n const v = value / 100;\n const l = (2 - s) * v;\n const divisor = l <= 1 ? l : 2 - l; // Avoid division by zero when lightness is close to zero\n const newSaturation = divisor < 1e-9 ? 0 : s * v / divisor;\n\n return {\n hue: hue,\n saturation: clamp(newSaturation * 100, 0, 100),\n lightness: clamp(l * 50, 0, 100),\n alpha: alpha\n };\n}\n","import {rgbToHsv} from './rgb';\nimport {hsvToHsl} from './hsv';\n\nexport function hexToHsv(hex: string) {\n const {red, green, blue, alpha} = hexToRgb(hex);\n return rgbToHsv(red, green, blue, alpha);\n}\n\nexport function hexToRgb(hex: string) {\n const hexCharacters = 'a-f\\\\d';\n const match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;\n const match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;\n const nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');\n const validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');\n\n if (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {\n throw new TypeError('expected a valid hex string');\n }\n\n hex = hex.replace(/^#/, '');\n let alphaFromHex = 1;\n\n if (hex.length === 8) {\n alphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;\n hex = hex.slice(0, 6);\n }\n\n if (hex.length === 4) {\n alphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n hex = hex.slice(0, 3);\n }\n\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n const number = Number.parseInt(hex, 16);\n return {\n red: number >> 16,\n green: (number >> 8) & 255,\n blue: number & 255,\n alpha: alphaFromHex\n };\n}\n\nexport function hexToHsl(hex: string) {\n const hsv = hexToHsv(hex);\n return hsvToHsl(hsv.hue, hsv.saturation, hsv.value, hsv.alpha);\n}\n","import {clamp} from '../functions/utils';\nimport {hsvToHex} from './hsv';\n\nexport function hslToHsv(hue: number, saturation: number, lightness: number, alpha: number = 1) {\n const l = lightness * 2;\n const s = saturation * (l <= 100 ? l : 200 - l) / 100; // Avoid division by zero when l + s is near 0\n const newSaturation = l + s < 1e-9 ? 0 : 2 * s / (l + s);\n return {\n hue: hue,\n saturation: clamp(newSaturation * 100, 0, 100),\n value: clamp((l + s) / 2, 0, 100),\n alpha: alpha\n };\n}\n\nexport function hslToHex(hue: number, saturation: number, lightness: number, alpha: number = 1) {\n const hsv = hslToHsv(hue, saturation, lightness, alpha);\n return hsvToHex(hsv.hue, hsv.saturation, hsv.value, hsv.alpha);\n}\n","export function parseDate(value: string | number | Date): Date | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (typeof value === 'string') {\n if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/.test(value)) {\n return createDate(new Date(`${value}Z`));\n }\n\n if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(value)) {\n const [y, m, d] = value.split('-');\n const year = Number(y);\n const month = Number(m) - 1;\n const day = Number(d);\n return createDate(new Date(year, month, day));\n }\n }\n\n return createDate(new Date(value));\n}\n\nexport function createDate(date: Date) {\n return isValidDate(date) ? date : null;\n}\n\nexport function isValidDate(date: unknown) {\n if (!isDate(date)) {\n return false;\n }\n\n return !isNaN(Number(date));\n}\n\nexport function isDate(value: unknown): value is Date {\n return (value instanceof Date || (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'));\n}\n","export function generatePassword(length: number = 12) {\n const chars = 'abcdefghijklmnopqrstuvwxyz';\n const upperChars = chars.toUpperCase();\n const numberChars = '0123456789';\n const specialChars = '!@#?$%^&*+=';\n const usableChars = chars + upperChars + numberChars + specialChars;\n\n let generatedPassword = '';\n\n for (let index = 0; index < length - 4; index++) {\n generatedPassword += usableChars[Math.floor(Math.random() * (usableChars.length))];\n }\n\n generatedPassword += chars[Math.floor(Math.random() * (chars.length))];\n generatedPassword += upperChars[Math.floor(Math.random() * (upperChars.length))];\n generatedPassword += numberChars[Math.floor(Math.random() * (numberChars.length))];\n generatedPassword += specialChars[Math.floor(Math.random() * (specialChars.length))];\n\n return generatedPassword;\n}\n","export function arrayToMap<T extends object, K extends keyof T>(\n items: T[],\n field: K\n): Readonly<Record<string, T>> {\n const map = Object.create(null) as Record<string, T>;\n for (const item of items) {\n if (item) {\n map[String(item[field])] = item;\n }\n }\n return map;\n}\n","export function isFileLike(input: unknown) {\n return 'File' in window && input instanceof File\n || 'Blob' in window && input instanceof Blob;\n}\n\nexport function isValidFileType(file: File, accept: string | null | undefined) {\n if (!isFileLike(file)) {\n return false;\n }\n\n if (accept === null || accept === undefined || accept === '*') {\n return true;\n }\n\n const regexString = accept\n .replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n .replace(/,/g, '|');\n const mimeTypeRegex = new RegExp(regexString);\n return mimeTypeRegex.test(file?.type);\n}\n\nexport function isValidFileSize(file: File, max: number) {\n if (!isFileLike(file)) {\n return false;\n }\n\n return file?.size <= max;\n}\n","import {InjectionToken, makeEnvironmentProviders} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\nexport class RouteCache<T> {\n\n protected readonly value$: BehaviorSubject<T | null>;\n\n constructor(initialValue?: T) {\n this.value$ = new BehaviorSubject<T | null>(initialValue ?? null);\n }\n\n asObservable() {\n return this.value$.asObservable();\n }\n\n get() {\n return this.value$.getValue();\n }\n\n set(value: T) {\n this.value$.next(value);\n }\n\n}\n\nexport function provideRouteCache<T>(token: InjectionToken<RouteCache<T>>, value: RouteCache<T>) {\n return makeEnvironmentProviders([\n {provide: token, useValue: value}\n ]);\n}\n","import {HostAttributeToken, inject, linkedSignal, signal} from '@angular/core';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {toSignal} from '@angular/core/rxjs-interop';\n\nexport function injectRouteParam<T = string>(\n key: string,\n format: (rawValue: string | null) => T | null = (value => value as T | null)\n) {\n const route = inject(ActivatedRoute);\n const initialValue = format(route.snapshot.paramMap.get(key));\n return toSignal(\n route.paramMap.pipe(\n map(paramMap => format(paramMap.get(key))),\n distinctUntilChanged()\n ),\n {initialValue}\n );\n}\n\nexport function injectRouteParamId(key: string) {\n return injectRouteParam<number>(key, rawValue => {\n if (rawValue === null || rawValue === undefined) {\n return null;\n }\n if (!/^\\d+$/.test(rawValue)) {\n return null;\n }\n const numberValue = Number(rawValue);\n return Number.isSafeInteger(numberValue) && numberValue > 0\n ? numberValue\n : null;\n });\n}\n\nexport function injectRouteQueryParam<T = string>(\n key: string,\n format: (rawValue: string | null) => T | null = (value => value as T | null)\n) {\n const route = inject(ActivatedRoute);\n const initialValue = format(route.snapshot.queryParamMap.get(key));\n return toSignal(\n route.queryParamMap.pipe(\n map(queryParamMap => format(queryParamMap.get(key))),\n distinctUntilChanged()\n ),\n {initialValue}\n );\n}\n\nexport function injectRouterInfo<T>(key: string) {\n const router = inject(Router);\n const info = router?.currentNavigation()?.extras?.info as Record<string, any>;\n return signal(info?.[key] as T ?? null).asReadonly();\n}\n\nexport function injectLinkedRouteData<T>(key: string) {\n const route = inject(ActivatedRoute);\n const initialValue = (route.snapshot.data?.[key] as T | undefined) ?? null;\n const source = toSignal(\n route.data.pipe(\n map(data => (data?.[key] as T | undefined) ?? null),\n distinctUntilChanged()\n ),\n {initialValue}\n );\n return linkedSignal({source, computation: value => value});\n}\n\nexport function injectAttribute(key: string, defaultValue: string | null = null) {\n const attribute = inject(new HostAttributeToken(key), {optional: true}) ?? null;\n if (attribute === null || attribute === undefined) {\n return signal(defaultValue).asReadonly();\n }\n\n return signal(attribute).asReadonly();\n}\n","/*\n * Public API Surface of bb-foundation\n */\n\nexport * from './lib/core/services/image-converter.service';\nexport * from './lib/core/services/file-loader.service';\nexport * from './lib/core/services/files.service';\nexport * from './lib/core/services/languages.service';\nexport * from './lib/core/services/network.service';\nexport * from './lib/core/services/patch.service';\nexport * from './lib/core/services/exif.service';\n\nexport * from './lib/core/tokens/accept-language.token';\nexport * from './lib/core/tokens/cookie.token';\nexport * from './lib/core/tokens/window.token';\nexport * from './lib/core/tokens/navigator.token';\nexport * from './lib/core/tokens/location.token';\nexport * from './lib/core/tokens/global-focus-mode.token';\n\nexport * from './lib/core/miscellaneous/regex';\nexport * from './lib/core/miscellaneous/validator';\nexport * from './lib/core/miscellaneous/coercion';\n\nexport * from './lib/core/colors/hex';\nexport * from './lib/core/colors/hsl';\nexport * from './lib/core/colors/hsv';\nexport * from './lib/core/colors/rgb';\n\nexport * from './lib/core/functions/utils';\nexport * from './lib/core/functions/date.utils';\nexport * from './lib/core/functions/password.utils';\nexport * from './lib/core/functions/array.utils';\nexport * from './lib/core/functions/file.utils';\nexport * from './lib/core/functions/format.utils';\nexport * from './lib/core/functions/route-cache.utils';\nexport * from './lib/core/functions/inject.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bravobit/bb-foundation",
3
- "version": "0.58.0",
3
+ "version": "0.60.0",
4
4
  "description": "The Angular core foundation of the Bravobit team.",
5
5
  "author": {
6
6
  "name": "Stan van Heumen",
@@ -8,15 +8,15 @@
8
8
  "url": "https://bravobit.nl"
9
9
  },
10
10
  "peerDependencies": {
11
- "@angular/common": "^21.0.0",
12
- "@angular/core": "^21.0.0",
13
- "@angular/cdk": "^21.0.0"
11
+ "@angular/common": "^21.1.0",
12
+ "@angular/core": "^21.1.0",
13
+ "@angular/cdk": "^21.1.0"
14
14
  },
15
15
  "dependencies": {
16
16
  "tslib": "^2.8.1",
17
17
  "inputmask": "^5.0.9",
18
18
  "@types/grecaptcha": "^3.0.9",
19
- "@ng-select/ng-select": "~21.0.0"
19
+ "@ng-select/ng-select": "~21.4.0"
20
20
  },
21
21
  "sideEffects": false,
22
22
  "schematics": "./schematics/collection.json",