@filip.mazev/blocks-core 0.0.23 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,7 +71,7 @@ Bridges the gap between CSS media queries and TypeScript logic. It provides reac
71
71
 
72
72
  ```typescript
73
73
  export class MyComponent {
74
- protected windowDimensionsService = inject(WindowDimensionsService);
74
+ protected readonly windowDimensionsService = inject(WindowDimensionsService);
75
75
 
76
76
  protected windowDimensions = this.windowDimensionsService.dimensions;
77
77
  protected breakpoints = this.windowDimensionsService.breakpoints;
@@ -23,8 +23,8 @@ var MobileOS;
23
23
  })(MobileOS || (MobileOS = {}));
24
24
 
25
25
  class DeviceTypeService {
26
- userAgent = navigator.userAgent || navigator.vendor || window?.opera || undefined;
27
26
  isDesktopDevice = !this.isMobileDevice() && !this.isTabletDevice();
27
+ userAgent = navigator.userAgent || navigator.vendor || window?.opera || undefined;
28
28
  supportedScreenOrientation = (screen?.orientation || {}).type ?? screen.mozOrientation ?? screen.msOrientation;
29
29
  safariScreenOrientation = !screen?.orientation && matchMedia('(orientation: portrait)').matches ? 'portrait-primary' : 'landscape-primary';
30
30
  initialScreenOrientation = this.supportedScreenOrientation ?? this.safariScreenOrientation ?? 'portrait-primary';
@@ -176,72 +176,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
176
176
  }], ctorParameters: () => [] });
177
177
 
178
178
  class ScrollLockService {
179
- _isScrollDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isScrollDisabled" }] : []));
180
- isScrollDisabled = this._isScrollDisabled.asReadonly();
179
+ platformId = inject(PLATFORM_ID);
181
180
  deviceTypeService = inject(DeviceTypeService);
182
181
  windowDimensionsService = inject(WindowDimensionsService);
182
+ isBrowser = isPlatformBrowser(this.platformId);
183
183
  activeLocks = new Map();
184
- previousBodyPadding = null;
185
- activeConfig = computed(() => {
186
- if (this.activeLocks.size === 0)
187
- return null;
188
- const keys = Array.from(this.activeLocks.keys());
189
- const lastKey = keys[keys.length - 1];
190
- return this.activeLocks.get(lastKey) ?? null;
191
- }, ...(ngDevMode ? [{ debugName: "activeConfig" }] : []));
192
- windowDimensions = this.windowDimensionsService.dimensions;
193
184
  boundHandleTouchMove = this.handleTouchMove.bind(this);
194
185
  boundPreventDefault = this.preventDefault.bind(this);
186
+ _isScrollDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isScrollDisabled" }] : []));
187
+ isScrollDisabled = this._isScrollDisabled.asReadonly();
188
+ previousBodyPadding = null;
189
+ pendingListenerTimeout = null;
195
190
  ngOnDestroy() {
196
- this.activeLocks.clear();
197
- this.updateStateAndCleanup();
191
+ if (!this.isBrowser)
192
+ return;
193
+ this.clearPendingTimeout();
194
+ this.forceCleanupAll();
198
195
  }
199
196
  disableScroll(usageId, config) {
200
- const wasAlreadyDisabled = this._isScrollDisabled();
197
+ if (!this.isBrowser)
198
+ return;
199
+ const wasDisabled = this._isScrollDisabled();
201
200
  this.activeLocks.set(usageId, config);
202
201
  this._isScrollDisabled.set(true);
203
- if (wasAlreadyDisabled) {
202
+ if (wasDisabled)
204
203
  return;
205
- }
206
204
  const documentWidth = document.documentElement.clientWidth;
207
205
  const windowWidth = window.innerWidth;
208
206
  const scrollBarWidth = windowWidth - documentWidth;
209
207
  if (scrollBarWidth > 0) {
210
208
  this.previousBodyPadding = document.body.style.paddingRight;
211
- const computedBodyPadding = parseInt(window.getComputedStyle(document.body).paddingRight, 10) || 0;
212
- const newPadding = computedBodyPadding + scrollBarWidth;
213
- document.body.style.setProperty('padding-right', `${newPadding}px`, 'important');
209
+ const computedPadding = parseInt(getComputedStyle(document.body).paddingRight, 10) || 0;
210
+ document.body.style.setProperty('padding-right', `${computedPadding + scrollBarWidth}px`, 'important');
214
211
  }
215
212
  document.body.style.setProperty('overflow', 'hidden', 'important');
216
213
  if (config.handleTouchInput !== false) {
217
214
  document.body.style.setProperty('touch-action', 'none', 'important');
218
215
  }
219
- setTimeout(() => {
216
+ this.clearPendingTimeout();
217
+ this.pendingListenerTimeout = window.setTimeout(() => {
220
218
  if (!this._isScrollDisabled())
221
219
  return;
222
220
  if (config.handleTouchInput === true) {
223
221
  document.body.addEventListener('touchmove', this.boundHandleTouchMove, { passive: false });
224
222
  }
225
223
  if (config.handleExtremeOverflow === true) {
226
- const options = { passive: false };
227
- window.addEventListener('wheel', this.boundPreventDefault, options);
228
- window.addEventListener('mousewheel', this.boundPreventDefault, options);
229
- window.addEventListener('scroll', this.boundPreventDefault, options);
230
- window.addEventListener('DOMMouseScroll', this.boundPreventDefault, options);
224
+ const opt = { passive: false };
225
+ window.addEventListener('wheel', this.boundPreventDefault, opt);
226
+ window.addEventListener('mousewheel', this.boundPreventDefault, opt);
227
+ window.addEventListener('scroll', this.boundPreventDefault, opt);
228
+ window.addEventListener('DOMMouseScroll', this.boundPreventDefault, opt);
231
229
  }
232
230
  }, (config.animationDuration ?? 0) + 10);
233
231
  }
234
- enableScroll(usageId, extreme_overflow) {
235
- if (!this.activeLocks.has(usageId)) {
232
+ enableScroll(usageId, extremeOverflow) {
233
+ if (!this.isBrowser)
234
+ return;
235
+ if (!this.activeLocks.has(usageId))
236
236
  return;
237
- }
238
237
  this.activeLocks.delete(usageId);
239
- if (this.activeLocks.size > 0) {
238
+ if (this.activeLocks.size > 0)
240
239
  return;
241
- }
242
- this.updateStateAndCleanup(extreme_overflow);
240
+ this.updateStateAndCleanup(extremeOverflow);
241
+ }
242
+ getActiveConfig() {
243
+ if (this.activeLocks.size === 0)
244
+ return null;
245
+ const keys = Array.from(this.activeLocks.keys());
246
+ return this.activeLocks.get(keys[keys.length - 1]) ?? null;
243
247
  }
244
- updateStateAndCleanup(extreme_overflow) {
248
+ updateStateAndCleanup(extremeOverflow) {
249
+ if (!this.isBrowser)
250
+ return;
251
+ this.clearPendingTimeout();
245
252
  this._isScrollDisabled.set(false);
246
253
  document.body.style.removeProperty('overflow');
247
254
  if (this.previousBodyPadding !== null) {
@@ -255,39 +262,46 @@ class ScrollLockService {
255
262
  }
256
263
  document.body.removeEventListener('touchmove', this.boundHandleTouchMove);
257
264
  document.body.style.removeProperty('touch-action');
258
- if (extreme_overflow !== false) {
265
+ if (extremeOverflow !== false) {
259
266
  window.removeEventListener('wheel', this.boundPreventDefault);
260
267
  window.removeEventListener('mousewheel', this.boundPreventDefault);
261
268
  window.removeEventListener('scroll', this.boundPreventDefault);
262
269
  window.removeEventListener('DOMMouseScroll', this.boundPreventDefault);
263
270
  }
264
271
  }
272
+ forceCleanupAll() {
273
+ this.activeLocks.clear();
274
+ this.updateStateAndCleanup(true);
275
+ }
276
+ clearPendingTimeout() {
277
+ if (this.pendingListenerTimeout !== null) {
278
+ clearTimeout(this.pendingListenerTimeout);
279
+ this.pendingListenerTimeout = null;
280
+ }
281
+ }
265
282
  handleTouchMove(event) {
266
283
  const targetNode = event.target;
267
- const currentConfiguration = this.activeConfig();
268
- if (!this.isAllowedToScroll(targetNode) && (currentConfiguration === null || currentConfiguration?.handleTouchInput !== false)) {
269
- if (currentConfiguration === null ||
270
- currentConfiguration?.mobileOnlyTouchPrevention !== true ||
271
- (currentConfiguration?.mobileOnlyTouchPrevention === true &&
284
+ const cfg = this.getActiveConfig();
285
+ if (!this.isAllowedToScroll(targetNode) && (cfg === null || cfg.handleTouchInput !== false)) {
286
+ if (cfg === null ||
287
+ cfg.mobileOnlyTouchPrevention !== true ||
288
+ (cfg.mobileOnlyTouchPrevention === true &&
272
289
  (!this.deviceTypeService.getDeviceState().isMobile || !this.deviceTypeService.getDeviceState().isTablet) &&
273
- this.windowDimensions().width < this.windowDimensionsService.breakpoints.sm)) {
290
+ this.windowDimensionsService.dimensions().width < this.windowDimensionsService.breakpoints.sm)) {
274
291
  event.preventDefault();
275
292
  event.stopPropagation();
276
293
  }
277
294
  }
278
295
  }
279
296
  isAllowedToScroll(targetNode) {
280
- const currentConfiguration = this.activeConfig();
281
- if (!currentConfiguration?.allowTouchInputOn || currentConfiguration.allowTouchInputOn.length === 0) {
297
+ const cfg = this.getActiveConfig();
298
+ const allow = cfg?.allowTouchInputOn;
299
+ if (!allow)
282
300
  return true;
283
- }
284
- if (currentConfiguration.allowTouchInputOn.length === undefined) {
285
- return currentConfiguration.allowTouchInputOn.contains(targetNode);
286
- }
287
- for (const element of currentConfiguration.allowTouchInputOn) {
288
- if (element.contains(targetNode)) {
301
+ if (Array.isArray(allow)) {
302
+ if (allow.length === 0)
289
303
  return true;
290
- }
304
+ return allow.some((el) => el.contains(targetNode));
291
305
  }
292
306
  return false;
293
307
  }
@@ -300,19 +314,17 @@ class ScrollLockService {
300
314
  }
301
315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ScrollLockService, decorators: [{
302
316
  type: Injectable,
303
- args: [{
304
- providedIn: 'root'
305
- }]
317
+ args: [{ providedIn: 'root' }]
306
318
  }] });
307
319
 
308
320
  class ThemingService {
321
+ platformId = inject(PLATFORM_ID);
322
+ isBrowser = isPlatformBrowser(this.platformId);
309
323
  _systemTheme = signal(this.detectInitialSystemTheme(), ...(ngDevMode ? [{ debugName: "_systemTheme" }] : []));
310
324
  _applicationTheme = signal(null, ...(ngDevMode ? [{ debugName: "_applicationTheme" }] : []));
311
325
  systemTheme = this._systemTheme.asReadonly();
312
326
  applicationTheme = this._applicationTheme.asReadonly();
313
327
  activeTheme = computed(() => this.applicationTheme() ?? this.systemTheme(), ...(ngDevMode ? [{ debugName: "activeTheme" }] : []));
314
- platformId = inject(PLATFORM_ID);
315
- isBrowser = isPlatformBrowser(this.platformId);
316
328
  systemTheme$ = toObservable(this._systemTheme);
317
329
  applicationTheme$ = toObservable(this._applicationTheme);
318
330
  mediaQueryList;
@@ -330,16 +342,9 @@ class ThemingService {
330
342
  setApplicationTheme(theme) {
331
343
  this._applicationTheme.set(theme);
332
344
  }
333
- /**
334
- * Returns an observable of the system theme.
335
- * Safe to call anywhere because the observable is pre-created in the constructor context.
336
- */
337
345
  getSystemTheme$() {
338
346
  return this.systemTheme$;
339
347
  }
340
- /**
341
- * Returns an observable of the application theme.
342
- */
343
348
  getApplicationTheme$() {
344
349
  return this.applicationTheme$;
345
350
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filip.mazev-blocks-core.mjs","sources":["../../../projects/blocks-core/src/lib/enums/desktop-os.enum.ts","../../../projects/blocks-core/src/lib/enums/mobile-os.enum.ts","../../../projects/blocks-core/src/lib/services/device-type.service.ts","../../../projects/blocks-core/src/lib/constants/window-dimension.constants.ts","../../../projects/blocks-core/src/lib/services/window-dimension.service.ts","../../../projects/blocks-core/src/lib/services/scroll-lock.service.ts","../../../projects/blocks-core/src/lib/services/theming.service.ts","../../../projects/blocks-core/src/lib/constants/scroll-lock.constants.ts","../../../projects/blocks-core/src/lib/helpers/uui4.ts","../../../projects/blocks-core/src/public-api.ts","../../../projects/blocks-core/src/filip.mazev-blocks-core.ts"],"sourcesContent":["export enum DesktopOS {\n Linux = 'linux',\n MacOS = 'mac_os',\n Unix = 'unix',\n Unknown = 'unknown',\n Windows = 'windows'\n}\n","export enum MobileOS {\n Android = 'android',\n iOS = 'ios',\n Unknown = 'unknown',\n WindowsPhone = 'Windows Phone'\n}\n","import { Injectable } from '@angular/core';\nimport { DesktopOS } from '../enums/desktop-os.enum';\nimport { MobileOS } from '../enums/mobile-os.enum';\nimport { DeviceState } from '../interfaces/device-state.interface';\nimport { DeviceOS, DeviceOrientationType, LegacyScreenOrientation, MSStreamWindow, OperaCapableWindow } from '../types/core.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DeviceTypeService {\n private userAgent?: string = navigator.userAgent || navigator.vendor || (window as OperaCapableWindow)?.opera || undefined;\n private readonly isDesktopDevice = !this.isMobileDevice() && !this.isTabletDevice();\n\n private supportedScreenOrientation =\n (screen?.orientation || {}).type ?? (screen as LegacyScreenOrientation).mozOrientation ?? (screen as LegacyScreenOrientation).msOrientation;\n\n private safariScreenOrientation: DeviceOrientationType =\n !screen?.orientation && matchMedia('(orientation: portrait)').matches ? 'portrait-primary' : 'landscape-primary';\n\n private initialScreenOrientation: DeviceOrientationType = this.supportedScreenOrientation ?? this.safariScreenOrientation ?? 'portrait-primary';\n private screenOrientation: DeviceOrientationType = this.initialScreenOrientation;\n\n constructor() {\n if (screen.orientation) {\n screen.orientation.addEventListener('change', (ev: Event) => {\n const orientation = ev.target as ScreenOrientation | null;\n if (orientation?.type) {\n this.screenOrientation = orientation.type;\n }\n });\n }\n }\n\n public isLandscapeOrientation(): boolean {\n return ['landscape-primary', 'landscape-secondary'].includes(this.screenOrientation);\n }\n\n public isPortraitOrientation(): boolean {\n return ['portrait-primary', 'portrait-secondary'].includes(this.screenOrientation);\n }\n\n public getDeviceState(): DeviceState {\n const isDesktop = this.isDesktopDevice;\n const isMobile = this.isMobileDevice();\n const isTablet = this.isTabletDevice();\n const mobileOS: MobileOS | undefined = this.getMobileOS();\n const isAndroidDevice = this.getDeviceOS() === MobileOS.Android;\n const isAppleDevice = this.getDeviceOS() === MobileOS.iOS || this.getDeviceOS() === DesktopOS.MacOS;\n const isUnknownMobileDevice = this.getDeviceOS() === MobileOS.Unknown;\n const desktopOS: DesktopOS | undefined = this.getDesktopOS();\n const isWindowsDesktop = this.getDeviceOS() === DesktopOS.Windows;\n const isLinuxOrUnixDesktop = this.getDeviceOS() === DesktopOS.Linux || this.getDeviceOS() === DesktopOS.Unix;\n\n return {\n isDesktop,\n desktopOS,\n isWindowsDesktop,\n isLinuxOrUnixDesktop,\n isMobile,\n mobileOS,\n isAndroidDevice,\n isAppleDevice,\n isUnknownMobileDevice,\n isTablet,\n isLandscapeOrientation: () => this.isLandscapeOrientation(),\n isPortraitOrientation: () => this.isPortraitOrientation()\n };\n }\n\n private isMobileDevice(): boolean {\n const regexs = [/(Android)(.+)(Mobile)/i, /BlackBerry/i, /iPhone|iPod/i, /Opera Mini/i, /IEMobile/i];\n return regexs.some((b) => this.userAgent?.match(b) !== null);\n }\n\n private isTabletDevice(): boolean {\n const regex = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/;\n return regex.test(this.userAgent?.toLowerCase() ?? '');\n }\n\n private getMobileOS(): MobileOS | undefined {\n if (this.isMobileDevice() && this.userAgent) {\n if (/windows phone/i.test(this.userAgent)) return MobileOS.WindowsPhone;\n else if (/android/i.test(this.userAgent)) return MobileOS.Android;\n else if (/iPad|iPhone|iPod/.test(this.userAgent) && !(window as MSStreamWindow).MSStream) return MobileOS.iOS;\n\n return MobileOS.Unknown;\n }\n return undefined;\n }\n\n private getDesktopOS(): DesktopOS | undefined {\n if (this.isDesktopDevice && this.userAgent) {\n if (this.userAgent.indexOf('Win') !== -1) return DesktopOS.Windows;\n else if (this.userAgent.indexOf('Mac') !== -1) return DesktopOS.MacOS;\n else if (this.userAgent.indexOf('X11') !== -1) return DesktopOS.Unix;\n else if (this.userAgent.indexOf('Linux') !== -1) return DesktopOS.Linux;\n\n return DesktopOS.Unknown;\n } else return undefined;\n }\n\n private getDeviceOS(): DeviceOS | undefined {\n return this.getMobileOS() ?? this.getDesktopOS();\n }\n}\n","export const BREAKPOINTS = {\n xs: 360,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n '3xl': 1920,\n '4xl': 2560\n} as const;\n","import { Injectable, inject, NgZone, PLATFORM_ID, signal, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { fromEvent } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\nimport { BREAKPOINTS } from '../constants/window-dimension.constants';\nimport { WindowDimensions } from '../interfaces/window-dimensions.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WindowDimensionsService {\n public readonly ngZone = inject(NgZone);\n public readonly platformId = inject(PLATFORM_ID);\n public readonly isBrowser = isPlatformBrowser(this.platformId);\n\n public readonly _dimensions = signal<WindowDimensions>(this.getCurrentDimensions());\n\n public readonly dimensions = this._dimensions.asReadonly();\n\n public readonly isMobile = computed(() => this.dimensions().width < BREAKPOINTS.md);\n public readonly isTablet = computed(() => this.dimensions().width >= BREAKPOINTS.md && this.dimensions().width < BREAKPOINTS.lg);\n public readonly isDesktop = computed(() => this.dimensions().width >= BREAKPOINTS.lg);\n\n public readonly breakpoints = BREAKPOINTS;\n\n constructor() {\n this.initResizeListener();\n }\n\n private getCurrentDimensions(): WindowDimensions {\n if (!this.isBrowser) {\n return { width: 0, height: 0 };\n }\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n\n private initResizeListener(): void {\n if (!this.isBrowser) return;\n\n this.ngZone.runOutsideAngular(() => {\n fromEvent(window, 'resize')\n .pipe(\n debounceTime(150),\n map(() => this.getCurrentDimensions()),\n distinctUntilChanged((prev, curr) => prev.width === curr.width && prev.height === curr.height)\n )\n .subscribe((dims) => {\n this.ngZone.run(() => {\n this._dimensions.set(dims);\n });\n });\n });\n }\n}\n","import { Injectable, OnDestroy, inject, signal, computed } from '@angular/core';\nimport { DeviceTypeService } from './device-type.service';\nimport { WindowDimensionsService } from './window-dimension.service';\nimport { IScrollLockConfig } from '../interfaces/scroll-lock-config.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ScrollLockService implements OnDestroy {\n public _isScrollDisabled = signal<boolean>(false);\n public readonly isScrollDisabled = this._isScrollDisabled.asReadonly();\n\n private deviceTypeService = inject(DeviceTypeService);\n private windowDimensionsService = inject(WindowDimensionsService);\n\n private activeLocks = new Map<string, IScrollLockConfig>();\n\n private previousBodyPadding: string | null = null;\n\n private activeConfig = computed(() => {\n if (this.activeLocks.size === 0) return null;\n const keys = Array.from(this.activeLocks.keys());\n const lastKey = keys[keys.length - 1];\n return this.activeLocks.get(lastKey) ?? null;\n });\n\n private windowDimensions = this.windowDimensionsService.dimensions;\n\n private boundHandleTouchMove = this.handleTouchMove.bind(this);\n private boundPreventDefault = this.preventDefault.bind(this);\n\n public ngOnDestroy(): void {\n this.activeLocks.clear();\n this.updateStateAndCleanup();\n }\n\n public disableScroll(usageId: string, config: IScrollLockConfig): void {\n const wasAlreadyDisabled = this._isScrollDisabled();\n\n this.activeLocks.set(usageId, config);\n this._isScrollDisabled.set(true);\n\n if (wasAlreadyDisabled) {\n return;\n }\n\n const documentWidth = document.documentElement.clientWidth;\n const windowWidth = window.innerWidth;\n const scrollBarWidth = windowWidth - documentWidth;\n\n if (scrollBarWidth > 0) {\n this.previousBodyPadding = document.body.style.paddingRight;\n\n const computedBodyPadding = parseInt(window.getComputedStyle(document.body).paddingRight, 10) || 0;\n const newPadding = computedBodyPadding + scrollBarWidth;\n\n document.body.style.setProperty('padding-right', `${newPadding}px`, 'important');\n }\n\n document.body.style.setProperty('overflow', 'hidden', 'important');\n\n if (config.handleTouchInput !== false) {\n document.body.style.setProperty('touch-action', 'none', 'important');\n }\n\n setTimeout(\n () => {\n if (!this._isScrollDisabled()) return;\n\n if (config.handleTouchInput === true) {\n document.body.addEventListener('touchmove', this.boundHandleTouchMove, { passive: false });\n }\n\n if (config.handleExtremeOverflow === true) {\n const options = { passive: false };\n window.addEventListener('wheel', this.boundPreventDefault, options);\n window.addEventListener('mousewheel', this.boundPreventDefault, options);\n window.addEventListener('scroll', this.boundPreventDefault, options);\n window.addEventListener('DOMMouseScroll', this.boundPreventDefault, options);\n }\n },\n (config.animationDuration ?? 0) + 10\n );\n }\n\n public enableScroll(usageId: string, extreme_overflow?: boolean): void {\n if (!this.activeLocks.has(usageId)) {\n return;\n }\n\n this.activeLocks.delete(usageId);\n\n if (this.activeLocks.size > 0) {\n return;\n }\n\n this.updateStateAndCleanup(extreme_overflow);\n }\n\n private updateStateAndCleanup(extreme_overflow?: boolean): void {\n this._isScrollDisabled.set(false);\n\n document.body.style.removeProperty('overflow');\n\n if (this.previousBodyPadding !== null) {\n if (this.previousBodyPadding) {\n document.body.style.setProperty('padding-right', this.previousBodyPadding);\n } else {\n document.body.style.removeProperty('padding-right');\n }\n this.previousBodyPadding = null;\n }\n\n document.body.removeEventListener('touchmove', this.boundHandleTouchMove);\n document.body.style.removeProperty('touch-action');\n\n if (extreme_overflow !== false) {\n window.removeEventListener('wheel', this.boundPreventDefault);\n window.removeEventListener('mousewheel', this.boundPreventDefault);\n window.removeEventListener('scroll', this.boundPreventDefault);\n window.removeEventListener('DOMMouseScroll', this.boundPreventDefault);\n }\n }\n\n private handleTouchMove(event: Event): void {\n const targetNode = event.target as Node;\n const currentConfiguration = this.activeConfig();\n\n if (!this.isAllowedToScroll(targetNode) && (currentConfiguration === null || currentConfiguration?.handleTouchInput !== false)) {\n if (\n currentConfiguration === null ||\n currentConfiguration?.mobileOnlyTouchPrevention !== true ||\n (currentConfiguration?.mobileOnlyTouchPrevention === true &&\n (!this.deviceTypeService.getDeviceState().isMobile || !this.deviceTypeService.getDeviceState().isTablet) &&\n this.windowDimensions().width < this.windowDimensionsService.breakpoints.sm)\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n }\n\n private isAllowedToScroll(targetNode: Node): boolean {\n const currentConfiguration = this.activeConfig();\n\n if (!currentConfiguration?.allowTouchInputOn || currentConfiguration.allowTouchInputOn.length === 0) {\n return true;\n }\n\n if (currentConfiguration.allowTouchInputOn.length === undefined) {\n return (currentConfiguration.allowTouchInputOn as unknown as Element).contains(targetNode);\n }\n\n for (const element of currentConfiguration.allowTouchInputOn) {\n if (element.contains(targetNode)) {\n return true;\n }\n }\n\n return false;\n }\n\n private preventDefault(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n }\n}\n","import { Injectable, OnDestroy, inject, signal, PLATFORM_ID, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { DeviceTheme } from '../types/core.types';\nimport { toObservable } from '@angular/core/rxjs-interop';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemingService implements OnDestroy {\n public readonly _systemTheme = signal<DeviceTheme>(this.detectInitialSystemTheme());\n public readonly _applicationTheme = signal<DeviceTheme | null>(null);\n\n public readonly systemTheme = this._systemTheme.asReadonly();\n public readonly applicationTheme = this._applicationTheme.asReadonly();\n\n public readonly activeTheme = computed(() => this.applicationTheme() ?? this.systemTheme());\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly systemTheme$ = toObservable(this._systemTheme);\n private readonly applicationTheme$ = toObservable(this._applicationTheme);\n\n private mediaQueryList?: MediaQueryList;\n private mediaQueryListener?: (event: MediaQueryListEvent) => void;\n\n constructor() {\n if (this.isBrowser) {\n this.initSystemThemeListener();\n }\n }\n\n public ngOnDestroy(): void {\n if (this.mediaQueryList && this.mediaQueryListener) {\n this.mediaQueryList.removeEventListener('change', this.mediaQueryListener);\n }\n }\n\n public setApplicationTheme(theme: DeviceTheme): void {\n this._applicationTheme.set(theme);\n }\n\n /**\n * Returns an observable of the system theme.\n * Safe to call anywhere because the observable is pre-created in the constructor context.\n */\n public getSystemTheme$() {\n return this.systemTheme$;\n }\n\n /**\n * Returns an observable of the application theme.\n */\n public getApplicationTheme$() {\n return this.applicationTheme$;\n }\n\n private detectInitialSystemTheme(): DeviceTheme {\n if (!this.isBrowser) return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n private initSystemThemeListener(): void {\n this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n\n this.mediaQueryListener = (event: MediaQueryListEvent) => {\n this._systemTheme.set(event.matches ? 'dark' : 'light');\n };\n\n this.mediaQueryList.addEventListener('change', this.mediaQueryListener);\n }\n}\n","export const SCROLL_LOCK_INSTANCE_IDENTIFIER = 'scroll_lock_instance_';\n","export function uuidv4() {\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) => (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16));\n}\n","/*\n * Public API Surface of blocks-core\n */\n\nexport * from './lib/services/device-type.service';\nexport * from './lib/services/scroll-lock.service';\nexport * from './lib/services/window-dimension.service';\nexport * from './lib/services/theming.service';\n\nexport * from './lib/enums/desktop-os.enum';\nexport * from './lib/enums/mobile-os.enum';\n\nexport * from './lib/interfaces/device-state.interface';\nexport * from './lib/interfaces/scroll-lock-config.interface';\nexport * from './lib/interfaces/window-dimensions.interface';\n\nexport * from './lib/constants/window-dimension.constants';\nexport * from './lib/constants/scroll-lock.constants';\n\nexport * from './lib/types/core.types';\n\nexport * from './lib/helpers/uui4';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filip.mazev-blocks-core.mjs","sources":["../../../projects/blocks-core/src/lib/enums/desktop-os.enum.ts","../../../projects/blocks-core/src/lib/enums/mobile-os.enum.ts","../../../projects/blocks-core/src/lib/services/device-type.service.ts","../../../projects/blocks-core/src/lib/constants/window-dimension.constants.ts","../../../projects/blocks-core/src/lib/services/window-dimension.service.ts","../../../projects/blocks-core/src/lib/services/scroll-lock.service.ts","../../../projects/blocks-core/src/lib/services/theming.service.ts","../../../projects/blocks-core/src/lib/constants/scroll-lock.constants.ts","../../../projects/blocks-core/src/lib/helpers/uui4.ts","../../../projects/blocks-core/src/public-api.ts","../../../projects/blocks-core/src/filip.mazev-blocks-core.ts"],"sourcesContent":["export enum DesktopOS {\n Linux = 'linux',\n MacOS = 'mac_os',\n Unix = 'unix',\n Unknown = 'unknown',\n Windows = 'windows'\n}\n","export enum MobileOS {\n Android = 'android',\n iOS = 'ios',\n Unknown = 'unknown',\n WindowsPhone = 'Windows Phone'\n}\n","import { Injectable } from '@angular/core';\nimport { DesktopOS } from '../enums/desktop-os.enum';\nimport { MobileOS } from '../enums/mobile-os.enum';\nimport { DeviceState } from '../interfaces/device-state.interface';\nimport { DeviceOS, DeviceOrientationType, LegacyScreenOrientation, MSStreamWindow, OperaCapableWindow } from '../types/core.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DeviceTypeService {\n private readonly isDesktopDevice = !this.isMobileDevice() && !this.isTabletDevice();\n private userAgent?: string = navigator.userAgent || navigator.vendor || (window as OperaCapableWindow)?.opera || undefined;\n\n private supportedScreenOrientation =\n (screen?.orientation || {}).type ?? (screen as LegacyScreenOrientation).mozOrientation ?? (screen as LegacyScreenOrientation).msOrientation;\n\n private safariScreenOrientation: DeviceOrientationType =\n !screen?.orientation && matchMedia('(orientation: portrait)').matches ? 'portrait-primary' : 'landscape-primary';\n\n private initialScreenOrientation: DeviceOrientationType = this.supportedScreenOrientation ?? this.safariScreenOrientation ?? 'portrait-primary';\n private screenOrientation: DeviceOrientationType = this.initialScreenOrientation;\n\n constructor() {\n if (screen.orientation) {\n screen.orientation.addEventListener('change', (ev: Event) => {\n const orientation = ev.target as ScreenOrientation | null;\n if (orientation?.type) {\n this.screenOrientation = orientation.type;\n }\n });\n }\n }\n\n public isLandscapeOrientation(): boolean {\n return ['landscape-primary', 'landscape-secondary'].includes(this.screenOrientation);\n }\n\n public isPortraitOrientation(): boolean {\n return ['portrait-primary', 'portrait-secondary'].includes(this.screenOrientation);\n }\n\n public getDeviceState(): DeviceState {\n const isDesktop = this.isDesktopDevice;\n const isMobile = this.isMobileDevice();\n const isTablet = this.isTabletDevice();\n const mobileOS: MobileOS | undefined = this.getMobileOS();\n const isAndroidDevice = this.getDeviceOS() === MobileOS.Android;\n const isAppleDevice = this.getDeviceOS() === MobileOS.iOS || this.getDeviceOS() === DesktopOS.MacOS;\n const isUnknownMobileDevice = this.getDeviceOS() === MobileOS.Unknown;\n const desktopOS: DesktopOS | undefined = this.getDesktopOS();\n const isWindowsDesktop = this.getDeviceOS() === DesktopOS.Windows;\n const isLinuxOrUnixDesktop = this.getDeviceOS() === DesktopOS.Linux || this.getDeviceOS() === DesktopOS.Unix;\n\n return {\n isDesktop,\n desktopOS,\n isWindowsDesktop,\n isLinuxOrUnixDesktop,\n isMobile,\n mobileOS,\n isAndroidDevice,\n isAppleDevice,\n isUnknownMobileDevice,\n isTablet,\n isLandscapeOrientation: () => this.isLandscapeOrientation(),\n isPortraitOrientation: () => this.isPortraitOrientation()\n };\n }\n\n private isMobileDevice(): boolean {\n const regexs = [/(Android)(.+)(Mobile)/i, /BlackBerry/i, /iPhone|iPod/i, /Opera Mini/i, /IEMobile/i];\n return regexs.some((b) => this.userAgent?.match(b) !== null);\n }\n\n private isTabletDevice(): boolean {\n const regex = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/;\n return regex.test(this.userAgent?.toLowerCase() ?? '');\n }\n\n private getMobileOS(): MobileOS | undefined {\n if (this.isMobileDevice() && this.userAgent) {\n if (/windows phone/i.test(this.userAgent)) return MobileOS.WindowsPhone;\n else if (/android/i.test(this.userAgent)) return MobileOS.Android;\n else if (/iPad|iPhone|iPod/.test(this.userAgent) && !(window as MSStreamWindow).MSStream) return MobileOS.iOS;\n\n return MobileOS.Unknown;\n }\n return undefined;\n }\n\n private getDesktopOS(): DesktopOS | undefined {\n if (this.isDesktopDevice && this.userAgent) {\n if (this.userAgent.indexOf('Win') !== -1) return DesktopOS.Windows;\n else if (this.userAgent.indexOf('Mac') !== -1) return DesktopOS.MacOS;\n else if (this.userAgent.indexOf('X11') !== -1) return DesktopOS.Unix;\n else if (this.userAgent.indexOf('Linux') !== -1) return DesktopOS.Linux;\n\n return DesktopOS.Unknown;\n } else return undefined;\n }\n\n private getDeviceOS(): DeviceOS | undefined {\n return this.getMobileOS() ?? this.getDesktopOS();\n }\n}\n","export const BREAKPOINTS = {\n xs: 360,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n '3xl': 1920,\n '4xl': 2560\n} as const;\n","import { Injectable, inject, NgZone, PLATFORM_ID, signal, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { fromEvent } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\nimport { BREAKPOINTS } from '../constants/window-dimension.constants';\nimport { WindowDimensions } from '../interfaces/window-dimensions.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WindowDimensionsService {\n public readonly ngZone = inject(NgZone);\n public readonly platformId = inject(PLATFORM_ID);\n\n public readonly isBrowser = isPlatformBrowser(this.platformId);\n\n public readonly _dimensions = signal<WindowDimensions>(this.getCurrentDimensions());\n\n public readonly dimensions = this._dimensions.asReadonly();\n\n public readonly isMobile = computed(() => this.dimensions().width < BREAKPOINTS.md);\n public readonly isTablet = computed(() => this.dimensions().width >= BREAKPOINTS.md && this.dimensions().width < BREAKPOINTS.lg);\n public readonly isDesktop = computed(() => this.dimensions().width >= BREAKPOINTS.lg);\n\n public readonly breakpoints = BREAKPOINTS;\n\n constructor() {\n this.initResizeListener();\n }\n\n private getCurrentDimensions(): WindowDimensions {\n if (!this.isBrowser) {\n return { width: 0, height: 0 };\n }\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n\n private initResizeListener(): void {\n if (!this.isBrowser) return;\n\n this.ngZone.runOutsideAngular(() => {\n fromEvent(window, 'resize')\n .pipe(\n debounceTime(150),\n map(() => this.getCurrentDimensions()),\n distinctUntilChanged((prev, curr) => prev.width === curr.width && prev.height === curr.height)\n )\n .subscribe((dims) => {\n this.ngZone.run(() => {\n this._dimensions.set(dims);\n });\n });\n });\n }\n}\n","import { Injectable, OnDestroy, inject, signal, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { DeviceTypeService } from './device-type.service';\nimport { WindowDimensionsService } from './window-dimension.service';\nimport { IScrollLockConfig } from '../interfaces/scroll-lock-config.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class ScrollLockService implements OnDestroy {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly deviceTypeService = inject(DeviceTypeService);\n private readonly windowDimensionsService = inject(WindowDimensionsService);\n\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly activeLocks = new Map<string, IScrollLockConfig>();\n private readonly boundHandleTouchMove = this.handleTouchMove.bind(this);\n private readonly boundPreventDefault = this.preventDefault.bind(this);\n\n public readonly _isScrollDisabled = signal(false);\n public readonly isScrollDisabled = this._isScrollDisabled.asReadonly();\n\n private previousBodyPadding: string | null = null;\n\n private pendingListenerTimeout: number | null = null;\n\n public ngOnDestroy(): void {\n if (!this.isBrowser) return;\n this.clearPendingTimeout();\n this.forceCleanupAll();\n }\n\n public disableScroll(usageId: string, config: IScrollLockConfig): void {\n if (!this.isBrowser) return;\n\n const wasDisabled = this._isScrollDisabled();\n\n this.activeLocks.set(usageId, config);\n this._isScrollDisabled.set(true);\n\n if (wasDisabled) return;\n\n const documentWidth = document.documentElement.clientWidth;\n const windowWidth = window.innerWidth;\n const scrollBarWidth = windowWidth - documentWidth;\n\n if (scrollBarWidth > 0) {\n this.previousBodyPadding = document.body.style.paddingRight;\n const computedPadding = parseInt(getComputedStyle(document.body).paddingRight, 10) || 0;\n\n document.body.style.setProperty('padding-right', `${computedPadding + scrollBarWidth}px`, 'important');\n }\n\n document.body.style.setProperty('overflow', 'hidden', 'important');\n\n if (config.handleTouchInput !== false) {\n document.body.style.setProperty('touch-action', 'none', 'important');\n }\n\n this.clearPendingTimeout();\n\n this.pendingListenerTimeout = window.setTimeout(\n () => {\n if (!this._isScrollDisabled()) return;\n\n if (config.handleTouchInput === true) {\n document.body.addEventListener('touchmove', this.boundHandleTouchMove, { passive: false });\n }\n\n if (config.handleExtremeOverflow === true) {\n const opt = { passive: false };\n window.addEventListener('wheel', this.boundPreventDefault, opt);\n window.addEventListener('mousewheel', this.boundPreventDefault, opt);\n window.addEventListener('scroll', this.boundPreventDefault, opt);\n window.addEventListener('DOMMouseScroll', this.boundPreventDefault, opt);\n }\n },\n (config.animationDuration ?? 0) + 10\n );\n }\n\n public enableScroll(usageId: string, extremeOverflow?: boolean): void {\n if (!this.isBrowser) return;\n\n if (!this.activeLocks.has(usageId)) return;\n\n this.activeLocks.delete(usageId);\n\n if (this.activeLocks.size > 0) return;\n\n this.updateStateAndCleanup(extremeOverflow);\n }\n\n private getActiveConfig(): IScrollLockConfig | null {\n if (this.activeLocks.size === 0) return null;\n const keys = Array.from(this.activeLocks.keys());\n return this.activeLocks.get(keys[keys.length - 1]) ?? null;\n }\n\n private updateStateAndCleanup(extremeOverflow?: boolean): void {\n if (!this.isBrowser) return;\n\n this.clearPendingTimeout();\n\n this._isScrollDisabled.set(false);\n\n document.body.style.removeProperty('overflow');\n\n if (this.previousBodyPadding !== null) {\n if (this.previousBodyPadding) {\n document.body.style.setProperty('padding-right', this.previousBodyPadding);\n } else {\n document.body.style.removeProperty('padding-right');\n }\n this.previousBodyPadding = null;\n }\n\n document.body.removeEventListener('touchmove', this.boundHandleTouchMove);\n document.body.style.removeProperty('touch-action');\n\n if (extremeOverflow !== false) {\n window.removeEventListener('wheel', this.boundPreventDefault);\n window.removeEventListener('mousewheel', this.boundPreventDefault);\n window.removeEventListener('scroll', this.boundPreventDefault);\n window.removeEventListener('DOMMouseScroll', this.boundPreventDefault);\n }\n }\n\n private forceCleanupAll(): void {\n this.activeLocks.clear();\n this.updateStateAndCleanup(true);\n }\n\n private clearPendingTimeout(): void {\n if (this.pendingListenerTimeout !== null) {\n clearTimeout(this.pendingListenerTimeout);\n this.pendingListenerTimeout = null;\n }\n }\n\n private handleTouchMove(event: Event): void {\n const targetNode = event.target as Node;\n const cfg = this.getActiveConfig();\n\n if (!this.isAllowedToScroll(targetNode) && (cfg === null || cfg.handleTouchInput !== false)) {\n if (\n cfg === null ||\n cfg.mobileOnlyTouchPrevention !== true ||\n (cfg.mobileOnlyTouchPrevention === true &&\n (!this.deviceTypeService.getDeviceState().isMobile || !this.deviceTypeService.getDeviceState().isTablet) &&\n this.windowDimensionsService.dimensions().width < this.windowDimensionsService.breakpoints.sm)\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n }\n\n private isAllowedToScroll(targetNode: Node): boolean {\n const cfg = this.getActiveConfig();\n const allow = cfg?.allowTouchInputOn;\n\n if (!allow) return true;\n\n if (Array.isArray(allow)) {\n if (allow.length === 0) return true;\n return allow.some((el) => el.contains(targetNode));\n }\n\n return false;\n }\n\n private preventDefault(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n }\n}\n","import { Injectable, OnDestroy, inject, signal, PLATFORM_ID, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { DeviceTheme } from '@core/types/core.types';\nimport { toObservable } from '@angular/core/rxjs-interop';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemingService implements OnDestroy {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly _systemTheme = signal<DeviceTheme>(this.detectInitialSystemTheme());\n private readonly _applicationTheme = signal<DeviceTheme | null>(null);\n\n public readonly systemTheme = this._systemTheme.asReadonly();\n public readonly applicationTheme = this._applicationTheme.asReadonly();\n public readonly activeTheme = computed(() => this.applicationTheme() ?? this.systemTheme());\n\n private readonly systemTheme$ = toObservable(this._systemTheme);\n private readonly applicationTheme$ = toObservable(this._applicationTheme);\n\n private mediaQueryList?: MediaQueryList;\n private mediaQueryListener?: (event: MediaQueryListEvent) => void;\n\n constructor() {\n if (this.isBrowser) {\n this.initSystemThemeListener();\n }\n }\n\n public ngOnDestroy(): void {\n if (this.mediaQueryList && this.mediaQueryListener) {\n this.mediaQueryList.removeEventListener('change', this.mediaQueryListener);\n }\n }\n\n public setApplicationTheme(theme: DeviceTheme): void {\n this._applicationTheme.set(theme);\n }\n\n public getSystemTheme$() {\n return this.systemTheme$;\n }\n\n public getApplicationTheme$() {\n return this.applicationTheme$;\n }\n\n private detectInitialSystemTheme(): DeviceTheme {\n if (!this.isBrowser) return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n private initSystemThemeListener(): void {\n this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n\n this.mediaQueryListener = (event: MediaQueryListEvent) => {\n this._systemTheme.set(event.matches ? 'dark' : 'light');\n };\n\n this.mediaQueryList.addEventListener('change', this.mediaQueryListener);\n }\n}","export const SCROLL_LOCK_INSTANCE_IDENTIFIER = 'scroll_lock_instance_';\n","export function uuidv4() {\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) => (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16));\n}\n","/*\n * Public API Surface of blocks-core\n */\n\nexport * from './lib/services/device-type.service';\nexport * from './lib/services/scroll-lock.service';\nexport * from './lib/services/window-dimension.service';\nexport * from './lib/services/theming.service';\n\nexport * from './lib/enums/desktop-os.enum';\nexport * from './lib/enums/mobile-os.enum';\n\nexport * from './lib/interfaces/device-state.interface';\nexport * from './lib/interfaces/scroll-lock-config.interface';\nexport * from './lib/interfaces/window-dimensions.interface';\n\nexport * from './lib/constants/window-dimension.constants';\nexport * from './lib/constants/scroll-lock.constants';\n\nexport * from './lib/types/core.types';\n\nexport * from './lib/helpers/uui4';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;IAAY;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,QAAgB;AAChB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EANW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;;ICAT;AAAZ,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,QAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,QAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,QAAA,CAAA,cAAA,CAAA,GAAA,eAA8B;AAChC,CAAC,EALW,QAAQ,KAAR,QAAQ,GAAA,EAAA,CAAA,CAAA;;MCSP,iBAAiB,CAAA;AACX,IAAA,eAAe,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAC3E,IAAA,SAAS,GAAY,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,IAAK,MAA6B,EAAE,KAAK,IAAI,SAAS;AAElH,IAAA,0BAA0B,GAChC,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,EAAE,IAAI,IAAK,MAAkC,CAAC,cAAc,IAAK,MAAkC,CAAC,aAAa;IAErI,uBAAuB,GAC7B,CAAC,MAAM,EAAE,WAAW,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC,OAAO,GAAG,kBAAkB,GAAG,mBAAmB;IAE1G,wBAAwB,GAA0B,IAAI,CAAC,0BAA0B,IAAI,IAAI,CAAC,uBAAuB,IAAI,kBAAkB;AACvI,IAAA,iBAAiB,GAA0B,IAAI,CAAC,wBAAwB;AAEhF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;YACtB,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAS,KAAI;AAC1D,gBAAA,MAAM,WAAW,GAAG,EAAE,CAAC,MAAkC;AACzD,gBAAA,IAAI,WAAW,EAAE,IAAI,EAAE;AACrB,oBAAA,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,IAAI;gBAC3C;AACF,YAAA,CAAC,CAAC;QACJ;IACF;IAEO,sBAAsB,GAAA;AAC3B,QAAA,OAAO,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACtF;IAEO,qBAAqB,GAAA;AAC1B,QAAA,OAAO,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACpF;IAEO,cAAc,GAAA;AACnB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,MAAM,QAAQ,GAAyB,IAAI,CAAC,WAAW,EAAE;QACzD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,OAAO;AAC/D,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,KAAK;QACnG,MAAM,qBAAqB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,OAAO;AACrE,QAAA,MAAM,SAAS,GAA0B,IAAI,CAAC,YAAY,EAAE;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,OAAO;AACjE,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,IAAI;QAE5G,OAAO;YACL,SAAS;YACT,SAAS;YACT,gBAAgB;YAChB,oBAAoB;YACpB,QAAQ;YACR,QAAQ;YACR,eAAe;YACf,aAAa;YACb,qBAAqB;YACrB,QAAQ;AACR,YAAA,sBAAsB,EAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE;AAC3D,YAAA,qBAAqB,EAAE,MAAM,IAAI,CAAC,qBAAqB;SACxD;IACH;IAEQ,cAAc,GAAA;AACpB,QAAA,MAAM,MAAM,GAAG,CAAC,wBAAwB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC;QACpG,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9D;IAEQ,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,iHAAiH;AAC/H,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxD;IAEQ,WAAW,GAAA;QACjB,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;AAC3C,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,QAAQ,CAAC,YAAY;AAClE,iBAAA,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,QAAQ,CAAC,OAAO;AAC5D,iBAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAE,MAAyB,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC,GAAG;YAE7G,OAAO,QAAQ,CAAC,OAAO;QACzB;AACA,QAAA,OAAO,SAAS;IAClB;IAEQ,YAAY,GAAA;QAClB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,EAAE;YAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC,OAAO;iBAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC,KAAK;iBAChE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC,IAAI;iBAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC,KAAK;YAEvE,OAAO,SAAS,CAAC,OAAO;QAC1B;;AAAO,YAAA,OAAO,SAAS;IACzB;IAEQ,WAAW,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;IAClD;uGA9FW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACRM,MAAM,WAAW,GAAG;AACzB,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE;;;MCEI,uBAAuB,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAE9C,WAAW,GAAG,MAAM,CAAmB,IAAI,CAAC,oBAAoB,EAAE,uDAAC;AAEnE,IAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAE1C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,oDAAC;AACnE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAChH,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,WAAW,CAAC,EAAE,qDAAC;IAErE,WAAW,GAAG,WAAW;AAEzC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAChC;QACA,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,MAAM,EAAE,MAAM,CAAC;SAChB;IACH;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;AACvB,iBAAA,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,EACtC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;AAE/F,iBAAA,SAAS,CAAC,CAAC,IAAI,KAAI;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACnB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACJ;uGA9CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCFY,iBAAiB,CAAA;AACX,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,IAAA,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAEzD,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9C,IAAA,WAAW,GAAG,IAAI,GAAG,EAA6B;IAClD,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAErD,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,6DAAC;AACjC,IAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;IAE9D,mBAAmB,GAAkB,IAAI;IAEzC,sBAAsB,GAAkB,IAAI;IAE7C,WAAW,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QACrB,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,eAAe,EAAE;IACxB;IAEO,aAAa,CAAC,OAAe,EAAE,MAAyB,EAAA;QAC7D,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAE5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;AACrC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEhC,QAAA,IAAI,WAAW;YAAE;AAEjB,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;AAC1D,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU;AACrC,QAAA,MAAM,cAAc,GAAG,WAAW,GAAG,aAAa;AAElD,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY;AAC3D,YAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC;AAEvF,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAA,EAAG,eAAe,GAAG,cAAc,IAAI,EAAE,WAAW,CAAC;QACxG;AAEA,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;AAElE,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,KAAK,EAAE;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,CAAC;QACtE;QAEA,IAAI,CAAC,mBAAmB,EAAE;QAE1B,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAC7C,MAAK;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAAE;AAE/B,YAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI,EAAE;AACpC,gBAAA,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5F;AAEA,YAAA,IAAI,MAAM,CAAC,qBAAqB,KAAK,IAAI,EAAE;AACzC,gBAAA,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC9B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC;gBAC/D,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC;gBACpE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC;YAC1E;QACF,CAAC,EACD,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,CACrC;IACH;IAEO,YAAY,CAAC,OAAe,EAAE,eAAyB,EAAA;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE;AAEpC,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;AAEhC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;YAAE;AAE/B,QAAA,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC;IAC7C;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AAC5C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;IAC5D;AAEQ,IAAA,qBAAqB,CAAC,eAAyB,EAAA;QACrD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;AAE9C,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE;AACrC,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,mBAAmB,CAAC;YAC5E;iBAAO;gBACL,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;YACrD;AACA,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QACjC;QAEA,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;AAElD,QAAA,IAAI,eAAe,KAAK,KAAK,EAAE;YAC7B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC;YAC7D,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC;YAClE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC;YAC9D,MAAM,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,CAAC;QACxE;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;IAClC;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE;AACxC,YAAA,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACzC,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;QACpC;IACF;AAEQ,IAAA,eAAe,CAAC,KAAY,EAAA;AAClC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAc;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;QAElC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,gBAAgB,KAAK,KAAK,CAAC,EAAE;YAC3F,IACE,GAAG,KAAK,IAAI;gBACZ,GAAG,CAAC,yBAAyB,KAAK,IAAI;AACtC,iBAAC,GAAG,CAAC,yBAAyB,KAAK,IAAI;AACrC,qBAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;AACxG,oBAAA,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,CAAC,EAChG;gBACA,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;YACzB;QACF;IACF;AAEQ,IAAA,iBAAiB,CAAC,UAAgB,EAAA;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG,GAAG,EAAE,iBAAiB;AAEpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AACnC,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpD;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,cAAc,CAAC,KAAY,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;IACzB;uGAtKW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCErB,cAAc,CAAA;AACR,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAE9C,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,wBAAwB,EAAE,wDAAC;AACnE,IAAA,iBAAiB,GAAG,MAAM,CAAqB,IAAI,6DAAC;AAErD,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;AACtD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,uDAAC;AAE1E,IAAA,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9C,IAAA,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAEjE,IAAA,cAAc;AACd,IAAA,kBAAkB;AAE1B,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,uBAAuB,EAAE;QAChC;IACF;IAEO,WAAW,GAAA;QAChB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAClD,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC;QAC5E;IACF;AAEO,IAAA,mBAAmB,CAAC,KAAkB,EAAA;AAC3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC;IAEO,eAAe,GAAA;QACpB,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEO,oBAAoB,GAAA;QACzB,OAAO,IAAI,CAAC,iBAAiB;IAC/B;IAEQ,wBAAwB,GAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,OAAO;AACnC,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;IACrF;IAEQ,uBAAuB,GAAA;QAC7B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC;AAEvE,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,KAA0B,KAAI;AACvD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AACzD,QAAA,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC;IACzE;uGAtDW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACPM,MAAM,+BAA+B,GAAG;;SCA/B,MAAM,GAAA;IACpB,OAAO,sCAAsC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/J;;ACFA;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@filip.mazev/blocks-core",
3
- "version": "0.0.23",
3
+ "version": "0.0.25",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  "./mixins": "./lib/styles/_mixins.scss",
@@ -1,6 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy, NgZone } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
+ import { DeviceTheme as DeviceTheme$1 } from '@core/types/core.types';
4
5
 
5
6
  declare enum DesktopOS {
6
7
  Linux = "linux",
@@ -33,8 +34,8 @@ interface DeviceState {
33
34
  }
34
35
 
35
36
  declare class DeviceTypeService {
36
- private userAgent?;
37
37
  private readonly isDesktopDevice;
38
+ private userAgent?;
38
39
  private supportedScreenOrientation;
39
40
  private safariScreenOrientation;
40
41
  private initialScreenOrientation;
@@ -61,20 +62,24 @@ interface IScrollLockConfig {
61
62
  }
62
63
 
63
64
  declare class ScrollLockService implements OnDestroy {
64
- _isScrollDisabled: _angular_core.WritableSignal<boolean>;
65
+ private readonly platformId;
66
+ private readonly deviceTypeService;
67
+ private readonly windowDimensionsService;
68
+ private readonly isBrowser;
69
+ private readonly activeLocks;
70
+ private readonly boundHandleTouchMove;
71
+ private readonly boundPreventDefault;
72
+ readonly _isScrollDisabled: _angular_core.WritableSignal<boolean>;
65
73
  readonly isScrollDisabled: _angular_core.Signal<boolean>;
66
- private deviceTypeService;
67
- private windowDimensionsService;
68
- private activeLocks;
69
74
  private previousBodyPadding;
70
- private activeConfig;
71
- private windowDimensions;
72
- private boundHandleTouchMove;
73
- private boundPreventDefault;
75
+ private pendingListenerTimeout;
74
76
  ngOnDestroy(): void;
75
77
  disableScroll(usageId: string, config: IScrollLockConfig): void;
76
- enableScroll(usageId: string, extreme_overflow?: boolean): void;
78
+ enableScroll(usageId: string, extremeOverflow?: boolean): void;
79
+ private getActiveConfig;
77
80
  private updateStateAndCleanup;
81
+ private forceCleanupAll;
82
+ private clearPendingTimeout;
78
83
  private handleTouchMove;
79
84
  private isAllowedToScroll;
80
85
  private preventDefault;
@@ -113,44 +118,23 @@ declare class WindowDimensionsService {
113
118
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<WindowDimensionsService>;
114
119
  }
115
120
 
116
- type DeviceTheme = 'light' | 'dark';
117
- type DeviceOS = DesktopOS | MobileOS;
118
- type DeviceOrientationType = 'portrait-primary' | 'landscape-primary' | 'portrait-secondary' | 'landscape-secondary';
119
- type OperaCapableWindow = Window & {
120
- opera?: string;
121
- };
122
- type LegacyScreenOrientation = Screen & {
123
- mozOrientation?: DeviceOrientationType;
124
- msOrientation?: DeviceOrientationType;
125
- };
126
- type MSStreamWindow = Window & {
127
- MSStream?: unknown;
128
- };
129
-
130
121
  declare class ThemingService implements OnDestroy {
131
- readonly _systemTheme: _angular_core.WritableSignal<DeviceTheme>;
132
- readonly _applicationTheme: _angular_core.WritableSignal<DeviceTheme | null>;
133
- readonly systemTheme: _angular_core.Signal<DeviceTheme>;
134
- readonly applicationTheme: _angular_core.Signal<DeviceTheme | null>;
135
- readonly activeTheme: _angular_core.Signal<DeviceTheme>;
136
122
  private readonly platformId;
137
123
  private readonly isBrowser;
124
+ private readonly _systemTheme;
125
+ private readonly _applicationTheme;
126
+ readonly systemTheme: _angular_core.Signal<DeviceTheme$1>;
127
+ readonly applicationTheme: _angular_core.Signal<DeviceTheme$1 | null>;
128
+ readonly activeTheme: _angular_core.Signal<DeviceTheme$1>;
138
129
  private readonly systemTheme$;
139
130
  private readonly applicationTheme$;
140
131
  private mediaQueryList?;
141
132
  private mediaQueryListener?;
142
133
  constructor();
143
134
  ngOnDestroy(): void;
144
- setApplicationTheme(theme: DeviceTheme): void;
145
- /**
146
- * Returns an observable of the system theme.
147
- * Safe to call anywhere because the observable is pre-created in the constructor context.
148
- */
149
- getSystemTheme$(): rxjs.Observable<DeviceTheme>;
150
- /**
151
- * Returns an observable of the application theme.
152
- */
153
- getApplicationTheme$(): rxjs.Observable<DeviceTheme | null>;
135
+ setApplicationTheme(theme: DeviceTheme$1): void;
136
+ getSystemTheme$(): rxjs.Observable<DeviceTheme$1>;
137
+ getApplicationTheme$(): rxjs.Observable<DeviceTheme$1 | null>;
154
138
  private detectInitialSystemTheme;
155
139
  private initSystemThemeListener;
156
140
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemingService, never>;
@@ -170,6 +154,20 @@ declare const BREAKPOINTS: {
170
154
 
171
155
  declare const SCROLL_LOCK_INSTANCE_IDENTIFIER = "scroll_lock_instance_";
172
156
 
157
+ type DeviceTheme = 'light' | 'dark';
158
+ type DeviceOS = DesktopOS | MobileOS;
159
+ type DeviceOrientationType = 'portrait-primary' | 'landscape-primary' | 'portrait-secondary' | 'landscape-secondary';
160
+ type OperaCapableWindow = Window & {
161
+ opera?: string;
162
+ };
163
+ type LegacyScreenOrientation = Screen & {
164
+ mozOrientation?: DeviceOrientationType;
165
+ msOrientation?: DeviceOrientationType;
166
+ };
167
+ type MSStreamWindow = Window & {
168
+ MSStream?: unknown;
169
+ };
170
+
173
171
  declare function uuidv4(): string;
174
172
 
175
173
  export { BREAKPOINTS, DesktopOS, DeviceTypeService, MobileOS, SCROLL_LOCK_INSTANCE_IDENTIFIER, ScrollLockService, ThemingService, WindowDimensionsService, uuidv4 };