@reforgium/presentia 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, signal, computed, inject, afterRenderEffect, Injectable, input, TemplateRef, ViewContainerRef, effect, Directive, ElementRef, Renderer2, afterNextRender, Pipe, makeEnvironmentProviders, LOCALE_ID, DestroyRef } from '@angular/core';
3
- import { TRANSLATION, SELECTED_LANG, SELECTED_THEME, CURRENT_DEVICE, deepEqual } from '@reforgium/internal';
3
+ import { TRANSLATION, SELECTED_LANG, CHANGE_LANG, SELECTED_THEME, CHANGE_THEME, CURRENT_DEVICE, deepEqual } from '@reforgium/internal';
4
4
  import { BreakpointObserver } from '@angular/cdk/layout';
5
5
  import { fromEvent, debounceTime, startWith, filter as filter$1, map } from 'rxjs';
6
6
  import { HttpClient } from '@angular/common/http';
@@ -124,10 +124,10 @@ class AdaptiveService {
124
124
  this.#height.set(window.innerHeight);
125
125
  });
126
126
  }
127
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AdaptiveService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
128
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AdaptiveService, providedIn: 'root' });
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: AdaptiveService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
128
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: AdaptiveService, providedIn: 'root' });
129
129
  }
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AdaptiveService, decorators: [{
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: AdaptiveService, decorators: [{
131
131
  type: Injectable,
132
132
  args: [{
133
133
  providedIn: 'root',
@@ -155,7 +155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
155
155
  * the template is automatically added or removed from the DOM.
156
156
  */
157
157
  class IfDeviceDirective {
158
- device = input(undefined, { ...(ngDevMode ? { debugName: "device" } : {}), alias: 'ssIfDevice' });
158
+ device = input(undefined, { ...(ngDevMode ? { debugName: "device" } : {}), alias: 'reIfDevice' });
159
159
  inverse = input(false, ...(ngDevMode ? [{ debugName: "inverse" }] : []));
160
160
  tpl = inject(TemplateRef);
161
161
  vcr = inject(ViewContainerRef);
@@ -184,16 +184,16 @@ class IfDeviceDirective {
184
184
  this.hasView = false;
185
185
  }
186
186
  }
187
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: IfDeviceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
188
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.3", type: IfDeviceDirective, isStandalone: true, selector: "[reIfDevice]", inputs: { device: { classPropertyName: "device", publicName: "ssIfDevice", isSignal: true, isRequired: false, transformFunction: null }, inverse: { classPropertyName: "inverse", publicName: "inverse", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
187
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: IfDeviceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
188
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: IfDeviceDirective, isStandalone: true, selector: "[reIfDevice]", inputs: { device: { classPropertyName: "device", publicName: "reIfDevice", isSignal: true, isRequired: false, transformFunction: null }, inverse: { classPropertyName: "inverse", publicName: "inverse", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
189
189
  }
190
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: IfDeviceDirective, decorators: [{
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: IfDeviceDirective, decorators: [{
191
191
  type: Directive,
192
192
  args: [{
193
193
  selector: '[reIfDevice]',
194
194
  standalone: true,
195
195
  }]
196
- }], ctorParameters: () => [], propDecorators: { device: [{ type: i0.Input, args: [{ isSignal: true, alias: "ssIfDevice", required: false }] }], inverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverse", required: false }] }] } });
196
+ }], ctorParameters: () => [], propDecorators: { device: [{ type: i0.Input, args: [{ isSignal: true, alias: "reIfDevice", required: false }] }], inverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverse", required: false }] }] } });
197
197
 
198
198
  const innerLangVal = Symbol('reInnerLangVal');
199
199
 
@@ -313,9 +313,8 @@ class LangService {
313
313
  const promise = new Promise((resolve, reject) => {
314
314
  this.http.get(this.makeUrl(ns)).subscribe({
315
315
  next: (res) => {
316
- const existing = this.#cache();
317
316
  const resolved = Array.isArray(res) ? this.parseModelToRecord(res) : this.parseAssetToRecord(ns, res);
318
- this.#cache.set({ ...existing, ...resolved });
317
+ this.#cache.update((existing) => ({ ...existing, ...resolved }));
319
318
  this.#loadedNamespaces.add(key);
320
319
  resolve();
321
320
  },
@@ -360,10 +359,10 @@ class LangService {
360
359
  makeNamespaceKey(ns) {
361
360
  return `${this.#lang()}.${ns}`;
362
361
  }
363
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
364
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangService, providedIn: 'root' });
362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
363
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangService, providedIn: 'root' });
365
364
  }
366
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangService, decorators: [{
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangService, decorators: [{
367
366
  type: Injectable,
368
367
  args: [{ providedIn: 'root' }]
369
368
  }] });
@@ -428,6 +427,21 @@ class LangDirective {
428
427
  this.replaceAttrValue(langForAttr);
429
428
  }
430
429
  }
430
+ /**
431
+ * Translates a localization key into its corresponding localized string.
432
+ * If the key doesn't look like a valid localization key (format `namespace.key`), outputs a warning.
433
+ *
434
+ * @param key localization key in format `namespace.path.to.key`
435
+ * @returns a Promise resolving to the localized string, or `undefined` if the key is invalid
436
+ */
437
+ translate(key) {
438
+ if (!this.looksLikeKey(key)) {
439
+ // eslint-disable-next-line no-console
440
+ console.warn('Lang: Translatable text is not a valid localization key', key);
441
+ return;
442
+ }
443
+ return this.getLangValue(key);
444
+ }
431
445
  /**
432
446
  * Replaces attribute value with a localized string.
433
447
  * If the value doesn't look like a localization key, outputs a warning.
@@ -438,25 +452,28 @@ class LangDirective {
438
452
  const native = this.el.nativeElement;
439
453
  const title = native.getAttribute(attributeName)?.trim() || '';
440
454
  if (!this.looksLikeKey(title)) {
455
+ // eslint-disable-next-line no-console
441
456
  console.warn(`Lang: Attribute ${attributeName} is not a lang key`, title);
442
457
  return;
443
458
  }
444
459
  this.getLangValue(title).then((langed) => this.renderer.setAttribute(native, attributeName, langed));
445
460
  }
446
461
  /**
447
- * Replaces element's text node with a localized string.
462
+ * Replaces an element's text node with a localized string.
448
463
  * Works only if the element contains no child elements (text only).
449
464
  * If the content doesn't look like a localization key, outputs a warning.
450
465
  */
451
466
  replaceTextNodeValue() {
452
467
  const native = this.el.nativeElement;
453
468
  if (native.children.length > 0) {
469
+ // eslint-disable-next-line no-console
454
470
  console.warn('Lang: Element has children, text node replacement is skipped');
455
471
  return;
456
472
  }
457
473
  const textNode = Array.from(native.childNodes).find((n) => n.nodeType === Node.TEXT_NODE);
458
474
  const key = textNode?.nodeValue?.trim() || '';
459
475
  if (!this.looksLikeKey(key)) {
476
+ // eslint-disable-next-line no-console
460
477
  console.warn('Lang: Text node is not a lang key', key);
461
478
  return;
462
479
  }
@@ -482,10 +499,10 @@ class LangDirective {
482
499
  await this.service.loadNamespace(ns);
483
500
  return this.service.get(key);
484
501
  }
485
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
486
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.3", type: LangDirective, isStandalone: true, selector: "[reLang]", inputs: { lang: { classPropertyName: "lang", publicName: "reLang", isSignal: true, isRequired: false, transformFunction: null }, langForAttr: { classPropertyName: "langForAttr", publicName: "langForAttr", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
502
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
503
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: LangDirective, isStandalone: true, selector: "[reLang]", inputs: { lang: { classPropertyName: "lang", publicName: "reLang", isSignal: true, isRequired: false, transformFunction: null }, langForAttr: { classPropertyName: "langForAttr", publicName: "langForAttr", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
487
504
  }
488
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangDirective, decorators: [{
505
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangDirective, decorators: [{
489
506
  type: Directive,
490
507
  args: [{ selector: '[reLang]', standalone: true }]
491
508
  }], ctorParameters: () => [], propDecorators: { lang: [{ type: i0.Input, args: [{ isSignal: true, alias: "reLang", required: false }] }], langForAttr: [{ type: i0.Input, args: [{ isSignal: true, alias: "langForAttr", required: false }] }] } });
@@ -514,10 +531,10 @@ class LangPipe {
514
531
  }
515
532
  return this.cache.get(key)();
516
533
  }
517
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
518
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.3", ngImport: i0, type: LangPipe, isStandalone: true, name: "lang", pure: false });
534
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
535
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.0", ngImport: i0, type: LangPipe, isStandalone: true, name: "lang", pure: false });
519
536
  }
520
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: LangPipe, decorators: [{
537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: LangPipe, decorators: [{
521
538
  type: Pipe,
522
539
  args: [{ name: 'lang', standalone: true, pure: false }]
523
540
  }] });
@@ -641,10 +658,10 @@ class ThemeService {
641
658
  newTheme === themes.light && html.classList.remove(darkThemePrefix);
642
659
  this.#theme.set(newTheme);
643
660
  }
644
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
645
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ThemeService, providedIn: 'root' });
661
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
662
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, providedIn: 'root' });
646
663
  }
647
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ThemeService, decorators: [{
664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ThemeService, decorators: [{
648
665
  type: Injectable,
649
666
  args: [{
650
667
  providedIn: 'root',
@@ -680,7 +697,9 @@ function provideReInit(config) {
680
697
  return makeEnvironmentProviders([
681
698
  { provide: TRANSLATION, deps: [LangService], useFactory: (ls) => ls },
682
699
  { provide: SELECTED_LANG, deps: [LangService], useFactory: (ls) => ls[innerLangVal] },
700
+ { provide: CHANGE_LANG, deps: [LangService], useFactory: (ls) => ls.setLang },
683
701
  { provide: SELECTED_THEME, deps: [ThemeService], useFactory: (ls) => ls.theme },
702
+ { provide: CHANGE_THEME, deps: [ThemeService], useFactory: (ls) => ls.switch },
684
703
  { provide: CURRENT_DEVICE, deps: [AdaptiveService], useFactory: (ls) => ls.device },
685
704
  { provide: DEVICE_BREAKPOINTS, useValue: config.breakpoints || defaultBreakpoints },
686
705
  { provide: THEME_CONFIG, useValue: config.theme || defaultThemeConfig },
@@ -792,10 +811,10 @@ class SeoService {
792
811
  }
793
812
  link.href = href;
794
813
  }
795
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
796
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoService });
814
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
815
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoService });
797
816
  }
798
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoService, decorators: [{
817
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoService, decorators: [{
799
818
  type: Injectable
800
819
  }] });
801
820
 
@@ -863,10 +882,10 @@ class SeoRouteListener {
863
882
  }
864
883
  return cur;
865
884
  }
866
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoRouteListener, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
867
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoRouteListener, providedIn: 'root' });
885
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoRouteListener, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
886
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoRouteListener, providedIn: 'root' });
868
887
  }
869
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: SeoRouteListener, decorators: [{
888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: SeoRouteListener, decorators: [{
870
889
  type: Injectable,
871
890
  args: [{ providedIn: 'root' }]
872
891
  }] });
@@ -936,10 +955,10 @@ class RouteWatcher {
936
955
  }
937
956
  return snap;
938
957
  }
939
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RouteWatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
940
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RouteWatcher, providedIn: 'root' });
958
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: RouteWatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
959
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: RouteWatcher, providedIn: 'root' });
941
960
  }
942
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: RouteWatcher, decorators: [{
961
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: RouteWatcher, decorators: [{
943
962
  type: Injectable,
944
963
  args: [{ providedIn: 'root' }]
945
964
  }], ctorParameters: () => [] });
