ngx-mq 2.4.0 → 2.6.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.
package/README.md CHANGED
@@ -132,6 +132,7 @@ Utils exposing common CSS media features.
132
132
  | `colorScheme` | `value: 'light' \| 'dark', options?: CreateMediaQueryOptions` | `Signal<boolean>` | `true` when the system color scheme matches the specified value. |
133
133
  | `displayMode` | `value: DisplayModeOption, options?: CreateMediaQueryOptions` | `Signal<boolean>` | `true` when the current display mode matches the specified value. |
134
134
  | `reducedMotion` | `options?: CreateMediaQueryOptions` | `Signal<boolean>` | `true` when the user has enabled reduced motion. |
135
+ | `hover` | `options?: CreateMediaQueryOptions` | `Signal<boolean>` | `true` when the user's primary input device supports hover capability. |
135
136
 
136
137
  ---
137
138
 
@@ -153,10 +154,28 @@ import { matchMediaSignal } from 'ngx-mq';
153
154
  export const isLandscape = (): Signal<boolean> => matchMediaSignal('(orientation: landscape)');
154
155
  ```
155
156
 
157
+ ## Providers
158
+
159
+ | Provider | Parameters | Description |
160
+ | ------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------- |
161
+ | `provideBreakpoints()` | `bps: MqBreakpoints` | Registers a custom set of breakpoints. |
162
+ | `provideTailwindBreakpoints()` | none | Registers the default Tailwind CSS breakpoints. |
163
+ | `provideBootstrapBreakpoints()` | none | Registers the default Bootstrap breakpoints. |
164
+ | `provideMaterialBreakpoints()` | none | Registers the default Angular Material breakpoints. |
165
+ | `provideBreakpointEpsilon()` | `epsilon: number` | Sets the epsilon threshold used when comparing breakpoint values. |
166
+ | `provideSsrValue()` | `value: boolean` | Defines the static signal value used during SSR, since media queries are not available on the server. Defaults to `false`. |
167
+
156
168
  ## Types
157
169
 
158
170
  ```ts
