UNPKG

@fireng/core

Version:

Core utilities for Fireng Angular responsive library.

1 lines 14.3 kB
{"version":3,"file":"fireng-core.mjs","sources":["../../../projects/core/src/lib/fireng.data.ts","../../../projects/core/src/lib/fireng.token.ts","../../../projects/core/src/lib/fireng-screen.service.ts","../../../projects/core/src/lib/fireng.providers.ts","../../../projects/core/src/fireng-core.ts"],"sourcesContent":["import { FirengBreakpoints } from './fireng.types';\r\n\r\nexport const DEFAULT_BREAKPOINTS: FirengBreakpoints = {\r\n xs: 0,\r\n sm: 576,\r\n md: 768,\r\n lg: 992,\r\n xl: 1200,\r\n xxl: 1400,\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { FirengBreakpoints } from './fireng.types';\r\nimport { DEFAULT_BREAKPOINTS } from './fireng.data';\r\n\r\nexport const FIRENG_BREAKPOINTS = new InjectionToken<FirengBreakpoints>(\r\n 'FIRENG_BREAKPOINTS_TOKEN',\r\n {\r\n factory: () => DEFAULT_BREAKPOINTS,\r\n }\r\n);\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n computed,\r\n inject,\r\n Injectable,\r\n Signal,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { FirengBreakpoints, FirengResponsiveMap } from './fireng.types';\r\nimport { FIRENG_BREAKPOINTS } from './fireng.token';\r\nimport { auditTime, fromEvent } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FirengScreenService {\r\n private readonly document: Document = inject(DOCUMENT);\r\n private readonly window: Window | undefined =\r\n this.document.defaultView || undefined;\r\n\r\n // signal to store the current window width\r\n private _windowWidth: WritableSignal<number> = signal(0);\r\n public readonly windowWidth = this._windowWidth.asReadonly();\r\n\r\n // signal to store the current window height\r\n private _windowHeight: WritableSignal<number> = signal(0);\r\n public readonly windowHeight = this._windowHeight.asReadonly();\r\n\r\n // Signal to store breakpoint and this allows for runtime updates to breakpoints\r\n private readonly _breakpoint: WritableSignal<FirengBreakpoints>;\r\n\r\n // Computed signal to get sorted breakpoints\r\n private readonly _sortedBreakpoints: Signal<FirengBreakpoints> = computed(\r\n () => {\r\n const breakpointsEntries = Object.entries(this._breakpoint() || {}).sort(\r\n (a, b) => a[1] - b[1]\r\n );\r\n return Object.fromEntries(breakpointsEntries);\r\n }\r\n );\r\n // Computed signal for current breakpoint\r\n public readonly currentBreakpoint: Signal<string> = computed(() => {\r\n const width = this._windowWidth();\r\n const breakpoints = this._sortedBreakpoints();\r\n\r\n // taking first first key of breakpoints as default active breakpoint\r\n let activeBreakpointKey = Object.keys(breakpoints)[0];\r\n\r\n for (const [breakpointKey, breakpointValue] of Object.entries(\r\n breakpoints\r\n )) {\r\n if (width >= breakpointValue) {\r\n activeBreakpointKey = breakpointKey;\r\n } else {\r\n break; // Exit loop once we find the first breakpoint that is larger than the width\r\n }\r\n }\r\n\r\n return activeBreakpointKey;\r\n });\r\n\r\n // Computed signal for cascading breakpoints\r\n public readonly activeBreakpoints: Signal<string[]> = computed(() => {\r\n const currentBreakpoint = this.currentBreakpoint();\r\n const breakpoints = this._sortedBreakpoints();\r\n\r\n const activeNames: string[] = [];\r\n for (const [breakpointKey, breakpointValue] of Object.entries(\r\n breakpoints\r\n )) {\r\n activeNames.push(breakpointKey);\r\n if (breakpointKey === currentBreakpoint) {\r\n break;\r\n }\r\n }\r\n return activeNames;\r\n });\r\n\r\n constructor() {\r\n this._breakpoint = signal(inject(FIRENG_BREAKPOINTS));\r\n\r\n if (this.window) {\r\n this._windowWidth.set(this.window.innerWidth);\r\n this._windowHeight.set(this.window.innerHeight);\r\n\r\n fromEvent(this.window, 'resize')\r\n .pipe(auditTime(100))\r\n .subscribe(() => {\r\n this._windowWidth.set(this.window?.innerWidth || 0);\r\n this._windowHeight.set(this.window?.innerHeight || 0);\r\n });\r\n } else {\r\n console.warn(\r\n 'FirengScreenService: No window object found. Screen service may not work as expected.'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the current screen width matches the specified breakpoint.\r\n * @param breakpointName The name of the breakpoint (e.g., 'xs', 'md').\r\n * @returns A signal indicating if the current screen width matches the specified breakpoint.\r\n */\r\n public isBreakpoint(breakpointName: string): Signal<boolean> {\r\n return computed(() => breakpointName === this.currentBreakpoint());\r\n }\r\n\r\n /**\r\n * Checks if the current screen size is at or above a specific breakpoint.\r\n * @param breakpointName The name of the breakpoint (e.g., 'sm', 'md').\r\n * @returns A signal indicating if the current screen is at or above the breakpoint.\r\n */\r\n public isBreakpointUp(breakpointName: string): Signal<boolean> {\r\n return computed(() => {\r\n const breakpoints = this._sortedBreakpoints();\r\n const targetIndex = Object.keys(breakpoints).indexOf(breakpointName);\r\n const currentIndex = Object.keys(breakpoints).indexOf(\r\n this.currentBreakpoint()\r\n );\r\n\r\n return (\r\n targetIndex >= currentIndex && targetIndex >= 0 && currentIndex >= 0\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the current screen size is below a specific breakpoint.\r\n * @param breakpointName The name of the breakpoint (e.g., 'sm', 'md').\r\n * @returns A signal indicating if the current screen is below the breakpoint.\r\n */\r\n public isBreakpointDown(breakpointName: string): Signal<boolean> {\r\n return computed(() => {\r\n const breakpoints = this._sortedBreakpoints();\r\n const targetIndex = Object.keys(breakpoints).indexOf(breakpointName);\r\n const currentIndex = Object.keys(breakpoints).indexOf(\r\n this.currentBreakpoint()\r\n );\r\n\r\n return (\r\n currentIndex < targetIndex && targetIndex >= 0 && currentIndex >= 0\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Allows users to update breakpoints dynamically at runtime.\r\n * This will immediately update the `currentBreakpoint` and `activeBreakpoints` signals.\r\n * @param newBreakpoints An array of new breakpoint definitions.\r\n */\r\n public setBreakpoints(newBreakpoints: FirengBreakpoints): void {\r\n const keys = new Set<string>();\r\n for (const [key, value] of Object.entries(newBreakpoints)) {\r\n if (typeof value !== 'number' || isNaN(value) || value < 0) {\r\n console.warn(`Invalid breakpoint value for \"${key}\": ${value}`);\r\n return;\r\n } else if (keys.has(key)) {\r\n console.warn(`Duplicate breakpoint key found: \"${key}\"`);\r\n return;\r\n }\r\n keys.add(key);\r\n }\r\n\r\n this._breakpoint.set(newBreakpoints);\r\n console.log('FirengScreenService: Breakpoints updated successfully.');\r\n }\r\n\r\n public readonly isPortrait: Signal<boolean> = computed(() => {\r\n return this._windowHeight() > this._windowWidth();\r\n });\r\n\r\n /**\r\n * Resolves a responsive value from a map based on current active breakpoints.\r\n *\r\n * It applies cascading logic: the value for the largest active breakpoint in `valueMap` is returned.\r\n * If no match is found, the `fallback` value is returned.\r\n *\r\n * @template T The type of the value (e.g., `number`, `string`).\r\n * @param valueMap An object mapping breakpoint names to values (e.g., `{ xs: 5, md: 10 }`).\r\n * @param fallback An optional default value if no matching breakpoint is found.\r\n * @returns A signal emitting the resolved value, or `fallback`, or `undefined`.\r\n *\r\n * @example\r\n * // Get items per page: 5 for xs, 10 for md and up, default 5\r\n * const itemsPerPage = this.screenService.resolveBreakpointValue({ xs: 5, md: 10 }, 5);\r\n */\r\n public resolveBreakpointValue<T>(\r\n valueMap: FirengResponsiveMap<T>,\r\n fallback?: T\r\n ): Signal<T | undefined> {\r\n return computed(() => {\r\n const activeBreakpoints = this.activeBreakpoints();\r\n\r\n let selectedValue: T | undefined;\r\n for (const breakpoint of activeBreakpoints) {\r\n if (valueMap.hasOwnProperty(breakpoint)) {\r\n selectedValue = valueMap[breakpoint];\r\n }\r\n }\r\n\r\n if (selectedValue === undefined) {\r\n return fallback;\r\n }\r\n\r\n return selectedValue;\r\n });\r\n }\r\n}\r\n","import { Provider } from '@angular/core';\r\nimport { FirengBreakpoints } from './fireng.types';\r\nimport { FIRENG_BREAKPOINTS } from './fireng.token';\r\n\r\nexport function provideFirengBreakpoints(\r\n breakpoints: FirengBreakpoints\r\n): Provider[] {\r\n return [\r\n {\r\n provide: FIRENG_BREAKPOINTS,\r\n useValue: breakpoints,\r\n },\r\n ];\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}