ngx-mq 1.0.1
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/LICENSE +21 -0
- package/README.md +126 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/lib/api.mjs +35 -0
- package/esm2022/lib/constants.mjs +22 -0
- package/esm2022/lib/core.mjs +10 -0
- package/esm2022/lib/models.mjs +2 -0
- package/esm2022/lib/mql-registry/index.mjs +3 -0
- package/esm2022/lib/mql-registry/mql-registry.extensions.mjs +9 -0
- package/esm2022/lib/mql-registry/mql-registry.listeners.mjs +21 -0
- package/esm2022/lib/mql-registry/mql-registry.mjs +43 -0
- package/esm2022/lib/mql-registry/mql-registry.models.mjs +2 -0
- package/esm2022/lib/providers.mjs +22 -0
- package/esm2022/lib/tokens.mjs +8 -0
- package/esm2022/lib/utils/breakpoints.utils.mjs +49 -0
- package/esm2022/lib/utils/common.utils.mjs +4 -0
- package/esm2022/ngx-mq.mjs +5 -0
- package/fesm2022/ngx-mq.mjs +213 -0
- package/fesm2022/ngx-mq.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/api.d.ts +5 -0
- package/lib/constants.d.ts +5 -0
- package/lib/core.d.ts +3 -0
- package/lib/models.d.ts +1 -0
- package/lib/mql-registry/index.d.ts +3 -0
- package/lib/mql-registry/mql-registry.d.ts +3 -0
- package/lib/mql-registry/mql-registry.extensions.d.ts +2 -0
- package/lib/mql-registry/mql-registry.listeners.d.ts +2 -0
- package/lib/mql-registry/mql-registry.models.d.ts +13 -0
- package/lib/providers.d.ts +7 -0
- package/lib/tokens.d.ts +4 -0
- package/lib/utils/breakpoints.utils.d.ts +5 -0
- package/lib/utils/common.utils.d.ts +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Myroslav Martsin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/martsinlabs/ngx-mq/refs/heads/main/assets/logo.svg" width="160" alt="ngx-mq logo" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h3 align="center">
|
|
6
|
+
Signal-Powered Breakpoints & Media Queries
|
|
7
|
+
</h3>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/ngx-mq">
|
|
11
|
+
<img src="https://img.shields.io/npm/v/ngx-mq.svg?color=#1f883d" alt="npm version" />
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/ngx-mq">
|
|
14
|
+
<img src="https://img.shields.io/npm/dm/ngx-mq.svg?color=#1f883d" alt="npm downloads" />
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://opensource.org/license/MIT">
|
|
17
|
+
<img src="https://img.shields.io/npm/l/ngx-mq.svg?color=#1f883d" alt="license" />
|
|
18
|
+
</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
## Introduction
|
|
22
|
+
|
|
23
|
+
Built on the native [matchMedia](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) API, NGX-MQ brings a signal-based and declarative way to handle breakpoints and media queries in Angular. Lifecycle management is fully automated via `DestroyRef`, removing the need for manual cleanup. Under the hood, it leverages the Multiton and Flyweight patterns for efficient instance reuse and consistent behavior across your app.
|
|
24
|
+
|
|
25
|
+
> **Tip:** Always call query utilities within Angular’s [injection context](https://v18.angular.dev/guide/di/dependency-injection-context) to keep them in sync with the framework’s lifecycle.
|
|
26
|
+
|
|
27
|
+
## Live Demo
|
|
28
|
+
|
|
29
|
+
Try it on [StackBlitz](https://stackblitz.com/github/martsinlabs/ngx-mq-demo/tree/demo/v1?file=src%2Fapp%2Fapp.component.ts)
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
Choose the package version that matches your Angular setup:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# For Angular 16–18
|
|
37
|
+
npm install ngx-mq@1
|
|
38
|
+
|
|
39
|
+
# For Angular 19–20
|
|
40
|
+
npm install ngx-mq@2
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Breakpoint API
|
|
44
|
+
|
|
45
|
+
### Configuration
|
|
46
|
+
|
|
47
|
+
Provide your map at the application bootstrap.
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { bootstrapApplication } from '@angular/platform-browser';
|
|
51
|
+
import { AppComponent } from './app/app.component';
|
|
52
|
+
import {
|
|
53
|
+
provideBreakpoints,
|
|
54
|
+
provideTailwindBreakpoints,
|
|
55
|
+
provideBootstrapBreakpoints,
|
|
56
|
+
provideMaterialBreakpoints,
|
|
57
|
+
provideBreakpointEpsilon,
|
|
58
|
+
} from 'ngx-mq';
|
|
59
|
+
|
|
60
|
+
bootstrapApplication(AppComponent, {
|
|
61
|
+
providers: [
|
|
62
|
+
// Define a custom map (keys are named ranges, values are widths in pixels)
|
|
63
|
+
provideBreakpoints({
|
|
64
|
+
sm: 640,
|
|
65
|
+
md: 768,
|
|
66
|
+
lg: 1024,
|
|
67
|
+
}),
|
|
68
|
+
|
|
69
|
+
// Or use one of the built-in presets
|
|
70
|
+
// provideTailwindBreakpoints(),
|
|
71
|
+
// provideBootstrapBreakpoints(),
|
|
72
|
+
// provideMaterialBreakpoints(),
|
|
73
|
+
|
|
74
|
+
// Configure epsilon if needed (default: 0.02)
|
|
75
|
+
provideBreakpointEpsilon(0.02),
|
|
76
|
+
],
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Available presets**
|
|
81
|
+
|
|
82
|
+
- **Tailwind** → `sm: 640, md: 768, lg: 1024, xl: 1280, 2xl: 1536`
|
|
83
|
+
- **Bootstrap** → `sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1400`
|
|
84
|
+
- **Material** → `sm: 600, md: 905, lg: 1240, xl: 1440`
|
|
85
|
+
|
|
86
|
+
> **Note**: Epsilon is a small value subtracted from upper bounds to prevent adjacent ranges from overlapping.
|
|
87
|
+
|
|
88
|
+
### BP-related utilities
|
|
89
|
+
|
|
90
|
+
| Function | Parameters | Returns | Description |
|
|
91
|
+
| --------- | ------------------------------ | ----------------- | --------------------------------------------- |
|
|
92
|
+
| `up` | `bp: string` | `Signal<boolean>` | `true` when viewport width ≥ breakpoint |
|
|
93
|
+
| `down` | `bp: string` | `Signal<boolean>` | `true` when viewport width < breakpoint |
|
|
94
|
+
| `between` | `minBp: string, maxBp: string` | `Signal<boolean>` | `true` when viewport width is in range [a, b] |
|
|
95
|
+
|
|
96
|
+
> **Tip:** Wrap these APIs into reusable helpers:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// viewport-utils.ts
|
|
100
|
+
import { Signal } from '@angular/core';
|
|
101
|
+
import { up, down, between } from 'ngx-mq';
|
|
102
|
+
|
|
103
|
+
export const isMobile = (): Signal<boolean> => down('md');
|
|
104
|
+
export const isTablet = (): Signal<boolean> => between('md', 'lg');
|
|
105
|
+
export const isDesktop = (): Signal<boolean> => up('lg');
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Generic Media Query API
|
|
111
|
+
|
|
112
|
+
Works with any valid [CSS media query](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries) and returns a `Signal<boolean>` which automatically updates when the query result changes.
|
|
113
|
+
|
|
114
|
+
| Function | Parameters | Returns | Description |
|
|
115
|
+
| ------------------ | --------------- | ----------------- | --------------------------------------------------------- |
|
|
116
|
+
| `matchMediaSignal` | `query: string` | `Signal<boolean>` | Provides a signal representing the state of a media query |
|
|
117
|
+
|
|
118
|
+
> **Tip:** Use this API for media queries that are not part of your breakpoint map.
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { Signal } from '@angular/core';
|
|
122
|
+
import { matchMediaSignal } from 'ngx-mq';
|
|
123
|
+
|
|
124
|
+
// Example: track orientation changes
|
|
125
|
+
export const isLandscape = (): Signal<boolean> => matchMediaSignal('(orientation: landscape)');
|
|
126
|
+
```
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { release } from './lib/mql-registry/mql-registry';
|
|
2
|
+
export { retainUntilDestroy } from './lib/mql-registry';
|
|
3
|
+
export * from './lib/api';
|
|
4
|
+
export * from './lib/tokens';
|
|
5
|
+
export * from './lib/providers';
|
|
6
|
+
export * from './lib/models';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhELGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyByZWxlYXNlIH0gZnJvbSAnLi9saWIvbXFsLXJlZ2lzdHJ5L21xbC1yZWdpc3RyeSc7XG5leHBvcnQgeyByZXRhaW5VbnRpbERlc3Ryb3kgfSBmcm9tICcuL2xpYi9tcWwtcmVnaXN0cnknO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Byb3ZpZGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMnO1xuIl19
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { assertInInjectionContext, isDevMode } from '@angular/core';
|
|
2
|
+
import { applyMaxEpsilon, resolveBreakpoint } from './utils/breakpoints.utils';
|
|
3
|
+
import { createConsumer, createConsumerLabel } from './core';
|
|
4
|
+
import { normalizeQuery } from './utils/common.utils';
|
|
5
|
+
export function up(bp) {
|
|
6
|
+
isDevMode() && assertInInjectionContext(up);
|
|
7
|
+
const query = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);
|
|
8
|
+
const consumer = createConsumer(query);
|
|
9
|
+
consumer.toString = () => createConsumerLabel(`up(${bp})`);
|
|
10
|
+
return consumer;
|
|
11
|
+
}
|
|
12
|
+
export function down(bp) {
|
|
13
|
+
isDevMode() && assertInInjectionContext(down);
|
|
14
|
+
const query = normalizeQuery(`(max-width: ${applyMaxEpsilon(resolveBreakpoint(bp))}px)`);
|
|
15
|
+
const consumer = createConsumer(query);
|
|
16
|
+
consumer.toString = () => createConsumerLabel(`down(${bp})`);
|
|
17
|
+
return consumer;
|
|
18
|
+
}
|
|
19
|
+
export function between(minBp, maxBp) {
|
|
20
|
+
isDevMode() && assertInInjectionContext(between);
|
|
21
|
+
const minPx = resolveBreakpoint(minBp);
|
|
22
|
+
const maxPx = resolveBreakpoint(maxBp);
|
|
23
|
+
const query = normalizeQuery(`(min-width: ${minPx}px) and (max-width: ${applyMaxEpsilon(maxPx)}px)`);
|
|
24
|
+
const consumer = createConsumer(query);
|
|
25
|
+
consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);
|
|
26
|
+
return consumer;
|
|
27
|
+
}
|
|
28
|
+
export function matchMediaSignal(query) {
|
|
29
|
+
isDevMode() && assertInInjectionContext(matchMediaSignal);
|
|
30
|
+
const media = normalizeQuery(query);
|
|
31
|
+
const consumer = createConsumer(media);
|
|
32
|
+
consumer.toString = () => createConsumerLabel(`matchMediaSignal(${query})`);
|
|
33
|
+
return consumer;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsTUFBTSxVQUFVLEVBQUUsQ0FBQyxFQUFVO0lBQzNCLFNBQVMsRUFBRSxJQUFJLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTVDLE1BQU0sS0FBSyxHQUFXLGNBQWMsQ0FBQyxlQUFlLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRixNQUFNLFFBQVEsR0FBb0IsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhELFFBQVEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLFVBQVUsSUFBSSxDQUFDLEVBQVU7SUFDN0IsU0FBUyxFQUFFLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFOUMsTUFBTSxLQUFLLEdBQVcsY0FBYyxDQUFDLGVBQWUsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sUUFBUSxHQUFvQixjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsUUFBUSxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDbEQsU0FBUyxFQUFFLElBQUksd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFakQsTUFBTSxLQUFLLEdBQVcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQVcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQVcsY0FBYyxDQUFDLGVBQWUsS0FBSyx1QkFBdUIsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RyxNQUFNLFFBQVEsR0FBb0IsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhELFFBQVEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsV0FBVyxLQUFLLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQztJQUU3RSxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWE7SUFDNUMsU0FBUyxFQUFFLElBQUksd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUxRCxNQUFNLEtBQUssR0FBVyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxRQUFRLEdBQW9CLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxRQUFRLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRTVFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGlzRGV2TW9kZSwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhcHBseU1heEVwc2lsb24sIHJlc29sdmVCcmVha3BvaW50IH0gZnJvbSAnLi91dGlscy9icmVha3BvaW50cy51dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVDb25zdW1lciwgY3JlYXRlQ29uc3VtZXJMYWJlbCB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQgeyBub3JtYWxpemVRdWVyeSB9IGZyb20gJy4vdXRpbHMvY29tbW9uLnV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVwKGJwOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICBpc0Rldk1vZGUoKSAmJiBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQodXApO1xuXG4gIGNvbnN0IHF1ZXJ5OiBzdHJpbmcgPSBub3JtYWxpemVRdWVyeShgKG1pbi13aWR0aDogJHtyZXNvbHZlQnJlYWtwb2ludChicCl9cHgpYCk7XG4gIGNvbnN0IGNvbnN1bWVyOiBTaWduYWw8Ym9vbGVhbj4gPSBjcmVhdGVDb25zdW1lcihxdWVyeSk7XG5cbiAgY29uc3VtZXIudG9TdHJpbmcgPSAoKSA9PiBjcmVhdGVDb25zdW1lckxhYmVsKGB1cCgke2JwfSlgKTtcblxuICByZXR1cm4gY29uc3VtZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3duKGJwOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICBpc0Rldk1vZGUoKSAmJiBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoZG93bik7XG5cbiAgY29uc3QgcXVlcnk6IHN0cmluZyA9IG5vcm1hbGl6ZVF1ZXJ5KGAobWF4LXdpZHRoOiAke2FwcGx5TWF4RXBzaWxvbihyZXNvbHZlQnJlYWtwb2ludChicCkpfXB4KWApO1xuICBjb25zdCBjb25zdW1lcjogU2lnbmFsPGJvb2xlYW4+ID0gY3JlYXRlQ29uc3VtZXIocXVlcnkpO1xuXG4gIGNvbnN1bWVyLnRvU3RyaW5nID0gKCkgPT4gY3JlYXRlQ29uc3VtZXJMYWJlbChgZG93bigke2JwfSlgKTtcblxuICByZXR1cm4gY29uc3VtZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiZXR3ZWVuKG1pbkJwOiBzdHJpbmcsIG1heEJwOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICBpc0Rldk1vZGUoKSAmJiBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoYmV0d2Vlbik7XG5cbiAgY29uc3QgbWluUHg6IG51bWJlciA9IHJlc29sdmVCcmVha3BvaW50KG1pbkJwKTtcbiAgY29uc3QgbWF4UHg6IG51bWJlciA9IHJlc29sdmVCcmVha3BvaW50KG1heEJwKTtcbiAgY29uc3QgcXVlcnk6IHN0cmluZyA9IG5vcm1hbGl6ZVF1ZXJ5KGAobWluLXdpZHRoOiAke21pblB4fXB4KSBhbmQgKG1heC13aWR0aDogJHthcHBseU1heEVwc2lsb24obWF4UHgpfXB4KWApO1xuICBjb25zdCBjb25zdW1lcjogU2lnbmFsPGJvb2xlYW4+ID0gY3JlYXRlQ29uc3VtZXIocXVlcnkpO1xuXG4gIGNvbnN1bWVyLnRvU3RyaW5nID0gKCkgPT4gY3JlYXRlQ29uc3VtZXJMYWJlbChgYmV0d2Vlbigke21pbkJwfSwgJHttYXhCcH0pYCk7XG5cbiAgcmV0dXJuIGNvbnN1bWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hNZWRpYVNpZ25hbChxdWVyeTogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4+IHtcbiAgaXNEZXZNb2RlKCkgJiYgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KG1hdGNoTWVkaWFTaWduYWwpO1xuXG4gIGNvbnN0IG1lZGlhOiBzdHJpbmcgPSBub3JtYWxpemVRdWVyeShxdWVyeSk7XG4gIGNvbnN0IGNvbnN1bWVyOiBTaWduYWw8Ym9vbGVhbj4gPSBjcmVhdGVDb25zdW1lcihtZWRpYSk7XG5cbiAgY29uc3VtZXIudG9TdHJpbmcgPSAoKSA9PiBjcmVhdGVDb25zdW1lckxhYmVsKGBtYXRjaE1lZGlhU2lnbmFsKCR7cXVlcnl9KWApO1xuXG4gIHJldHVybiBjb25zdW1lcjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const TAILWIND_BREAKPOINTS = {
|
|
2
|
+
sm: 640,
|
|
3
|
+
md: 768,
|
|
4
|
+
lg: 1024,
|
|
5
|
+
xl: 1280,
|
|
6
|
+
'2xl': 1536,
|
|
7
|
+
};
|
|
8
|
+
export const BOOTSTRAP_BREAKPOINTS = {
|
|
9
|
+
sm: 576,
|
|
10
|
+
md: 768,
|
|
11
|
+
lg: 992,
|
|
12
|
+
xl: 1200,
|
|
13
|
+
xxl: 1400,
|
|
14
|
+
};
|
|
15
|
+
export const MATERIAL_BREAKPOINTS = {
|
|
16
|
+
sm: 600,
|
|
17
|
+
md: 905,
|
|
18
|
+
lg: 1240,
|
|
19
|
+
xl: 1440,
|
|
20
|
+
};
|
|
21
|
+
export const DEFAULT_BREAKPOINT_EPSILON = 0.02;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWtCO0lBQ2pELEVBQUUsRUFBRSxHQUFHO0lBQ1AsRUFBRSxFQUFFLEdBQUc7SUFDUCxFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWtCO0lBQ2xELEVBQUUsRUFBRSxHQUFHO0lBQ1AsRUFBRSxFQUFFLEdBQUc7SUFDUCxFQUFFLEVBQUUsR0FBRztJQUNQLEVBQUUsRUFBRSxJQUFJO0lBQ1IsR0FBRyxFQUFFLElBQUk7Q0FDVixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWtCO0lBQ2pELEVBQUUsRUFBRSxHQUFHO0lBQ1AsRUFBRSxFQUFFLEdBQUc7SUFDUCxFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0NBQ1QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFXLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1xQnJlYWtwb2ludHMgfSBmcm9tICcuL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBUQUlMV0lORF9CUkVBS1BPSU5UUzogTXFCcmVha3BvaW50cyA9IHtcbiAgc206IDY0MCxcbiAgbWQ6IDc2OCxcbiAgbGc6IDEwMjQsXG4gIHhsOiAxMjgwLFxuICAnMnhsJzogMTUzNixcbn07XG5cbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfQlJFQUtQT0lOVFM6IE1xQnJlYWtwb2ludHMgPSB7XG4gIHNtOiA1NzYsXG4gIG1kOiA3NjgsXG4gIGxnOiA5OTIsXG4gIHhsOiAxMjAwLFxuICB4eGw6IDE0MDAsXG59O1xuXG5leHBvcnQgY29uc3QgTUFURVJJQUxfQlJFQUtQT0lOVFM6IE1xQnJlYWtwb2ludHMgPSB7XG4gIHNtOiA2MDAsXG4gIG1kOiA5MDUsXG4gIGxnOiAxMjQwLFxuICB4bDogMTQ0MCxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JSRUFLUE9JTlRfRVBTSUxPTjogbnVtYmVyID0gMC4wMjtcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computed } from '@angular/core';
|
|
2
|
+
import { retainUntilDestroy } from './mql-registry';
|
|
3
|
+
export function createConsumer(query) {
|
|
4
|
+
const retainRef = retainUntilDestroy(query);
|
|
5
|
+
return computed(() => retainRef.signal());
|
|
6
|
+
}
|
|
7
|
+
export function createConsumerLabel(descriptor) {
|
|
8
|
+
return `[NgxMq Signal: ${descriptor}]`;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYTtJQUMxQyxNQUFNLFNBQVMsR0FBZ0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFekQsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNwRCxPQUFPLGtCQUFrQixVQUFVLEdBQUcsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTXFSZXRhaW5SZWYsIHJldGFpblVudGlsRGVzdHJveSB9IGZyb20gJy4vbXFsLXJlZ2lzdHJ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnN1bWVyKHF1ZXJ5OiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICBjb25zdCByZXRhaW5SZWY6IE1xUmV0YWluUmVmID0gcmV0YWluVW50aWxEZXN0cm95KHF1ZXJ5KTtcblxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gcmV0YWluUmVmLnNpZ25hbCgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnN1bWVyTGFiZWwoZGVzY3JpcHRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbTmd4TXEgU2lnbmFsOiAke2Rlc2NyaXB0b3J9XWA7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE1xQnJlYWtwb2ludHMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { retain, release } from './mql-registry';
|
|
2
|
+
export { retainUntilDestroy } from './mql-registry.extensions';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21xbC1yZWdpc3RyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgcmV0YWluLCByZWxlYXNlIH0gZnJvbSAnLi9tcWwtcmVnaXN0cnknO1xuXG5leHBvcnQgeyByZXRhaW5VbnRpbERlc3Ryb3kgfSBmcm9tICcuL21xbC1yZWdpc3RyeS5leHRlbnNpb25zJztcblxuZXhwb3J0IHsgTXFSZXRhaW5Ub2tlbiwgTXFSZXRhaW5SZWYgfSBmcm9tICcuL21xbC1yZWdpc3RyeS5tb2RlbHMnO1xuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DestroyRef, inject } from '@angular/core';
|
|
2
|
+
import { retain, release } from './mql-registry';
|
|
3
|
+
export function retainUntilDestroy(query) {
|
|
4
|
+
const ref = retain(query);
|
|
5
|
+
const destroyRef = inject(DestroyRef);
|
|
6
|
+
destroyRef.onDestroy(() => release(query, ref.token));
|
|
7
|
+
return ref;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXFsLXJlZ2lzdHJ5LmV4dGVuc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21xbC1yZWdpc3RyeS9tcWwtcmVnaXN0cnkuZXh0ZW5zaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFhO0lBQzlDLE1BQU0sR0FBRyxHQUFnQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQWUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWxELFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV0RCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHJldGFpbiwgcmVsZWFzZSB9IGZyb20gJy4vbXFsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IE1xUmV0YWluUmVmIH0gZnJvbSAnLi9tcWwtcmVnaXN0cnkubW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldGFpblVudGlsRGVzdHJveShxdWVyeTogc3RyaW5nKTogTXFSZXRhaW5SZWYge1xuICBjb25zdCByZWY6IE1xUmV0YWluUmVmID0gcmV0YWluKHF1ZXJ5KTtcbiAgY29uc3QgZGVzdHJveVJlZjogRGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiByZWxlYXNlKHF1ZXJ5LCByZWYudG9rZW4pKTtcblxuICByZXR1cm4gcmVmO1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function addChangeListenerToMql(mql, onChange) {
|
|
2
|
+
if (typeof mql.addEventListener === 'function') {
|
|
3
|
+
// Modern browsers
|
|
4
|
+
mql.addEventListener('change', onChange);
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
// Legacy fallback (Safari < 14)
|
|
8
|
+
mql.addListener(onChange);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function removeChangeListenerFromMql(mql, onChange) {
|
|
12
|
+
if (typeof mql.removeEventListener === 'function') {
|
|
13
|
+
// Modern browsers
|
|
14
|
+
mql.removeEventListener('change', onChange);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// Legacy fallback (Safari < 14)
|
|
18
|
+
mql.removeListener(onChange);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXFsLXJlZ2lzdHJ5Lmxpc3RlbmVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbXFsLXJlZ2lzdHJ5L21xbC1yZWdpc3RyeS5saXN0ZW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQW1CLEVBQUUsUUFBK0M7SUFDekcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxrQkFBa0I7UUFDbEIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDO1NBQU0sQ0FBQztRQUNOLGdDQUFnQztRQUMvQixHQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxHQUFtQixFQUNuQixRQUErQztJQUUvQyxJQUFJLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xELGtCQUFrQjtRQUNsQixHQUFHLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7U0FBTSxDQUFDO1FBQ04sZ0NBQWdDO1FBQy9CLEdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYWRkQ2hhbmdlTGlzdGVuZXJUb01xbChtcWw6IE1lZGlhUXVlcnlMaXN0LCBvbkNoYW5nZTogKGV2ZW50PzogTWVkaWFRdWVyeUxpc3RFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAodHlwZW9mIG1xbC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgbXFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgZmFsbGJhY2sgKFNhZmFyaSA8IDE0KVxuICAgIChtcWwgYXMgYW55KS5hZGRMaXN0ZW5lcihvbkNoYW5nZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNoYW5nZUxpc3RlbmVyRnJvbU1xbChcbiAgbXFsOiBNZWRpYVF1ZXJ5TGlzdCxcbiAgb25DaGFuZ2U6IChldmVudD86IE1lZGlhUXVlcnlMaXN0RXZlbnQpID0+IHZvaWRcbik6IHZvaWQge1xuICBpZiAodHlwZW9mIG1xbC5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgZmFsbGJhY2sgKFNhZmFyaSA8IDE0KVxuICAgIChtcWwgYXMgYW55KS5yZW1vdmVMaXN0ZW5lcihvbkNoYW5nZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { signal as createSignal } from '@angular/core';
|
|
2
|
+
import { addChangeListenerToMql, removeChangeListenerFromMql } from './mql-registry.listeners';
|
|
3
|
+
const REGISTRY_KEY = Symbol.for('ngx-mq:mql-registry');
|
|
4
|
+
const getRegistry = () => {
|
|
5
|
+
const realmGlobal = globalThis;
|
|
6
|
+
return (realmGlobal[REGISTRY_KEY] ??= new Map());
|
|
7
|
+
};
|
|
8
|
+
const createRetainToken = (query) => Symbol(`mq-retainer:${query}`);
|
|
9
|
+
const createMqHandle = (query) => {
|
|
10
|
+
const mql = matchMedia(query);
|
|
11
|
+
const signal = createSignal(mql.matches);
|
|
12
|
+
const onChange = (event) => signal.set(event?.matches ?? mql.matches);
|
|
13
|
+
addChangeListenerToMql(mql, onChange);
|
|
14
|
+
return { mql, signal, onChange, retainers: new Set() };
|
|
15
|
+
};
|
|
16
|
+
export function retain(query) {
|
|
17
|
+
const token = createRetainToken(query);
|
|
18
|
+
// SSR-safe fallback
|
|
19
|
+
if (typeof globalThis.matchMedia !== 'function') {
|
|
20
|
+
return { signal: createSignal(false).asReadonly(), token };
|
|
21
|
+
}
|
|
22
|
+
const registry = getRegistry();
|
|
23
|
+
let handle = registry.get(query);
|
|
24
|
+
if (!handle) {
|
|
25
|
+
handle = createMqHandle(query);
|
|
26
|
+
registry.set(query, handle);
|
|
27
|
+
}
|
|
28
|
+
handle.retainers.add(token);
|
|
29
|
+
return { signal: handle.signal.asReadonly(), token };
|
|
30
|
+
}
|
|
31
|
+
export function release(query, token) {
|
|
32
|
+
const registry = getRegistry();
|
|
33
|
+
let handle = registry.get(query);
|
|
34
|
+
if (!handle)
|
|
35
|
+
return false;
|
|
36
|
+
const removed = handle.retainers.delete(token);
|
|
37
|
+
if (handle.retainers.size === 0) {
|
|
38
|
+
removeChangeListenerFromMql(handle.mql, handle.onChange);
|
|
39
|
+
registry.delete(query);
|
|
40
|
+
}
|
|
41
|
+
return removed;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXFsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tcWwtcmVnaXN0cnkvbXFsLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUcvRixNQUFNLFlBQVksR0FBVyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFL0QsTUFBTSxXQUFXLEdBQUcsR0FBZ0IsRUFBRTtJQUNwQyxNQUFNLFdBQVcsR0FBaUMsVUFBVSxDQUFDO0lBRTdELE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBZ0IsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYSxFQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUUzRixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWEsRUFBWSxFQUFFO0lBQ2pELE1BQU0sR0FBRyxHQUFtQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQTRCLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTVGLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN6RCxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWE7SUFDbEMsTUFBTSxLQUFLLEdBQWtCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXRELG9CQUFvQjtJQUNwQixJQUFJLE9BQU8sVUFBVSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQWdCLFdBQVcsRUFBRSxDQUFDO0lBRTVDLElBQUksTUFBTSxHQUF5QixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhLEVBQUUsS0FBb0I7SUFDekQsTUFBTSxRQUFRLEdBQWdCLFdBQVcsRUFBRSxDQUFDO0lBRTVDLElBQUksTUFBTSxHQUF5QixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQVksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lnbmFsIGFzIGNyZWF0ZVNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFkZENoYW5nZUxpc3RlbmVyVG9NcWwsIHJlbW92ZUNoYW5nZUxpc3RlbmVyRnJvbU1xbCB9IGZyb20gJy4vbXFsLXJlZ2lzdHJ5Lmxpc3RlbmVycyc7XG5pbXBvcnQgeyBNcWxSZWdpc3RyeSwgTXFSZXRhaW5Ub2tlbiwgTXFIYW5kbGUsIE1xUmV0YWluUmVmIH0gZnJvbSAnLi9tcWwtcmVnaXN0cnkubW9kZWxzJztcblxuY29uc3QgUkVHSVNUUllfS0VZOiBzeW1ib2wgPSBTeW1ib2wuZm9yKCduZ3gtbXE6bXFsLXJlZ2lzdHJ5Jyk7XG5cbmNvbnN0IGdldFJlZ2lzdHJ5ID0gKCk6IE1xbFJlZ2lzdHJ5ID0+IHtcbiAgY29uc3QgcmVhbG1HbG9iYWw6IFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4gPSBnbG9iYWxUaGlzO1xuXG4gIHJldHVybiAocmVhbG1HbG9iYWxbUkVHSVNUUllfS0VZXSA/Pz0gbmV3IE1hcCgpKSBhcyBNcWxSZWdpc3RyeTtcbn07XG5cbmNvbnN0IGNyZWF0ZVJldGFpblRva2VuID0gKHF1ZXJ5OiBzdHJpbmcpOiBNcVJldGFpblRva2VuID0+IFN5bWJvbChgbXEtcmV0YWluZXI6JHtxdWVyeX1gKTtcblxuY29uc3QgY3JlYXRlTXFIYW5kbGUgPSAocXVlcnk6IHN0cmluZyk6IE1xSGFuZGxlID0+IHtcbiAgY29uc3QgbXFsOiBNZWRpYVF1ZXJ5TGlzdCA9IG1hdGNoTWVkaWEocXVlcnkpO1xuICBjb25zdCBzaWduYWw6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gY3JlYXRlU2lnbmFsKG1xbC5tYXRjaGVzKTtcblxuICBjb25zdCBvbkNoYW5nZSA9IChldmVudD86IE1lZGlhUXVlcnlMaXN0RXZlbnQpID0+IHNpZ25hbC5zZXQoZXZlbnQ/Lm1hdGNoZXMgPz8gbXFsLm1hdGNoZXMpO1xuXG4gIGFkZENoYW5nZUxpc3RlbmVyVG9NcWwobXFsLCBvbkNoYW5nZSk7XG5cbiAgcmV0dXJuIHsgbXFsLCBzaWduYWwsIG9uQ2hhbmdlLCByZXRhaW5lcnM6IG5ldyBTZXQoKSB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJldGFpbihxdWVyeTogc3RyaW5nKTogTXFSZXRhaW5SZWYge1xuICBjb25zdCB0b2tlbjogTXFSZXRhaW5Ub2tlbiA9IGNyZWF0ZVJldGFpblRva2VuKHF1ZXJ5KTtcblxuICAvLyBTU1Itc2FmZSBmYWxsYmFja1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMubWF0Y2hNZWRpYSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHNpZ25hbDogY3JlYXRlU2lnbmFsKGZhbHNlKS5hc1JlYWRvbmx5KCksIHRva2VuIH07XG4gIH1cblxuICBjb25zdCByZWdpc3RyeTogTXFsUmVnaXN0cnkgPSBnZXRSZWdpc3RyeSgpO1xuXG4gIGxldCBoYW5kbGU6IE1xSGFuZGxlIHwgdW5kZWZpbmVkID0gcmVnaXN0cnkuZ2V0KHF1ZXJ5KTtcblxuICBpZiAoIWhhbmRsZSkge1xuICAgIGhhbmRsZSA9IGNyZWF0ZU1xSGFuZGxlKHF1ZXJ5KTtcbiAgICByZWdpc3RyeS5zZXQocXVlcnksIGhhbmRsZSk7XG4gIH1cblxuICBoYW5kbGUucmV0YWluZXJzLmFkZCh0b2tlbik7XG5cbiAgcmV0dXJuIHsgc2lnbmFsOiBoYW5kbGUuc2lnbmFsLmFzUmVhZG9ubHkoKSwgdG9rZW4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2UocXVlcnk6IHN0cmluZywgdG9rZW46IE1xUmV0YWluVG9rZW4pOiBib29sZWFuIHtcbiAgY29uc3QgcmVnaXN0cnk6IE1xbFJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcblxuICBsZXQgaGFuZGxlOiBNcUhhbmRsZSB8IHVuZGVmaW5lZCA9IHJlZ2lzdHJ5LmdldChxdWVyeSk7XG5cbiAgaWYgKCFoYW5kbGUpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCByZW1vdmVkOiBib29sZWFuID0gaGFuZGxlLnJldGFpbmVycy5kZWxldGUodG9rZW4pO1xuXG4gIGlmIChoYW5kbGUucmV0YWluZXJzLnNpemUgPT09IDApIHtcbiAgICByZW1vdmVDaGFuZ2VMaXN0ZW5lckZyb21NcWwoaGFuZGxlLm1xbCwgaGFuZGxlLm9uQ2hhbmdlKTtcbiAgICByZWdpc3RyeS5kZWxldGUocXVlcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlbW92ZWQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXFsLXJlZ2lzdHJ5Lm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbXFsLXJlZ2lzdHJ5L21xbC1yZWdpc3RyeS5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTXFSZXRhaW5Ub2tlbiA9IHN5bWJvbDtcblxuZXhwb3J0IGludGVyZmFjZSBNcVJldGFpblJlZiB7XG4gIHNpZ25hbDogU2lnbmFsPGJvb2xlYW4+O1xuICB0b2tlbjogTXFSZXRhaW5Ub2tlbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNcUhhbmRsZSB7XG4gIG1xbDogTWVkaWFRdWVyeUxpc3Q7XG4gIHNpZ25hbDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIG9uQ2hhbmdlOiAoZXZlbnQ/OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KSA9PiB2b2lkO1xuICByZXRhaW5lcnM6IFNldDxNcVJldGFpblRva2VuPjtcbn1cblxuZXhwb3J0IHR5cGUgTXFsUmVnaXN0cnkgPSBNYXA8c3RyaW5nLCBNcUhhbmRsZT47XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { isDevMode } from '@angular/core';
|
|
2
|
+
import { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS } from './tokens';
|
|
3
|
+
import { normalizeBreakpoints, validateEpsilon } from './utils/breakpoints.utils';
|
|
4
|
+
import { BOOTSTRAP_BREAKPOINTS, DEFAULT_BREAKPOINT_EPSILON, MATERIAL_BREAKPOINTS, TAILWIND_BREAKPOINTS, } from './constants';
|
|
5
|
+
export function provideBreakpoints(bps) {
|
|
6
|
+
return { provide: MQ_BREAKPOINTS, useValue: normalizeBreakpoints(bps) };
|
|
7
|
+
}
|
|
8
|
+
export function provideTailwindBreakpoints() {
|
|
9
|
+
return provideBreakpoints(TAILWIND_BREAKPOINTS);
|
|
10
|
+
}
|
|
11
|
+
export function provideBootstrapBreakpoints() {
|
|
12
|
+
return provideBreakpoints(BOOTSTRAP_BREAKPOINTS);
|
|
13
|
+
}
|
|
14
|
+
export function provideMaterialBreakpoints() {
|
|
15
|
+
return provideBreakpoints(MATERIAL_BREAKPOINTS);
|
|
16
|
+
}
|
|
17
|
+
export function provideBreakpointEpsilon(epsilon = DEFAULT_BREAKPOINT_EPSILON) {
|
|
18
|
+
if (isDevMode())
|
|
19
|
+
validateEpsilon(epsilon);
|
|
20
|
+
return { provide: MQ_BREAKPOINT_EPSILON, useValue: epsilon };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFrQjtJQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsT0FBTyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLE9BQU8sa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFVBQWtCLDBCQUEwQjtJQUNuRixJQUFJLFNBQVMsRUFBRTtRQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNEZXZNb2RlLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTVFfQlJFQUtQT0lOVF9FUFNJTE9OLCBNUV9CUkVBS1BPSU5UUyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJyZWFrcG9pbnRzLCB2YWxpZGF0ZUVwc2lsb24gfSBmcm9tICcuL3V0aWxzL2JyZWFrcG9pbnRzLnV0aWxzJztcbmltcG9ydCB7IE1xQnJlYWtwb2ludHMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge1xuICBCT09UU1RSQVBfQlJFQUtQT0lOVFMsXG4gIERFRkFVTFRfQlJFQUtQT0lOVF9FUFNJTE9OLFxuICBNQVRFUklBTF9CUkVBS1BPSU5UUyxcbiAgVEFJTFdJTkRfQlJFQUtQT0lOVFMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCcmVha3BvaW50cyhicHM6IE1xQnJlYWtwb2ludHMpOiBQcm92aWRlciB7XG4gIHJldHVybiB7IHByb3ZpZGU6IE1RX0JSRUFLUE9JTlRTLCB1c2VWYWx1ZTogbm9ybWFsaXplQnJlYWtwb2ludHMoYnBzKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVRhaWx3aW5kQnJlYWtwb2ludHMoKTogUHJvdmlkZXIge1xuICByZXR1cm4gcHJvdmlkZUJyZWFrcG9pbnRzKFRBSUxXSU5EX0JSRUFLUE9JTlRTKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCb290c3RyYXBCcmVha3BvaW50cygpOiBQcm92aWRlciB7XG4gIHJldHVybiBwcm92aWRlQnJlYWtwb2ludHMoQk9PVFNUUkFQX0JSRUFLUE9JTlRTKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVNYXRlcmlhbEJyZWFrcG9pbnRzKCk6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIHByb3ZpZGVCcmVha3BvaW50cyhNQVRFUklBTF9CUkVBS1BPSU5UUyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQnJlYWtwb2ludEVwc2lsb24oZXBzaWxvbjogbnVtYmVyID0gREVGQVVMVF9CUkVBS1BPSU5UX0VQU0lMT04pOiBQcm92aWRlciB7XG4gIGlmIChpc0Rldk1vZGUoKSkgdmFsaWRhdGVFcHNpbG9uKGVwc2lsb24pO1xuXG4gIHJldHVybiB7IHByb3ZpZGU6IE1RX0JSRUFLUE9JTlRfRVBTSUxPTiwgdXNlVmFsdWU6IGVwc2lsb24gfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { DEFAULT_BREAKPOINT_EPSILON } from './constants';
|
|
3
|
+
export const MQ_BREAKPOINTS = new InjectionToken('MQ_BREAKPOINTS');
|
|
4
|
+
export const MQ_BREAKPOINT_EPSILON = new InjectionToken('MQ_BREAKPOINT_EPSILON', {
|
|
5
|
+
providedIn: 'root',
|
|
6
|
+
factory: () => DEFAULT_BREAKPOINT_EPSILON,
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFrQyxJQUFJLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWxHLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUEyQixJQUFJLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRTtJQUN2RyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsMEJBQTBCO0NBQzFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX0JSRUFLUE9JTlRfRVBTSUxPTiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1xQnJlYWtwb2ludHMgfSBmcm9tICcuL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBNUV9CUkVBS1BPSU5UUzogSW5qZWN0aW9uVG9rZW48TXFCcmVha3BvaW50cz4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01RX0JSRUFLUE9JTlRTJyk7XG5cbmV4cG9ydCBjb25zdCBNUV9CUkVBS1BPSU5UX0VQU0lMT046IEluamVjdGlvblRva2VuPG51bWJlcj4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01RX0JSRUFLUE9JTlRfRVBTSUxPTicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0JSRUFLUE9JTlRfRVBTSUxPTixcbn0pO1xuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { inject, isDevMode } from '@angular/core';
|
|
2
|
+
import { MQ_BREAKPOINT_EPSILON, MQ_BREAKPOINTS } from '../tokens';
|
|
3
|
+
function assertBreakpointsProvided() {
|
|
4
|
+
const breakpoints = inject(MQ_BREAKPOINTS, { optional: true });
|
|
5
|
+
if (isDevMode() && !breakpoints) {
|
|
6
|
+
throw new Error('[ngx-mq]: No breakpoints provided.\n' +
|
|
7
|
+
'Please configure your app with provideBreakpoints(), ' +
|
|
8
|
+
'or use one of the built-in presets: ' +
|
|
9
|
+
'provideTailwindBreakpoints(), provideBootstrapBreakpoints(), provideMaterialBreakpoints().');
|
|
10
|
+
}
|
|
11
|
+
return breakpoints;
|
|
12
|
+
}
|
|
13
|
+
function assertBreakpointExists(bp, breakpoints) {
|
|
14
|
+
if (isDevMode() && !(bp in breakpoints)) {
|
|
15
|
+
throw new Error(`[ngx-mq]: Breakpoint "${bp}" not found in provided configuration.\n` +
|
|
16
|
+
`Available breakpoints: ${Object.keys(breakpoints).join(', ')}.`);
|
|
17
|
+
}
|
|
18
|
+
return breakpoints[bp];
|
|
19
|
+
}
|
|
20
|
+
export function resolveBreakpoint(bp) {
|
|
21
|
+
const breakpoints = assertBreakpointsProvided();
|
|
22
|
+
return assertBreakpointExists(bp, breakpoints);
|
|
23
|
+
}
|
|
24
|
+
export function normalizeBreakpoints(bps) {
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const [rawKey, value] of Object.entries(bps)) {
|
|
27
|
+
const key = rawKey.trim();
|
|
28
|
+
if (isDevMode()) {
|
|
29
|
+
if (!Number.isFinite(value)) {
|
|
30
|
+
throw new Error(`[ngx-mq] Breakpoint "${key}" must be a finite number, got ${value}.`);
|
|
31
|
+
}
|
|
32
|
+
if (value <= 0) {
|
|
33
|
+
throw new Error(`[ngx-mq] Breakpoint "${key}" must be > 0, got ${value}.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
out[key] = value;
|
|
37
|
+
}
|
|
38
|
+
return Object.freeze(out);
|
|
39
|
+
}
|
|
40
|
+
export function validateEpsilon(epsilon) {
|
|
41
|
+
if (!Number.isFinite(epsilon) || epsilon <= 0 || epsilon > 1) {
|
|
42
|
+
throw new Error(`[ngx-mq] Epsilon must be in (0, 1]. Got: ${epsilon}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function applyMaxEpsilon(value) {
|
|
46
|
+
const epsilon = inject(MQ_BREAKPOINT_EPSILON, { optional: true }) ?? 0.02;
|
|
47
|
+
return value - epsilon;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWtwb2ludHMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2JyZWFrcG9pbnRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHbEUsU0FBUyx5QkFBeUI7SUFDaEMsTUFBTSxXQUFXLEdBQXlCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVyRixJQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYixzQ0FBc0M7WUFDcEMsdURBQXVEO1lBQ3ZELHNDQUFzQztZQUN0Qyw0RkFBNEYsQ0FDL0YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLFdBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxFQUFVLEVBQUUsV0FBMEI7SUFDcEUsSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsRUFBRSwwQ0FBMEM7WUFDbkUsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFVO0lBQzFDLE1BQU0sV0FBVyxHQUFrQix5QkFBeUIsRUFBRSxDQUFDO0lBRS9ELE9BQU8sc0JBQXNCLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBa0I7SUFDckQsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUV2QyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUxQixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxrQ0FBa0MsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN6RixDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxzQkFBc0IsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUFlO0lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWE7SUFDM0MsTUFBTSxPQUFPLEdBQVcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO0lBRWxGLE9BQU8sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1RX0JSRUFLUE9JTlRfRVBTSUxPTiwgTVFfQlJFQUtQT0lOVFMgfSBmcm9tICcuLi90b2tlbnMnO1xuaW1wb3J0IHsgTXFCcmVha3BvaW50cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmZ1bmN0aW9uIGFzc2VydEJyZWFrcG9pbnRzUHJvdmlkZWQoKTogTXFCcmVha3BvaW50cyB7XG4gIGNvbnN0IGJyZWFrcG9pbnRzOiBNcUJyZWFrcG9pbnRzIHwgbnVsbCA9IGluamVjdChNUV9CUkVBS1BPSU5UUywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBpZiAoaXNEZXZNb2RlKCkgJiYgIWJyZWFrcG9pbnRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tuZ3gtbXFdOiBObyBicmVha3BvaW50cyBwcm92aWRlZC5cXG4nICtcbiAgICAgICAgJ1BsZWFzZSBjb25maWd1cmUgeW91ciBhcHAgd2l0aCBwcm92aWRlQnJlYWtwb2ludHMoKSwgJyArXG4gICAgICAgICdvciB1c2Ugb25lIG9mIHRoZSBidWlsdC1pbiBwcmVzZXRzOiAnICtcbiAgICAgICAgJ3Byb3ZpZGVUYWlsd2luZEJyZWFrcG9pbnRzKCksIHByb3ZpZGVCb290c3RyYXBCcmVha3BvaW50cygpLCBwcm92aWRlTWF0ZXJpYWxCcmVha3BvaW50cygpLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJyZWFrcG9pbnRzITtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QnJlYWtwb2ludEV4aXN0cyhicDogc3RyaW5nLCBicmVha3BvaW50czogTXFCcmVha3BvaW50cyk6IG51bWJlciB7XG4gIGlmIChpc0Rldk1vZGUoKSAmJiAhKGJwIGluIGJyZWFrcG9pbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBbbmd4LW1xXTogQnJlYWtwb2ludCBcIiR7YnB9XCIgbm90IGZvdW5kIGluIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uXFxuYCArXG4gICAgICAgIGBBdmFpbGFibGUgYnJlYWtwb2ludHM6ICR7T2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmpvaW4oJywgJyl9LmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJyZWFrcG9pbnRzW2JwXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCcmVha3BvaW50KGJwOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBicmVha3BvaW50czogTXFCcmVha3BvaW50cyA9IGFzc2VydEJyZWFrcG9pbnRzUHJvdmlkZWQoKTtcblxuICByZXR1cm4gYXNzZXJ0QnJlYWtwb2ludEV4aXN0cyhicCwgYnJlYWtwb2ludHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnJlYWtwb2ludHMoYnBzOiBNcUJyZWFrcG9pbnRzKTogUmVhZG9ubHk8TXFCcmVha3BvaW50cz4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtyYXdLZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhicHMpKSB7XG4gICAgY29uc3Qga2V5ID0gcmF3S2V5LnRyaW0oKTtcblxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW25neC1tcV0gQnJlYWtwb2ludCBcIiR7a2V5fVwiIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyLCBnb3QgJHt2YWx1ZX0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW25neC1tcV0gQnJlYWtwb2ludCBcIiR7a2V5fVwiIG11c3QgYmUgPiAwLCBnb3QgJHt2YWx1ZX0uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0W2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG91dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUVwc2lsb24oZXBzaWxvbjogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGVwc2lsb24pIHx8IGVwc2lsb24gPD0gMCB8fCBlcHNpbG9uID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgW25neC1tcV0gRXBzaWxvbiBtdXN0IGJlIGluICgwLCAxXS4gR290OiAke2Vwc2lsb259YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWF4RXBzaWxvbih2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZXBzaWxvbjogbnVtYmVyID0gaW5qZWN0KE1RX0JSRUFLUE9JTlRfRVBTSUxPTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyAwLjAyO1xuXG4gIHJldHVybiB2YWx1ZSAtIGVwc2lsb247XG59XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export function normalizeQuery(value) {
|
|
2
|
+
return value.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
3
|
+
}
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9jb21tb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhO0lBQzFDLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVRdWVyeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1xLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25neC1tcS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { signal, inject, DestroyRef, InjectionToken, isDevMode, computed, assertInInjectionContext } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
function addChangeListenerToMql(mql, onChange) {
|
|
4
|
+
if (typeof mql.addEventListener === 'function') {
|
|
5
|
+
// Modern browsers
|
|
6
|
+
mql.addEventListener('change', onChange);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
// Legacy fallback (Safari < 14)
|
|
10
|
+
mql.addListener(onChange);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function removeChangeListenerFromMql(mql, onChange) {
|
|
14
|
+
if (typeof mql.removeEventListener === 'function') {
|
|
15
|
+
// Modern browsers
|
|
16
|
+
mql.removeEventListener('change', onChange);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
// Legacy fallback (Safari < 14)
|
|
20
|
+
mql.removeListener(onChange);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const REGISTRY_KEY = Symbol.for('ngx-mq:mql-registry');
|
|
25
|
+
const getRegistry = () => {
|
|
26
|
+
const realmGlobal = globalThis;
|
|
27
|
+
return (realmGlobal[REGISTRY_KEY] ??= new Map());
|
|
28
|
+
};
|
|
29
|
+
const createRetainToken = (query) => Symbol(`mq-retainer:${query}`);
|
|
30
|
+
const createMqHandle = (query) => {
|
|
31
|
+
const mql = matchMedia(query);
|
|
32
|
+
const signal$1 = signal(mql.matches);
|
|
33
|
+
const onChange = (event) => signal$1.set(event?.matches ?? mql.matches);
|
|
34
|
+
addChangeListenerToMql(mql, onChange);
|
|
35
|
+
return { mql, signal: signal$1, onChange, retainers: new Set() };
|
|
36
|
+
};
|
|
37
|
+
function retain(query) {
|
|
38
|
+
const token = createRetainToken(query);
|
|
39
|
+
// SSR-safe fallback
|
|
40
|
+
if (typeof globalThis.matchMedia !== 'function') {
|
|
41
|
+
return { signal: signal(false).asReadonly(), token };
|
|
42
|
+
}
|
|
43
|
+
const registry = getRegistry();
|
|
44
|
+
let handle = registry.get(query);
|
|
45
|
+
if (!handle) {
|
|
46
|
+
handle = createMqHandle(query);
|
|
47
|
+
registry.set(query, handle);
|
|
48
|
+
}
|
|
49
|
+
handle.retainers.add(token);
|
|
50
|
+
return { signal: handle.signal.asReadonly(), token };
|
|
51
|
+
}
|
|
52
|
+
function release(query, token) {
|
|
53
|
+
const registry = getRegistry();
|
|
54
|
+
let handle = registry.get(query);
|
|
55
|
+
if (!handle)
|
|
56
|
+
return false;
|
|
57
|
+
const removed = handle.retainers.delete(token);
|
|
58
|
+
if (handle.retainers.size === 0) {
|
|
59
|
+
removeChangeListenerFromMql(handle.mql, handle.onChange);
|
|
60
|
+
registry.delete(query);
|
|
61
|
+
}
|
|
62
|
+
return removed;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function retainUntilDestroy(query) {
|
|
66
|
+
const ref = retain(query);
|
|
67
|
+
const destroyRef = inject(DestroyRef);
|
|
68
|
+
destroyRef.onDestroy(() => release(query, ref.token));
|
|
69
|
+
return ref;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const TAILWIND_BREAKPOINTS = {
|
|
73
|
+
sm: 640,
|
|
74
|
+
md: 768,
|
|
75
|
+
lg: 1024,
|
|
76
|
+
xl: 1280,
|
|
77
|
+
'2xl': 1536,
|
|
78
|
+
};
|
|
79
|
+
const BOOTSTRAP_BREAKPOINTS = {
|
|
80
|
+
sm: 576,
|
|
81
|
+
md: 768,
|
|
82
|
+
lg: 992,
|
|
83
|
+
xl: 1200,
|
|
84
|
+
xxl: 1400,
|
|
85
|
+
};
|
|
86
|
+
const MATERIAL_BREAKPOINTS = {
|
|
87
|
+
sm: 600,
|
|
88
|
+
md: 905,
|
|
89
|
+
lg: 1240,
|
|
90
|
+
xl: 1440,
|
|
91
|
+
};
|
|
92
|
+
const DEFAULT_BREAKPOINT_EPSILON = 0.02;
|
|
93
|
+
|
|
94
|
+
const MQ_BREAKPOINTS = new InjectionToken('MQ_BREAKPOINTS');
|
|
95
|
+
const MQ_BREAKPOINT_EPSILON = new InjectionToken('MQ_BREAKPOINT_EPSILON', {
|
|
96
|
+
providedIn: 'root',
|
|
97
|
+
factory: () => DEFAULT_BREAKPOINT_EPSILON,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
function assertBreakpointsProvided() {
|
|
101
|
+
const breakpoints = inject(MQ_BREAKPOINTS, { optional: true });
|
|
102
|
+
if (isDevMode() && !breakpoints) {
|
|
103
|
+
throw new Error('[ngx-mq]: No breakpoints provided.\n' +
|
|
104
|
+
'Please configure your app with provideBreakpoints(), ' +
|
|
105
|
+
'or use one of the built-in presets: ' +
|
|
106
|
+
'provideTailwindBreakpoints(), provideBootstrapBreakpoints(), provideMaterialBreakpoints().');
|
|
107
|
+
}
|
|
108
|
+
return breakpoints;
|
|
109
|
+
}
|
|
110
|
+
function assertBreakpointExists(bp, breakpoints) {
|
|
111
|
+
if (isDevMode() && !(bp in breakpoints)) {
|
|
112
|
+
throw new Error(`[ngx-mq]: Breakpoint "${bp}" not found in provided configuration.\n` +
|
|
113
|
+
`Available breakpoints: ${Object.keys(breakpoints).join(', ')}.`);
|
|
114
|
+
}
|
|
115
|
+
return breakpoints[bp];
|
|
116
|
+
}
|
|
117
|
+
function resolveBreakpoint(bp) {
|
|
118
|
+
const breakpoints = assertBreakpointsProvided();
|
|
119
|
+
return assertBreakpointExists(bp, breakpoints);
|
|
120
|
+
}
|
|
121
|
+
function normalizeBreakpoints(bps) {
|
|
122
|
+
const out = {};
|
|
123
|
+
for (const [rawKey, value] of Object.entries(bps)) {
|
|
124
|
+
const key = rawKey.trim();
|
|
125
|
+
if (isDevMode()) {
|
|
126
|
+
if (!Number.isFinite(value)) {
|
|
127
|
+
throw new Error(`[ngx-mq] Breakpoint "${key}" must be a finite number, got ${value}.`);
|
|
128
|
+
}
|
|
129
|
+
if (value <= 0) {
|
|
130
|
+
throw new Error(`[ngx-mq] Breakpoint "${key}" must be > 0, got ${value}.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
out[key] = value;
|
|
134
|
+
}
|
|
135
|
+
return Object.freeze(out);
|
|
136
|
+
}
|
|
137
|
+
function validateEpsilon(epsilon) {
|
|
138
|
+
if (!Number.isFinite(epsilon) || epsilon <= 0 || epsilon > 1) {
|
|
139
|
+
throw new Error(`[ngx-mq] Epsilon must be in (0, 1]. Got: ${epsilon}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function applyMaxEpsilon(value) {
|
|
143
|
+
const epsilon = inject(MQ_BREAKPOINT_EPSILON, { optional: true }) ?? 0.02;
|
|
144
|
+
return value - epsilon;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function createConsumer(query) {
|
|
148
|
+
const retainRef = retainUntilDestroy(query);
|
|
149
|
+
return computed(() => retainRef.signal());
|
|
150
|
+
}
|
|
151
|
+
function createConsumerLabel(descriptor) {
|
|
152
|
+
return `[NgxMq Signal: ${descriptor}]`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function normalizeQuery(value) {
|
|
156
|
+
return value.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function up(bp) {
|
|
160
|
+
isDevMode() && assertInInjectionContext(up);
|
|
161
|
+
const query = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);
|
|
162
|
+
const consumer = createConsumer(query);
|
|
163
|
+
consumer.toString = () => createConsumerLabel(`up(${bp})`);
|
|
164
|
+
return consumer;
|
|
165
|
+
}
|
|
166
|
+
function down(bp) {
|
|
167
|
+
isDevMode() && assertInInjectionContext(down);
|
|
168
|
+
const query = normalizeQuery(`(max-width: ${applyMaxEpsilon(resolveBreakpoint(bp))}px)`);
|
|
169
|
+
const consumer = createConsumer(query);
|
|
170
|
+
consumer.toString = () => createConsumerLabel(`down(${bp})`);
|
|
171
|
+
return consumer;
|
|
172
|
+
}
|
|
173
|
+
function between(minBp, maxBp) {
|
|
174
|
+
isDevMode() && assertInInjectionContext(between);
|
|
175
|
+
const minPx = resolveBreakpoint(minBp);
|
|
176
|
+
const maxPx = resolveBreakpoint(maxBp);
|
|
177
|
+
const query = normalizeQuery(`(min-width: ${minPx}px) and (max-width: ${applyMaxEpsilon(maxPx)}px)`);
|
|
178
|
+
const consumer = createConsumer(query);
|
|
179
|
+
consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);
|
|
180
|
+
return consumer;
|
|
181
|
+
}
|
|
182
|
+
function matchMediaSignal(query) {
|
|
183
|
+
isDevMode() && assertInInjectionContext(matchMediaSignal);
|
|
184
|
+
const media = normalizeQuery(query);
|
|
185
|
+
const consumer = createConsumer(media);
|
|
186
|
+
consumer.toString = () => createConsumerLabel(`matchMediaSignal(${query})`);
|
|
187
|
+
return consumer;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function provideBreakpoints(bps) {
|
|
191
|
+
return { provide: MQ_BREAKPOINTS, useValue: normalizeBreakpoints(bps) };
|
|
192
|
+
}
|
|
193
|
+
function provideTailwindBreakpoints() {
|
|
194
|
+
return provideBreakpoints(TAILWIND_BREAKPOINTS);
|
|
195
|
+
}
|
|
196
|
+
function provideBootstrapBreakpoints() {
|
|
197
|
+
return provideBreakpoints(BOOTSTRAP_BREAKPOINTS);
|
|
198
|
+
}
|
|
199
|
+
function provideMaterialBreakpoints() {
|
|
200
|
+
return provideBreakpoints(MATERIAL_BREAKPOINTS);
|
|
201
|
+
}
|
|
202
|
+
function provideBreakpointEpsilon(epsilon = DEFAULT_BREAKPOINT_EPSILON) {
|
|
203
|
+
if (isDevMode())
|
|
204
|
+
validateEpsilon(epsilon);
|
|
205
|
+
return { provide: MQ_BREAKPOINT_EPSILON, useValue: epsilon };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Generated bundle index. Do not edit.
|
|
210
|
+
*/
|
|
211
|
+
|
|
212
|
+
export { MQ_BREAKPOINTS, MQ_BREAKPOINT_EPSILON, between, down, matchMediaSignal, provideBootstrapBreakpoints, provideBreakpointEpsilon, provideBreakpoints, provideMaterialBreakpoints, provideTailwindBreakpoints, release, retainUntilDestroy, up };
|
|
213
|
+
//# sourceMappingURL=ngx-mq.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-mq.mjs","sources":["../../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/constants.ts","../../src/lib/tokens.ts","../../src/lib/utils/breakpoints.utils.ts","../../src/lib/core.ts","../../src/lib/utils/common.utils.ts","../../src/lib/api.ts","../../src/lib/providers.ts","../../src/ngx-mq.ts"],"sourcesContent":["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, WritableSignal } from '@angular/core';\nimport { addChangeListenerToMql, removeChangeListenerFromMql } from './mql-registry.listeners';\nimport { MqlRegistry, MqRetainToken, MqHandle, MqRetainRef } 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 createRetainToken = (query: string): MqRetainToken => Symbol(`mq-retainer:${query}`);\n\nconst createMqHandle = (query: string): MqHandle => {\n const mql: MediaQueryList = matchMedia(query);\n const signal: WritableSignal<boolean> = createSignal(mql.matches);\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): MqRetainRef {\n const token: MqRetainToken = createRetainToken(query);\n\n // SSR-safe fallback\n if (typeof globalThis.matchMedia !== 'function') {\n return { signal: createSignal(false).asReadonly(), token };\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 { signal: handle.signal.asReadonly(), token };\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","import { DestroyRef, inject } from '@angular/core';\nimport { retain, release } from './mql-registry';\nimport { MqRetainRef } from './mql-registry.models';\n\nexport function retainUntilDestroy(query: string): MqRetainRef {\n const ref: MqRetainRef = retain(query);\n const destroyRef: DestroyRef = inject(DestroyRef);\n\n destroyRef.onDestroy(() => release(query, ref.token));\n\n return ref;\n}\n","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","import { computed, Signal } from '@angular/core';\nimport { MqRetainRef, retainUntilDestroy } from './mql-registry';\n\nexport function createConsumer(query: string): Signal<boolean> {\n const retainRef: MqRetainRef = retainUntilDestroy(query);\n\n return computed(() => retainRef.signal());\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 { createConsumer, createConsumerLabel } from './core';\nimport { normalizeQuery } from './utils/common.utils';\n\nexport function up(bp: string): Signal<boolean> {\n isDevMode() && assertInInjectionContext(up);\n\n const query: string = normalizeQuery(`(min-width: ${resolveBreakpoint(bp)}px)`);\n const consumer: Signal<boolean> = createConsumer(query);\n\n consumer.toString = () => createConsumerLabel(`up(${bp})`);\n\n return consumer;\n}\n\nexport function down(bp: string): 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);\n\n consumer.toString = () => createConsumerLabel(`down(${bp})`);\n\n return consumer;\n}\n\nexport function between(minBp: string, maxBp: string): 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);\n\n consumer.toString = () => createConsumerLabel(`between(${minBp}, ${maxBp})`);\n\n return consumer;\n}\n\nexport function matchMediaSignal(query: string): Signal<boolean> {\n isDevMode() && assertInInjectionContext(matchMediaSignal);\n\n const media: string = normalizeQuery(query);\n const consumer: Signal<boolean> = createConsumer(media);\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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"}
|
package/index.d.ts
ADDED
package/lib/api.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
export declare function up(bp: string): Signal<boolean>;
|
|
3
|
+
export declare function down(bp: string): Signal<boolean>;
|
|
4
|
+
export declare function between(minBp: string, maxBp: string): Signal<boolean>;
|
|
5
|
+
export declare function matchMediaSignal(query: string): Signal<boolean>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MqBreakpoints } from './models';
|
|
2
|
+
export declare const TAILWIND_BREAKPOINTS: MqBreakpoints;
|
|
3
|
+
export declare const BOOTSTRAP_BREAKPOINTS: MqBreakpoints;
|
|
4
|
+
export declare const MATERIAL_BREAKPOINTS: MqBreakpoints;
|
|
5
|
+
export declare const DEFAULT_BREAKPOINT_EPSILON: number;
|
package/lib/core.d.ts
ADDED
package/lib/models.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type MqBreakpoints = Record<string, number>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Signal, WritableSignal } from '@angular/core';
|
|
2
|
+
export type MqRetainToken = symbol;
|
|
3
|
+
export interface MqRetainRef {
|
|
4
|
+
signal: Signal<boolean>;
|
|
5
|
+
token: MqRetainToken;
|
|
6
|
+
}
|
|
7
|
+
export interface MqHandle {
|
|
8
|
+
mql: MediaQueryList;
|
|
9
|
+
signal: WritableSignal<boolean>;
|
|
10
|
+
onChange: (event?: MediaQueryListEvent) => void;
|
|
11
|
+
retainers: Set<MqRetainToken>;
|
|
12
|
+
}
|
|
13
|
+
export type MqlRegistry = Map<string, MqHandle>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Provider } from '@angular/core';
|
|
2
|
+
import { MqBreakpoints } from './models';
|
|
3
|
+
export declare function provideBreakpoints(bps: MqBreakpoints): Provider;
|
|
4
|
+
export declare function provideTailwindBreakpoints(): Provider;
|
|
5
|
+
export declare function provideBootstrapBreakpoints(): Provider;
|
|
6
|
+
export declare function provideMaterialBreakpoints(): Provider;
|
|
7
|
+
export declare function provideBreakpointEpsilon(epsilon?: number): Provider;
|
package/lib/tokens.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MqBreakpoints } from '../models';
|
|
2
|
+
export declare function resolveBreakpoint(bp: string): number;
|
|
3
|
+
export declare function normalizeBreakpoints(bps: MqBreakpoints): Readonly<MqBreakpoints>;
|
|
4
|
+
export declare function validateEpsilon(epsilon: number): void;
|
|
5
|
+
export declare function applyMaxEpsilon(value: number): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeQuery(value: string): string;
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ngx-mq",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Signal-powered breakpoints and media queries for Angular.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/martsinlabs/ngx-mq.git"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/martsinlabs/ngx-mq#readme",
|
|
10
|
+
"main": "index.js",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"angular",
|
|
13
|
+
"signals",
|
|
14
|
+
"matchMedia",
|
|
15
|
+
"media-query",
|
|
16
|
+
"breakpoints",
|
|
17
|
+
"media-observer",
|
|
18
|
+
"responsive"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"author": "Myroslav Martsin",
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@angular/core": ">=16 <19",
|
|
25
|
+
"@angular/common": ">=16 <19"
|
|
26
|
+
},
|
|
27
|
+
"module": "fesm2022/ngx-mq.mjs",
|
|
28
|
+
"typings": "index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
"./package.json": {
|
|
31
|
+
"default": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./index.d.ts",
|
|
35
|
+
"esm2022": "./esm2022/ngx-mq.mjs",
|
|
36
|
+
"esm": "./esm2022/ngx-mq.mjs",
|
|
37
|
+
"default": "./fesm2022/ngx-mq.mjs"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"tslib": "^2.3.0"
|
|
42
|
+
}
|
|
43
|
+
}
|