171
+ export type MqBreakpoints = Record<string, number>;
172
+
159
173
  export interface CreateMediaQueryOptions {
174
+ /**
175
+ * Static signal value used during SSR.
176
+ */
177
+ ssrValue?: boolean;
178
+
160
179
  /**
161
180
  * A debug name for the signal. Used in Angular DevTools to identify the signal.
162
181
  */
@@ -28,6 +28,10 @@ const MQ_BREAKPOINT_EPSILON = new InjectionToken('MQ_BREAKPOINT_EPSILON', {
28
28
  providedIn: 'root',
29
29
  factory: () => DEFAULT_BREAKPOINT_EPSILON,
30
30
  });
31
+ const NGX_MQ_SSR_VALUE = new InjectionToken('NGX_MQ_SSR_VALUE', {
32
+ providedIn: 'root',
33
+ factory: () => false,
34
+ });
31
35
 
32
36
  function assertBreakpointsProvided() {
33
37
  const breakpoints = inject(MQ_BREAKPOINTS, { optional: true });
@@ -109,10 +113,10 @@ const createMqHandle = (query) => {
109
113
  addChangeListenerToMql(mql, onChange);
110
114
  return { mql, signal: signal$1, onChange, retainers: new Set() };
111
115
  };
112
- function retain(query, token) {
113
- // SSR-safe fallback
116
+ function retain(query, token, ssrValue) {
117
+ // SSR mode
114
118
  if (typeof globalThis.matchMedia !== 'function') {
115
- return signal(false).asReadonly();
119
+ return signal(ssrValue).asReadonly();
116
120
  }
117
121
  const registry = getRegistry();
118
122
  let handle = registry.get(query);
@@ -152,18 +156,20 @@ function _resetRegistry() {
152
156
  registry.clear();
153
157
  }
154
158
 
155
- function retainUntilDestroy(query) {
159
+ function retainUntilDestroy(query, ssrValue) {
156
160
  const destroyRef = inject(DestroyRef);
157
- const querySignal = retain(query, destroyRef);
161
+ const querySignal = retain(query, destroyRef, ssrValue);
158
162
  destroyRef.onDestroy(() => release(query, destroyRef));
159
163
  return querySignal;
160
164
  }
161
165
 
162
- function createConsumer(query, debugName) {
163
- const querySignal = retainUntilDestroy(query);
166
+ function createConsumer(query, options) {
167
+ const defaultSsrValue = inject(NGX_MQ_SSR_VALUE);
168
+ const effectiveSsrValue = options?.ssrValue ?? defaultSsrValue;
169
+ const querySignal = retainUntilDestroy(query, effectiveSsrValue);
164
170
  const getter = createComputed(() => querySignal());
165
171
  if (isDevMode()) {
166
- getter[SIGNAL].debugName = debugName;
172
+ getter[SIGNAL].debugName = options?.debugName;
167
173
  }
168
174
  return getter;
169
175
  }
@@ -178,14 +184,14 @@ function normalizeQuery(value) {
178
184
  function up(bp, options) {
179
185
  isDevMode() && assertInInjectionContext(up);
180
186
  const query = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);
181
- const consumer = createConsumer(query, options?.debugName);
187
+ const consumer = createConsumer(query, options);
182
188
  consumer.toString = () => createConsumerLabel(`up(${bp})`);
183
189
  return consumer;
184
190
  }
185
191
  function down(bp, options) {
186
192
  isDevMode() && assertInInjectionContext(down);
187
193
  const query = normalizeQuery(`(max-width: ${applyMaxEpsilon(resolveBreakpoint(bp))}px)`);
188
- const consumer = createConsumer(query, options?.debugName);
194
+ const consumer = createConsumer(query, options);
189
195
  consumer.toString = () => createConsumerLabel(`down(${bp})`);
190
196
  return consumer;
191
197
  }
@@ -194,42 +200,49 @@ function between(minBp, maxBp, options) {
194
200
  const minPx = resolveBreakpoint(minBp);
195
201
  const maxPx = resolveBreakpoint(maxBp);
196
202
  const query = normalizeQuery(`(min-width: ${minPx}px) and (max-width: ${applyMaxEpsilon(maxPx)}px)`);
197
- const consumer = createConsumer(query, options?.debugName);
203
+ const consumer = createConsumer(query, options);
198
204
  consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);
199
205
  return consumer;
200
206
  }
201
207
  function orientation(value, options) {
202
208
  isDevMode() && assertInInjectionContext(orientation);
203
209
  const query = normalizeQuery(`(orientation: ${value})`);
204
- const consumer = createConsumer(query, options?.debugName);
210
+ const consumer = createConsumer(query, options);
205
211
  consumer.toString = () => createConsumerLabel(`orientation(${value})`);
206
212
  return consumer;
207
213
  }
208
214
  function colorScheme(value, options) {
209
215
  isDevMode() && assertInInjectionContext(colorScheme);
210
216
  const query = normalizeQuery(`(prefers-color-scheme: ${value})`);
211
- const consumer = createConsumer(query, options?.debugName);
217
+ const consumer = createConsumer(query, options);
212
218
  consumer.toString = () => createConsumerLabel(`colorScheme(${value})`);
213
219
  return consumer;
214
220
  }
215
221
  function displayMode(value, options) {
216
222
  isDevMode() && assertInInjectionContext(displayMode);
217
223
  const query = normalizeQuery(`(display-mode: ${value})`);
218
- const consumer = createConsumer(query, options?.debugName);
224
+ const consumer = createConsumer(query, options);
219
225
  consumer.toString = () => createConsumerLabel(`displayMode(${value})`);
220
226
  return consumer;
221
227
  }
222
228
  function reducedMotion(options) {
223
229
  isDevMode() && assertInInjectionContext(reducedMotion);
224
230
  const query = normalizeQuery('(prefers-reduced-motion: reduce)');
225
- const consumer = createConsumer(query, options?.debugName);
231
+ const consumer = createConsumer(query, options);
226
232
  consumer.toString = () => createConsumerLabel('reducedMotion');
227
233
  return consumer;
228
234
  }
235
+ function hover(options) {
236
+ isDevMode() && assertInInjectionContext(hover);
237
+ const query = normalizeQuery('(hover: hover)');
238
+ const consumer = createConsumer(query, options);
239
+ consumer.toString = () => createConsumerLabel('hover');
240
+ return consumer;
241
+ }
229
242
  function matchMediaSignal(query, options) {
230
243
  isDevMode() && assertInInjectionContext(matchMediaSignal);
231
244
  const media = normalizeQuery(query);
232
- const consumer = createConsumer(media, options?.debugName);
245
+ const consumer = createConsumer(media, options);
233
246
  consumer.toString = () => createConsumerLabel(`matchMediaSignal(${query})`);
234
247
  return consumer;
235
248
  }
@@ -251,10 +264,13 @@ function provideBreakpointEpsilon(epsilon = DEFAULT_BREAKPOINT_EPSILON) {
251
264
  validateEpsilon(epsilon);
252
265
  return { provide: MQ_BREAKPOINT_EPSILON, useValue: epsilon };
253
266
  }
267
+ function provideSsrValue(value) {
268
+ return { provide: NGX_MQ_SSR_VALUE, useValue: value };
269
+ }
254
270
 
255
271
  /**
256
272
  * Generated bundle index. Do not edit.
257
273
  */
258
274
 
259
- export { MQ_BREAKPOINTS, MQ_BREAKPOINT_EPSILON, between, colorScheme, displayMode, down, matchMediaSignal, orientation, provideBootstrapBreakpoints, provideBreakpointEpsilon, provideBreakpoints, provideMaterialBreakpoints, provideTailwindBreakpoints, reducedMotion, up };
275
+ export { MQ_BREAKPOINTS, MQ_BREAKPOINT_EPSILON, NGX_MQ_SSR_VALUE, between, colorScheme, displayMode, down, hover, matchMediaSignal, orientation, provideBootstrapBreakpoints, provideBreakpointEpsilon, provideBreakpoints, provideMaterialBreakpoints, provideSsrValue, provideTailwindBreakpoints, reducedMotion, up };
260
276
  //# sourceMappingURL=ngx-mq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-mq.mjs","sources":["../../src/lib/constants.ts","../../src/lib/tokens.ts","../../src/lib/utils/breakpoints.utils.ts","../../src/lib/mql-registry/mql-registry.listeners.ts","../../src/lib/mql-registry/mql-registry.ts","../../src/lib/mql-registry/mql-registry.extensions.ts","../../src/lib/core.ts","../../src/lib/utils/common.utils.ts","../../src/lib/api.ts","../../src/lib/providers.ts","../../src/ngx-mq.ts"],"sourcesContent":["import { MqBreakpoints } from './models';\n\nexport const TAILWIND_BREAKPOINTS: MqBreakpoints = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\nexport const BOOTSTRAP_BREAKPOINTS: MqBreakpoints = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400,\n};\n\nexport const MATERIAL_BREAKPOINTS: MqBreakpoints = {\n sm: 600,\n md: 905,\n lg: 1240,\n xl: 1440,\n};\n\nexport const DEFAULT_BREAKPOINT_EPSILON: number = 0.02;\n","import { InjectionToken } from '@angular/core';\nimport { DEFAULT_BREAKPOINT_EPSILON } from './constants';\nimport { MqBreakpoints } from './models';\n\nexport const MQ_BREAKPOINTS: InjectionToken<MqBreakpoints> = new InjectionToken('MQ_BREAKPOINTS');\n\nexport const MQ_BREAKPOINT_EPSILON: InjectionToken<number> = new InjectionToken('MQ_BREAKPOINT_EPSILON', {\n providedIn: 'root',\n factory: () => DEFAULT_BREAKPOINT_EPSILON,\n});\n","import { inject, isDevMode } from '@angular/core';\nimport { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS } from '../tokens';\nimport { MqBreakpoints } from '../models';\n\nfunction assertBreakpointsProvided(): MqBreakpoints {\n const breakpoints: MqBreakpoints | null = inject(MQ_BREAKPOINTS, { optional: true });\n\n if (isDevMode() && !breakpoints) {\n throw new Error(\n '[ngx-mq]: No breakpoints provided.\\n' +\n 'Please configure your app with provideBreakpoints(), ' +\n 'or use one of the built-in presets: ' +\n 'provideTailwindBreakpoints(), provideBootstrapBreakpoints(), provideMaterialBreakpoints().'\n );\n }\n\n return breakpoints!;\n}\n\nfunction assertBreakpointExists(bp: string, breakpoints: MqBreakpoints): number {\n if (isDevMode() && !(bp in breakpoints)) {\n throw new Error(\n `[ngx-mq]: Breakpoint \"${bp}\" not found in provided configuration.\\n` +\n `Available breakpoints: ${Object.keys(breakpoints).join(', ')}.`\n );\n }\n\n return breakpoints[bp];\n}\n\nexport function resolveBreakpoint(bp: string): number {\n const breakpoints: MqBreakpoints = assertBreakpointsProvided();\n\n return assertBreakpointExists(bp, breakpoints);\n}\n\nexport function normalizeBreakpoints(bps: MqBreakpoints): Readonly<MqBreakpoints> {\n const out: Record<string, number> = {};\n\n for (const [rawKey, value] of Object.entries(bps)) {\n const key = rawKey.trim();\n\n if (isDevMode()) {\n if (!Number.isFinite(value)) {\n throw new Error(`[ngx-mq] Breakpoint \"${key}\" must be a finite number, got ${value}.`);\n }\n\n if (value <= 0) {\n throw new Error(`[ngx-mq] Breakpoint \"${key}\" must be > 0, got ${value}.`);\n }\n }\n\n out[key] = value;\n }\n\n return Object.freeze(out);\n}\n\nexport function validateEpsilon(epsilon: number): void {\n if (!Number.isFinite(epsilon) || epsilon <= 0 || epsilon > 1) {\n throw new Error(`[ngx-mq] Epsilon must be in (0, 1]. Got: ${epsilon}`);\n }\n}\n\nexport function applyMaxEpsilon(value: number): number {\n const epsilon: number = inject(MQ_BREAKPOINT_EPSILON, { optional: true }) ?? 0.02;\n\n return value - epsilon;\n}\n","export function addChangeListenerToMql(mql: MediaQueryList, onChange: (event?: MediaQueryListEvent) => void): void {\n if (typeof mql.addEventListener === 'function') {\n // Modern browsers\n mql.addEventListener('change', onChange);\n } else {\n // Legacy fallback (Safari < 14)\n (mql as any).addListener(onChange);\n }\n}\n\nexport function removeChangeListenerFromMql(\n mql: MediaQueryList,\n onChange: (event?: MediaQueryListEvent) => void\n): void {\n if (typeof mql.removeEventListener === 'function') {\n // Modern browsers\n mql.removeEventListener('change', onChange);\n } else {\n // Legacy fallback (Safari < 14)\n (mql as any).removeListener(onChange);\n }\n}\n","import { signal as createSignal, Signal, WritableSignal } from '@angular/core';\nimport { addChangeListenerToMql, removeChangeListenerFromMql } from './mql-registry.listeners';\nimport { MqlRegistry, MqRetainToken, MqHandle } from './mql-registry.models';\n\nconst REGISTRY_KEY: symbol = Symbol.for('ngx-mq:mql-registry');\n\nconst getRegistry = (): MqlRegistry => {\n const realmGlobal: Record<PropertyKey, unknown> = globalThis;\n\n return (realmGlobal[REGISTRY_KEY] ??= new Map()) as MqlRegistry;\n};\n\nconst createMqHandle = (query: string): MqHandle => {\n const mql: MediaQueryList = matchMedia(query);\n const signal: WritableSignal<boolean> = createSignal(mql.matches, { debugName: `ngx-mq: ${query}` });\n\n const onChange = (event?: MediaQueryListEvent) => signal.set(event?.matches ?? mql.matches);\n\n addChangeListenerToMql(mql, onChange);\n\n return { mql, signal, onChange, retainers: new Set() };\n};\n\nexport function retain(query: string, token: MqRetainToken): Signal<boolean> {\n // SSR-safe fallback\n if (typeof globalThis.matchMedia !== 'function') {\n return createSignal(false).asReadonly();\n }\n\n const registry: MqlRegistry = getRegistry();\n\n let handle: MqHandle | undefined = registry.get(query);\n\n if (!handle) {\n handle = createMqHandle(query);\n registry.set(query, handle);\n }\n\n handle.retainers.add(token);\n\n return handle.signal.asReadonly();\n}\n\nexport function release(query: string, token: MqRetainToken): boolean {\n const registry: MqlRegistry = getRegistry();\n\n let handle: MqHandle | undefined = registry.get(query);\n\n if (!handle) return false;\n\n const removed: boolean = handle.retainers.delete(token);\n\n if (handle.retainers.size === 0) {\n removeChangeListenerFromMql(handle.mql, handle.onChange);\n registry.delete(query);\n }\n\n return removed;\n}\n\n/* @internal\n * Returns the current registry (used only in tests).\n */\nexport function _getRegistry(): MqlRegistry {\n return getRegistry();\n}\n\n/* @internal\n * Clears all registry entries and removes media-query listeners.\n */\nexport function _resetRegistry(): void {\n const registry: MqlRegistry = getRegistry();\n\n registry.forEach((handle: MqHandle) => {\n removeChangeListenerFromMql(handle.mql, handle.onChange);\n });\n\n registry.clear();\n}\n","import { DestroyRef, inject, Signal } from '@angular/core';\nimport { retain, release } from './mql-registry';\n\nexport function retainUntilDestroy(query: string): Signal<boolean> {\n const destroyRef: DestroyRef = inject(DestroyRef);\n\n const querySignal: Signal<boolean> = retain(query, destroyRef);\n\n destroyRef.onDestroy(() => release(query, destroyRef));\n\n return querySignal;\n}\n","import { isDevMode, Signal } from '@angular/core';\nimport { createComputed, SIGNAL } from '@angular/core/primitives/signals';\nimport { retainUntilDestroy } from './mql-registry';\n\nexport function createConsumer(query: string, debugName?: string): Signal<boolean> {\n const querySignal: Signal<boolean> = retainUntilDestroy(query);\n\n const getter = createComputed(() => querySignal());\n\n if (isDevMode()) {\n getter[SIGNAL].debugName = debugName;\n }\n\n return getter satisfies Signal<boolean>;\n}\n\nexport function createConsumerLabel(descriptor: string): string {\n return `[NgxMq Signal: ${descriptor}]`;\n}\n","export function normalizeQuery(value: string): string {\n return value.trim().replace(/\\s+/g, ' ').toLowerCase();\n}\n","import { assertInInjectionContext, isDevMode, Signal } from '@angular/core';\nimport { applyMaxEpsilon, resolveBreakpoint } from './utils/breakpoints.utils';\nimport { CreateMediaQueryOptions, DisplayModeOption } from './models';\nimport { createConsumer, createConsumerLabel } from './core';\nimport { normalizeQuery } from './utils/common.utils';\n\nexport function up(bp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(up);\n\n const query: string = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`up(${bp})`);\n\n return consumer;\n}\n\nexport function down(bp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(down);\n\n const query: string = normalizeQuery(`(max-width: ${applyMaxEpsilon(resolveBreakpoint(bp))}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`down(${bp})`);\n\n return consumer;\n}\n\nexport function between(minBp: string, maxBp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(between);\n\n const minPx: number = resolveBreakpoint(minBp);\n const maxPx: number = resolveBreakpoint(maxBp);\n const query: string = normalizeQuery(`(min-width: ${minPx}px) and (max-width: ${applyMaxEpsilon(maxPx)}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);\n\n return consumer;\n}\n\nexport function orientation(value: 'portrait' | 'landscape', options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(orientation);\n\n const query: string = normalizeQuery(`(orientation: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`orientation(${value})`);\n\n return consumer;\n}\n\nexport function colorScheme(value: 'light' | 'dark', options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(colorScheme);\n\n const query: string = normalizeQuery(`(prefers-color-scheme: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`colorScheme(${value})`);\n\n return consumer;\n}\n\nexport function displayMode(value: DisplayModeOption, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(displayMode);\n\n const query = normalizeQuery(`(display-mode: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`displayMode(${value})`);\n\n return consumer;\n}\n\nexport function reducedMotion(options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(reducedMotion);\n\n const query: string = normalizeQuery('(prefers-reduced-motion: reduce)');\n const consumer: Signal<boolean> = createConsumer(query, options?.debugName);\n\n consumer.toString = () => createConsumerLabel('reducedMotion');\n\n return consumer;\n}\n\nexport function matchMediaSignal(query: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(matchMediaSignal);\n\n const media: string = normalizeQuery(query);\n const consumer: Signal<boolean> = createConsumer(media, options?.debugName);\n\n consumer.toString = () => createConsumerLabel(`matchMediaSignal(${query})`);\n\n return consumer;\n}\n","import { isDevMode, Provider } from '@angular/core';\nimport { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS } from './tokens';\nimport { normalizeBreakpoints, validateEpsilon } from './utils/breakpoints.utils';\nimport { MqBreakpoints } from './models';\nimport {\n BOOTSTRAP_BREAKPOINTS,\n DEFAULT_BREAKPOINT_EPSILON,\n MATERIAL_BREAKPOINTS,\n TAILWIND_BREAKPOINTS,\n} from './constants';\n\nexport function provideBreakpoints(bps: MqBreakpoints): Provider {\n return { provide: MQ_BREAKPOINTS, useValue: normalizeBreakpoints(bps) };\n}\n\nexport function provideTailwindBreakpoints(): Provider {\n return provideBreakpoints(TAILWIND_BREAKPOINTS);\n}\n\nexport function provideBootstrapBreakpoints(): Provider {\n return provideBreakpoints(BOOTSTRAP_BREAKPOINTS);\n}\n\nexport function provideMaterialBreakpoints(): Provider {\n return provideBreakpoints(MATERIAL_BREAKPOINTS);\n}\n\nexport function provideBreakpointEpsilon(epsilon: number = DEFAULT_BREAKPOINT_EPSILON): Provider {\n if (isDevMode()) validateEpsilon(epsilon);\n\n return { provide: MQ_BREAKPOINT_EPSILON, useValue: epsilon };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["signal","createSignal"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-mq.mjs","sources":["../../src/lib/constants.ts","../../src/lib/tokens.ts","../../src/lib/utils/breakpoints.utils.ts","../../src/lib/mql-registry/mql-registry.listeners.ts","../../src/lib/mql-registry/mql-registry.ts","../../src/lib/mql-registry/mql-registry.extensions.ts","../../src/lib/core.ts","../../src/lib/utils/common.utils.ts","../../src/lib/api.ts","../../src/lib/providers.ts","../../src/ngx-mq.ts"],"sourcesContent":["import { MqBreakpoints } from './models';\n\nexport const TAILWIND_BREAKPOINTS: MqBreakpoints = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\nexport const BOOTSTRAP_BREAKPOINTS: MqBreakpoints = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400,\n};\n\nexport const MATERIAL_BREAKPOINTS: MqBreakpoints = {\n sm: 600,\n md: 905,\n lg: 1240,\n xl: 1440,\n};\n\nexport const DEFAULT_BREAKPOINT_EPSILON: number = 0.02;\n","import { InjectionToken } from '@angular/core';\nimport { DEFAULT_BREAKPOINT_EPSILON } from './constants';\nimport { MqBreakpoints } from './models';\n\nexport const MQ_BREAKPOINTS: InjectionToken<MqBreakpoints> = new InjectionToken('MQ_BREAKPOINTS');\n\nexport const MQ_BREAKPOINT_EPSILON: InjectionToken<number> = new InjectionToken('MQ_BREAKPOINT_EPSILON', {\n providedIn: 'root',\n factory: () => DEFAULT_BREAKPOINT_EPSILON,\n});\n\nexport const NGX_MQ_SSR_VALUE: InjectionToken<boolean> = new InjectionToken('NGX_MQ_SSR_VALUE', {\n providedIn: 'root',\n factory: () => false,\n});\n","import { inject, isDevMode } from '@angular/core';\nimport { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS } from '../tokens';\nimport { MqBreakpoints } from '../models';\n\nfunction assertBreakpointsProvided(): MqBreakpoints {\n const breakpoints: MqBreakpoints | null = inject(MQ_BREAKPOINTS, { optional: true });\n\n if (isDevMode() && !breakpoints) {\n throw new Error(\n '[ngx-mq]: No breakpoints provided.\\n' +\n 'Please configure your app with provideBreakpoints(), ' +\n 'or use one of the built-in presets: ' +\n 'provideTailwindBreakpoints(), provideBootstrapBreakpoints(), provideMaterialBreakpoints().'\n );\n }\n\n return breakpoints!;\n}\n\nfunction assertBreakpointExists(bp: string, breakpoints: MqBreakpoints): number {\n if (isDevMode() && !(bp in breakpoints)) {\n throw new Error(\n `[ngx-mq]: Breakpoint \"${bp}\" not found in provided configuration.\\n` +\n `Available breakpoints: ${Object.keys(breakpoints).join(', ')}.`\n );\n }\n\n return breakpoints[bp];\n}\n\nexport function resolveBreakpoint(bp: string): number {\n const breakpoints: MqBreakpoints = assertBreakpointsProvided();\n\n return assertBreakpointExists(bp, breakpoints);\n}\n\nexport function normalizeBreakpoints(bps: MqBreakpoints): Readonly<MqBreakpoints> {\n const out: Record<string, number> = {};\n\n for (const [rawKey, value] of Object.entries(bps)) {\n const key = rawKey.trim();\n\n if (isDevMode()) {\n if (!Number.isFinite(value)) {\n throw new Error(`[ngx-mq] Breakpoint \"${key}\" must be a finite number, got ${value}.`);\n }\n\n if (value <= 0) {\n throw new Error(`[ngx-mq] Breakpoint \"${key}\" must be > 0, got ${value}.`);\n }\n }\n\n out[key] = value;\n }\n\n return Object.freeze(out);\n}\n\nexport function validateEpsilon(epsilon: number): void {\n if (!Number.isFinite(epsilon) || epsilon <= 0 || epsilon > 1) {\n throw new Error(`[ngx-mq] Epsilon must be in (0, 1]. Got: ${epsilon}`);\n }\n}\n\nexport function applyMaxEpsilon(value: number): number {\n const epsilon: number = inject(MQ_BREAKPOINT_EPSILON, { optional: true }) ?? 0.02;\n\n return value - epsilon;\n}\n","export function addChangeListenerToMql(mql: MediaQueryList, onChange: (event?: MediaQueryListEvent) => void): void {\n if (typeof mql.addEventListener === 'function') {\n // Modern browsers\n mql.addEventListener('change', onChange);\n } else {\n // Legacy fallback (Safari < 14)\n (mql as any).addListener(onChange);\n }\n}\n\nexport function removeChangeListenerFromMql(\n mql: MediaQueryList,\n onChange: (event?: MediaQueryListEvent) => void\n): void {\n if (typeof mql.removeEventListener === 'function') {\n // Modern browsers\n mql.removeEventListener('change', onChange);\n } else {\n // Legacy fallback (Safari < 14)\n (mql as any).removeListener(onChange);\n }\n}\n","import { signal as createSignal, Signal, WritableSignal } from '@angular/core';\nimport { addChangeListenerToMql, removeChangeListenerFromMql } from './mql-registry.listeners';\nimport { MqlRegistry, MqRetainToken, MqHandle } from './mql-registry.models';\n\nconst REGISTRY_KEY: symbol = Symbol.for('ngx-mq:mql-registry');\n\nconst getRegistry = (): MqlRegistry => {\n const realmGlobal: Record<PropertyKey, unknown> = globalThis;\n\n return (realmGlobal[REGISTRY_KEY] ??= new Map()) as MqlRegistry;\n};\n\nconst createMqHandle = (query: string): MqHandle => {\n const mql: MediaQueryList = matchMedia(query);\n const signal: WritableSignal<boolean> = createSignal(mql.matches, { debugName: `ngx-mq: ${query}` });\n\n const onChange = (event?: MediaQueryListEvent) => signal.set(event?.matches ?? mql.matches);\n\n addChangeListenerToMql(mql, onChange);\n\n return { mql, signal, onChange, retainers: new Set() };\n};\n\nexport function retain(query: string, token: MqRetainToken, ssrValue: boolean): Signal<boolean> {\n // SSR mode\n if (typeof globalThis.matchMedia !== 'function') {\n return createSignal(ssrValue).asReadonly();\n }\n\n const registry: MqlRegistry = getRegistry();\n\n let handle: MqHandle | undefined = registry.get(query);\n\n if (!handle) {\n handle = createMqHandle(query);\n registry.set(query, handle);\n }\n\n handle.retainers.add(token);\n\n return handle.signal.asReadonly();\n}\n\nexport function release(query: string, token: MqRetainToken): boolean {\n const registry: MqlRegistry = getRegistry();\n\n let handle: MqHandle | undefined = registry.get(query);\n\n if (!handle) return false;\n\n const removed: boolean = handle.retainers.delete(token);\n\n if (handle.retainers.size === 0) {\n removeChangeListenerFromMql(handle.mql, handle.onChange);\n registry.delete(query);\n }\n\n return removed;\n}\n\n/* @internal\n * Returns the current registry (used only in tests).\n */\nexport function _getRegistry(): MqlRegistry {\n return getRegistry();\n}\n\n/* @internal\n * Clears all registry entries and removes media-query listeners.\n */\nexport function _resetRegistry(): void {\n const registry: MqlRegistry = getRegistry();\n\n registry.forEach((handle: MqHandle) => {\n removeChangeListenerFromMql(handle.mql, handle.onChange);\n });\n\n registry.clear();\n}\n","import { DestroyRef, inject, Signal } from '@angular/core';\nimport { retain, release } from './mql-registry';\n\nexport function retainUntilDestroy(query: string, ssrValue: boolean): Signal<boolean> {\n const destroyRef: DestroyRef = inject(DestroyRef);\n\n const querySignal: Signal<boolean> = retain(query, destroyRef, ssrValue);\n\n destroyRef.onDestroy(() => release(query, destroyRef));\n\n return querySignal;\n}\n","import { isDevMode, Signal, inject } from '@angular/core';\nimport { createComputed, SIGNAL } from '@angular/core/primitives/signals';\nimport { retainUntilDestroy } from './mql-registry';\nimport { CreateMediaQueryOptions } from './models';\nimport { NGX_MQ_SSR_VALUE } from './tokens';\n\nexport function createConsumer(query: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n const defaultSsrValue: boolean = inject(NGX_MQ_SSR_VALUE);\n const effectiveSsrValue: boolean = options?.ssrValue ?? defaultSsrValue;\n\n const querySignal: Signal<boolean> = retainUntilDestroy(query, effectiveSsrValue);\n\n const getter = createComputed(() => querySignal());\n\n if (isDevMode()) {\n getter[SIGNAL].debugName = options?.debugName;\n }\n\n return getter satisfies Signal<boolean>;\n}\n\nexport function createConsumerLabel(descriptor: string): string {\n return `[NgxMq Signal: ${descriptor}]`;\n}\n","export function normalizeQuery(value: string): string {\n return value.trim().replace(/\\s+/g, ' ').toLowerCase();\n}\n","import { assertInInjectionContext, isDevMode, Signal } from '@angular/core';\nimport { applyMaxEpsilon, resolveBreakpoint } from './utils/breakpoints.utils';\nimport { CreateMediaQueryOptions, DisplayModeOption } from './models';\nimport { createConsumer, createConsumerLabel } from './core';\nimport { normalizeQuery } from './utils/common.utils';\n\nexport function up(bp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(up);\n\n const query: string = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`up(${bp})`);\n\n return consumer;\n}\n\nexport function down(bp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(down);\n\n const query: string = normalizeQuery(`(max-width: ${applyMaxEpsilon(resolveBreakpoint(bp))}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`down(${bp})`);\n\n return consumer;\n}\n\nexport function between(minBp: string, maxBp: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(between);\n\n const minPx: number = resolveBreakpoint(minBp);\n const maxPx: number = resolveBreakpoint(maxBp);\n const query: string = normalizeQuery(`(min-width: ${minPx}px) and (max-width: ${applyMaxEpsilon(maxPx)}px)`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);\n\n return consumer;\n}\n\nexport function orientation(value: 'portrait' | 'landscape', options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(orientation);\n\n const query: string = normalizeQuery(`(orientation: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`orientation(${value})`);\n\n return consumer;\n}\n\nexport function colorScheme(value: 'light' | 'dark', options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(colorScheme);\n\n const query: string = normalizeQuery(`(prefers-color-scheme: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`colorScheme(${value})`);\n\n return consumer;\n}\n\nexport function displayMode(value: DisplayModeOption, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(displayMode);\n\n const query = normalizeQuery(`(display-mode: ${value})`);\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel(`displayMode(${value})`);\n\n return consumer;\n}\n\nexport function reducedMotion(options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(reducedMotion);\n\n const query: string = normalizeQuery('(prefers-reduced-motion: reduce)');\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel('reducedMotion');\n\n return consumer;\n}\n\nexport function hover(options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(hover);\n\n const query: string = normalizeQuery('(hover: hover)');\n const consumer: Signal<boolean> = createConsumer(query, options);\n\n consumer.toString = () => createConsumerLabel('hover');\n\n return consumer;\n}\n\nexport function matchMediaSignal(query: string, options?: CreateMediaQueryOptions): Signal<boolean> {\n isDevMode() && assertInInjectionContext(matchMediaSignal);\n\n const media: string = normalizeQuery(query);\n const consumer: Signal<boolean> = createConsumer(media, options);\n\n consumer.toString = () => createConsumerLabel(`matchMediaSignal(${query})`);\n\n return consumer;\n}\n","import { isDevMode, Provider } from '@angular/core';\nimport { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS, NGX_MQ_SSR_VALUE } from './tokens';\nimport { normalizeBreakpoints, validateEpsilon } from './utils/breakpoints.utils';\nimport { MqBreakpoints } from './models';\nimport {\n BOOTSTRAP_BREAKPOINTS,\n DEFAULT_BREAKPOINT_EPSILON,\n MATERIAL_BREAKPOINTS,\n TAILWIND_BREAKPOINTS,\n} from './constants';\n\nexport function provideBreakpoints(bps: MqBreakpoints): Provider {\n return { provide: MQ_BREAKPOINTS, useValue: normalizeBreakpoints(bps) };\n}\n\nexport function provideTailwindBreakpoints(): Provider {\n return provideBreakpoints(TAILWIND_BREAKPOINTS);\n}\n\nexport function provideBootstrapBreakpoints(): Provider {\n return provideBreakpoints(BOOTSTRAP_BREAKPOINTS);\n}\n\nexport function provideMaterialBreakpoints(): Provider {\n return provideBreakpoints(MATERIAL_BREAKPOINTS);\n}\n\nexport function provideBreakpointEpsilon(epsilon: number = DEFAULT_BREAKPOINT_EPSILON): Provider {\n if (isDevMode()) validateEpsilon(epsilon);\n\n return { provide: MQ_BREAKPOINT_EPSILON, useValue: epsilon };\n}\n\nexport function provideSsrValue(value: boolean): Provider {\n return { provide: NGX_MQ_SSR_VALUE, useValue: value };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["signal","createSignal"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -2,6 +2,10 @@ import { Signal, InjectionToken, Provider } from '@angular/core';
2
2
 
3
3
  type MqBreakpoints = Record<string, number>;
4
4
  interface CreateMediaQueryOptions {
5
+ /**
6
+ * Static signal value used during SSR.
7
+ */
8
+ ssrValue?: boolean;
5
9
  /**
6
10
  * A debug name for the signal. Used in Angular DevTools to identify the signal.
7
11
  */
@@ -16,16 +20,19 @@ declare function orientation(value: 'portrait' | 'landscape', options?: CreateMe
16
20
  declare function colorScheme(value: 'light' | 'dark', options?: CreateMediaQueryOptions): Signal<boolean>;
17
21
  declare function displayMode(value: DisplayModeOption, options?: CreateMediaQueryOptions): Signal<boolean>;
18
22
  declare function reducedMotion(options?: CreateMediaQueryOptions): Signal<boolean>;
23
+ declare function hover(options?: CreateMediaQueryOptions): Signal<boolean>;
19
24
  declare function matchMediaSignal(query: string, options?: CreateMediaQueryOptions): Signal<boolean>;
20
25
 
21
26
  declare const MQ_BREAKPOINTS: InjectionToken<MqBreakpoints>;
22
27
  declare const MQ_BREAKPOINT_EPSILON: InjectionToken<number>;
28
+ declare const NGX_MQ_SSR_VALUE: InjectionToken<boolean>;
23
29
 
24
30
  declare function provideBreakpoints(bps: MqBreakpoints): Provider;
25
31
  declare function provideTailwindBreakpoints(): Provider;
26
32
  declare function provideBootstrapBreakpoints(): Provider;
27
33
  declare function provideMaterialBreakpoints(): Provider;
28
34
  declare function provideBreakpointEpsilon(epsilon?: number): Provider;
35
+ declare function provideSsrValue(value: boolean): Provider;
29
36
 
30
- export { MQ_BREAKPOINTS, MQ_BREAKPOINT_EPSILON, between, colorScheme, displayMode, down, matchMediaSignal, orientation, provideBootstrapBreakpoints, provideBreakpointEpsilon, provideBreakpoints, provideMaterialBreakpoints, provideTailwindBreakpoints, reducedMotion, up };
37
+ export { MQ_BREAKPOINTS, MQ_BREAKPOINT_EPSILON, NGX_MQ_SSR_VALUE, between, colorScheme, displayMode, down, hover, matchMediaSignal, orientation, provideBootstrapBreakpoints, provideBreakpointEpsilon, provideBreakpoints, provideMaterialBreakpoints, provideSsrValue, provideTailwindBreakpoints, reducedMotion, up };
31
38
  export type { CreateMediaQueryOptions, DisplayModeOption, MqBreakpoints };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-mq",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "Signal-powered breakpoints and media queries for Angular.",
5
5
  "repository": {
6
6
  "type": "git",