@@ -1 +1 @@
1
- {"version":3,"file":"reforgium-presentia.mjs","sources":["../../../../libs/presentia/src/adaptive/adaptive.provider.ts","../../../../libs/presentia/src/adaptive/adaptive.service.ts","../../../../libs/presentia/src/adaptive/device-type.directive.ts","../../../../libs/presentia/src/lang/lang.models.ts","../../../../libs/presentia/src/lang/locale.provider.ts","../../../../libs/presentia/src/lang/lang.service.ts","../../../../libs/presentia/src/lang/lang.directive.ts","../../../../libs/presentia/src/lang/lang.pipe.ts","../../../../libs/presentia/src/theme/themes.constant.ts","../../../../libs/presentia/src/theme/theme.provider.ts","../../../../libs/presentia/src/theme/theme.service.ts","../../../../libs/presentia/src/providers/init.provider.ts","../../../../libs/presentia/src/seo/seo.service.ts","../../../../libs/presentia/src/seo/seo-route.listener.ts","../../../../libs/presentia/src/routes/route-watcher.service.ts","../../../../libs/presentia/src/reforgium-presentia.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nimport { DeviceBreakpoints } from './adaptive.models';\r\n\r\n/**\r\n * Default breakpoints for device type detection.\r\n *\r\n * Defines media queries for each device category:\r\n * - `mobile` — screens up to 719px wide\r\n * - `tablet` — screens from 720px to 1399px wide\r\n * - `desktop-s` — small desktop screens from 1400px to 1919px wide\r\n * - `desktop` — large desktop screens 1920px and wider\r\n *\r\n * These breakpoints are used by `AdaptiveService` to determine the current device type.\r\n */\r\nexport const defaultBreakpoints = {\r\n 'mobile': '(max-width: 719px)',\r\n 'tablet': '(min-width: 720px) and (max-width: 1399px)',\r\n 'desktop-s': '(min-width: 1400px) and (max-width: 1919px)',\r\n 'desktop': '(min-width: 1920px)',\r\n};\r\n/**\r\n * Injection token for providing custom device breakpoints.\r\n *\r\n * By default, provides `defaultBreakpoints`, but can be overridden\r\n * at any level of the dependency injection tree to customize\r\n * the device detection behavior.\r\n *\r\n * Example of overriding:\r\n * ```typescript\r\n * {\r\n * provide: DEVICE_BREAKPOINTS,\r\n * useValue: {\r\n * mobile: '(max-width: 599px)',\r\n * tablet: '(min-width: 600px) and (max-width: 1199px)',\r\n * 'desktop-s': '(min-width: 1200px) and (max-width: 1799px)',\r\n * desktop: '(min-width: 1800px)'\r\n * }\r\n * }\r\n * ```\r\n *\r\n * Used by `AdaptiveService` to observe media query changes.\r\n */\r\nexport const DEVICE_BREAKPOINTS = new InjectionToken<DeviceBreakpoints>('RE_DEVICE_BREAKPOINTS', {\r\n providedIn: 'root',\r\n factory: () => defaultBreakpoints,\r\n});\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { afterRenderEffect, computed, inject, Injectable, signal } from '@angular/core';\r\nimport { debounceTime, fromEvent } from 'rxjs';\r\n\r\nimport { Devices } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { DEVICE_BREAKPOINTS } from './adaptive.provider';\r\n\r\n/**\r\n * The `AdaptiveService` is responsible for determining the device type, window dimensions, and screen orientation.\r\n *\r\n * Used for building adaptive interfaces, changing component behavior and styles\r\n * depending on the current device or screen size.\r\n *\r\n * Main features:\r\n * - Reactive tracking of the current device (`desktop`, `tablet`, `mobile`).\r\n * - Support for computed properties (`isDesktop`, `isPortrait`).\r\n * - Automatic updates when the window is resized and breakpoints are crossed.\r\n *\r\n * Implementation is based on:\r\n * - `BreakpointObserver` from Angular CDK — for observing media queries.\r\n * - `signal` and `computed` — for reactive state without zones.\r\n * - `fromEvent(window, 'resize')` — for updating window dimensions with debouncing.\r\n *\r\n * The service is registered as `providedIn: 'root'` and is available throughout the application.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AdaptiveService {\r\n /** @internal Signal of the current device type. */\r\n #device = signal<Devices>('desktop');\r\n\r\n /** @internal Signals of the current window width and height. */\r\n #width = signal(0);\r\n #height = signal(0);\r\n\r\n /**\r\n * Current device type (reactive signal).\r\n * Possible values: `'desktop' | 'tablet' | 'mobile'`.\r\n *\r\n * Updates automatically when screen width changes\r\n * or when specified breakpoints are crossed (`DEVICE_BREAKPOINTS`).\r\n */\r\n device = this.#device.asReadonly();\r\n\r\n /**\r\n * Current browser window width in pixels.\r\n * Updates reactively on `resize` event.\r\n */\r\n width = this.#width.asReadonly();\r\n\r\n /**\r\n * Current browser window height in pixels.\r\n * Updates reactively on `resize` event.\r\n */\r\n height = this.#height.asReadonly();\r\n\r\n /**\r\n * Computed signal indicating whether the current device is a desktop.\r\n * Used for conditional rendering or layout configuration.\r\n */\r\n isDesktop = computed(() => this.#device() === 'desktop');\r\n\r\n /**\r\n * Computed signal determining whether the screen is in portrait orientation.\r\n * Returns `true` if window height is greater than width.\r\n */\r\n isPortrait = computed(() => this.#height() > this.#width());\r\n\r\n private deviceBreakpoints = inject(DEVICE_BREAKPOINTS);\r\n private devicePriority: Devices[] = Object.keys(this.deviceBreakpoints) as Devices[];\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n this.#width.set(window.innerWidth);\r\n this.#height.set(window.innerHeight);\r\n });\r\n\r\n this.breakpointObserver.observe(Object.values(this.deviceBreakpoints)).subscribe((state) => {\r\n const device = this.devicePriority.find((key) => state.breakpoints[this.deviceBreakpoints[key]]);\r\n\r\n this.#device.set(device ?? 'desktop');\r\n });\r\n fromEvent(window, 'resize')\r\n .pipe(debounceTime(100))\r\n .subscribe(() => {\r\n this.#width.set(window.innerWidth);\r\n this.#height.set(window.innerHeight);\r\n });\r\n }\r\n}\r\n","import { Directive, effect, inject, input, Signal, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\nimport { Devices } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { AdaptiveService } from './adaptive.service';\r\n\r\n/**\r\n * Structural directive `*ssIfDevice`.\r\n *\r\n * Shows or hides an element based on the current device type,\r\n * as determined by `AdaptiveService`.\r\n *\r\n * Example:\r\n * ```html\r\n * <div *ssIfDevice=\"'desktop'\">Desktop only</div>\r\n * <div *ssIfDevice=\"['mobile', 'tablet']\">For mobile and tablets</div>\r\n * <div *ssIfDevice=\"'mobile'; inverse: true\"> Hide on mobile</div>\r\n * ```\r\n *\r\n * Parameters:\r\n * - `ssIfDevice` — one or more `Devices` values (`'desktop' | 'tablet' | 'mobile'`)\r\n * - `inverse` — inverts the display condition\r\n *\r\n * Works reactively: when the device type changes in `AdaptiveService`,\r\n * the template is automatically added or removed from the DOM.\r\n */\r\n@Directive({\r\n selector: '[reIfDevice]',\r\n standalone: true,\r\n})\r\nexport class IfDeviceDirective {\r\n device = input<Devices | Devices[]>(undefined, { alias: 'ssIfDevice' });\r\n inverse = input<boolean>(false);\r\n\r\n private readonly tpl = inject(TemplateRef);\r\n private readonly vcr = inject(ViewContainerRef);\r\n private readonly adaptive = inject(AdaptiveService);\r\n\r\n private allowedDevices: Devices[] = [];\r\n private hasView = false;\r\n\r\n private readonly currentDevice: Signal<Devices> = this.adaptive.device;\r\n\r\n constructor() {\r\n effect(() => {\r\n const device = this.device();\r\n\r\n if (device) {\r\n this.allowedDevices = Array.isArray(device) ? device : [device];\r\n }\r\n\r\n this.updateView();\r\n });\r\n }\r\n\r\n private updateView() {\r\n const isAllowed = this.allowedDevices.includes(this.currentDevice());\r\n const shouldShow = this.inverse() ? !isAllowed : isAllowed;\r\n\r\n if (shouldShow && !this.hasView) {\r\n this.vcr.createEmbeddedView(this.tpl);\r\n this.hasView = true;\r\n } else if (!shouldShow && this.hasView) {\r\n this.vcr.clear();\r\n this.hasView = false;\r\n }\r\n }\r\n}\r\n","import { Langs } from '@reforgium/internal';\n\n/**\n * Language data model from localization server\n *\n * @description\n * `Model` for translation data\n * `namespace` - git project name\n * `code` - masked query: ${page}.${recordKey}\n * `value` - translation value\n */\nexport interface LangDto {\n namespace: string;\n code: string;\n localization: string;\n}\n\n/**\n * Data model for translation\n *\n * @description\n * `key` - masked query: ${page}.${recordKey}\n * `value` - translation value or nested model\n */\nexport interface LangModel {\n [key: string]: string | LangModel;\n}\n\n/**\n * Parameters for text formatting\n *\n * @description\n * `key` - mask key\n * `value` - mask value\n * example: {{`key1`}} will be replaced with `value1`\n */\nexport type LangParams = Record<string, string>;\n\n/**\n * Represents configuration settings for localization.\n *\n * This interface is used to define the locale configuration structure,\n * which can include URL, resource origin information, default language,\n * and related values for regional or localization settings.\n *\n * Properties:\n * - `url` specifies the localization URL for loading resources.\n * - `isFromAssets` indicates whether resources are loaded from application assets.\n * - `defaultLang` defines optional default language for localization.\n * - `defaultValue` - optional default value for locale resource.\n * - `kgValue` specifies optional localization value with variants `kg` or `ky`.\n */\nexport interface LocaleConfig {\n url: string;\n isFromAssets: boolean;\n defaultLang?: Langs;\n defaultValue?: string;\n kgValue?: 'kg' | 'ky';\n}\n\nexport const innerLangVal = Symbol('reInnerLangVal');\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { LocaleConfig } from './lang.models';\r\n\r\n/**\r\n * Injection token for providing locale configuration to the language module.\r\n *\r\n * Used to inject `LocaleConfig` into services and components that require\r\n * internationalization settings (e.g., locale, date formats, translations).\r\n *\r\n * Example:\r\n * ```typescript\r\n * providers: [\r\n * { provide: LANG_CONFIG, useValue: { locale: 'ru', ... } }\r\n * ]\r\n * ```\r\n *\r\n * The token can be injected using Angular's DI system:\r\n * ```typescript\r\n * private config = inject(LANG_CONFIG);\r\n * ```\r\n */\r\nexport const LANG_CONFIG = new InjectionToken<LocaleConfig>('RE_LANG_CONFIG');\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { computed, inject, Injectable, Signal, signal } from '@angular/core';\r\n\r\nimport { Langs } from '@reforgium/internal';\r\n\r\nimport { innerLangVal, LangDto, LangModel, LangParams } from './lang.models';\r\nimport { LANG_CONFIG } from './locale.provider';\r\n\r\n/**\r\n * LangService provides functionality for managing and tracking language settings\r\n * and translations in the application. It is designed to handle localization needs,\r\n * loading language resources, caching translations, and dynamically applying translations\r\n * throughout the application.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class LangService {\r\n private readonly config = inject(LANG_CONFIG);\r\n private readonly http = inject(HttpClient);\r\n\r\n readonly #lang = signal<Langs>(this.getStoredLang());\r\n readonly #cache = signal<LangModel>({});\r\n\r\n readonly #loadedNamespaces = new Set<string>();\r\n readonly #pendingLoads = new Map<string, Promise<void>>();\r\n\r\n /**\r\n * Computed property determining the current language setting.\r\n *\r\n * - If private method `#lang` returns 'ru', this property will return 'ru'.\r\n * - If `#lang` returns another value, the `config.kgValue` property is checked:\r\n * - If `config.kgValue` is defined, the property will return its value.\r\n * - If `config.kgValue` is not defined, the property will return the default value 'kg'.\r\n */\r\n readonly currentLang = computed(() => {\r\n const lang = this.#lang();\r\n\r\n return lang === 'ru' ? 'ru' : (this.config?.kgValue ?? 'kg');\r\n });\r\n /**\r\n * Extracts readonly value from private property `#lang` and assigns it to `innerLangVal`.\r\n * Expected that property `#lang` has `asReadonly` method that returns immutable representation.\r\n */\r\n readonly [innerLangVal] = this.#lang.asReadonly();\r\n\r\n /**\r\n * Sets the current language for the application.\r\n *\r\n * @param {Langs | 'ky'} lang - The language to set.\r\n * Accepts predefined type `Langs` or 'ky' to set Kyrgyz language.\r\n * @return {void} Returns no value.\r\n */\r\n setLang(lang: Langs | 'ky'): void {\r\n const langVal = lang === 'ky' ? 'kg' : lang;\r\n\r\n if (langVal !== this.#lang()) {\r\n this.#lang.set(langVal);\r\n localStorage.setItem('lang', langVal);\r\n\r\n const namespaces = Array.from(this.#loadedNamespaces.values()).map((key) => key.split('.')[1]);\r\n\r\n this.#loadedNamespaces.clear();\r\n\r\n namespaces.forEach((ns) => void this.loadNamespace(ns));\r\n }\r\n }\r\n\r\n /**\r\n * Gets value based on a provided query and optionally applies specified parameters.\r\n *\r\n * @param {string} query - Query string used to retrieve desired value.\r\n * @param {LangParams} [params] - Optional parameters to apply to retrieved value.\r\n * @return {string} Retrieved value after optional parameter application,\r\n * or default value if a query is not found.\r\n */\r\n get(query: string, params?: LangParams): string {\r\n const value = this.getChainedValue(query);\r\n\r\n if (params) {\r\n return this.applyParams((value ?? query) as string, params);\r\n }\r\n\r\n return (value as string | undefined) ?? this.config.defaultValue ?? query;\r\n }\r\n\r\n /**\r\n * Observes changes to a specified translation key and dynamically computes its value.\r\n *\r\n * @param {string} query - Translation key to observe, typically in format \"namespace.key\".\r\n * @param {LangParams} [params] - Optional parameters for interpolation or\r\n * dynamic content replacement in translation value.\r\n * @return {Signal<string>} Computed value that dynamically updates\r\n * with translation matching a provided query and parameters.\r\n */\r\n observe(query: string, params?: LangParams): Signal<string> {\r\n const [ns] = query.split('.');\r\n\r\n if (!this.#loadedNamespaces.has(this.makeNamespaceKey(ns))) {\r\n void this.loadNamespace(ns);\r\n }\r\n\r\n return computed(() => this.get(query, params));\r\n }\r\n\r\n /**\r\n * Loads specified namespace, ensuring its caching and availability for use.\r\n *\r\n * @param {string} ns - Namespace name to load.\r\n * @return {Promise<void>} Promise that resolves on a successful namespace load,\r\n * or rejects when error occurs during a process.\r\n */\r\n async loadNamespace(ns: string): Promise<void> {\r\n const key = this.makeNamespaceKey(ns);\r\n\r\n if (this.#loadedNamespaces.has(key)) {\r\n return;\r\n }\r\n\r\n if (this.#pendingLoads.has(key)) {\r\n return this.#pendingLoads.get(key)!;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n this.http.get<LangDto[] | LangModel>(this.makeUrl(ns)).subscribe({\r\n next: (res) => {\r\n const existing = this.#cache();\r\n const resolved = Array.isArray(res) ? this.parseModelToRecord(res) : this.parseAssetToRecord(ns, res);\r\n\r\n this.#cache.set({ ...existing, ...resolved });\r\n this.#loadedNamespaces.add(key);\r\n resolve();\r\n },\r\n error: (err) => {\r\n this.#pendingLoads.delete(key);\r\n reject(err);\r\n },\r\n complete: () => this.#pendingLoads.delete(key),\r\n });\r\n });\r\n\r\n this.#pendingLoads.set(key, promise);\r\n\r\n return promise;\r\n }\r\n\r\n private parseModelToRecord(model: LangDto[]): LangModel {\r\n const records: LangModel = {};\r\n\r\n for (const item of model) {\r\n records[item.code] = item.localization;\r\n }\r\n\r\n return records;\r\n }\r\n\r\n private parseAssetToRecord(page: string, data: LangModel): LangModel {\r\n const records: LangModel = {};\r\n\r\n for (const [k, v] of Object.entries(data)) {\r\n records[`${page}.${k}`] = v;\r\n }\r\n\r\n return records;\r\n }\r\n\r\n private applyParams(text: string, params: LangParams): string {\r\n return text.replace(/\\{\\{(.*?)}}/g, (_, k) => params[k.trim()] ?? '');\r\n }\r\n\r\n private getChainedValue(query = '', source = this.#cache()) {\r\n const [page, key, ...normalizedPath] = query.split('.');\r\n\r\n return [`${page}.${key}`, ...normalizedPath].reduce<LangModel | string | undefined>(\r\n (acc, key) => (typeof acc === 'object' ? (acc[key] ?? acc[query]) : undefined),\r\n source,\r\n ) as string | undefined;\r\n }\r\n\r\n private getStoredLang(): Langs {\r\n return (localStorage.getItem('lang') as Langs) || this.config.defaultLang || 'ru';\r\n }\r\n\r\n private makeUrl(ns: string): string {\r\n const suffix = this.config.isFromAssets ? `.${this.#lang()}.json` : `?language=${this.#lang()}`;\r\n\r\n return `${this.config.url}/${ns}${suffix}`;\r\n }\r\n\r\n private makeNamespaceKey(ns: string) {\r\n return `${this.#lang()}.${ns}`;\r\n }\r\n}\r\n","import { afterNextRender, Directive, ElementRef, inject, input, Renderer2 } from '@angular/core';\r\n\r\nimport { LangService } from './lang.service';\r\n\r\n/**\r\n * Localization modes for the `reLang` directive.\r\n *\r\n * - `'only-content'` — only text content of the element\r\n * - `'only-placeholder'` — only the `placeholder` attribute\r\n * - `'only-label'` — only the `label` attribute\r\n * - `'only-title'` — only the `title` attribute\r\n * - `'all'` — all supported attributes and content\r\n */\r\ntype Types = 'only-content' | 'only-placeholder' | 'only-label' | 'only-title' | 'all';\r\n\r\n/**\r\n * **LangDirective** — directive for automatic localization of attributes and text content.\r\n *\r\n * Replaces localization keys (format `namespace.key`) with translated strings via `LangService`.\r\n * Supports `title`, `label`, `placeholder` attributes and text nodes.\r\n *\r\n * ### Usage\r\n * ```html\r\n * <!-- Localize all attributes and content -->\r\n * <button reLang title=\"common.save\">common.save</button>\r\n *\r\n * <!-- Localize only title -->\r\n * <button [reLang]=\"'only-title'\" title=\"common.cancel\">Cancel</button>\r\n *\r\n * <!-- Localize custom attribute -->\r\n * <input reLang [langForAttr]=\"'aria-label'\" aria-label=\"forms.username\" />\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Directive({ selector: '[reLang]', standalone: true })\r\nexport class LangDirective {\r\n /**\r\n * Localization mode: defines which parts of the element will be translated.\r\n * @default 'all'\r\n */\r\n lang = input<Types | ''>('all', { alias: 'reLang' });\r\n\r\n /**\r\n * Name of an additional attribute to localize (besides standard `title`, `label`, `placeholder`).\r\n */\r\n langForAttr = input<string>();\r\n\r\n private el = inject(ElementRef);\r\n private renderer = inject(Renderer2);\r\n private service = inject(LangService);\r\n\r\n constructor() {\r\n afterNextRender(() => this.setAttributes());\r\n }\r\n\r\n /**\r\n * Applies localization to the element according to `lang` and `langForAttr` settings.\r\n * Called automatically after the component renders.\r\n */\r\n setAttributes() {\r\n const native = this.el.nativeElement as HTMLElement;\r\n const langFor = this.lang() || 'all';\r\n const langForAttr = this.langForAttr();\r\n\r\n if (['all', 'only-title'].includes(langFor) && native.hasAttribute('title')) {\r\n this.replaceAttrValue('title');\r\n }\r\n\r\n if (['all', 'only-label'].includes(langFor) && native.hasAttribute('label')) {\r\n this.replaceAttrValue('label');\r\n }\r\n\r\n if (['all', 'only-placeholder'].includes(langFor) && native.hasAttribute('placeholder')) {\r\n this.replaceAttrValue('placeholder');\r\n }\r\n\r\n if (['all', 'only-content'].includes(langFor)) {\r\n this.replaceTextNodeValue();\r\n }\r\n\r\n if (langForAttr) {\r\n this.replaceAttrValue(langForAttr!);\r\n }\r\n }\r\n\r\n /**\r\n * Replaces attribute value with a localized string.\r\n * If the value doesn't look like a localization key, outputs a warning.\r\n *\r\n * @param attributeName name of the attribute to replace\r\n */\r\n private replaceAttrValue(attributeName: string) {\r\n const native = this.el.nativeElement as HTMLElement;\r\n const title = native.getAttribute(attributeName)?.trim() || '';\r\n\r\n if (!this.looksLikeKey(title)) {\r\n console.warn(`Lang: Attribute ${attributeName} is not a lang key`, title);\r\n\r\n return;\r\n }\r\n\r\n this.getLangValue(title).then((langed) => this.renderer.setAttribute(native, attributeName, langed));\r\n }\r\n\r\n /**\r\n * Replaces element's text node with a localized string.\r\n * Works only if the element contains no child elements (text only).\r\n * If the content doesn't look like a localization key, outputs a warning.\r\n */\r\n private replaceTextNodeValue() {\r\n const native = this.el.nativeElement as HTMLElement;\r\n\r\n if (native.children.length > 0) {\r\n console.warn('Lang: Element has children, text node replacement is skipped');\r\n\r\n return;\r\n }\r\n\r\n const textNode = Array.from(native.childNodes).find((n) => n.nodeType === Node.TEXT_NODE) as Text | undefined;\r\n const key = textNode?.nodeValue?.trim() || '';\r\n\r\n if (!this.looksLikeKey(key)) {\r\n console.warn('Lang: Text node is not a lang key', key);\r\n\r\n return;\r\n }\r\n\r\n this.getLangValue(key).then((langed) => this.renderer.setValue(textNode, langed));\r\n }\r\n\r\n /**\r\n * Checks if a string looks like a localization key (contains `.` and no spaces).\r\n *\r\n * @param value string to check\r\n * @returns `true` if the string looks like a localization key\r\n */\r\n private looksLikeKey(value: string) {\r\n return !!value && value.includes('.') && !value.includes(' ');\r\n }\r\n\r\n /**\r\n * Asynchronously loads namespace and retrieves localized value by key.\r\n *\r\n * @param key localization key in format `namespace.path.to.key`\r\n * @returns localized string\r\n */\r\n private async getLangValue(key: string) {\r\n const [ns] = key.split('.', 1);\r\n\r\n await this.service.loadNamespace(ns);\r\n\r\n return this.service.get(key);\r\n }\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core';\r\n\r\nimport { LangParams } from './lang.models';\r\nimport { LangService } from './lang.service';\r\n\r\n/**\r\n * Custom Angular pipe that transforms a language key and additional parameters into a localized string.\r\n *\r\n * The pipe is declared as standalone and impure — meaning it can be used without importing a module\r\n * and will be recalculated when the state changes (for example, when the language is switched).\r\n *\r\n * In its operation, the pipe observes and caches language keys to improve performance,\r\n * using LangService to retrieve translated strings based on the current application language.\r\n *\r\n * The transformation involves accepting a key string and optional parameters,\r\n * forming a cache key, and returning the localized value corresponding to that request.\r\n *\r\n * @implements {PipeTransform}\r\n */\r\n@Pipe({ name: 'lang', standalone: true, pure: false })\r\nexport class LangPipe implements PipeTransform {\r\n private readonly lang = inject(LangService);\r\n private readonly cache = new Map<string, () => string>();\r\n\r\n transform(query: string, params?: LangParams): string {\r\n const key = query + JSON.stringify(params);\r\n\r\n if (!this.cache.has(key)) {\r\n this.cache.set(key, this.lang.observe(query, params));\r\n }\r\n\r\n return this.cache.get(key)!();\r\n }\r\n}\r\n","import { Themes } from '@reforgium/internal';\r\n\r\n/**\r\n * Type-safe mapping of available theme names.\r\n *\r\n * Provides a constant record that maps theme identifiers to their corresponding string values.\r\n * This ensures compile-time safety when referencing theme names throughout the application.\r\n *\r\n * Available themes:\r\n * - `light` - Light theme variant\r\n * - `dark` - Dark theme variant\r\n *\r\n * @example\r\n * ```typescript\r\n * const currentTheme = themes.light; // 'light'\r\n * const isDarkTheme = theme === themes.dark;\r\n * ```\r\n */\r\nexport const themes: Record<Themes, Themes> = {\r\n light: 'light',\r\n dark: 'dark',\r\n} as const;\r\n\r\n/**\r\n * CSS class prefix used for dark theme styling.\r\n *\r\n * This constant defines the prefix applied to HTML elements when the dark theme is active.\r\n * It is typically added to the root element or specific components to enable dark theme styles.\r\n *\r\n * @example\r\n * ```typescript\r\n * document.body.classList.add(darkThemePrefix); // Applies 're-dark' class\r\n * ```\r\n */\r\nexport const darkThemePrefix = 're-dark';\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { ThemeConfig } from './theme.models';\r\n// noinspection ES6PreferShortImport\r\nimport { themes } from './themes.constant';\r\n\r\n/**\r\n * Default theme configuration object.\r\n *\r\n * Defines the initial theme settings for the application.\r\n * By default, sets the light theme as the active theme.\r\n *\r\n * This configuration can be overridden when providing `THEME_CONFIG` token\r\n * at the module or application level.\r\n * ```\r\n */\r\nexport const defaultThemeConfig = {\r\n defaultTheme: themes.light,\r\n};\r\n\r\n/**\r\n * Injection token for theme configuration.\r\n *\r\n * Used to provide custom theme settings via Angular's dependency injection system.\r\n * The token expects a value of type `ThemeConfig`.\r\n *\r\n * Example usage:\r\n * ```typescript\r\n * // In providers array:\r\n * { provide: THEME_CONFIG, useValue: { defaultTheme: themes.dark } }\r\n *\r\n * // In service or component:\r\n * private themeConfig = inject(THEME_CONFIG);\r\n * ```\r\n *\r\n * If not provided, `defaultThemeConfig` will be used as fallback.\r\n */\r\nexport const THEME_CONFIG = new InjectionToken<ThemeConfig>('RE_THEME_CONFIG');\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\n\r\nimport { Themes } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { THEME_CONFIG } from './theme.provider';\r\n// noinspection ES6PreferShortImport\r\nimport { darkThemePrefix, themes } from './themes.constant';\r\n\r\n/**\r\n * Service for managing application theme.\r\n *\r\n * Allows getting the current theme and switching between light and dark.\r\n * Automatically saves the selected theme to `localStorage` and applies CSS class to `<html>` element.\r\n *\r\n * Example:\r\n * ```ts\r\n * const theme = inject(ThemeService);\r\n * theme.switch('dark');\r\n * console.log(theme.theme()); // 'dark'\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService {\r\n private readonly config = inject(THEME_CONFIG);\r\n private readonly themeDefault = this.config?.defaultTheme || themes.light;\r\n\r\n #theme = signal<Themes>(this.themeDefault);\r\n\r\n /**\r\n * Current active theme (`light` or `dark`).\r\n *\r\n * Value is reactive — can be used in template or `computed`.\r\n * ```html\r\n * <div [class.dark]=\"themeService.theme() === 'dark'\"></div>\r\n * <div [class]=\"themeService.theme()\"></div>\r\n * ```\r\n */\r\n theme = computed(() => this.#theme());\r\n\r\n /**\r\n * Convenient flag returning `true` if light theme is active.\r\n * Suitable for conditional style application or resource selection.\r\n */\r\n isLight = computed(() => this.#theme() === themes.light);\r\n\r\n constructor() {\r\n effect(() => {\r\n const theme = (localStorage.getItem('theme') as Themes) || this.themeDefault;\r\n\r\n this.switch(theme);\r\n });\r\n effect(() => localStorage.setItem('theme', this.#theme()));\r\n }\r\n\r\n /**\r\n * Switches theme.\r\n *\r\n * If a parameter is not provided — performs toggle between `light` and `dark`.\r\n * Also, automatically updates `<html>` class and saves selection to `localStorage`.\r\n *\r\n * @param theme — explicit theme value (`'light'` or `'dark'`).\r\n */\r\n switch(theme?: Themes) {\r\n const html = document.querySelector('html')!;\r\n const newTheme = theme ?? (this.#theme() === themes.light ? themes.dark : themes.light);\r\n\r\n newTheme === themes.dark && html.classList.add(darkThemePrefix);\r\n newTheme === themes.light && html.classList.remove(darkThemePrefix);\r\n this.#theme.set(newTheme);\r\n }\r\n}\r\n","import { EnvironmentProviders, LOCALE_ID, makeEnvironmentProviders } from '@angular/core';\r\n\r\nimport { CURRENT_DEVICE, SELECTED_LANG, SELECTED_THEME, TRANSLATION } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { AdaptiveService, defaultBreakpoints, DEVICE_BREAKPOINTS, DeviceBreakpoints } from '../adaptive';\r\nimport { innerLangVal, LANG_CONFIG, LangService, LocaleConfig } from '../lang';\r\nimport { defaultThemeConfig, THEME_CONFIG, ThemeConfig, ThemeService } from '../theme';\r\n\r\n/**\r\n * Configuration object for initializing the Presentia application providers.\r\n *\r\n * @property {LocaleConfig} locale - Locale configuration (required). Defines language and localization settings.\r\n * @property {ThemeConfig} [theme] - Theme configuration (optional). Defines the application theme. Defaults to `defaultThemeConfig` if not provided.\r\n * @property {DeviceBreakpoints} [breakpoints] - Device breakpoints configuration (optional). Defines responsive breakpoints. Defaults to `defaultBreakpoints` if not provided.\r\n */\r\nexport interface AppConfig {\r\n locale: LocaleConfig;\r\n theme?: ThemeConfig;\r\n breakpoints?: DeviceBreakpoints;\r\n}\r\n\r\n/**\r\n * Provides environment-level providers for Presentia application initialization.\r\n *\r\n * This function configures essential application services:\r\n * - Language and localization settings\r\n * - Theme configuration\r\n * - Adaptive/responsive breakpoints\r\n * - Current device detection\r\n *\r\n * @param {AppConfig} config - Configuration object containing locale, theme, and breakpoints settings.\r\n * @returns {EnvironmentProviders} A collection of Angular providers for the application environment.\r\n *\r\n * @example\r\n * ```typescript\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideReInit({\r\n * locale: { defaultLang: 'en', supportedLangs: ['en', 'ru'] },\r\n * theme: { defaultTheme: 'dark' },\r\n * breakpoints: { mobile: 768, tablet: 1024 }\r\n * })\r\n * ]\r\n * };\r\n * ```\r\n */\r\nexport function provideReInit(config: AppConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: TRANSLATION, deps: [LangService], useFactory: (ls: LangService) => ls },\r\n { provide: SELECTED_LANG, deps: [LangService], useFactory: (ls: LangService) => ls[innerLangVal] },\r\n { provide: SELECTED_THEME, deps: [ThemeService], useFactory: (ls: ThemeService) => ls.theme },\r\n { provide: CURRENT_DEVICE, deps: [AdaptiveService], useFactory: (ls: AdaptiveService) => ls.device },\r\n { provide: DEVICE_BREAKPOINTS, useValue: config.breakpoints || defaultBreakpoints },\r\n { provide: THEME_CONFIG, useValue: config.theme || defaultThemeConfig },\r\n { provide: LANG_CONFIG, useValue: config.locale || {} },\r\n { provide: LOCALE_ID, useValue: config.locale.defaultLang ?? 'ru' },\r\n ]);\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\n\r\nimport { OgType, TwitterCardType } from './seo.models';\r\n\r\n/**\r\n * Service for managing page SEO metadata.\r\n *\r\n * Allows centrally setting title, description, keywords,\r\n * Open Graph and Twitter Card tags, canonical link, and JSON-LD schema.\r\n *\r\n * Example:\r\n * ```ts\r\n * const seo = inject(SeoService);\r\n * seo.setTitle('Home Page');\r\n * seo.setDescription('Site Description');\r\n * seo.setOg({ title: 'Home', type: 'website' });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class SeoService {\r\n private title = inject(Title);\r\n private meta = inject(Meta);\r\n\r\n /**\r\n * Sets page title (`<title>`).\r\n * @param value title text\r\n */\r\n setTitle(value: string) {\r\n this.title.setTitle(value);\r\n }\r\n\r\n /**\r\n * Sets page description (`<meta name=\"description\">`).\r\n * @param desc brief content description\r\n */\r\n setDescription(desc: string) {\r\n this.upsert({ name: 'description', content: desc });\r\n }\r\n\r\n /**\r\n * Sets page keywords (`<meta name=\"keywords\">`).\r\n * @param keywords array of keywords\r\n */\r\n setKeywords(keywords: string[]) {\r\n this.upsert({ name: 'keywords', content: keywords.join(', ') });\r\n }\r\n\r\n /**\r\n * Sets directives for search engines (`<meta name=\"robots\">`).\r\n * @param value value, e.g. `\"index,follow\"`\r\n */\r\n setRobots(value: string) {\r\n this.upsert({ name: 'robots', content: value }); // e.g. \"index,follow\"\r\n }\r\n\r\n /**\r\n * Sets canonical link (`<link rel=\"canonical\">`).\r\n * @param url absolute URL of canonical page\r\n */\r\n setCanonical(url: string) {\r\n this.upsertLink('canonical', url);\r\n }\r\n\r\n /**\r\n * Sets Open Graph meta tags.\r\n * @param opts object with Open Graph fields (`title`, `description`, `image`, `url`, `type`, etc.)\r\n */\r\n setOg(opts: OgType) {\r\n for (const [k, v] of Object.entries(opts)) {\r\n v && this.upsert({ property: `og:${k}`, content: v });\r\n }\r\n }\r\n\r\n /**\r\n * Sets Twitter Card meta tags.\r\n * @param opts object with Twitter Card fields (`card`, `title`, `description`, `image`, etc.)\r\n */\r\n setTwitter(opts: TwitterCardType) {\r\n for (const [k, v] of Object.entries(opts)) {\r\n v && this.upsert({ name: `twitter:${k}`, content: v });\r\n }\r\n }\r\n\r\n /**\r\n * Embeds JSON-LD schema (structured data) in `<head>`.\r\n * @param schema schema object (will be serialized to JSON)\r\n */\r\n setJsonLd(schema: object) {\r\n const id = 'app-jsonld';\r\n let el = document.getElementById(id) as HTMLScriptElement | null;\r\n\r\n if (!el) {\r\n el = document.createElement('script');\r\n el.type = 'application/ld+json';\r\n el.id = id;\r\n document.head.appendChild(el);\r\n }\r\n\r\n el.text = JSON.stringify(schema);\r\n }\r\n\r\n private upsert(tag: { name?: string; property?: string; content: string }) {\r\n if (tag.name) {\r\n this.meta.updateTag(tag, `name='${tag.name}'`);\r\n } else if (tag.property) {\r\n this.meta.updateTag(tag, `property='${tag.property}'`);\r\n }\r\n }\r\n\r\n private upsertLink(rel: string, href: string) {\r\n const head = document.head;\r\n let link = head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`);\r\n\r\n if (!link) {\r\n link = document.createElement('link');\r\n link.rel = rel;\r\n head.appendChild(link);\r\n }\r\n\r\n link.href = href;\r\n }\r\n}\r\n","import { DestroyRef, inject, Injectable } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\n\r\nimport { SeoService } from './seo.service';\r\n\r\n/**\r\n * Service that listens to Angular route changes and automatically updates SEO metadata\r\n * (title, description, Open Graph, Twitter cards, JSON-LD, canonical URL, robots meta tag)\r\n * based on route data configuration.\r\n *\r\n * @example\r\n * ```typescript\r\n * const routes: Routes = [{\r\n * path: 'about',\r\n * component: AboutComponent,\r\n * data: {\r\n * title: 'About Us',\r\n * description: 'Learn more about our company',\r\n * robots: 'index,follow'\r\n * }\r\n * }];\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SeoRouteListener {\r\n private router = inject(Router);\r\n private seo = inject(SeoService);\r\n private ar = inject(ActivatedRoute);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Initializes the route listener to monitor navigation events and update SEO metadata.\r\n * Subscribes to router NavigationEnd events and automatically unsubscribes on component destruction.\r\n *\r\n * @param baseUrl - The base URL of the application used for constructing canonical URLs.\r\n * Trailing slashes will be removed automatically.\r\n */\r\n init(baseUrl: string) {\r\n const sub = this.router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe(() => {\r\n const route = this.deepest(this.ar);\r\n const data = route.snapshot.data as {\r\n title?: string;\r\n description?: string;\r\n robots?: string;\r\n canonical?: string;\r\n og?: Record<string, string>;\r\n twitter?: Record<string, string>;\r\n jsonld?: object;\r\n };\r\n const url = data.canonical ?? baseUrl.replace(/\\/+$/, '') + this.router.url;\r\n\r\n data.title && this.seo.setTitle(data.title);\r\n data.description && this.seo.setDescription(data.description);\r\n data.twitter && this.seo.setTwitter(data.twitter);\r\n data.jsonld && this.seo.setJsonLd(data.jsonld);\r\n\r\n this.seo.setRobots(data.robots ?? 'index,follow');\r\n this.seo.setCanonical(url);\r\n this.seo.setOg({\r\n title: data.title,\r\n description: data.description,\r\n url: url,\r\n ...data.og,\r\n });\r\n });\r\n\r\n this.destroyRef.onDestroy(() => sub.unsubscribe());\r\n }\r\n\r\n /**\r\n * Recursively finds the deepest (most nested) activated route in the route tree.\r\n * This is used to extract route data from the currently active leaf route.\r\n *\r\n * @param r - The root activated route to start traversing from.\r\n * @returns The deepest child route in the hierarchy.\r\n */\r\n private deepest(r: ActivatedRoute): ActivatedRoute {\r\n let cur = r;\r\n\r\n while (cur.firstChild) {\r\n cur = cur.firstChild;\r\n }\r\n\r\n return cur;\r\n }\r\n}\r\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, UrlSegment } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs';\n\nimport { deepEqual } from '@reforgium/internal';\n\n/**\n * Reactive snapshot of the current route (the deepest active route).\n * Updates on every `NavigationEnd` event.\n *\n * Provides:\n * - `params` / `query` — strings (as in Angular Router)\n * - `data` — arbitrary data (from route configuration/resolvers)\n * - `url` — string assembled from `UrlSegment[]`\n * - `fragment` — hash (#section)\n * - `selectData(key)` — type-safe selector for `data`\n * - `state` — combined computed object (convenient for single subscriber)\n */\n@Injectable({ providedIn: 'root' })\nexport class RouteWatcher {\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n #params = signal<Record<string, string>>({});\n #query = signal<Record<string, string>>({});\n #data = signal<Record<string, unknown>>({});\n #url = signal<string>('');\n #fragment = signal<string | null>(null);\n\n /** Signal for tracking and retrieving URL parameters */\n readonly params = this.#params.asReadonly();\n\n /** Signal for tracking and retrieving query parameters */\n readonly query = this.#query.asReadonly();\n\n /** Signal for tracking and retrieving route data */\n readonly data = this.#data.asReadonly();\n\n /** Signal for tracking and retrieving URL */\n readonly url = this.#url.asReadonly();\n\n /** Signal for tracking and retrieving URL fragment */\n readonly fragment = this.#fragment.asReadonly();\n\n /** Combined computed snapshot (to avoid multiple effects) */\n readonly state = computed(() => ({\n params: this.#params(),\n query: this.#query(),\n data: this.#data(),\n url: this.#url(),\n fragment: this.#fragment(),\n }));\n\n constructor() {\n const read = () => {\n const snap = this.deepestSnapshot();\n const url = joinUrl(snap.url);\n\n !deepEqual(snap.params, this.#params()) && this.#params.set(snap.params as Record<string, string>);\n !deepEqual(snap.queryParams, this.#query()) && this.#query.set(snap.queryParams as Record<string, string>);\n !deepEqual(snap.data, this.#data()) && this.#data.set(snap.data as Record<string, unknown>);\n this.#url() !== url && this.#url.set(url);\n this.#fragment() !== snap.fragment && this.#fragment.set(snap.fragment ?? null);\n };\n\n read();\n\n this.router.events\n .pipe(\n startWith(new NavigationEnd(0, this.router.url, this.router.url)),\n filter((e) => e instanceof NavigationEnd),\n map(() => true),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => read());\n }\n\n /** Convenient selector for a data key with type-safe casting */\n selectData<T = unknown>(key: string) {\n return computed<T | undefined>(() => this.#data()[key] as T | undefined);\n }\n\n private deepestSnapshot() {\n // work with snapshot — we need a \"frozen\" point at NavigationEnd moment\n let snap = this.router.routerState.snapshot.root;\n\n while (snap.firstChild) {\n snap = snap.firstChild;\n }\n\n return snap;\n }\n}\n\n/** Joins `UrlSegment[]` into a path string */\nfunction joinUrl(segments: UrlSegment[]): string {\n return segments.length ? segments.map((s) => s.path).join('/') : '';\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["filter"],"mappings":"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"}
1
+ {"version":3,"file":"reforgium-presentia.mjs","sources":["../../../../libs/presentia/src/adaptive/adaptive.provider.ts","../../../../libs/presentia/src/adaptive/adaptive.service.ts","../../../../libs/presentia/src/adaptive/device-type.directive.ts","../../../../libs/presentia/src/lang/lang.models.ts","../../../../libs/presentia/src/lang/locale.provider.ts","../../../../libs/presentia/src/lang/lang.service.ts","../../../../libs/presentia/src/lang/lang.directive.ts","../../../../libs/presentia/src/lang/lang.pipe.ts","../../../../libs/presentia/src/theme/themes.constant.ts","../../../../libs/presentia/src/theme/theme.provider.ts","../../../../libs/presentia/src/theme/theme.service.ts","../../../../libs/presentia/src/providers/init.provider.ts","../../../../libs/presentia/src/seo/seo.service.ts","../../../../libs/presentia/src/seo/seo-route.listener.ts","../../../../libs/presentia/src/routes/route-watcher.service.ts","../../../../libs/presentia/src/reforgium-presentia.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nimport { DeviceBreakpoints } from './adaptive.models';\r\n\r\n/**\r\n * Default breakpoints for device type detection.\r\n *\r\n * Defines media queries for each device category:\r\n * - `mobile` — screens up to 719px wide\r\n * - `tablet` — screens from 720px to 1399px wide\r\n * - `desktop-s` — small desktop screens from 1400px to 1919px wide\r\n * - `desktop` — large desktop screens 1920px and wider\r\n *\r\n * These breakpoints are used by `AdaptiveService` to determine the current device type.\r\n */\r\nexport const defaultBreakpoints = {\r\n 'mobile': '(max-width: 719px)',\r\n 'tablet': '(min-width: 720px) and (max-width: 1399px)',\r\n 'desktop-s': '(min-width: 1400px) and (max-width: 1919px)',\r\n 'desktop': '(min-width: 1920px)',\r\n};\r\n/**\r\n * Injection token for providing custom device breakpoints.\r\n *\r\n * By default, provides `defaultBreakpoints`, but can be overridden\r\n * at any level of the dependency injection tree to customize\r\n * the device detection behavior.\r\n *\r\n * Example of overriding:\r\n * ```typescript\r\n * {\r\n * provide: DEVICE_BREAKPOINTS,\r\n * useValue: {\r\n * mobile: '(max-width: 599px)',\r\n * tablet: '(min-width: 600px) and (max-width: 1199px)',\r\n * 'desktop-s': '(min-width: 1200px) and (max-width: 1799px)',\r\n * desktop: '(min-width: 1800px)'\r\n * }\r\n * }\r\n * ```\r\n *\r\n * Used by `AdaptiveService` to observe media query changes.\r\n */\r\nexport const DEVICE_BREAKPOINTS = new InjectionToken<DeviceBreakpoints>('RE_DEVICE_BREAKPOINTS', {\r\n providedIn: 'root',\r\n factory: () => defaultBreakpoints,\r\n});\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { afterRenderEffect, computed, inject, Injectable, signal } from '@angular/core';\r\nimport { debounceTime, fromEvent } from 'rxjs';\r\n\r\nimport { Devices } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { DEVICE_BREAKPOINTS } from './adaptive.provider';\r\n\r\n/**\r\n * The `AdaptiveService` is responsible for determining the device type, window dimensions, and screen orientation.\r\n *\r\n * Used for building adaptive interfaces, changing component behavior and styles\r\n * depending on the current device or screen size.\r\n *\r\n * Main features:\r\n * - Reactive tracking of the current device (`desktop`, `tablet`, `mobile`).\r\n * - Support for computed properties (`isDesktop`, `isPortrait`).\r\n * - Automatic updates when the window is resized and breakpoints are crossed.\r\n *\r\n * Implementation is based on:\r\n * - `BreakpointObserver` from Angular CDK — for observing media queries.\r\n * - `signal` and `computed` — for reactive state without zones.\r\n * - `fromEvent(window, 'resize')` — for updating window dimensions with debouncing.\r\n *\r\n * The service is registered as `providedIn: 'root'` and is available throughout the application.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AdaptiveService {\r\n /** @internal Signal of the current device type. */\r\n #device = signal<Devices>('desktop');\r\n\r\n /** @internal Signals of the current window width and height. */\r\n #width = signal(0);\r\n #height = signal(0);\r\n\r\n /**\r\n * Current device type (reactive signal).\r\n * Possible values: `'desktop' | 'tablet' | 'mobile'`.\r\n *\r\n * Updates automatically when screen width changes\r\n * or when specified breakpoints are crossed (`DEVICE_BREAKPOINTS`).\r\n */\r\n device = this.#device.asReadonly();\r\n\r\n /**\r\n * Current browser window width in pixels.\r\n * Updates reactively on `resize` event.\r\n */\r\n width = this.#width.asReadonly();\r\n\r\n /**\r\n * Current browser window height in pixels.\r\n * Updates reactively on `resize` event.\r\n */\r\n height = this.#height.asReadonly();\r\n\r\n /**\r\n * Computed signal indicating whether the current device is a desktop.\r\n * Used for conditional rendering or layout configuration.\r\n */\r\n isDesktop = computed(() => this.#device() === 'desktop');\r\n\r\n /**\r\n * Computed signal determining whether the screen is in portrait orientation.\r\n * Returns `true` if window height is greater than width.\r\n */\r\n isPortrait = computed(() => this.#height() > this.#width());\r\n\r\n private deviceBreakpoints = inject(DEVICE_BREAKPOINTS);\r\n private devicePriority: Devices[] = Object.keys(this.deviceBreakpoints) as Devices[];\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n this.#width.set(window.innerWidth);\r\n this.#height.set(window.innerHeight);\r\n });\r\n\r\n this.breakpointObserver.observe(Object.values(this.deviceBreakpoints)).subscribe((state) => {\r\n const device = this.devicePriority.find((key) => state.breakpoints[this.deviceBreakpoints[key]]);\r\n\r\n this.#device.set(device ?? 'desktop');\r\n });\r\n fromEvent(window, 'resize')\r\n .pipe(debounceTime(100))\r\n .subscribe(() => {\r\n this.#width.set(window.innerWidth);\r\n this.#height.set(window.innerHeight);\r\n });\r\n }\r\n}\r\n","import { Directive, effect, inject, input, Signal, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\nimport { Devices } from '@reforgium/internal'; // noinspection ES6PreferShortImport\r\n\r\nimport { AdaptiveService } from './adaptive.service';\r\n\r\n/**\r\n * Structural directive `*ssIfDevice`.\r\n *\r\n * Shows or hides an element based on the current device type,\r\n * as determined by `AdaptiveService`.\r\n *\r\n * Example:\r\n * ```html\r\n * <div *ssIfDevice=\"'desktop'\">Desktop only</div>\r\n * <div *ssIfDevice=\"['mobile', 'tablet']\">For mobile and tablets</div>\r\n * <div *ssIfDevice=\"'mobile'; inverse: true\"> Hide on mobile</div>\r\n * ```\r\n *\r\n * Parameters:\r\n * - `ssIfDevice` — one or more `Devices` values (`'desktop' | 'tablet' | 'mobile'`)\r\n * - `inverse` — inverts the display condition\r\n *\r\n * Works reactively: when the device type changes in `AdaptiveService`,\r\n * the template is automatically added or removed from the DOM.\r\n */\r\n@Directive({\r\n selector: '[reIfDevice]',\r\n standalone: true,\r\n})\r\nexport class IfDeviceDirective {\r\n device = input<Devices | Devices[]>(undefined, { alias: 'reIfDevice' });\r\n inverse = input<boolean>(false);\r\n\r\n private readonly tpl = inject(TemplateRef);\r\n private readonly vcr = inject(ViewContainerRef);\r\n private readonly adaptive = inject(AdaptiveService);\r\n\r\n private allowedDevices: Devices[] = [];\r\n private hasView = false;\r\n\r\n private readonly currentDevice: Signal<Devices> = this.adaptive.device;\r\n\r\n constructor() {\r\n effect(() => {\r\n const device = this.device();\r\n\r\n if (device) {\r\n this.allowedDevices = Array.isArray(device) ? device : [device];\r\n }\r\n\r\n this.updateView();\r\n });\r\n }\r\n\r\n private updateView() {\r\n const isAllowed = this.allowedDevices.includes(this.currentDevice());\r\n const shouldShow = this.inverse() ? !isAllowed : isAllowed;\r\n\r\n if (shouldShow && !this.hasView) {\r\n this.vcr.createEmbeddedView(this.tpl);\r\n this.hasView = true;\r\n } else if (!shouldShow && this.hasView) {\r\n this.vcr.clear();\r\n this.hasView = false;\r\n }\r\n }\r\n}\r\n","import { Langs } from '@reforgium/internal';\n\n/**\n * Language data model from localization server\n *\n * @description\n * `Model` for translation data\n * `namespace` - git project name\n * `code` - masked query: ${page}.${recordKey}\n * `value` - translation value\n */\nexport interface LangDto {\n namespace: string;\n code: string;\n localization: string;\n}\n\n/**\n * Data model for translation\n *\n * @description\n * `key` - masked query: ${page}.${recordKey}\n * `value` - translation value or nested model\n */\nexport interface LangModel {\n [key: string]: string | LangModel;\n}\n\n/**\n * Parameters for text formatting\n *\n * @description\n * `key` - mask key\n * `value` - mask value\n * example: {{`key1`}} will be replaced with `value1`\n */\nexport type LangParams = Record<string, string>;\n\n/**\n * Represents configuration settings for localization.\n *\n * This interface is used to define the locale configuration structure,\n * which can include URL, resource origin information, default language,\n * and related values for regional or localization settings.\n *\n * Properties:\n * - `url` specifies the localization URL for loading resources.\n * - `isFromAssets` indicates whether resources are loaded from application assets.\n * - `defaultLang` defines optional default language for localization.\n * - `defaultValue` - optional default value for locale resource.\n * - `kgValue` specifies optional localization value with variants `kg` or `ky`.\n */\nexport interface LocaleConfig {\n url: string;\n isFromAssets: boolean;\n defaultLang?: Langs;\n defaultValue?: string;\n kgValue?: 'kg' | 'ky';\n}\n\nexport const innerLangVal = Symbol('reInnerLangVal');\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { LocaleConfig } from './lang.models';\r\n\r\n/**\r\n * Injection token for providing locale configuration to the language module.\r\n *\r\n * Used to inject `LocaleConfig` into services and components that require\r\n * internationalization settings (e.g., locale, date formats, translations).\r\n *\r\n * Example:\r\n * ```typescript\r\n * providers: [\r\n * { provide: LANG_CONFIG, useValue: { locale: 'ru', ... } }\r\n * ]\r\n * ```\r\n *\r\n * The token can be injected using Angular's DI system:\r\n * ```typescript\r\n * private config = inject(LANG_CONFIG);\r\n * ```\r\n */\r\nexport const LANG_CONFIG = new InjectionToken<LocaleConfig>('RE_LANG_CONFIG');\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { computed, inject, Injectable, Signal, signal } from '@angular/core';\r\n\r\nimport { Langs } from '@reforgium/internal';\r\n\r\nimport { innerLangVal, LangDto, LangModel, LangParams } from './lang.models';\r\nimport { LANG_CONFIG } from './locale.provider';\r\n\r\n/**\r\n * LangService provides functionality for managing and tracking language settings\r\n * and translations in the application. It is designed to handle localization needs,\r\n * loading language resources, caching translations, and dynamically applying translations\r\n * throughout the application.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class LangService {\r\n private readonly config = inject(LANG_CONFIG);\r\n private readonly http = inject(HttpClient);\r\n\r\n readonly #lang = signal<Langs>(this.getStoredLang());\r\n readonly #cache = signal<LangModel>({});\r\n\r\n readonly #loadedNamespaces = new Set<string>();\r\n readonly #pendingLoads = new Map<string, Promise<void>>();\r\n\r\n /**\r\n * Computed property determining the current language setting.\r\n *\r\n * - If private method `#lang` returns 'ru', this property will return 'ru'.\r\n * - If `#lang` returns another value, the `config.kgValue` property is checked:\r\n * - If `config.kgValue` is defined, the property will return its value.\r\n * - If `config.kgValue` is not defined, the property will return the default value 'kg'.\r\n */\r\n readonly currentLang = computed(() => {\r\n const lang = this.#lang();\r\n\r\n return lang === 'ru' ? 'ru' : (this.config?.kgValue ?? 'kg');\r\n });\r\n /**\r\n * Extracts readonly value from private property `#lang` and assigns it to `innerLangVal`.\r\n * Expected that property `#lang` has `asReadonly` method that returns immutable representation.\r\n */\r\n readonly [innerLangVal] = this.#lang.asReadonly();\r\n\r\n /**\r\n * Sets the current language for the application.\r\n *\r\n * @param {Langs | 'ky'} lang - The language to set.\r\n * Accepts predefined type `Langs` or 'ky' to set Kyrgyz language.\r\n * @return {void} Returns no value.\r\n */\r\n setLang(lang: Langs | 'ky'): void {\r\n const langVal = lang === 'ky' ? 'kg' : lang;\r\n\r\n if (langVal !== this.#lang()) {\r\n this.#lang.set(langVal);\r\n localStorage.setItem('lang', langVal);\r\n\r\n const namespaces = Array.from(this.#loadedNamespaces.values()).map((key) => key.split('.')[1]);\r\n\r\n this.#loadedNamespaces.clear();\r\n\r\n namespaces.forEach((ns) => void this.loadNamespace(ns));\r\n }\r\n }\r\n\r\n /**\r\n * Gets value based on a provided query and optionally applies specified parameters.\r\n *\r\n * @param {string} query - Query string used to retrieve desired value.\r\n * @param {LangParams} [params] - Optional parameters to apply to retrieved value.\r\n * @return {string} Retrieved value after optional parameter application,\r\n * or default value if a query is not found.\r\n */\r\n get(query: string, params?: LangParams): string {\r\n const value = this.getChainedValue(query);\r\n\r\n if (params) {\r\n return this.applyParams((value ?? query) as string, params);\r\n }\r\n\r\n return (value as string | undefined) ?? this.config.defaultValue ?? query;\r\n }\r\n\r\n /**\r\n * Observes changes to a specified translation key and dynamically computes its value.\r\n *\r\n * @param {string} query - Translation key to observe, typically in format \"namespace.key\".\r\n * @param {LangParams} [params] - Optional parameters for interpolation or\r\n * dynamic content replacement in translation value.\r\n * @return {Signal<string>} Computed value that dynamically updates\r\n * with translation matching a provided query and parameters.\r\n */\r\n observe(query: string, params?: LangParams): Signal<string> {\r\n const [ns] = query.split('.');\r\n\r\n if (!this.#loadedNamespaces.has(this.makeNamespaceKey(ns))) {\r\n void this.loadNamespace(ns);\r\n }\r\n\r\n return computed(() => this.get(query, params));\r\n }\r\n\r\n /**\r\n * Loads specified namespace, ensuring its caching and availability for use.\r\n *\r\n * @param {string} ns - Namespace name to load.\r\n * @return {Promise<void>} Promise that resolves on a successful namespace load,\r\n * or rejects when error occurs during a process.\r\n */\r\n async loadNamespace(ns: string): Promise<void> {\r\n const key = this.makeNamespaceKey(ns);\r\n\r\n if (this.#loadedNamespaces.has(key)) {\r\n return;\r\n }\r\n\r\n if (this.#pendingLoads.has(key)) {\r\n return this.#pendingLoads.get(key)!;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n this.http.get<LangDto[] | LangModel>(this.makeUrl(ns)).subscribe({\r\n next: (res) => {\r\n const resolved = Array.isArray(res) ? this.parseModelToRecord(res) : this.parseAssetToRecord(ns, res);\r\n\r\n this.#cache.update((existing) => ({ ...existing, ...resolved }));\r\n this.#loadedNamespaces.add(key);\r\n resolve();\r\n },\r\n error: (err) => {\r\n this.#pendingLoads.delete(key);\r\n reject(err);\r\n },\r\n complete: () => this.#pendingLoads.delete(key),\r\n });\r\n });\r\n\r\n this.#pendingLoads.set(key, promise);\r\n\r\n return promise;\r\n }\r\n\r\n private parseModelToRecord(model: LangDto[]): LangModel {\r\n const records: LangModel = {};\r\n\r\n for (const item of model) {\r\n records[item.code] = item.localization;\r\n }\r\n\r\n return records;\r\n }\r\n\r\n private parseAssetToRecord(page: string, data: LangModel): LangModel {\r\n const records: LangModel = {};\r\n\r\n for (const [k, v] of Object.entries(data)) {\r\n records[`${page}.${k}`] = v;\r\n }\r\n\r\n return records;\r\n }\r\n\r\n private applyParams(text: string, params: LangParams): string {\r\n return text.replace(/\\{\\{(.*?)}}/g, (_, k) => params[k.trim()] ?? '');\r\n }\r\n\r\n private getChainedValue(query = '', source = this.#cache()) {\r\n const [page, key, ...normalizedPath] = query.split('.');\r\n\r\n return [`${page}.${key}`, ...normalizedPath].reduce<LangModel | string | undefined>(\r\n (acc, key) => (typeof acc === 'object' ? (acc[key] ?? acc[query]) : undefined),\r\n source,\r\n ) as string | undefined;\r\n }\r\n\r\n private getStoredLang(): Langs {\r\n return (localStorage.getItem('lang') as Langs) || this.config.defaultLang || 'ru';\r\n }\r\n\r\n private makeUrl(ns: string): string {\r\n const suffix = this.config.isFromAssets ? `.${this.#lang()}.json` : `?language=${this.#lang()}`;\r\n\r\n return `${this.config.url}/${ns}${suffix}`;\r\n }\r\n\r\n private makeNamespaceKey(ns: string) {\r\n return `${this.#lang()}.${ns}`;\r\n }\r\n}\r\n","import { afterNextRender, Directive, ElementRef, inject, input, Renderer2 } from '@angular/core';\r\n\r\nimport { LangService } from './lang.service';\r\n\r\n/**\r\n * Localization modes for the `reLang` directive.\r\n *\r\n * - `'only-content'` — only text content of the element\r\n * - `'only-placeholder'` — only the `placeholder` attribute\r\n * - `'only-label'` — only the `label` attribute\r\n * - `'only-title'` — only the `title` attribute\r\n * - `'all'` — all supported attributes and content\r\n */\r\ntype Types = 'only-content' | 'only-placeholder' | 'only-label' | 'only-title' | 'all';\r\n\r\n/**\r\n * **LangDirective** — directive for automatic localization of attributes and text content.\r\n *\r\n * Replaces localization keys (format `namespace.key`) with translated strings via `LangService`.\r\n * Supports `title`, `label`, `placeholder` attributes and text nodes.\r\n *\r\n * ### Usage\r\n * ```html\r\n * <!-- Localize all attributes and content -->\r\n * <button reLang title=\"common.save\">common.save</button>\r\n *\r\n * <!-- Localize only title -->\r\n * <button [reLang]=\"'only-title'\" title=\"common.cancel\">Cancel</button>\r\n *\r\n * <!-- Localize custom attribute -->\r\n * <input reLang [langForAttr]=\"'aria-label'\" aria-label=\"forms.username\" />\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Directive({ selector: '[reLang]', standalone: true })\r\nexport class LangDirective {\r\n /**\r\n * Localization mode: defines which parts of the element will be translated.\r\n * @default 'all'\r\n */\r\n lang = input<Types | ''>('all', { alias: 'reLang' });\r\n\r\n /**\r\n * Name of an additional attribute to localize (besides standard `title`, `label`, `placeholder`).\r\n */\r\n langForAttr = input<string>();\r\n\r\n private el = inject(ElementRef);\r\n private renderer = inject(Renderer2);\r\n private service = inject(LangService);\r\n\r\n constructor() {\r\n afterNextRender(() => this.setAttributes());\r\n }\r\n\r\n /**\r\n * Applies localization to the element according to `lang` and `langForAttr` settings.\r\n * Called automatically after the component renders.\r\n */\r\n setAttributes() {\r\n const native = this.el.nativeElement as HTMLElement;\r\n const langFor = this.lang() || 'all';\r\n const langForAttr = this.langForAttr();\r\n\r\n if (['all', 'only-title'].includes(langFor) && native.hasAttribute('title')) {\r\n this.replaceAttrValue('title');\r\n }\r\n\r\n if (['all', 'only-label'].includes(langFor) && native.hasAttribute('label')) {\r\n this.replaceAttrValue('label');\r\n }\r\n\r\n if (['all', 'only-placeholder'].includes(langFor) && native.hasAttribute('placeholder')) {\r\n this.replaceAttrValue('placeholder');\r\n }\r\n\r\n if (['all', 'only-content'].includes(langFor)) {\r\n this.replaceTextNodeValue();\r\n }\r\n\r\n if (langForAttr) {\r\n this.replaceAttrValue(langForAttr!);\r\n }\r\n }\r\n\r\n /**\r\n * Translates a localization key into its corresponding localized string.\r\n * If the key doesn't look like a valid localization key (format `namespace.key`), outputs a warning.\r\n *\r\n * @param key localization key in format `namespace.path.to.key`\r\n * @returns a Promise resolving to the localized string, or `undefined` if the key is invalid\r\n */\r\n public translate(key: string) {\r\n if (!this.looksLikeKey(key)) {\r\n // eslint-disable-next-line no-console\r\n console.warn('Lang: Translatable text is not a valid localization key', key);\r\n\r\n return;\r\n }\r\n\r\n return this.getLangValue(key);\r\n }\r\n\r\n /**\r\n * Replaces attribute value with a localized string.\r\n * If the value doesn't look like a localization key, outputs a warning.\r\n *\r\n * @param attributeName name of the attribute to replace\r\n */\r\n private replaceAttrValue(attributeName: string) {\r\n const native = this.el.nativeElement as HTMLElement;\r\n const title = native.getAttribute(attributeName)?.trim() || '';\r\n\r\n if (!this.looksLikeKey(title)) {\r\n // eslint-disable-next-line no-console\r\n console.warn(`Lang: Attribute ${attributeName} is not a lang key`, title);\r\n\r\n return;\r\n }\r\n\r\n this.getLangValue(title).then((langed) => this.renderer.setAttribute(native, attributeName, langed));\r\n }\r\n\r\n /**\r\n * Replaces an element's text node with a localized string.\r\n * Works only if the element contains no child elements (text only).\r\n * If the content doesn't look like a localization key, outputs a warning.\r\n */\r\n private replaceTextNodeValue() {\r\n const native = this.el.nativeElement as HTMLElement;\r\n\r\n if (native.children.length > 0) {\r\n // eslint-disable-next-line no-console\r\n console.warn('Lang: Element has children, text node replacement is skipped');\r\n\r\n return;\r\n }\r\n\r\n const textNode = Array.from(native.childNodes).find((n) => n.nodeType === Node.TEXT_NODE) as Text | undefined;\r\n const key = textNode?.nodeValue?.trim() || '';\r\n\r\n if (!this.looksLikeKey(key)) {\r\n // eslint-disable-next-line no-console\r\n console.warn('Lang: Text node is not a lang key', key);\r\n\r\n return;\r\n }\r\n\r\n this.getLangValue(key).then((langed) => this.renderer.setValue(textNode, langed));\r\n }\r\n\r\n /**\r\n * Checks if a string looks like a localization key (contains `.` and no spaces).\r\n *\r\n * @param value string to check\r\n * @returns `true` if the string looks like a localization key\r\n */\r\n private looksLikeKey(value: string) {\r\n return !!value && value.includes('.') && !value.includes(' ');\r\n }\r\n\r\n /**\r\n * Asynchronously loads namespace and retrieves localized value by key.\r\n *\r\n * @param key localization key in format `namespace.path.to.key`\r\n * @returns localized string\r\n */\r\n private async getLangValue(key: string) {\r\n const [ns] = key.split('.', 1);\r\n\r\n await this.service.loadNamespace(ns);\r\n\r\n return this.service.get(key);\r\n }\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core';\r\n\r\nimport { LangParams } from './lang.models';\r\nimport { LangService } from './lang.service';\r\n\r\n/**\r\n * Custom Angular pipe that transforms a language key and additional parameters into a localized string.\r\n *\r\n * The pipe is declared as standalone and impure — meaning it can be used without importing a module\r\n * and will be recalculated when the state changes (for example, when the language is switched).\r\n *\r\n * In its operation, the pipe observes and caches language keys to improve performance,\r\n * using LangService to retrieve translated strings based on the current application language.\r\n *\r\n * The transformation involves accepting a key string and optional parameters,\r\n * forming a cache key, and returning the localized value corresponding to that request.\r\n *\r\n * @implements {PipeTransform}\r\n */\r\n@Pipe({ name: 'lang', standalone: true, pure: false })\r\nexport class LangPipe implements PipeTransform {\r\n private readonly lang = inject(LangService);\r\n private readonly cache = new Map<string, () => string>();\r\n\r\n transform(query: string, params?: LangParams): string {\r\n const key = query + JSON.stringify(params);\r\n\r\n if (!this.cache.has(key)) {\r\n this.cache.set(key, this.lang.observe(query, params));\r\n }\r\n\r\n return this.cache.get(key)!();\r\n }\r\n}\r\n","import { Themes } from '@reforgium/internal';\r\n\r\n/**\r\n * Type-safe mapping of available theme names.\r\n *\r\n * Provides a constant record that maps theme identifiers to their corresponding string values.\r\n * This ensures compile-time safety when referencing theme names throughout the application.\r\n *\r\n * Available themes:\r\n * - `light` - Light theme variant\r\n * - `dark` - Dark theme variant\r\n *\r\n * @example\r\n * ```typescript\r\n * const currentTheme = themes.light; // 'light'\r\n * const isDarkTheme = theme === themes.dark;\r\n * ```\r\n */\r\nexport const themes: Record<Themes, Themes> = {\r\n light: 'light',\r\n dark: 'dark',\r\n} as const;\r\n\r\n/**\r\n * CSS class prefix used for dark theme styling.\r\n *\r\n * This constant defines the prefix applied to HTML elements when the dark theme is active.\r\n * It is typically added to the root element or specific components to enable dark theme styles.\r\n *\r\n * @example\r\n * ```typescript\r\n * document.body.classList.add(darkThemePrefix); // Applies 're-dark' class\r\n * ```\r\n */\r\nexport const darkThemePrefix = 're-dark';\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nimport { ThemeConfig } from './theme.models';\r\n// noinspection ES6PreferShortImport\r\nimport { themes } from './themes.constant';\r\n\r\n/**\r\n * Default theme configuration object.\r\n *\r\n * Defines the initial theme settings for the application.\r\n * By default, sets the light theme as the active theme.\r\n *\r\n * This configuration can be overridden when providing `THEME_CONFIG` token\r\n * at the module or application level.\r\n * ```\r\n */\r\nexport const defaultThemeConfig = {\r\n defaultTheme: themes.light,\r\n};\r\n\r\n/**\r\n * Injection token for theme configuration.\r\n *\r\n * Used to provide custom theme settings via Angular's dependency injection system.\r\n * The token expects a value of type `ThemeConfig`.\r\n *\r\n * Example usage:\r\n * ```typescript\r\n * // In providers array:\r\n * { provide: THEME_CONFIG, useValue: { defaultTheme: themes.dark } }\r\n *\r\n * // In service or component:\r\n * private themeConfig = inject(THEME_CONFIG);\r\n * ```\r\n *\r\n * If not provided, `defaultThemeConfig` will be used as fallback.\r\n */\r\nexport const THEME_CONFIG = new InjectionToken<ThemeConfig>('RE_THEME_CONFIG');\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\n\r\nimport { Themes } from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { THEME_CONFIG } from './theme.provider';\r\n// noinspection ES6PreferShortImport\r\nimport { darkThemePrefix, themes } from './themes.constant';\r\n\r\n/**\r\n * Service for managing application theme.\r\n *\r\n * Allows getting the current theme and switching between light and dark.\r\n * Automatically saves the selected theme to `localStorage` and applies CSS class to `<html>` element.\r\n *\r\n * Example:\r\n * ```ts\r\n * const theme = inject(ThemeService);\r\n * theme.switch('dark');\r\n * console.log(theme.theme()); // 'dark'\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService {\r\n private readonly config = inject(THEME_CONFIG);\r\n private readonly themeDefault = this.config?.defaultTheme || themes.light;\r\n\r\n #theme = signal<Themes>(this.themeDefault);\r\n\r\n /**\r\n * Current active theme (`light` or `dark`).\r\n *\r\n * Value is reactive — can be used in template or `computed`.\r\n * ```html\r\n * <div [class.dark]=\"themeService.theme() === 'dark'\"></div>\r\n * <div [class]=\"themeService.theme()\"></div>\r\n * ```\r\n */\r\n theme = computed(() => this.#theme());\r\n\r\n /**\r\n * Convenient flag returning `true` if light theme is active.\r\n * Suitable for conditional style application or resource selection.\r\n */\r\n isLight = computed(() => this.#theme() === themes.light);\r\n\r\n constructor() {\r\n effect(() => {\r\n const theme = (localStorage.getItem('theme') as Themes) || this.themeDefault;\r\n\r\n this.switch(theme);\r\n });\r\n effect(() => localStorage.setItem('theme', this.#theme()));\r\n }\r\n\r\n /**\r\n * Switches theme.\r\n *\r\n * If a parameter is not provided — performs toggle between `light` and `dark`.\r\n * Also, automatically updates `<html>` class and saves selection to `localStorage`.\r\n *\r\n * @param theme — explicit theme value (`'light'` or `'dark'`).\r\n */\r\n switch(theme?: Themes) {\r\n const html = document.querySelector('html')!;\r\n const newTheme = theme ?? (this.#theme() === themes.light ? themes.dark : themes.light);\r\n\r\n newTheme === themes.dark && html.classList.add(darkThemePrefix);\r\n newTheme === themes.light && html.classList.remove(darkThemePrefix);\r\n this.#theme.set(newTheme);\r\n }\r\n}\r\n","import { EnvironmentProviders, LOCALE_ID, makeEnvironmentProviders } from '@angular/core';\r\n\r\nimport {\r\n CHANGE_LANG,\r\n CHANGE_THEME,\r\n CURRENT_DEVICE,\r\n SELECTED_LANG,\r\n SELECTED_THEME,\r\n TRANSLATION,\r\n} from '@reforgium/internal';\r\n\r\n// noinspection ES6PreferShortImport\r\nimport { AdaptiveService, defaultBreakpoints, DEVICE_BREAKPOINTS, DeviceBreakpoints } from '../adaptive';\r\nimport { innerLangVal, LANG_CONFIG, LangService, LocaleConfig } from '../lang';\r\nimport { defaultThemeConfig, THEME_CONFIG, ThemeConfig, ThemeService } from '../theme';\r\n\r\n/**\r\n * Configuration object for initializing the Presentia application providers.\r\n *\r\n * @property {LocaleConfig} locale - Locale configuration (required). Defines language and localization settings.\r\n * @property {ThemeConfig} [theme] - Theme configuration (optional).\r\n * Defines the application theme. Defaults to `defaultThemeConfig` if not provided.\r\n * @property {DeviceBreakpoints} [breakpoints] - Device breakpoints configuration (optional).\r\n * Defines responsive breakpoints. Defaults to `defaultBreakpoints` if not provided.\r\n */\r\nexport interface AppConfig {\r\n locale: LocaleConfig;\r\n theme?: ThemeConfig;\r\n breakpoints?: DeviceBreakpoints;\r\n}\r\n\r\n/**\r\n * Provides environment-level providers for Presentia application initialization.\r\n *\r\n * This function configures essential application services:\r\n * - Language and localization settings\r\n * - Theme configuration\r\n * - Adaptive/responsive breakpoints\r\n * - Current device detection\r\n *\r\n * @param {AppConfig} config - Configuration object containing locale, theme, and breakpoints settings.\r\n * @returns {EnvironmentProviders} A collection of Angular providers for the application environment.\r\n *\r\n * @example\r\n * ```typescript\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideReInit({\r\n * locale: { defaultLang: 'en', supportedLangs: ['en', 'ru'] },\r\n * theme: { defaultTheme: 'dark' },\r\n * breakpoints: { mobile: 768, tablet: 1024 }\r\n * })\r\n * ]\r\n * };\r\n * ```\r\n */\r\nexport function provideReInit(config: AppConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: TRANSLATION, deps: [LangService], useFactory: (ls: LangService) => ls },\r\n { provide: SELECTED_LANG, deps: [LangService], useFactory: (ls: LangService) => ls[innerLangVal] },\r\n { provide: CHANGE_LANG, deps: [LangService], useFactory: (ls: LangService) => ls.setLang },\r\n { provide: SELECTED_THEME, deps: [ThemeService], useFactory: (ls: ThemeService) => ls.theme },\r\n { provide: CHANGE_THEME, deps: [ThemeService], useFactory: (ls: ThemeService) => ls.switch },\r\n { provide: CURRENT_DEVICE, deps: [AdaptiveService], useFactory: (ls: AdaptiveService) => ls.device },\r\n { provide: DEVICE_BREAKPOINTS, useValue: config.breakpoints || defaultBreakpoints },\r\n { provide: THEME_CONFIG, useValue: config.theme || defaultThemeConfig },\r\n { provide: LANG_CONFIG, useValue: config.locale || {} },\r\n { provide: LOCALE_ID, useValue: config.locale.defaultLang ?? 'ru' },\r\n ]);\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\n\r\nimport { OgType, TwitterCardType } from './seo.models';\r\n\r\n/**\r\n * Service for managing page SEO metadata.\r\n *\r\n * Allows centrally setting title, description, keywords,\r\n * Open Graph and Twitter Card tags, canonical link, and JSON-LD schema.\r\n *\r\n * Example:\r\n * ```ts\r\n * const seo = inject(SeoService);\r\n * seo.setTitle('Home Page');\r\n * seo.setDescription('Site Description');\r\n * seo.setOg({ title: 'Home', type: 'website' });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class SeoService {\r\n private title = inject(Title);\r\n private meta = inject(Meta);\r\n\r\n /**\r\n * Sets page title (`<title>`).\r\n * @param value title text\r\n */\r\n setTitle(value: string) {\r\n this.title.setTitle(value);\r\n }\r\n\r\n /**\r\n * Sets page description (`<meta name=\"description\">`).\r\n * @param desc brief content description\r\n */\r\n setDescription(desc: string) {\r\n this.upsert({ name: 'description', content: desc });\r\n }\r\n\r\n /**\r\n * Sets page keywords (`<meta name=\"keywords\">`).\r\n * @param keywords array of keywords\r\n */\r\n setKeywords(keywords: string[]) {\r\n this.upsert({ name: 'keywords', content: keywords.join(', ') });\r\n }\r\n\r\n /**\r\n * Sets directives for search engines (`<meta name=\"robots\">`).\r\n * @param value value, e.g. `\"index,follow\"`\r\n */\r\n setRobots(value: string) {\r\n this.upsert({ name: 'robots', content: value }); // e.g. \"index,follow\"\r\n }\r\n\r\n /**\r\n * Sets canonical link (`<link rel=\"canonical\">`).\r\n * @param url absolute URL of canonical page\r\n */\r\n setCanonical(url: string) {\r\n this.upsertLink('canonical', url);\r\n }\r\n\r\n /**\r\n * Sets Open Graph meta tags.\r\n * @param opts object with Open Graph fields (`title`, `description`, `image`, `url`, `type`, etc.)\r\n */\r\n setOg(opts: OgType) {\r\n for (const [k, v] of Object.entries(opts)) {\r\n v && this.upsert({ property: `og:${k}`, content: v });\r\n }\r\n }\r\n\r\n /**\r\n * Sets Twitter Card meta tags.\r\n * @param opts object with Twitter Card fields (`card`, `title`, `description`, `image`, etc.)\r\n */\r\n setTwitter(opts: TwitterCardType) {\r\n for (const [k, v] of Object.entries(opts)) {\r\n v && this.upsert({ name: `twitter:${k}`, content: v });\r\n }\r\n }\r\n\r\n /**\r\n * Embeds JSON-LD schema (structured data) in `<head>`.\r\n * @param schema schema object (will be serialized to JSON)\r\n */\r\n setJsonLd(schema: object) {\r\n const id = 'app-jsonld';\r\n let el = document.getElementById(id) as HTMLScriptElement | null;\r\n\r\n if (!el) {\r\n el = document.createElement('script');\r\n el.type = 'application/ld+json';\r\n el.id = id;\r\n document.head.appendChild(el);\r\n }\r\n\r\n el.text = JSON.stringify(schema);\r\n }\r\n\r\n private upsert(tag: { name?: string; property?: string; content: string }) {\r\n if (tag.name) {\r\n this.meta.updateTag(tag, `name='${tag.name}'`);\r\n } else if (tag.property) {\r\n this.meta.updateTag(tag, `property='${tag.property}'`);\r\n }\r\n }\r\n\r\n private upsertLink(rel: string, href: string) {\r\n const head = document.head;\r\n let link = head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`);\r\n\r\n if (!link) {\r\n link = document.createElement('link');\r\n link.rel = rel;\r\n head.appendChild(link);\r\n }\r\n\r\n link.href = href;\r\n }\r\n}\r\n","import { DestroyRef, inject, Injectable } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\n\r\nimport { SeoService } from './seo.service';\r\n\r\n/**\r\n * Service that listens to Angular route changes and automatically updates SEO metadata\r\n * (title, description, Open Graph, Twitter cards, JSON-LD, canonical URL, robots meta tag)\r\n * based on route data configuration.\r\n *\r\n * @example\r\n * ```typescript\r\n * const routes: Routes = [{\r\n * path: 'about',\r\n * component: AboutComponent,\r\n * data: {\r\n * title: 'About Us',\r\n * description: 'Learn more about our company',\r\n * robots: 'index,follow'\r\n * }\r\n * }];\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SeoRouteListener {\r\n private router = inject(Router);\r\n private seo = inject(SeoService);\r\n private ar = inject(ActivatedRoute);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Initializes the route listener to monitor navigation events and update SEO metadata.\r\n * Subscribes to router NavigationEnd events and automatically unsubscribes on component destruction.\r\n *\r\n * @param baseUrl - The base URL of the application used for constructing canonical URLs.\r\n * Trailing slashes will be removed automatically.\r\n */\r\n init(baseUrl: string) {\r\n const sub = this.router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe(() => {\r\n const route = this.deepest(this.ar);\r\n const data = route.snapshot.data as {\r\n title?: string;\r\n description?: string;\r\n robots?: string;\r\n canonical?: string;\r\n og?: Record<string, string>;\r\n twitter?: Record<string, string>;\r\n jsonld?: object;\r\n };\r\n const url = data.canonical ?? baseUrl.replace(/\\/+$/, '') + this.router.url;\r\n\r\n data.title && this.seo.setTitle(data.title);\r\n data.description && this.seo.setDescription(data.description);\r\n data.twitter && this.seo.setTwitter(data.twitter);\r\n data.jsonld && this.seo.setJsonLd(data.jsonld);\r\n\r\n this.seo.setRobots(data.robots ?? 'index,follow');\r\n this.seo.setCanonical(url);\r\n this.seo.setOg({\r\n title: data.title,\r\n description: data.description,\r\n url: url,\r\n ...data.og,\r\n });\r\n });\r\n\r\n this.destroyRef.onDestroy(() => sub.unsubscribe());\r\n }\r\n\r\n /**\r\n * Recursively finds the deepest (most nested) activated route in the route tree.\r\n * This is used to extract route data from the currently active leaf route.\r\n *\r\n * @param r - The root activated route to start traversing from.\r\n * @returns The deepest child route in the hierarchy.\r\n */\r\n private deepest(r: ActivatedRoute): ActivatedRoute {\r\n let cur = r;\r\n\r\n while (cur.firstChild) {\r\n cur = cur.firstChild;\r\n }\r\n\r\n return cur;\r\n }\r\n}\r\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, UrlSegment } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs';\n\nimport { deepEqual } from '@reforgium/internal';\n\n/**\n * Reactive snapshot of the current route (the deepest active route).\n * Updates on every `NavigationEnd` event.\n *\n * Provides:\n * - `params` / `query` — strings (as in Angular Router)\n * - `data` — arbitrary data (from route configuration/resolvers)\n * - `url` — string assembled from `UrlSegment[]`\n * - `fragment` — hash (#section)\n * - `selectData(key)` — type-safe selector for `data`\n * - `state` — combined computed object (convenient for single subscriber)\n */\n@Injectable({ providedIn: 'root' })\nexport class RouteWatcher {\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n #params = signal<Record<string, string>>({});\n #query = signal<Record<string, string>>({});\n #data = signal<Record<string, unknown>>({});\n #url = signal<string>('');\n #fragment = signal<string | null>(null);\n\n /** Signal for tracking and retrieving URL parameters */\n readonly params = this.#params.asReadonly();\n\n /** Signal for tracking and retrieving query parameters */\n readonly query = this.#query.asReadonly();\n\n /** Signal for tracking and retrieving route data */\n readonly data = this.#data.asReadonly();\n\n /** Signal for tracking and retrieving URL */\n readonly url = this.#url.asReadonly();\n\n /** Signal for tracking and retrieving URL fragment */\n readonly fragment = this.#fragment.asReadonly();\n\n /** Combined computed snapshot (to avoid multiple effects) */\n readonly state = computed(() => ({\n params: this.#params(),\n query: this.#query(),\n data: this.#data(),\n url: this.#url(),\n fragment: this.#fragment(),\n }));\n\n constructor() {\n const read = () => {\n const snap = this.deepestSnapshot();\n const url = joinUrl(snap.url);\n\n !deepEqual(snap.params, this.#params()) && this.#params.set(snap.params as Record<string, string>);\n !deepEqual(snap.queryParams, this.#query()) && this.#query.set(snap.queryParams as Record<string, string>);\n !deepEqual(snap.data, this.#data()) && this.#data.set(snap.data as Record<string, unknown>);\n this.#url() !== url && this.#url.set(url);\n this.#fragment() !== snap.fragment && this.#fragment.set(snap.fragment ?? null);\n };\n\n read();\n\n this.router.events\n .pipe(\n startWith(new NavigationEnd(0, this.router.url, this.router.url)),\n filter((e) => e instanceof NavigationEnd),\n map(() => true),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => read());\n }\n\n /** Convenient selector for a data key with type-safe casting */\n selectData<T = unknown>(key: string) {\n return computed<T | undefined>(() => this.#data()[key] as T | undefined);\n }\n\n private deepestSnapshot() {\n // work with snapshot — we need a \"frozen\" point at NavigationEnd moment\n let snap = this.router.routerState.snapshot.root;\n\n while (snap.firstChild) {\n snap = snap.firstChild;\n }\n\n return snap;\n }\n}\n\n/** Joins `UrlSegment[]` into a path string */\nfunction joinUrl(segments: UrlSegment[]): string {\n return segments.length ? segments.map((s) => s.path).join('/') : '';\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["filter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.0",
2
+ "version": "1.2.0",
3
3
  "name": "@reforgium/presentia",
4
4
  "description": "reforgium State modules",
5
5
  "author": "rtommievich",
@@ -25,6 +25,7 @@
25
25
  "peerDependencies": {
26
26
  "@angular/common": ">=18.0.0",
27
27
  "@angular/core": ">=18.0.0",
28
+ "@reforgium/internal": ">=1.1.0",
28
29
  "rxjs": ">=7.0.0"
29
30
  },
30
31
  "module": "fesm2022/reforgium-presentia.mjs",
@@ -135,7 +135,7 @@ declare class IfDeviceDirective {
135
135
  constructor();
136
136
  private updateView;
137
137
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<IfDeviceDirective, never>;
138
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IfDeviceDirective, "[reIfDevice]", never, { "device": { "alias": "ssIfDevice"; "required": false; "isSignal": true; }; "inverse": { "alias": "inverse"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
138
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IfDeviceDirective, "[reIfDevice]", never, { "device": { "alias": "reIfDevice"; "required": false; "isSignal": true; }; "inverse": { "alias": "inverse"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
139
139
  }
140
140
 
141
141
  /**
@@ -333,6 +333,14 @@ declare class LangDirective {
333
333
  * Called automatically after the component renders.
334
334
  */
335
335
  setAttributes(): void;
336
+ /**
337
+ * Translates a localization key into its corresponding localized string.
338
+ * If the key doesn't look like a valid localization key (format `namespace.key`), outputs a warning.
339
+ *
340
+ * @param key localization key in format `namespace.path.to.key`
341
+ * @returns a Promise resolving to the localized string, or `undefined` if the key is invalid
342
+ */
343
+ translate(key: string): Promise<string> | undefined;
336
344
  /**
337
345
  * Replaces attribute value with a localized string.
338
346
  * If the value doesn't look like a localization key, outputs a warning.
@@ -341,7 +349,7 @@ declare class LangDirective {
341
349
  */
342
350
  private replaceAttrValue;
343
351
  /**
344
- * Replaces element's text node with a localized string.
352
+ * Replaces an element's text node with a localized string.
345
353
  * Works only if the element contains no child elements (text only).
346
354
  * If the content doesn't look like a localization key, outputs a warning.
347
355
  */
@@ -515,8 +523,10 @@ declare class ThemeService {
515
523
  * Configuration object for initializing the Presentia application providers.
516
524
  *
517
525
  * @property {LocaleConfig} locale - Locale configuration (required). Defines language and localization settings.
518
- * @property {ThemeConfig} [theme] - Theme configuration (optional). Defines the application theme. Defaults to `defaultThemeConfig` if not provided.
519
- * @property {DeviceBreakpoints} [breakpoints] - Device breakpoints configuration (optional). Defines responsive breakpoints. Defaults to `defaultBreakpoints` if not provided.
526
+ * @property {ThemeConfig} [theme] - Theme configuration (optional).
527
+ * Defines the application theme. Defaults to `defaultThemeConfig` if not provided.
528
+ * @property {DeviceBreakpoints} [breakpoints] - Device breakpoints configuration (optional).
529
+ * Defines responsive breakpoints. Defaults to `defaultBreakpoints` if not provided.
520
530
  */
521
531
  interface AppConfig {
522
532
  locale: LocaleConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"reforgium-presentia.d.ts","sources":["../../../../libs/presentia/src/adaptive/adaptive.models.ts","../../../../libs/presentia/src/adaptive/adaptive.provider.ts","../../../../libs/presentia/src/adaptive/adaptive.service.ts","../../../../libs/presentia/src/adaptive/device-type.directive.ts","../../../../libs/presentia/src/lang/lang.models.ts","../../../../libs/presentia/src/lang/locale.provider.ts","../../../../libs/presentia/src/lang/lang.service.ts","../../../../libs/presentia/src/lang/lang.directive.ts","../../../../libs/presentia/src/lang/lang.pipe.ts","../../../../libs/presentia/src/theme/theme.models.ts","../../../../libs/presentia/src/theme/themes.constant.ts","../../../../libs/presentia/src/theme/theme.provider.ts","../../../../libs/presentia/src/theme/theme.service.ts","../../../../libs/presentia/src/providers/init.provider.ts","../../../../libs/presentia/src/seo/seo.models.ts","../../../../libs/presentia/src/seo/seo.service.ts","../../../../libs/presentia/src/seo/seo-route.listener.ts","../../../../libs/presentia/src/routes/route-watcher.service.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;AAEA;AACM;;ACCN;;;;;;;;;;AAUG;AACH;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACH;;AClCA;;;;;;;;;;;;;;;;;AAiBG;AACH;;AAWE;;;;;;AAMG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;;;;;;;AAyBD;;ACvFD;;;;;;;;;;;;;;;;;;;AAmBG;AACH;AAKE;AACA;AAEA;AACA;AACA;;;AAKA;;AAcA;;;AAYD;;AClED;;;;;;;;AAQG;;;;;AAKF;AAED;;;;;;AAMG;;AAED;AACD;AAED;;;;;;;AAOG;AACG;AAEN;;;;;;;;;;;;;AAaG;;;;;;AAMD;AACD;AAED;;ACxDA;;;;;;;;;;;;;;;;;AAiBG;AACH;;ACdA;;;;;AAKG;AACH;;AAEE;AACA;AAQA;;;;;;;AAOG;;AAMH;;;AAGG;AACH;AAEA;;;;;;AAMG;AACH;AAeA;;;;;;;AAOG;;AAWH;;;;;;;;AAQG;AACH;AAUA;;;;;;AAMG;;AAmCH;AAUA;AAUA;AAIA;AASA;AAIA;AAMA;;;AAGD;;AC1LD;;;;;;;;AAQG;AACH;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACH;AAEE;;;AAGG;AACH;AAEA;;AAEG;AACH;;;;;AAUA;;;AAGG;;AA2BH;;;;;AAKG;AACH;AAaA;;;;AAIG;AACH;AAqBA;;;;;AAKG;AACH;AAIA;;;;;AAKG;;;;AAQJ;;ACrJD;;;;;;;;;;;;;AAaG;AACH;AAEE;AACA;;;;AAWD;;AC/BD;;;AAGG;;AAED;;;AAGG;;AAEH;;;AAGG;;AAEJ;;ACfD;;;;;;;;;;;;;;;AAeG;AACH;AAKA;;;;;;;;;;AAUG;AACH;;AC5BA;;;;;;;;;AASG;AACH;;;AAIA;;;;;;;;;;;;;;;;AAgBG;AACH;;AC5BA;;;;;;;;;;;;AAYG;AACH;;AAIE;AACA;AAIA;;;;;;;;AAQG;AACH;AAEA;;;AAGG;AACH;;AAWA;;;;;;;AAOG;AACH;;;AAQD;;AChED;;;;;;AAMG;;;;;AAKF;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACH;;AC/CA;;;;;;;;;;;;AAYG;AACG;AAIN;;;;;;;;;;;AAWG;AACG;;ACxBN;;;;;;;;;;;;;AAaG;AACH;;;AAKE;;;AAGG;;AAKH;;;AAGG;;AAKH;;;AAGG;AACH;AAIA;;;AAGG;;AAKH;;;AAGG;;AAKH;;;AAGG;;AAOH;;;AAGG;;AAOH;;;AAGG;;AAeH;AAQA;;;AAYD;;ACpHD;;;;;;;;;;;;;;;;;AAiBG;AACH;;;;;AAOE;;;;;;AAMG;;AAiCH;;;;;;AAMG;AACH;;;AASD;;AC/ED;;;;;;;;;;;AAWG;AACH;;AAEE;AACA;;;;;;;;;;;;AAwBA;;;;;;AAMI;;;AA2BJ;AAIA;;;AAUD;;;"}
1
+ {"version":3,"file":"reforgium-presentia.d.ts","sources":["../../../../libs/presentia/src/adaptive/adaptive.models.ts","../../../../libs/presentia/src/adaptive/adaptive.provider.ts","../../../../libs/presentia/src/adaptive/adaptive.service.ts","../../../../libs/presentia/src/adaptive/device-type.directive.ts","../../../../libs/presentia/src/lang/lang.models.ts","../../../../libs/presentia/src/lang/locale.provider.ts","../../../../libs/presentia/src/lang/lang.service.ts","../../../../libs/presentia/src/lang/lang.directive.ts","../../../../libs/presentia/src/lang/lang.pipe.ts","../../../../libs/presentia/src/theme/theme.models.ts","../../../../libs/presentia/src/theme/themes.constant.ts","../../../../libs/presentia/src/theme/theme.provider.ts","../../../../libs/presentia/src/theme/theme.service.ts","../../../../libs/presentia/src/providers/init.provider.ts","../../../../libs/presentia/src/seo/seo.models.ts","../../../../libs/presentia/src/seo/seo.service.ts","../../../../libs/presentia/src/seo/seo-route.listener.ts","../../../../libs/presentia/src/routes/route-watcher.service.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;AAEA;AACM;;ACCN;;;;;;;;;;AAUG;AACH;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACH;;AClCA;;;;;;;;;;;;;;;;;AAiBG;AACH;;AAWE;;;;;;AAMG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;AAEA;;;AAGG;AACH;;;;;;;AAyBD;;ACxFD;;;;;;;;;;;;;;;;;;;AAmBG;AACH;AAKE;AACA;AAEA;AACA;AACA;;;AAKA;;AAcA;;;AAYD;;ACjED;;;;;;;;AAQG;;;;;AAKF;AAED;;;;;;AAMG;;AAED;AACD;AAED;;;;;;;AAOG;AACG;AAEN;;;;;;;;;;;;;AAaG;;;;;;AAMD;AACD;AAED;;ACxDA;;;;;;;;;;;;;;;;;AAiBG;AACH;;ACdA;;;;;AAKG;AACH;;AAEE;AACA;AAQA;;;;;;;AAOG;;AAMH;;;AAGG;AACH;AAEA;;;;;;AAMG;AACH;AAeA;;;;;;;AAOG;;AAWH;;;;;;;;AAQG;AACH;AAUA;;;;;;AAMG;;AAkCH;AAUA;AAUA;AAIA;AASA;AAIA;AAMA;;;AAGD;;ACzLD;;;;;;;;AAQG;AACH;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACH;AAEE;;;AAGG;AACH;AAEA;;AAEG;AACH;;;;;AAUA;;;AAGG;;AA2BH;;;;;;AAMG;;AAYH;;;;;AAKG;AACH;AAcA;;;;AAIG;AACH;AAuBA;;;;;AAKG;AACH;AAIA;;;;;AAKG;;;;AAQJ;;AC1KD;;;;;;;;;;;;;AAaG;AACH;AAEE;AACA;;;;AAWD;;AC/BD;;;AAGG;;AAED;;;AAGG;;AAEH;;;AAGG;;AAEJ;;ACfD;;;;;;;;;;;;;;;AAeG;AACH;AAKA;;;;;;;;;;AAUG;AACH;;AC5BA;;;;;;;;;AASG;AACH;;;AAIA;;;;;;;;;;;;;;;;AAgBG;AACH;;AC5BA;;;;;;;;;;;;AAYG;AACH;;AAIE;AACA;AAIA;;;;;;;;AAQG;AACH;AAEA;;;AAGG;AACH;;AAWA;;;;;;;AAOG;AACH;;;AAQD;;ACzDD;;;;;;;;AAQG;;;;;AAKF;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACH;;ACxDA;;;;;;;;;;;;AAYG;AACG;AAIN;;;;;;;;;;;AAWG;AACG;;ACxBN;;;;;;;;;;;;;AAaG;AACH;;;AAKE;;;AAGG;;AAKH;;;AAGG;;AAKH;;;AAGG;AACH;AAIA;;;AAGG;;AAKH;;;AAGG;;AAKH;;;AAGG;;AAOH;;;AAGG;;AAOH;;;AAGG;;AAeH;AAQA;;;AAYD;;ACpHD;;;;;;;;;;;;;;;;;AAiBG;AACH;;;;;AAOE;;;;;;AAMG;;AAiCH;;;;;;AAMG;AACH;;;AASD;;AC/ED;;;;;;;;;;;AAWG;AACH;;AAEE;AACA;;;;;;;;;;;;AAwBA;;;;;;AAMI;;;AA2BJ;AAIA;;;AAUD;;;"}