snackng 1.0.2 → 1.1.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/CHANGELOG.md +18 -0
- package/README.md +63 -14
- package/fesm2022/snackng.mjs +30 -7
- package/fesm2022/snackng.mjs.map +1 -1
- package/package.json +1 -1
- package/types/snackng.d.ts +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -12,8 +12,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
12
12
|
- Toasts now glide into the gap left by a dismissed neighbour instead of snapping to their new
|
|
13
13
|
position. Honours `prefers-reduced-motion`.
|
|
14
14
|
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Toasts are dismissible by default.** Every toast now renders its close button, because not
|
|
18
|
+
being able to close one is the more annoying default. Turn it off globally with
|
|
19
|
+
`provideSnackng({ dismissible: false })`, or per call with `{ dismissible: false }` — the
|
|
20
|
+
per-call value still wins over the global one either way.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- `SnackngOverflow` is exported. It was already the declared type of the public
|
|
25
|
+
`SnackngConfig.overflow`, but could not be imported.
|
|
26
|
+
- Deep documentation under `docs/` — API reference, theming, recipes — linked from the README.
|
|
27
|
+
|
|
15
28
|
### Fixed
|
|
16
29
|
|
|
30
|
+
- **Custom types can be recoloured, as the docs always claimed.** `--snackng-<type>-bg`,
|
|
31
|
+
`-ink` and `-solid` were read by nothing: a type registered through `provideSnackng`
|
|
32
|
+
rendered with the `info` surface and no override reached it. A custom type's name is only
|
|
33
|
+
known at runtime, so the element now points at its own tokens. Types with no tokens set look
|
|
34
|
+
exactly as before.
|
|
17
35
|
- Bottom-anchored stacks no longer shimmer when a toast is added. The stack now fills the viewport
|
|
18
36
|
height instead of growing upward, so existing toasts keep a stable layout position and their
|
|
19
37
|
`backdrop-filter` is not re-rasterized on every add.
|
package/README.md
CHANGED
|
@@ -44,10 +44,13 @@ this.toast.warning('3 records left unreconciled.');
|
|
|
44
44
|
this.toast.danger('Could not reach the server.');
|
|
45
45
|
this.toast.info('Next sync at 18:00.');
|
|
46
46
|
|
|
47
|
-
// A title
|
|
48
|
-
this.toast.info('Import running…', { title: 'In progress', duration: 0
|
|
47
|
+
// A title and a longer life. The close button is already there.
|
|
48
|
+
this.toast.info('Import running…', { title: 'In progress', duration: 0 });
|
|
49
49
|
// duration: 0 means "stay until dismissed"
|
|
50
50
|
|
|
51
|
+
// Unless you don't want it.
|
|
52
|
+
this.toast.success('Saved.', { dismissible: false });
|
|
53
|
+
|
|
51
54
|
// An action button, and knowing how it ended.
|
|
52
55
|
const ref = this.toast.success('Movement deleted.', {
|
|
53
56
|
action: { label: 'Undo', handler: () => this.restore() },
|
|
@@ -108,10 +111,24 @@ const ref = toast.success('Item deleted', {
|
|
|
108
111
|
action: { label: 'Undo', handler: () => restore() },
|
|
109
112
|
});
|
|
110
113
|
|
|
111
|
-
ref.
|
|
112
|
-
ref.dismiss();
|
|
114
|
+
ref.id; // 'sng-4'
|
|
115
|
+
ref.dismiss(); // close it yourself; resolves with 'manual'
|
|
116
|
+
ref.afterDismissed.then((reason) => console.log(reason));
|
|
113
117
|
```
|
|
114
118
|
|
|
119
|
+
`afterDismissed` is a **promise, so it resolves once, for that one toast, and never fires
|
|
120
|
+
again** — it is not a stream. It settles after the exit animation, with one of four reasons:
|
|
121
|
+
|
|
122
|
+
| Reason | When |
|
|
123
|
+
| ------------ | --------------------------------------------------------------- |
|
|
124
|
+
| `'timeout'` | `duration` elapsed. Never with `duration: 0`. |
|
|
125
|
+
| `'action'` | The action button was clicked (unless `dismissOnClick: false`). |
|
|
126
|
+
| `'manual'` | The close button, `ref.dismiss()`, or `dismissAll()`. |
|
|
127
|
+
| `'replaced'` | Evicted under `overflow: 'dismiss-oldest'`. |
|
|
128
|
+
|
|
129
|
+
To react to _every_ toast, attach it where you create them rather than keeping one ref —
|
|
130
|
+
[full details and edge cases](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/api.md#afterdismissed).
|
|
131
|
+
|
|
115
132
|
### Options
|
|
116
133
|
|
|
117
134
|
| Option | Type | Default | |
|
|
@@ -120,7 +137,7 @@ ref.dismiss();
|
|
|
120
137
|
| `duration` | `number` | `5000` | ms before auto-dismiss; `0` keeps it open |
|
|
121
138
|
| `action` | `{ label, handler?, dismissOnClick? }` | — | Snackbar-style button |
|
|
122
139
|
| `position` | `SnackngPosition` | `'top-end'` | `top`/`bottom` × `start`/`center`/`end` |
|
|
123
|
-
| `dismissible` | `boolean` | `
|
|
140
|
+
| `dismissible` | `boolean` | `true` | Close button; `false` hides it |
|
|
124
141
|
| `politeness` | `'polite' \| 'assertive' \| 'off'` | by type | Screen-reader urgency |
|
|
125
142
|
| `style` | `SnackngStyle` | `'glass'` | Glass preset — see below |
|
|
126
143
|
| `effect` | `SnackngEffect` | `'drift'` | Surface light effect — see below |
|
|
@@ -146,8 +163,11 @@ provideSnackng({ style: 'solid' }); // global default for every toast
|
|
|
146
163
|
| `'frosted'` | Heavy blur, high tint — classic frosted glass |
|
|
147
164
|
| `'flat'` | Fully opaque, no blur — flat design, and the cleanest `backdrop-filter` fallback |
|
|
148
165
|
|
|
149
|
-
Define your own
|
|
150
|
-
|
|
166
|
+
Define your own with a `.sng-style--<name>` rule setting the five private aliases —
|
|
167
|
+
`--sng-p-tint`, `--sng-p-blur`, `--sng-p-spec`, `--sng-p-spec-size`, `--sng-p-drift-dur` — and
|
|
168
|
+
pass `{ style: '<name>' }`. **The rule has to be global**; under Angular's default emulated
|
|
169
|
+
encapsulation it silently does nothing. Same goes for `panelClass`.
|
|
170
|
+
[Example and preset values](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/theming.md#writing-your-own-preset).
|
|
151
171
|
|
|
152
172
|
`effect` adds subtle motion/light to the glass surface — it never touches the enter/exit
|
|
153
173
|
animations:
|
|
@@ -160,6 +180,8 @@ animations:
|
|
|
160
180
|
| `'none'` | Static glass, no light motion |
|
|
161
181
|
|
|
162
182
|
Both `drift` and the drift half of `both` stop under `prefers-reduced-motion: reduce`.
|
|
183
|
+
`'glare'` needs a pointer, so it is inert on touch — use `'both'` if touch users should still
|
|
184
|
+
get the drift.
|
|
163
185
|
|
|
164
186
|
### Global defaults
|
|
165
187
|
|
|
@@ -176,8 +198,8 @@ bootstrapApplication(App, {
|
|
|
176
198
|
max: 5, // visible at once
|
|
177
199
|
overflow: 'queue', // 'queue' | 'dismiss-oldest'
|
|
178
200
|
stagger: 90, // ms between releases; 0 = all at once
|
|
179
|
-
pauseOnHover: true,
|
|
180
|
-
dismissible: false
|
|
201
|
+
pauseOnHover: true, // also pauses on keyboard focus
|
|
202
|
+
dismissible: true, // close button on every toast; false hides them all
|
|
181
203
|
style: 'glass', // default glass preset for every toast
|
|
182
204
|
effect: 'drift', // 'drift' | 'glare' | 'both' | 'none'
|
|
183
205
|
types: {
|
|
@@ -201,7 +223,10 @@ The trade-off is honest: a flood of 50 errors becomes a long parade. If you'd ra
|
|
|
201
223
|
always win, `overflow: 'dismiss-oldest'` evicts the oldest visible toast to make room, and those
|
|
202
224
|
resolve `afterDismissed` with `'replaced'`.
|
|
203
225
|
|
|
204
|
-
Custom types
|
|
226
|
+
### Custom types
|
|
227
|
+
|
|
228
|
+
Register one through `provideSnackng`, then emit it with `show`. It starts from the neutral
|
|
229
|
+
surface and is recoloured through its own variables:
|
|
205
230
|
|
|
206
231
|
```ts
|
|
207
232
|
toast.show('deploy', 'Version 2.4.0 is now live in production.');
|
|
@@ -211,6 +236,7 @@ toast.show('deploy', 'Version 2.4.0 is now live in production.');
|
|
|
211
236
|
:root {
|
|
212
237
|
--snackng-deploy-bg: linear-gradient(135deg, #7c3aed, #4c1d95);
|
|
213
238
|
--snackng-deploy-ink: #ffffff;
|
|
239
|
+
--snackng-deploy-solid: #6d28d9; /* where backdrop-filter is unsupported */
|
|
214
240
|
}
|
|
215
241
|
```
|
|
216
242
|
|
|
@@ -243,7 +269,10 @@ variables anywhere they inherit to the toast (`:root` is simplest).
|
|
|
243
269
|
| `--snackng-brightness` | `1.06` |
|
|
244
270
|
| `--snackng-gloss` | `0.22` — static highlight strength |
|
|
245
271
|
| `--snackng-spec-strength` / `--snackng-spec-size` | `0.15` / `30%` — drift & glare reflection |
|
|
246
|
-
| `--snackng-drift-duration` | `4s`
|
|
272
|
+
| `--snackng-drift-duration` | `4s` — only affects `drift` / `both` |
|
|
273
|
+
| `--snackng-blur-reduced` | `10px` — under `prefers-reduced-motion` |
|
|
274
|
+
| `--snackng-shift` | `28px` — enter/exit travel; `0` under reduced motion |
|
|
275
|
+
| `--snackng-action-size` / `--snackng-action-weight` | `13px` / `600` |
|
|
247
276
|
| `--snackng-border` | `1px solid rgba(255,255,255,.22)` |
|
|
248
277
|
| `--snackng-shadow` | layered drop + inner highlight |
|
|
249
278
|
| `--snackng-min-width` / `--snackng-max-width` | `340px` / `460px` |
|
|
@@ -259,6 +288,12 @@ variables anywhere they inherit to the toast (`:root` is simplest).
|
|
|
259
288
|
|
|
260
289
|
`{type}` is `success`, `warning`, `danger`, `info`, or any custom type you register.
|
|
261
290
|
|
|
291
|
+
Your `:root` values beat presets, which beat the library defaults — the library never declares
|
|
292
|
+
a public token on the toast itself, precisely so your override wins. Note that replacing
|
|
293
|
+
`--snackng-{type}-bg` with a flat gradient disconnects `--snackng-tint` for that type, and that
|
|
294
|
+
`-solid` is only used where `backdrop-filter` is unsupported.
|
|
295
|
+
[Every variable, with the reasoning](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/theming.md).
|
|
296
|
+
|
|
262
297
|
### Using daisyUI?
|
|
263
298
|
|
|
264
299
|
snackng does **not** depend on daisyUI or Tailwind. If you happen to use them, one optional import
|
|
@@ -268,9 +303,12 @@ re-points the toast at your daisy theme, so it follows theme switching and dark
|
|
|
268
303
|
@import 'snackng/themes/daisy.css';
|
|
269
304
|
```
|
|
270
305
|
|
|
271
|
-
That maps
|
|
272
|
-
|
|
273
|
-
the glass and only borrow the hues, skip the import and set the variables
|
|
306
|
+
That maps the twelve colour variables plus `--snackng-radius` and `--snackng-font` onto daisyUI
|
|
307
|
+
semantics (note `danger` → `--color-error`). It trades the glass gradients for daisy's flat theme
|
|
308
|
+
colours — to keep the glass and only borrow the hues, skip the import and set the variables
|
|
309
|
+
yourself. Two gotchas: `--snackng-font: inherit` drops Manrope, and the bridge declares on
|
|
310
|
+
`:root`, so a `data-theme` set on a subtree rather than `<html>` will not reach the toasts.
|
|
311
|
+
[Full mapping](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/theming.md#using-daisyui).
|
|
274
312
|
|
|
275
313
|
## Accessibility
|
|
276
314
|
|
|
@@ -282,6 +320,17 @@ the glass and only borrow the hues, skip the import and set the variables yourse
|
|
|
282
320
|
The library never overrides that OS setting on your behalf.
|
|
283
321
|
- Timers pause on hover **and** on keyboard focus, so a toast can't vanish mid-read.
|
|
284
322
|
|
|
323
|
+
## Documentation
|
|
324
|
+
|
|
325
|
+
This README is the tour. The details live next to the source:
|
|
326
|
+
|
|
327
|
+
- **[API reference](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/api.md)** — every export, every option, `SnackngRef` and
|
|
328
|
+
`afterDismissed`, the precedence rules, SSR behaviour.
|
|
329
|
+
- **[Theming](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/theming.md)** — all 40-odd CSS variables with defaults, the cascade,
|
|
330
|
+
writing your own preset, the daisyUI bridge.
|
|
331
|
+
- **[Recipes](https://github.com/xgreymx/snackng/blob/main/projects/snackng/docs/recipes.md)** — HTTP interceptor, undo, custom types, wrapping the
|
|
332
|
+
service, accessibility notes.
|
|
333
|
+
|
|
285
334
|
## License
|
|
286
335
|
|
|
287
336
|
Apache-2.0
|
package/fesm2022/snackng.mjs
CHANGED
|
@@ -10,7 +10,7 @@ const SNACKNG_DEFAULTS = {
|
|
|
10
10
|
overflow: 'queue',
|
|
11
11
|
stagger: 90,
|
|
12
12
|
pauseOnHover: true,
|
|
13
|
-
dismissible:
|
|
13
|
+
dismissible: true,
|
|
14
14
|
style: 'glass',
|
|
15
15
|
effect: 'drift',
|
|
16
16
|
types: {},
|
|
@@ -99,7 +99,6 @@ const SNACKNG_ICONS = {
|
|
|
99
99
|
danger: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z',
|
|
100
100
|
info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z',
|
|
101
101
|
};
|
|
102
|
-
const SNACKNG_CLOSE_ICON = 'M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z';
|
|
103
102
|
|
|
104
103
|
/**
|
|
105
104
|
* Toast state, and the pacing of how toasts reach the screen.
|
|
@@ -274,15 +273,15 @@ class SnackngToast {
|
|
|
274
273
|
}
|
|
275
274
|
return SNACKNG_ICONS[type] ?? SNACKNG_ICONS.info;
|
|
276
275
|
}, ...(ngDevMode ? [{ debugName: "iconPath" }] : /* istanbul ignore next */ []));
|
|
277
|
-
closeIconPath = computed(() => {
|
|
278
|
-
return SNACKNG_CLOSE_ICON;
|
|
279
|
-
}, ...(ngDevMode ? [{ debugName: "closeIconPath" }] : /* istanbul ignore next */ []));
|
|
280
276
|
/** Custom types may supply raw SVG markup, trusted as authored config. */
|
|
281
277
|
iconSvg = computed(() => {
|
|
282
278
|
const custom = this.config.types[this.item().type]?.icon;
|
|
283
279
|
return custom ? this.sanitizer.bypassSecurityTrustHtml(custom) : null;
|
|
284
280
|
}, ...(ngDevMode ? [{ debugName: "iconSvg" }] : /* istanbul ignore next */ []));
|
|
285
281
|
constructor() {
|
|
282
|
+
effect(() => {
|
|
283
|
+
this.applyCustomTypeColours();
|
|
284
|
+
});
|
|
286
285
|
effect(() => {
|
|
287
286
|
if (this.item().leaving) {
|
|
288
287
|
this.stopTimer();
|
|
@@ -299,6 +298,30 @@ class SnackngToast {
|
|
|
299
298
|
}
|
|
300
299
|
});
|
|
301
300
|
}
|
|
301
|
+
/**
|
|
302
|
+
* Points a custom type's surface at its own `--snackng-<type>-*` tokens.
|
|
303
|
+
*
|
|
304
|
+
* The built-ins get theirs from a `:host(.sng--success)` rule, but a custom
|
|
305
|
+
* type's name is only known at runtime, so no stylesheet can name its tokens
|
|
306
|
+
* — the element has to. Written as properties (not `style=`) so the glare's
|
|
307
|
+
* inline `--sng-glare-*` writes survive.
|
|
308
|
+
*
|
|
309
|
+
* The fallbacks are the neutral surface `:host` already resolves to, so a
|
|
310
|
+
* type with no tokens set looks exactly as it did before.
|
|
311
|
+
*/
|
|
312
|
+
applyCustomTypeColours() {
|
|
313
|
+
const type = this.item().type;
|
|
314
|
+
// SNACKNG_ICONS is keyed by the built-ins, which own a :host rule already.
|
|
315
|
+
if (type in SNACKNG_ICONS) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const style = this.element.nativeElement.style;
|
|
319
|
+
style.setProperty('--sng-bg', `var(--snackng-${type}-bg, linear-gradient(135deg, ` +
|
|
320
|
+
`rgb(var(--sng-c1) / var(--sng-tint)), ` +
|
|
321
|
+
`rgb(var(--sng-c2) / calc(var(--sng-tint) - 0.06))))`);
|
|
322
|
+
style.setProperty('--sng-ink', `var(--snackng-${type}-ink, #ffffff)`);
|
|
323
|
+
style.setProperty('--sng-solid', `var(--snackng-${type}-solid, #47556a)`);
|
|
324
|
+
}
|
|
302
325
|
/** Writes the cursor position into CSS vars the glare layer reads. Runs
|
|
303
326
|
* outside Angular — it only mutates style, no change detection needed. */
|
|
304
327
|
bindGlare() {
|
|
@@ -385,7 +408,7 @@ class SnackngToast {
|
|
|
385
408
|
}
|
|
386
409
|
}
|
|
387
410
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SnackngToast, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
388
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: SnackngToast, isStandalone: true, selector: "sng-toast", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "mouseenter": "pause()", "mouseleave": "resume()", "focusin": "pause()", "focusout": "resume()" }, properties: { "class": "hostClasses()" } }, ngImport: i0, template: "@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n <div class=\"sng-header\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n\n @if (closeIconPath(); as closePath) {\n <div class=\"sng-close-icon\" (click)=\"onDismiss()\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"closePath\" fill=\"currentColor\" />\n </svg>\n </div>\n }\n </div>\n\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n", styles: [":host{--sng-c1: 71 85 105;--sng-c2: 40 51 69;--sng-tint: var(--snackng-tint, var(--sng-p-tint, .86));--sng-blur: var(--snackng-blur, var(--sng-p-blur, 20px));--sng-spec: var(--snackng-spec-strength, var(--sng-p-spec, .15));--sng-spec-size: var(--snackng-spec-size, var(--sng-p-spec-size, 30%));--sng-drift-dur: var(--snackng-drift-duration, var(--sng-p-drift-dur, 4s));--sng-bg: var( --snackng-info-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-info-ink, #ffffff);--sng-solid: var(--snackng-info-solid, #47556a);--sng-shift: var(--snackng-shift, 28px);position:relative;display:flex;align-items:center;gap:var(--snackng-gap, 14px);box-sizing:border-box;min-width:var(--snackng-min-width, 340px);max-width:var(--snackng-max-width, 460px);padding:var(--snackng-padding, 14px 18px);overflow:hidden;isolation:isolate;pointer-events:auto;border-radius:var(--snackng-radius, 14px);border:var(--snackng-border, 1px solid rgba(255, 255, 255, .22));background-image:var(--sng-bg);backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));-webkit-backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));box-shadow:var( --snackng-shadow, 0 1px 1px rgba(0, 0, 0, .05), 0 14px 34px -12px rgba(10, 25, 60, .6), inset 0 1px 0 rgba(255, 255, 255, .32), inset 0 -1px 1px rgba(0, 0, 0, .18) );color:var(--sng-ink);font-family:var(--snackng-font, \"Manrope\", system-ui, sans-serif);line-height:var(--snackng-line-height, 1.45)}:host(.sng--success){--sng-c1: 33 80 159;--sng-c2: 17 52 111;--sng-bg: var( --snackng-success-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-success-ink, #ffffff);--sng-solid: var(--snackng-success-solid, #21509f)}:host(.sng--danger){--sng-c1: 192 57 43;--sng-c2: 140 35 29;--sng-bg: var( --snackng-danger-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-danger-ink, #ffffff);--sng-solid: var(--snackng-danger-solid, #c0392b)}:host(.sng--warning){--sng-c1: 180 83 9;--sng-c2: 146 64 14;--sng-bg: var( --snackng-warning-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-warning-ink, #ffffff);--sng-solid: var(--snackng-warning-solid, #b45309)}:host(.sng-style--solid){--sng-p-tint: .96;--sng-p-spec: .06;--sng-p-spec-size: 28%}:host(.sng-style--translucent){--sng-p-tint: .74;--sng-p-spec: .12;--sng-p-spec-size: 40%}:host(.sng-style--transparent){--sng-p-tint: .3;--sng-p-spec: .1;--sng-p-spec-size: 30%}:host(.sng-style--frosted){--sng-p-tint: .92;--sng-p-blur: 30px;--sng-p-spec: .1}:host(.sng-style--flat){--sng-p-tint: 1;--sng-p-blur: 0px;--sng-p-spec: 0}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){:host{background-color:var(--sng-solid)}}@media(max-width:480px){:host{min-width:0;max-width:100%;width:100%}}:host:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(135deg,rgb(255 255 255 / var(--snackng-gloss, .22)) 0%,rgb(255 255 255 / calc(var(--snackng-gloss, .22) * .28)) 26%,transparent 52%)}:host:after{content:\"\";position:absolute;inset:-35%;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);background:radial-gradient(circle at 34% 24%,rgb(255 255 255 / var(--sng-spec)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--drift):after{opacity:1;animation-name:sng-sheen-drift;animation-duration:var(--sng-drift-dur);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-direction:alternate}@keyframes sng-sheen-drift{0%{transform:translate(-6%,-5%) scale(1)}to{transform:translate(10%,8%) scale(1.12)}}.sng-glare{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);transition:opacity .25s ease;background:radial-gradient(circle at var(--sng-glare-x, 50%) var(--sng-glare-y, 50%),rgb(255 255 255 / calc(var(--sng-spec) + .06)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--glare) .sng-glare{opacity:var(--sng-glare-op, 0)}.sng-close-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:8px;border:0;background:transparent;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease}.sng-close-icon:hover{background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink)}.sng-close-icon:active{background:color-mix(in srgb,var(--sng-ink) 22%,transparent);transform:scale(.92)}.sng-close-icon svg{display:block;width:18px;height:18px;fill:currentColor}.sng-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:11px;border-radius:12px;background:color-mix(in srgb,var(--sng-ink) 16%,transparent);color:var(--sng-ink)}.sng-icon svg{display:block;width:24px;height:24px;fill:currentColor}.sng-icon-custom{display:flex}.sng-icon-custom ::ng-deep svg{display:block;width:24px;height:24px;fill:currentColor}.sng-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}.sng-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.sng-title{margin:0;font-size:var(--snackng-title-size, 14px);font-weight:var(--snackng-title-weight, 700);line-height:1.3;letter-spacing:.1px;color:var(--sng-ink)}.sng-message{margin:0;font-size:var(--snackng-message-size, 13px);font-weight:var(--snackng-message-weight, 400);color:color-mix(in srgb,var(--sng-ink) 85%,transparent)}.sng-action{flex:0 0 auto;padding:7px 12px;border:1px solid color-mix(in srgb,var(--sng-ink) 32%,transparent);border-radius:8px;background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink);font:inherit;font-size:var(--snackng-action-size, 13px);font-weight:var(--snackng-action-weight, 600);cursor:pointer;transition:background .15s ease}.sng-action:hover{background:color-mix(in srgb,var(--sng-ink) 22%,transparent)}.sng-close{flex:0 0 auto;display:flex;padding:4px;border:0;border-radius:6px;background:none;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer}.sng-close:hover{background:color-mix(in srgb,var(--sng-ink) 14%,transparent);color:var(--sng-ink)}.sng-close svg{display:block;width:18px;height:18px}.sng-action:focus-visible,.sng-close:focus-visible{outline:2px solid var(--sng-ink);outline-offset:2px}@keyframes sng-in-right{0%{opacity:0;transform:translate(var(--sng-shift))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(var(--sng-shift))}}@keyframes sng-in-left{0%{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-left{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-top{0%{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-top{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-bottom{0%{opacity:0;transform:translateY(var(--sng-shift))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-bottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(var(--sng-shift))}}:host(.sng-entering){animation-duration:var(--snackng-enter-duration, .4s);animation-timing-function:cubic-bezier(0,0,.2,1);animation-fill-mode:both}:host(.sng-leaving){animation-duration:var(--snackng-exit-duration, .2s);animation-timing-function:cubic-bezier(.4,0,1,1);animation-fill-mode:both}:host(.sng-at--top-end.sng-entering),:host(.sng-at--bottom-end.sng-entering){animation-name:sng-in-right}:host(.sng-at--top-end.sng-leaving),:host(.sng-at--bottom-end.sng-leaving){animation-name:sng-out-right}:host(.sng-at--top-start.sng-entering),:host(.sng-at--bottom-start.sng-entering){animation-name:sng-in-left}:host(.sng-at--top-start.sng-leaving),:host(.sng-at--bottom-start.sng-leaving){animation-name:sng-out-left}:host(.sng-at--top-center.sng-entering){animation-name:sng-in-top}:host(.sng-at--top-center.sng-leaving){animation-name:sng-out-top}:host(.sng-at--bottom-center.sng-entering){animation-name:sng-in-bottom}:host(.sng-at--bottom-center.sng-leaving){animation-name:sng-out-bottom}@media(prefers-reduced-motion:reduce){:host{--sng-shift: 0px;--sng-blur: var(--snackng-blur-reduced, 10px)}:host(.sng-fx--drift):after{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
411
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: SnackngToast, isStandalone: true, selector: "sng-toast", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "mouseenter": "pause()", "mouseleave": "resume()", "focusin": "pause()", "focusout": "resume()" }, properties: { "class": "hostClasses()" } }, ngImport: i0, template: "@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n", styles: [":host{--sng-c1: 71 85 105;--sng-c2: 40 51 69;--sng-tint: var(--snackng-tint, var(--sng-p-tint, .86));--sng-blur: var(--snackng-blur, var(--sng-p-blur, 20px));--sng-spec: var(--snackng-spec-strength, var(--sng-p-spec, .15));--sng-spec-size: var(--snackng-spec-size, var(--sng-p-spec-size, 30%));--sng-drift-dur: var(--snackng-drift-duration, var(--sng-p-drift-dur, 4s));--sng-bg: var( --snackng-info-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-info-ink, #ffffff);--sng-solid: var(--snackng-info-solid, #47556a);--sng-shift: var(--snackng-shift, 28px);position:relative;display:flex;align-items:center;gap:var(--snackng-gap, 14px);box-sizing:border-box;min-width:var(--snackng-min-width, 340px);max-width:var(--snackng-max-width, 460px);padding:var(--snackng-padding, 14px 18px);overflow:hidden;isolation:isolate;pointer-events:auto;border-radius:var(--snackng-radius, 14px);border:var(--snackng-border, 1px solid rgba(255, 255, 255, .22));background-image:var(--sng-bg);backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));-webkit-backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));box-shadow:var( --snackng-shadow, 0 1px 1px rgba(0, 0, 0, .05), 0 14px 34px -12px rgba(10, 25, 60, .6), inset 0 1px 0 rgba(255, 255, 255, .32), inset 0 -1px 1px rgba(0, 0, 0, .18) );color:var(--sng-ink);font-family:var(--snackng-font, \"Manrope\", system-ui, sans-serif);line-height:var(--snackng-line-height, 1.45)}:host(.sng--success){--sng-c1: 33 80 159;--sng-c2: 17 52 111;--sng-bg: var( --snackng-success-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-success-ink, #ffffff);--sng-solid: var(--snackng-success-solid, #21509f)}:host(.sng--danger){--sng-c1: 192 57 43;--sng-c2: 140 35 29;--sng-bg: var( --snackng-danger-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-danger-ink, #ffffff);--sng-solid: var(--snackng-danger-solid, #c0392b)}:host(.sng--warning){--sng-c1: 180 83 9;--sng-c2: 146 64 14;--sng-bg: var( --snackng-warning-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-warning-ink, #ffffff);--sng-solid: var(--snackng-warning-solid, #b45309)}:host(.sng-style--solid){--sng-p-tint: .96;--sng-p-spec: .06;--sng-p-spec-size: 28%}:host(.sng-style--translucent){--sng-p-tint: .74;--sng-p-spec: .12;--sng-p-spec-size: 40%}:host(.sng-style--transparent){--sng-p-tint: .3;--sng-p-spec: .1;--sng-p-spec-size: 30%}:host(.sng-style--frosted){--sng-p-tint: .92;--sng-p-blur: 30px;--sng-p-spec: .1}:host(.sng-style--flat){--sng-p-tint: 1;--sng-p-blur: 0px;--sng-p-spec: 0}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){:host{background-color:var(--sng-solid)}}@media(max-width:480px){:host{min-width:0;max-width:100%;width:100%}}:host:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(135deg,rgb(255 255 255 / var(--snackng-gloss, .22)) 0%,rgb(255 255 255 / calc(var(--snackng-gloss, .22) * .28)) 26%,transparent 52%)}:host:after{content:\"\";position:absolute;inset:-35%;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);background:radial-gradient(circle at 34% 24%,rgb(255 255 255 / var(--sng-spec)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--drift):after{opacity:1;animation-name:sng-sheen-drift;animation-duration:var(--sng-drift-dur);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-direction:alternate}@keyframes sng-sheen-drift{0%{transform:translate(-6%,-5%) scale(1)}to{transform:translate(10%,8%) scale(1.12)}}.sng-glare{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);transition:opacity .25s ease;background:radial-gradient(circle at var(--sng-glare-x, 50%) var(--sng-glare-y, 50%),rgb(255 255 255 / calc(var(--sng-spec) + .06)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--glare) .sng-glare{opacity:var(--sng-glare-op, 0)}.sng-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:11px;border-radius:12px;background:color-mix(in srgb,var(--sng-ink) 16%,transparent);color:var(--sng-ink)}.sng-icon svg{display:block;width:24px;height:24px;fill:currentColor}.sng-icon-custom{display:flex}.sng-icon-custom ::ng-deep svg{display:block;width:24px;height:24px;fill:currentColor}.sng-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}.sng-title{margin:0;font-size:var(--snackng-title-size, 14px);font-weight:var(--snackng-title-weight, 700);line-height:1.3;letter-spacing:.1px;color:var(--sng-ink)}.sng-message{margin:0;font-size:var(--snackng-message-size, 13px);font-weight:var(--snackng-message-weight, 400);color:color-mix(in srgb,var(--sng-ink) 85%,transparent)}.sng-action{flex:0 0 auto;padding:7px 12px;border:1px solid color-mix(in srgb,var(--sng-ink) 32%,transparent);border-radius:8px;background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink);font:inherit;font-size:var(--snackng-action-size, 13px);font-weight:var(--snackng-action-weight, 600);cursor:pointer;transition:background .15s ease}.sng-action:hover{background:color-mix(in srgb,var(--sng-ink) 22%,transparent)}.sng-close{flex:0 0 auto;display:flex;padding:4px;border:0;border-radius:6px;background:none;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer}.sng-close:hover{background:color-mix(in srgb,var(--sng-ink) 14%,transparent);color:var(--sng-ink)}.sng-close svg{display:block;width:18px;height:18px}.sng-action:focus-visible,.sng-close:focus-visible{outline:2px solid var(--sng-ink);outline-offset:2px}@keyframes sng-in-right{0%{opacity:0;transform:translate(var(--sng-shift))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(var(--sng-shift))}}@keyframes sng-in-left{0%{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-left{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-top{0%{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-top{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-bottom{0%{opacity:0;transform:translateY(var(--sng-shift))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-bottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(var(--sng-shift))}}:host(.sng-entering){animation-duration:var(--snackng-enter-duration, .4s);animation-timing-function:cubic-bezier(0,0,.2,1);animation-fill-mode:both}:host(.sng-leaving){animation-duration:var(--snackng-exit-duration, .2s);animation-timing-function:cubic-bezier(.4,0,1,1);animation-fill-mode:both}:host(.sng-at--top-end.sng-entering),:host(.sng-at--bottom-end.sng-entering){animation-name:sng-in-right}:host(.sng-at--top-end.sng-leaving),:host(.sng-at--bottom-end.sng-leaving){animation-name:sng-out-right}:host(.sng-at--top-start.sng-entering),:host(.sng-at--bottom-start.sng-entering){animation-name:sng-in-left}:host(.sng-at--top-start.sng-leaving),:host(.sng-at--bottom-start.sng-leaving){animation-name:sng-out-left}:host(.sng-at--top-center.sng-entering){animation-name:sng-in-top}:host(.sng-at--top-center.sng-leaving){animation-name:sng-out-top}:host(.sng-at--bottom-center.sng-entering){animation-name:sng-in-bottom}:host(.sng-at--bottom-center.sng-leaving){animation-name:sng-out-bottom}@media(prefers-reduced-motion:reduce){:host{--sng-shift: 0px;--sng-blur: var(--snackng-blur-reduced, 10px)}:host(.sng-fx--drift):after{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
389
412
|
}
|
|
390
413
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SnackngToast, decorators: [{
|
|
391
414
|
type: Component,
|
|
@@ -395,7 +418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
|
|
|
395
418
|
'(mouseleave)': 'resume()',
|
|
396
419
|
'(focusin)': 'pause()',
|
|
397
420
|
'(focusout)': 'resume()',
|
|
398
|
-
}, template: "@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n <div class=\"sng-header\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n\n @if (closeIconPath(); as closePath) {\n <div class=\"sng-close-icon\" (click)=\"onDismiss()\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"closePath\" fill=\"currentColor\" />\n </svg>\n </div>\n }\n </div>\n\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n", styles: [":host{--sng-c1: 71 85 105;--sng-c2: 40 51 69;--sng-tint: var(--snackng-tint, var(--sng-p-tint, .86));--sng-blur: var(--snackng-blur, var(--sng-p-blur, 20px));--sng-spec: var(--snackng-spec-strength, var(--sng-p-spec, .15));--sng-spec-size: var(--snackng-spec-size, var(--sng-p-spec-size, 30%));--sng-drift-dur: var(--snackng-drift-duration, var(--sng-p-drift-dur, 4s));--sng-bg: var( --snackng-info-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-info-ink, #ffffff);--sng-solid: var(--snackng-info-solid, #47556a);--sng-shift: var(--snackng-shift, 28px);position:relative;display:flex;align-items:center;gap:var(--snackng-gap, 14px);box-sizing:border-box;min-width:var(--snackng-min-width, 340px);max-width:var(--snackng-max-width, 460px);padding:var(--snackng-padding, 14px 18px);overflow:hidden;isolation:isolate;pointer-events:auto;border-radius:var(--snackng-radius, 14px);border:var(--snackng-border, 1px solid rgba(255, 255, 255, .22));background-image:var(--sng-bg);backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));-webkit-backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));box-shadow:var( --snackng-shadow, 0 1px 1px rgba(0, 0, 0, .05), 0 14px 34px -12px rgba(10, 25, 60, .6), inset 0 1px 0 rgba(255, 255, 255, .32), inset 0 -1px 1px rgba(0, 0, 0, .18) );color:var(--sng-ink);font-family:var(--snackng-font, \"Manrope\", system-ui, sans-serif);line-height:var(--snackng-line-height, 1.45)}:host(.sng--success){--sng-c1: 33 80 159;--sng-c2: 17 52 111;--sng-bg: var( --snackng-success-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-success-ink, #ffffff);--sng-solid: var(--snackng-success-solid, #21509f)}:host(.sng--danger){--sng-c1: 192 57 43;--sng-c2: 140 35 29;--sng-bg: var( --snackng-danger-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-danger-ink, #ffffff);--sng-solid: var(--snackng-danger-solid, #c0392b)}:host(.sng--warning){--sng-c1: 180 83 9;--sng-c2: 146 64 14;--sng-bg: var( --snackng-warning-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-warning-ink, #ffffff);--sng-solid: var(--snackng-warning-solid, #b45309)}:host(.sng-style--solid){--sng-p-tint: .96;--sng-p-spec: .06;--sng-p-spec-size: 28%}:host(.sng-style--translucent){--sng-p-tint: .74;--sng-p-spec: .12;--sng-p-spec-size: 40%}:host(.sng-style--transparent){--sng-p-tint: .3;--sng-p-spec: .1;--sng-p-spec-size: 30%}:host(.sng-style--frosted){--sng-p-tint: .92;--sng-p-blur: 30px;--sng-p-spec: .1}:host(.sng-style--flat){--sng-p-tint: 1;--sng-p-blur: 0px;--sng-p-spec: 0}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){:host{background-color:var(--sng-solid)}}@media(max-width:480px){:host{min-width:0;max-width:100%;width:100%}}:host:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(135deg,rgb(255 255 255 / var(--snackng-gloss, .22)) 0%,rgb(255 255 255 / calc(var(--snackng-gloss, .22) * .28)) 26%,transparent 52%)}:host:after{content:\"\";position:absolute;inset:-35%;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);background:radial-gradient(circle at 34% 24%,rgb(255 255 255 / var(--sng-spec)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--drift):after{opacity:1;animation-name:sng-sheen-drift;animation-duration:var(--sng-drift-dur);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-direction:alternate}@keyframes sng-sheen-drift{0%{transform:translate(-6%,-5%) scale(1)}to{transform:translate(10%,8%) scale(1.12)}}.sng-glare{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);transition:opacity .25s ease;background:radial-gradient(circle at var(--sng-glare-x, 50%) var(--sng-glare-y, 50%),rgb(255 255 255 / calc(var(--sng-spec) + .06)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--glare) .sng-glare{opacity:var(--sng-glare-op, 0)}.sng-close-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:8px;border:0;background:transparent;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease}.sng-close-icon:hover{background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink)}.sng-close-icon:active{background:color-mix(in srgb,var(--sng-ink) 22%,transparent);transform:scale(.92)}.sng-close-icon svg{display:block;width:18px;height:18px;fill:currentColor}.sng-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:11px;border-radius:12px;background:color-mix(in srgb,var(--sng-ink) 16%,transparent);color:var(--sng-ink)}.sng-icon svg{display:block;width:24px;height:24px;fill:currentColor}.sng-icon-custom{display:flex}.sng-icon-custom ::ng-deep svg{display:block;width:24px;height:24px;fill:currentColor}.sng-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}.sng-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.sng-title{margin:0;font-size:var(--snackng-title-size, 14px);font-weight:var(--snackng-title-weight, 700);line-height:1.3;letter-spacing:.1px;color:var(--sng-ink)}.sng-message{margin:0;font-size:var(--snackng-message-size, 13px);font-weight:var(--snackng-message-weight, 400);color:color-mix(in srgb,var(--sng-ink) 85%,transparent)}.sng-action{flex:0 0 auto;padding:7px 12px;border:1px solid color-mix(in srgb,var(--sng-ink) 32%,transparent);border-radius:8px;background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink);font:inherit;font-size:var(--snackng-action-size, 13px);font-weight:var(--snackng-action-weight, 600);cursor:pointer;transition:background .15s ease}.sng-action:hover{background:color-mix(in srgb,var(--sng-ink) 22%,transparent)}.sng-close{flex:0 0 auto;display:flex;padding:4px;border:0;border-radius:6px;background:none;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer}.sng-close:hover{background:color-mix(in srgb,var(--sng-ink) 14%,transparent);color:var(--sng-ink)}.sng-close svg{display:block;width:18px;height:18px}.sng-action:focus-visible,.sng-close:focus-visible{outline:2px solid var(--sng-ink);outline-offset:2px}@keyframes sng-in-right{0%{opacity:0;transform:translate(var(--sng-shift))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(var(--sng-shift))}}@keyframes sng-in-left{0%{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-left{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-top{0%{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-top{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-bottom{0%{opacity:0;transform:translateY(var(--sng-shift))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-bottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(var(--sng-shift))}}:host(.sng-entering){animation-duration:var(--snackng-enter-duration, .4s);animation-timing-function:cubic-bezier(0,0,.2,1);animation-fill-mode:both}:host(.sng-leaving){animation-duration:var(--snackng-exit-duration, .2s);animation-timing-function:cubic-bezier(.4,0,1,1);animation-fill-mode:both}:host(.sng-at--top-end.sng-entering),:host(.sng-at--bottom-end.sng-entering){animation-name:sng-in-right}:host(.sng-at--top-end.sng-leaving),:host(.sng-at--bottom-end.sng-leaving){animation-name:sng-out-right}:host(.sng-at--top-start.sng-entering),:host(.sng-at--bottom-start.sng-entering){animation-name:sng-in-left}:host(.sng-at--top-start.sng-leaving),:host(.sng-at--bottom-start.sng-leaving){animation-name:sng-out-left}:host(.sng-at--top-center.sng-entering){animation-name:sng-in-top}:host(.sng-at--top-center.sng-leaving){animation-name:sng-out-top}:host(.sng-at--bottom-center.sng-entering){animation-name:sng-in-bottom}:host(.sng-at--bottom-center.sng-leaving){animation-name:sng-out-bottom}@media(prefers-reduced-motion:reduce){:host{--sng-shift: 0px;--sng-blur: var(--snackng-blur-reduced, 10px)}:host(.sng-fx--drift):after{animation:none}}\n"] }]
|
|
421
|
+
}, template: "@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n", styles: [":host{--sng-c1: 71 85 105;--sng-c2: 40 51 69;--sng-tint: var(--snackng-tint, var(--sng-p-tint, .86));--sng-blur: var(--snackng-blur, var(--sng-p-blur, 20px));--sng-spec: var(--snackng-spec-strength, var(--sng-p-spec, .15));--sng-spec-size: var(--snackng-spec-size, var(--sng-p-spec-size, 30%));--sng-drift-dur: var(--snackng-drift-duration, var(--sng-p-drift-dur, 4s));--sng-bg: var( --snackng-info-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-info-ink, #ffffff);--sng-solid: var(--snackng-info-solid, #47556a);--sng-shift: var(--snackng-shift, 28px);position:relative;display:flex;align-items:center;gap:var(--snackng-gap, 14px);box-sizing:border-box;min-width:var(--snackng-min-width, 340px);max-width:var(--snackng-max-width, 460px);padding:var(--snackng-padding, 14px 18px);overflow:hidden;isolation:isolate;pointer-events:auto;border-radius:var(--snackng-radius, 14px);border:var(--snackng-border, 1px solid rgba(255, 255, 255, .22));background-image:var(--sng-bg);backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));-webkit-backdrop-filter:blur(var(--sng-blur)) saturate(var(--snackng-saturate, 180%)) brightness(var(--snackng-brightness, 1.06));box-shadow:var( --snackng-shadow, 0 1px 1px rgba(0, 0, 0, .05), 0 14px 34px -12px rgba(10, 25, 60, .6), inset 0 1px 0 rgba(255, 255, 255, .32), inset 0 -1px 1px rgba(0, 0, 0, .18) );color:var(--sng-ink);font-family:var(--snackng-font, \"Manrope\", system-ui, sans-serif);line-height:var(--snackng-line-height, 1.45)}:host(.sng--success){--sng-c1: 33 80 159;--sng-c2: 17 52 111;--sng-bg: var( --snackng-success-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-success-ink, #ffffff);--sng-solid: var(--snackng-success-solid, #21509f)}:host(.sng--danger){--sng-c1: 192 57 43;--sng-c2: 140 35 29;--sng-bg: var( --snackng-danger-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-danger-ink, #ffffff);--sng-solid: var(--snackng-danger-solid, #c0392b)}:host(.sng--warning){--sng-c1: 180 83 9;--sng-c2: 146 64 14;--sng-bg: var( --snackng-warning-bg, linear-gradient( 135deg, rgb(var(--sng-c1) / var(--sng-tint)), rgb(var(--sng-c2) / calc(var(--sng-tint) - .06)) ) );--sng-ink: var(--snackng-warning-ink, #ffffff);--sng-solid: var(--snackng-warning-solid, #b45309)}:host(.sng-style--solid){--sng-p-tint: .96;--sng-p-spec: .06;--sng-p-spec-size: 28%}:host(.sng-style--translucent){--sng-p-tint: .74;--sng-p-spec: .12;--sng-p-spec-size: 40%}:host(.sng-style--transparent){--sng-p-tint: .3;--sng-p-spec: .1;--sng-p-spec-size: 30%}:host(.sng-style--frosted){--sng-p-tint: .92;--sng-p-blur: 30px;--sng-p-spec: .1}:host(.sng-style--flat){--sng-p-tint: 1;--sng-p-blur: 0px;--sng-p-spec: 0}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){:host{background-color:var(--sng-solid)}}@media(max-width:480px){:host{min-width:0;max-width:100%;width:100%}}:host:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(135deg,rgb(255 255 255 / var(--snackng-gloss, .22)) 0%,rgb(255 255 255 / calc(var(--snackng-gloss, .22) * .28)) 26%,transparent 52%)}:host:after{content:\"\";position:absolute;inset:-35%;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);background:radial-gradient(circle at 34% 24%,rgb(255 255 255 / var(--sng-spec)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--drift):after{opacity:1;animation-name:sng-sheen-drift;animation-duration:var(--sng-drift-dur);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-direction:alternate}@keyframes sng-sheen-drift{0%{transform:translate(-6%,-5%) scale(1)}to{transform:translate(10%,8%) scale(1.12)}}.sng-glare{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;filter:blur(12px);transition:opacity .25s ease;background:radial-gradient(circle at var(--sng-glare-x, 50%) var(--sng-glare-y, 50%),rgb(255 255 255 / calc(var(--sng-spec) + .06)) 0%,transparent var(--sng-spec-size))}:host(.sng-fx--glare) .sng-glare{opacity:var(--sng-glare-op, 0)}.sng-icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:11px;border-radius:12px;background:color-mix(in srgb,var(--sng-ink) 16%,transparent);color:var(--sng-ink)}.sng-icon svg{display:block;width:24px;height:24px;fill:currentColor}.sng-icon-custom{display:flex}.sng-icon-custom ::ng-deep svg{display:block;width:24px;height:24px;fill:currentColor}.sng-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}.sng-title{margin:0;font-size:var(--snackng-title-size, 14px);font-weight:var(--snackng-title-weight, 700);line-height:1.3;letter-spacing:.1px;color:var(--sng-ink)}.sng-message{margin:0;font-size:var(--snackng-message-size, 13px);font-weight:var(--snackng-message-weight, 400);color:color-mix(in srgb,var(--sng-ink) 85%,transparent)}.sng-action{flex:0 0 auto;padding:7px 12px;border:1px solid color-mix(in srgb,var(--sng-ink) 32%,transparent);border-radius:8px;background:color-mix(in srgb,var(--sng-ink) 12%,transparent);color:var(--sng-ink);font:inherit;font-size:var(--snackng-action-size, 13px);font-weight:var(--snackng-action-weight, 600);cursor:pointer;transition:background .15s ease}.sng-action:hover{background:color-mix(in srgb,var(--sng-ink) 22%,transparent)}.sng-close{flex:0 0 auto;display:flex;padding:4px;border:0;border-radius:6px;background:none;color:color-mix(in srgb,var(--sng-ink) 70%,transparent);cursor:pointer}.sng-close:hover{background:color-mix(in srgb,var(--sng-ink) 14%,transparent);color:var(--sng-ink)}.sng-close svg{display:block;width:18px;height:18px}.sng-action:focus-visible,.sng-close:focus-visible{outline:2px solid var(--sng-ink);outline-offset:2px}@keyframes sng-in-right{0%{opacity:0;transform:translate(var(--sng-shift))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(var(--sng-shift))}}@keyframes sng-in-left{0%{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translate(0)}}@keyframes sng-out-left{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-top{0%{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-top{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(calc(-1 * var(--sng-shift)))}}@keyframes sng-in-bottom{0%{opacity:0;transform:translateY(var(--sng-shift))}to{opacity:1;transform:translateY(0)}}@keyframes sng-out-bottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(var(--sng-shift))}}:host(.sng-entering){animation-duration:var(--snackng-enter-duration, .4s);animation-timing-function:cubic-bezier(0,0,.2,1);animation-fill-mode:both}:host(.sng-leaving){animation-duration:var(--snackng-exit-duration, .2s);animation-timing-function:cubic-bezier(.4,0,1,1);animation-fill-mode:both}:host(.sng-at--top-end.sng-entering),:host(.sng-at--bottom-end.sng-entering){animation-name:sng-in-right}:host(.sng-at--top-end.sng-leaving),:host(.sng-at--bottom-end.sng-leaving){animation-name:sng-out-right}:host(.sng-at--top-start.sng-entering),:host(.sng-at--bottom-start.sng-entering){animation-name:sng-in-left}:host(.sng-at--top-start.sng-leaving),:host(.sng-at--bottom-start.sng-leaving){animation-name:sng-out-left}:host(.sng-at--top-center.sng-entering){animation-name:sng-in-top}:host(.sng-at--top-center.sng-leaving){animation-name:sng-out-top}:host(.sng-at--bottom-center.sng-entering){animation-name:sng-in-bottom}:host(.sng-at--bottom-center.sng-leaving){animation-name:sng-out-bottom}@media(prefers-reduced-motion:reduce){:host{--sng-shift: 0px;--sng-blur: var(--snackng-blur-reduced, 10px)}:host(.sng-fx--drift):after{animation:none}}\n"] }]
|
|
399
422
|
}], ctorParameters: () => [], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }] } });
|
|
400
423
|
|
|
401
424
|
const SHIFT_DURATION = 260;
|
package/fesm2022/snackng.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snackng.mjs","sources":["../../../projects/snackng/src/lib/snackng.config.ts","../../../projects/snackng/src/lib/live-region.ts","../../../projects/snackng/src/lib/icons.ts","../../../projects/snackng/src/lib/snackng.store.ts","../../../projects/snackng/src/lib/snackng-toast/snackng-toast.ts","../../../projects/snackng/src/lib/snackng-toast/snackng-toast.html","../../../projects/snackng/src/lib/snackng-host/snackng-host.ts","../../../projects/snackng/src/lib/snackng-host/snackng-host.html","../../../projects/snackng/src/lib/snackng.service.ts","../../../projects/snackng/src/public-api.ts","../../../projects/snackng/src/snackng.ts"],"sourcesContent":["import { InjectionToken, EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport {\n SnackngEffect,\n SnackngOverflow,\n SnackngPosition,\n SnackngStyle,\n SnackngTypeDef,\n} from './snackng.model';\n\nexport interface SnackngConfig {\n duration: number;\n position: SnackngPosition;\n /** Maximum toasts on screen at once. Extras are handled per `overflow`. */\n max: number;\n /**\n * What happens when a toast arrives while `max` are already visible.\n * `'queue'` waits for a free slot — nothing is ever lost, but a flood becomes\n * a long parade. `'dismiss-oldest'` evicts the oldest to make room, so the\n * newest always wins; useful when an interceptor can emit toasts in bursts.\n */\n overflow: SnackngOverflow;\n /**\n * Milliseconds between releasing consecutive queued toasts. Staggering keeps\n * a burst from firing every enter animation at the same instant. `0` releases\n * as many as fit at once.\n */\n stagger: number;\n pauseOnHover: boolean;\n dismissible: boolean;\n /** Default glass preset for every toast. Overridable per call via `options.style`. */\n style: SnackngStyle;\n /** Default surface light effect. Overridable per call via `options.effect`. */\n effect: SnackngEffect;\n types: Record<string, SnackngTypeDef>;\n}\n\nexport const SNACKNG_DEFAULTS: SnackngConfig = {\n duration: 5000,\n position: 'top-end',\n max: 5,\n overflow: 'queue',\n stagger: 90,\n pauseOnHover: true,\n dismissible: false,\n style: 'glass',\n effect: 'drift',\n types: {},\n};\n\nexport const SNACKNG_CONFIG = new InjectionToken<SnackngConfig>('snackng.config', {\n providedIn: 'root',\n factory: () => SNACKNG_DEFAULTS,\n});\n\n/**\n * Optional. Without it the defaults above apply, so `npm i snackng` and calling\n * the service is enough to get working toasts.\n */\nexport function provideSnackng(config: Partial<SnackngConfig> = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: SNACKNG_CONFIG,\n useValue: {\n ...SNACKNG_DEFAULTS,\n ...config,\n types: { ...SNACKNG_DEFAULTS.types, ...config.types },\n } satisfies SnackngConfig,\n },\n ]);\n}\n","import { DOCUMENT, Injectable, OnDestroy, inject } from '@angular/core';\nimport { SnackngPoliteness } from './snackng.model';\n\n/**\n * Announces toast text to screen readers, in place of the CDK `LiveAnnouncer`.\n *\n * The toast markup carries no `aria-live` of its own: text is copied into this\n * off-screen region instead. Keep it that way — a live region nested inside\n * another throws `HierarchyRequestError` when the outer one relocates its\n * content.\n */\n@Injectable({ providedIn: 'root' })\nexport class SnackngLiveRegion implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region?: HTMLElement;\n private clearTimer?: ReturnType<typeof setTimeout>;\n\n announce(message: string, politeness: SnackngPoliteness = 'polite'): void {\n if (politeness === 'off' || !message) {\n return;\n }\n\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clearing first forces assistive tech to treat an identical repeated\n // message as a new announcement.\n region.textContent = '';\n clearTimeout(this.clearTimer);\n this.clearTimer = setTimeout(() => (region.textContent = message), 100);\n }\n\n private ensureRegion(): HTMLElement {\n if (this.region?.isConnected) {\n return this.region;\n }\n\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.setAttribute('aria-live', 'polite');\n region.classList.add('sng-live-region');\n // Visually hidden but still announced: `display:none` would silence it.\n region.style.cssText =\n 'position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;' +\n 'clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;';\n\n this.document.body.appendChild(region);\n this.region = region;\n return region;\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.clearTimer);\n this.region?.remove();\n this.region = undefined;\n }\n}\n","import { SnackngBuiltInType } from './snackng.model';\n\n/**\n * Path data for the built-in glyphs, inlined so the package never requires an\n * icon font. Bound with `[attr.d]`, so no sanitizer is involved.\n */\nexport const SNACKNG_ICONS: Record<SnackngBuiltInType, string> = {\n success: 'M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n warning: 'M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z',\n danger:\n 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z',\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z',\n};\n\nexport const SNACKNG_CLOSE_ICON =\n 'M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z';\n\n","import { Injectable, OnDestroy, computed, inject, signal } from '@angular/core';\nimport { SNACKNG_CONFIG } from './snackng.config';\nimport {\n SnackngAction,\n SnackngDismissReason,\n SnackngEffect,\n SnackngPoliteness,\n SnackngPosition,\n SnackngStyle,\n SnackngType,\n} from './snackng.model';\n\nexport interface SnackngItem {\n readonly id: string;\n readonly type: SnackngType;\n readonly message: string;\n readonly title?: string;\n readonly duration: number;\n readonly position: SnackngPosition;\n readonly dismissible: boolean;\n readonly action?: SnackngAction;\n readonly style: SnackngStyle;\n readonly effect: SnackngEffect;\n readonly panelClass: readonly string[];\n readonly politeness: SnackngPoliteness;\n /** Set while the exit animation runs; the item is still in the DOM. */\n readonly leaving: boolean;\n}\n\nexport interface SnackngStack {\n readonly position: SnackngPosition;\n readonly items: readonly SnackngItem[];\n}\n\n/**\n * Toast state, and the pacing of how toasts reach the screen.\n *\n * Producer/consumer: `add` only enqueues; `pump` is the sole consumer moving\n * items into view as capacity allows. Releasing directly would let a burst\n * render in one tick, appearing and evicting itself in the same frame.\n *\n * Separate from `SnackngService` so the service can create the host while the\n * host reads state, without an import cycle.\n */\n@Injectable({ providedIn: 'root' })\nexport class SnackngStore implements OnDestroy {\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly resolvers = new Map<string, (reason: SnackngDismissReason) => void>();\n private readonly reasons = new Map<string, SnackngDismissReason>();\n private pumpTimer?: ReturnType<typeof setTimeout>;\n private lastReleaseAt = 0;\n private counter = 0;\n\n /** Toasts currently rendered (including those playing their exit animation). */\n readonly items = signal<readonly SnackngItem[]>([]);\n /** Toasts accepted but still waiting for a free slot. */\n readonly queue = signal<readonly SnackngItem[]>([]);\n readonly pending = computed(() => this.queue().length);\n\n readonly stacks = computed<readonly SnackngStack[]>(() => {\n const byPosition = new Map<SnackngPosition, SnackngItem[]>();\n for (const item of this.items()) {\n const bucket = byPosition.get(item.position);\n bucket ? bucket.push(item) : byPosition.set(item.position, [item]);\n }\n return [...byPosition].map(([position, items]) => ({ position, items }));\n });\n\n add(item: Omit<SnackngItem, 'id' | 'leaving'>): {\n id: string;\n afterDismissed: Promise<SnackngDismissReason>;\n } {\n const id = `sng-${++this.counter}`;\n const afterDismissed = new Promise<SnackngDismissReason>((resolve) =>\n this.resolvers.set(id, resolve),\n );\n\n this.queue.update((queue) => [...queue, { ...item, id, leaving: false }]);\n this.pump();\n\n return { id, afterDismissed };\n }\n\n /**\n * Starts the exit animation; the item leaves the DOM on `finalize`. A toast\n * still queued is dropped outright, having never been shown.\n */\n dismiss(id: string, reason: SnackngDismissReason = 'manual'): void {\n if (this.queue().some((item) => item.id === id)) {\n this.queue.update((queue) => queue.filter((item) => item.id !== id));\n this.resolve(id, reason);\n return;\n }\n\n const target = this.items().find((item) => item.id === id);\n if (!target || target.leaving) {\n return;\n }\n this.reasons.set(id, reason);\n this.items.update((items) => items.map((i) => (i.id === id ? { ...i, leaving: true } : i)));\n }\n\n /** Removes the item and resolves its `afterDismissed` promise. */\n finalize(id: string): void {\n if (!this.resolvers.has(id)) {\n return;\n }\n this.items.update((items) => items.filter((item) => item.id !== id));\n this.resolve(id, this.reasons.get(id) ?? 'manual');\n this.reasons.delete(id);\n this.pump();\n }\n\n dismissAll(reason: SnackngDismissReason = 'manual'): void {\n // Drain the queue first, or it would march onto a screen just cleared.\n clearTimeout(this.pumpTimer);\n this.pumpTimer = undefined;\n for (const item of this.queue()) {\n this.resolve(item.id, reason);\n }\n this.queue.set([]);\n\n for (const item of this.items()) {\n this.dismiss(item.id, reason);\n }\n }\n\n /** The consumer. Runs on every add and every finalize. */\n private pump(): void {\n if (this.pumpTimer) {\n return; // a staggered release is already pending\n }\n\n while (this.queue().length) {\n // Counts leaving toasts too: they hold their slot until finalize removes\n // them, so ignoring them reads an expiring batch as free space.\n const onScreen = this.items();\n\n if (onScreen.length >= this.config.max) {\n if (this.config.overflow === 'dismiss-oldest') {\n // Evicting an already-leaving toast frees nothing.\n const victim = onScreen.find((item) => !item.leaving);\n if (victim) {\n this.dismiss(victim.id, 'replaced');\n }\n }\n return;\n }\n\n // Spaced by elapsed time, not queue length: callers add one at a time, so\n // a burst arrives as N pumps of one item and would never wait.\n const wait = this.config.stagger - (Date.now() - this.lastReleaseAt);\n if (this.config.stagger > 0 && wait > 0) {\n this.pumpTimer = setTimeout(() => {\n this.pumpTimer = undefined;\n this.pump();\n }, wait);\n return;\n }\n\n const [next, ...rest] = this.queue();\n this.queue.set(rest);\n this.items.update((items) => [...items, next]);\n this.lastReleaseAt = Date.now();\n }\n }\n\n private resolve(id: string, reason: SnackngDismissReason): void {\n this.resolvers.get(id)?.(reason);\n this.resolvers.delete(id);\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.pumpTimer);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { SNACKNG_CONFIG } from '../snackng.config';\nimport { SNACKNG_CLOSE_ICON, SNACKNG_ICONS } from '../icons';\nimport { SnackngBuiltInType } from '../snackng.model';\nimport { SnackngItem, SnackngStore } from '../snackng.store';\n\nconst EXIT_DURATION = 200;\n/** Guards against `animationend` never firing (reduced motion, jsdom, backgrounded tab). */\nconst EXIT_FALLBACK = EXIT_DURATION + 150;\n\n@Component({\n selector: 'sng-toast',\n templateUrl: './snackng-toast.html',\n styleUrl: './snackng-toast.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class SnackngToast implements OnDestroy {\n readonly item = input.required<SnackngItem>();\n\n private readonly store = inject(SnackngStore);\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n\n private timer?: ReturnType<typeof setTimeout>;\n private exitTimer?: ReturnType<typeof setTimeout>;\n private armed = false;\n private remaining = 0;\n private startedAt = 0;\n private glareBound = false;\n\n protected readonly hostClasses = computed(() => {\n const item = this.item();\n const classes = [\n 'sng-toast',\n `sng--${item.type}`,\n `sng-at--${item.position}`,\n `sng-style--${item.style}`,\n item.leaving ? 'sng-leaving' : 'sng-entering',\n ...item.panelClass,\n ];\n if (item.effect === 'drift' || item.effect === 'both') {\n classes.push('sng-fx--drift');\n }\n if (item.effect === 'glare' || item.effect === 'both') {\n classes.push('sng-fx--glare');\n }\n return classes.join(' ');\n });\n\n /** Whether this toast tracks the pointer for the cursor glare effect. */\n protected readonly glareEnabled = computed(() => {\n const fx = this.item().effect;\n return fx === 'glare' || fx === 'both';\n });\n\n /** Null when the type brings its own SVG; unknown types fall back to `info`. */\n protected readonly iconPath = computed<string | null>(() => {\n const type = this.item().type;\n if (this.config.types[type]?.icon) {\n return null;\n }\n return SNACKNG_ICONS[type as SnackngBuiltInType] ?? SNACKNG_ICONS.info;\n });\n\n protected readonly closeIconPath = computed<string | null>(() => {\n return SNACKNG_CLOSE_ICON;\n });\n\n /** Custom types may supply raw SVG markup, trusted as authored config. */\n protected readonly iconSvg = computed<SafeHtml | null>(() => {\n const custom = this.config.types[this.item().type]?.icon;\n return custom ? this.sanitizer.bypassSecurityTrustHtml(custom) : null;\n });\n\n constructor() {\n effect(() => {\n if (this.item().leaving) {\n this.stopTimer();\n this.scheduleFinalize();\n } else {\n this.startTimer();\n }\n });\n\n // Bind pointer tracking once, only if this toast uses the glare effect.\n effect(() => {\n if (this.glareEnabled() && !this.glareBound) {\n this.bindGlare();\n }\n });\n }\n\n /** Writes the cursor position into CSS vars the glare layer reads. Runs\n * outside Angular — it only mutates style, no change detection needed. */\n private bindGlare(): void {\n this.glareBound = true;\n const el = this.element.nativeElement;\n this.zone.runOutsideAngular(() => {\n el.addEventListener('pointermove', this.onGlareMove);\n el.addEventListener('pointerleave', this.onGlareLeave);\n });\n }\n\n private readonly onGlareMove = (event: PointerEvent): void => {\n const el = this.element.nativeElement;\n const rect = el.getBoundingClientRect();\n if (!rect.width || !rect.height) {\n return;\n }\n el.style.setProperty('--sng-glare-x', `${((event.clientX - rect.left) / rect.width) * 100}%`);\n el.style.setProperty('--sng-glare-y', `${((event.clientY - rect.top) / rect.height) * 100}%`);\n el.style.setProperty('--sng-glare-op', '1');\n };\n\n private readonly onGlareLeave = (): void => {\n this.element.nativeElement.style.setProperty('--sng-glare-op', '0');\n };\n\n protected onAction(): void {\n const action = this.item().action;\n action?.handler?.();\n if (action?.dismissOnClick !== false) {\n this.store.dismiss(this.item().id, 'action');\n }\n }\n\n protected onDismiss(): void {\n this.store.dismiss(this.item().id, 'manual');\n }\n\n protected pause(): void {\n if (!this.config.pauseOnHover || !this.timer) {\n return;\n }\n this.remaining -= Date.now() - this.startedAt;\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n protected resume(): void {\n if (!this.config.pauseOnHover || this.timer || this.remaining <= 0 || this.item().leaving) {\n return;\n }\n this.arm(this.remaining);\n }\n\n /** Arms once per toast: re-running on later item updates would reset a paused timer. */\n private startTimer(): void {\n const duration = this.item().duration;\n if (this.armed || duration <= 0) {\n return;\n }\n this.armed = true;\n this.remaining = duration;\n this.arm(duration);\n }\n\n private arm(ms: number): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.store.dismiss(this.item().id, 'timeout'), ms);\n }\n\n private stopTimer(): void {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n private scheduleFinalize(): void {\n if (this.exitTimer) {\n return;\n }\n const finalize = () => {\n clearTimeout(this.exitTimer);\n this.store.finalize(this.item().id);\n };\n this.element.nativeElement.addEventListener('animationend', finalize, { once: true });\n this.exitTimer = setTimeout(finalize, EXIT_FALLBACK);\n }\n\n ngOnDestroy(): void {\n this.stopTimer();\n clearTimeout(this.exitTimer);\n if (this.glareBound) {\n const el = this.element.nativeElement;\n el.removeEventListener('pointermove', this.onGlareMove);\n el.removeEventListener('pointerleave', this.onGlareLeave);\n }\n }\n}\n","@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n <div class=\"sng-header\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n\n @if (closeIconPath(); as closePath) {\n <div class=\"sng-close-icon\" (click)=\"onDismiss()\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"closePath\" fill=\"currentColor\" />\n </svg>\n </div>\n }\n </div>\n\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterEveryRender,\n inject,\n} from '@angular/core';\nimport { SnackngToast } from '../snackng-toast/snackng-toast';\nimport { SnackngStore } from '../snackng.store';\n\nconst SHIFT_DURATION = 260;\nconst SHIFT_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n/** Guarded: test environments such as jsdom render without `matchMedia`. */\nfunction prefersReducedMotion(): boolean {\n return (\n typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n@Component({\n selector: 'sng-host',\n imports: [SnackngToast],\n templateUrl: './snackng-host.html',\n styleUrl: './snackng-host.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SnackngHost {\n private readonly store = inject(SnackngStore);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n protected readonly stacks = this.store.stacks;\n\n private readonly offsets = new Map<string, number>();\n private readonly shifts = new Map<string, Animation>();\n\n constructor() {\n afterEveryRender(() => this.absorbLayoutShift());\n }\n\n /**\n * FLIP: offset each slot back to where it was, then animate that offset away,\n * so neighbours glide into a freed gap instead of snapping.\n *\n * Measured with `offsetTop` rather than `getBoundingClientRect`: the latter\n * includes transforms and would read an in-flight shift instead of the layout\n * beneath it. Stacks are full height and top-anchored, so a slot's offsetTop\n * only changes when it truly moves. Applied to the slot, never the toast, to\n * leave the toast's own enter/exit transform alone.\n */\n private absorbLayoutShift(): void {\n const slots = this.element.nativeElement.querySelectorAll<HTMLElement>('.sng-slot');\n const present = new Set<string>();\n\n for (const slot of slots) {\n const id = slot.dataset['sngId'];\n if (!id) {\n continue;\n }\n present.add(id);\n\n const top = slot.offsetTop;\n const previous = this.offsets.get(id);\n this.offsets.set(id, top);\n\n if (previous === undefined || previous === top || prefersReducedMotion()) {\n continue;\n }\n\n this.shifts.get(id)?.cancel();\n this.shifts.set(\n id,\n slot.animate([{ transform: `translateY(${previous - top}px)` }, { transform: 'none' }], {\n duration: SHIFT_DURATION,\n easing: SHIFT_EASING,\n }),\n );\n }\n\n for (const id of [...this.offsets.keys()]) {\n if (!present.has(id)) {\n this.offsets.delete(id);\n this.shifts.delete(id);\n }\n }\n }\n}\n","@for (stack of stacks(); track stack.position) {\n <div class=\"sng-stack\" [class]=\"'sng-stack--' + stack.position\">\n @for (item of stack.items; track item.id) {\n <div class=\"sng-slot\" [attr.data-sng-id]=\"item.id\">\n <sng-toast [item]=\"item\" />\n </div>\n }\n </div>\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n OnDestroy,\n PLATFORM_ID,\n createComponent,\n inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SNACKNG_CONFIG } from './snackng.config';\nimport { SnackngLiveRegion } from './live-region';\nimport { SnackngHost } from './snackng-host/snackng-host';\nimport { SnackngStore } from './snackng.store';\nimport {\n SnackngDismissReason,\n SnackngOptions,\n SnackngPoliteness,\n SnackngRef,\n SnackngStyle,\n SnackngType,\n} from './snackng.model';\n\nconst NOOP_REF: SnackngRef = {\n id: 'sng-noop',\n dismiss: () => {},\n afterDismissed: Promise.resolve<SnackngDismissReason>('manual'),\n};\n\n/**\n * A variant shortcut (`success`, `danger`, …). Callable directly, and also\n * carries a method per built-in glass preset so you can pick a look inline:\n * `snackng.success.solid('Saved')` is sugar for\n * `snackng.success('Saved', { style: 'solid' })`.\n */\nexport interface SnackngVariantFn {\n (message: string, options?: SnackngOptions): SnackngRef;\n glass(message: string, options?: SnackngOptions): SnackngRef;\n solid(message: string, options?: SnackngOptions): SnackngRef;\n translucent(message: string, options?: SnackngOptions): SnackngRef;\n transparent(message: string, options?: SnackngOptions): SnackngRef;\n frosted(message: string, options?: SnackngOptions): SnackngRef;\n flat(message: string, options?: SnackngOptions): SnackngRef;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SnackngService implements OnDestroy {\n private readonly store = inject(SnackngStore);\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly liveRegion = inject(SnackngLiveRegion);\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private host?: ComponentRef<SnackngHost>;\n\n /**\n * Toasts accepted but still waiting for a free slot under `overflow: 'queue'`.\n * Useful for a \"3 more\" affordance.\n */\n readonly pending = this.store.pending;\n\n /** Callable shortcut with per-preset sugar, e.g. `success.solid('Saved')`. */\n readonly success = this.variant('success');\n readonly warning = this.variant('warning');\n readonly danger = this.variant('danger');\n readonly info = this.variant('info');\n\n /** Builds a callable variant carrying a method per built-in preset. */\n private variant(type: SnackngType): SnackngVariantFn {\n const withStyle =\n (style?: SnackngStyle) =>\n (message: string, options?: SnackngOptions): SnackngRef =>\n this.show(type, message, style ? { ...options, style } : options);\n\n return Object.assign(withStyle(), {\n glass: withStyle('glass'),\n solid: withStyle('solid'),\n translucent: withStyle('translucent'),\n transparent: withStyle('transparent'),\n frosted: withStyle('frosted'),\n flat: withStyle('flat'),\n });\n }\n\n show(type: SnackngType, message: string, options: SnackngOptions = {}): SnackngRef {\n // Client-only: no-op rather than throw on `document` during SSR.\n if (!this.isBrowser) {\n return NOOP_REF;\n }\n\n this.ensureHost();\n\n const politeness = this.resolvePoliteness(type, options);\n const { id, afterDismissed } = this.store.add({\n type,\n message,\n title: options.title,\n duration: options.duration ?? this.config.duration,\n position: options.position ?? this.config.position,\n dismissible: options.dismissible ?? this.config.dismissible,\n action: options.action,\n style: options.style ?? this.config.style,\n effect: options.effect ?? this.config.effect,\n panelClass: normalizeClasses(options.panelClass),\n politeness,\n });\n\n this.liveRegion.announce([options.title, message].filter(Boolean).join('. '), politeness);\n\n return {\n id,\n afterDismissed,\n dismiss: () => this.store.dismiss(id, 'manual'),\n };\n }\n\n dismissAll(): void {\n this.store.dismissAll();\n }\n\n private resolvePoliteness(type: SnackngType, options: SnackngOptions): SnackngPoliteness {\n if (options.politeness) {\n return options.politeness;\n }\n const configured = this.config.types[type]?.politeness;\n if (configured) {\n return configured;\n }\n // Errors interrupt; everything else waits for a pause.\n return type === 'danger' ? 'assertive' : 'polite';\n }\n\n private ensureHost(): void {\n if (this.host) {\n return;\n }\n this.host = createComponent(SnackngHost, { environmentInjector: this.injector });\n this.appRef.attachView(this.host.hostView);\n this.document.body.appendChild(this.host.location.nativeElement);\n }\n\n ngOnDestroy(): void {\n if (this.host) {\n this.appRef.detachView(this.host.hostView);\n this.host.destroy();\n this.host = undefined;\n }\n }\n}\n\nfunction normalizeClasses(panelClass: string | string[] | undefined): string[] {\n if (!panelClass) {\n return [];\n }\n return Array.isArray(panelClass) ? panelClass : [panelClass];\n}\n","/*\n * Public API Surface of snackng\n */\n\nexport { SnackngService } from './lib/snackng.service';\nexport type { SnackngVariantFn } from './lib/snackng.service';\nexport { provideSnackng, SNACKNG_CONFIG, SNACKNG_DEFAULTS } from './lib/snackng.config';\nexport type { SnackngConfig } from './lib/snackng.config';\nexport type {\n SnackngAction,\n SnackngBuiltInStyle,\n SnackngBuiltInType,\n SnackngDismissReason,\n SnackngEffect,\n SnackngOptions,\n SnackngPoliteness,\n SnackngPosition,\n SnackngRef,\n SnackngStyle,\n SnackngType,\n SnackngTypeDef,\n} from './lib/snackng.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snackng.mjs","sources":["../../../projects/snackng/src/lib/snackng.config.ts","../../../projects/snackng/src/lib/live-region.ts","../../../projects/snackng/src/lib/icons.ts","../../../projects/snackng/src/lib/snackng.store.ts","../../../projects/snackng/src/lib/snackng-toast/snackng-toast.ts","../../../projects/snackng/src/lib/snackng-toast/snackng-toast.html","../../../projects/snackng/src/lib/snackng-host/snackng-host.ts","../../../projects/snackng/src/lib/snackng-host/snackng-host.html","../../../projects/snackng/src/lib/snackng.service.ts","../../../projects/snackng/src/public-api.ts","../../../projects/snackng/src/snackng.ts"],"sourcesContent":["import { InjectionToken, EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport {\n SnackngEffect,\n SnackngOverflow,\n SnackngPosition,\n SnackngStyle,\n SnackngTypeDef,\n} from './snackng.model';\n\nexport interface SnackngConfig {\n duration: number;\n position: SnackngPosition;\n /** Maximum toasts on screen at once. Extras are handled per `overflow`. */\n max: number;\n /**\n * What happens when a toast arrives while `max` are already visible.\n * `'queue'` waits for a free slot — nothing is ever lost, but a flood becomes\n * a long parade. `'dismiss-oldest'` evicts the oldest to make room, so the\n * newest always wins; useful when an interceptor can emit toasts in bursts.\n */\n overflow: SnackngOverflow;\n /**\n * Milliseconds between releasing consecutive queued toasts. Staggering keeps\n * a burst from firing every enter animation at the same instant. `0` releases\n * as many as fit at once.\n */\n stagger: number;\n pauseOnHover: boolean;\n /** Show the close button. Overridable per call via `options.dismissible`. */\n dismissible: boolean;\n /** Default glass preset for every toast. Overridable per call via `options.style`. */\n style: SnackngStyle;\n /** Default surface light effect. Overridable per call via `options.effect`. */\n effect: SnackngEffect;\n types: Record<string, SnackngTypeDef>;\n}\n\nexport const SNACKNG_DEFAULTS: SnackngConfig = {\n duration: 5000,\n position: 'top-end',\n max: 5,\n overflow: 'queue',\n stagger: 90,\n pauseOnHover: true,\n dismissible: true,\n style: 'glass',\n effect: 'drift',\n types: {},\n};\n\nexport const SNACKNG_CONFIG = new InjectionToken<SnackngConfig>('snackng.config', {\n providedIn: 'root',\n factory: () => SNACKNG_DEFAULTS,\n});\n\n/**\n * Optional. Without it the defaults above apply, so `npm i snackng` and calling\n * the service is enough to get working toasts.\n */\nexport function provideSnackng(config: Partial<SnackngConfig> = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: SNACKNG_CONFIG,\n useValue: {\n ...SNACKNG_DEFAULTS,\n ...config,\n types: { ...SNACKNG_DEFAULTS.types, ...config.types },\n } satisfies SnackngConfig,\n },\n ]);\n}\n","import { DOCUMENT, Injectable, OnDestroy, inject } from '@angular/core';\nimport { SnackngPoliteness } from './snackng.model';\n\n/**\n * Announces toast text to screen readers, in place of the CDK `LiveAnnouncer`.\n *\n * The toast markup carries no `aria-live` of its own: text is copied into this\n * off-screen region instead. Keep it that way — a live region nested inside\n * another throws `HierarchyRequestError` when the outer one relocates its\n * content.\n */\n@Injectable({ providedIn: 'root' })\nexport class SnackngLiveRegion implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private region?: HTMLElement;\n private clearTimer?: ReturnType<typeof setTimeout>;\n\n announce(message: string, politeness: SnackngPoliteness = 'polite'): void {\n if (politeness === 'off' || !message) {\n return;\n }\n\n const region = this.ensureRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clearing first forces assistive tech to treat an identical repeated\n // message as a new announcement.\n region.textContent = '';\n clearTimeout(this.clearTimer);\n this.clearTimer = setTimeout(() => (region.textContent = message), 100);\n }\n\n private ensureRegion(): HTMLElement {\n if (this.region?.isConnected) {\n return this.region;\n }\n\n const region = this.document.createElement('div');\n region.setAttribute('aria-atomic', 'true');\n region.setAttribute('aria-live', 'polite');\n region.classList.add('sng-live-region');\n // Visually hidden but still announced: `display:none` would silence it.\n region.style.cssText =\n 'position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;' +\n 'clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;';\n\n this.document.body.appendChild(region);\n this.region = region;\n return region;\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.clearTimer);\n this.region?.remove();\n this.region = undefined;\n }\n}\n","import { SnackngBuiltInType } from './snackng.model';\n\n/**\n * Path data for the built-in glyphs, inlined so the package never requires an\n * icon font. Bound with `[attr.d]`, so no sanitizer is involved.\n */\nexport const SNACKNG_ICONS: Record<SnackngBuiltInType, string> = {\n success: 'M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n warning: 'M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z',\n danger:\n 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z',\n info: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z',\n};\n","import { Injectable, OnDestroy, computed, inject, signal } from '@angular/core';\nimport { SNACKNG_CONFIG } from './snackng.config';\nimport {\n SnackngAction,\n SnackngDismissReason,\n SnackngEffect,\n SnackngPoliteness,\n SnackngPosition,\n SnackngStyle,\n SnackngType,\n} from './snackng.model';\n\nexport interface SnackngItem {\n readonly id: string;\n readonly type: SnackngType;\n readonly message: string;\n readonly title?: string;\n readonly duration: number;\n readonly position: SnackngPosition;\n readonly dismissible: boolean;\n readonly action?: SnackngAction;\n readonly style: SnackngStyle;\n readonly effect: SnackngEffect;\n readonly panelClass: readonly string[];\n readonly politeness: SnackngPoliteness;\n /** Set while the exit animation runs; the item is still in the DOM. */\n readonly leaving: boolean;\n}\n\nexport interface SnackngStack {\n readonly position: SnackngPosition;\n readonly items: readonly SnackngItem[];\n}\n\n/**\n * Toast state, and the pacing of how toasts reach the screen.\n *\n * Producer/consumer: `add` only enqueues; `pump` is the sole consumer moving\n * items into view as capacity allows. Releasing directly would let a burst\n * render in one tick, appearing and evicting itself in the same frame.\n *\n * Separate from `SnackngService` so the service can create the host while the\n * host reads state, without an import cycle.\n */\n@Injectable({ providedIn: 'root' })\nexport class SnackngStore implements OnDestroy {\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly resolvers = new Map<string, (reason: SnackngDismissReason) => void>();\n private readonly reasons = new Map<string, SnackngDismissReason>();\n private pumpTimer?: ReturnType<typeof setTimeout>;\n private lastReleaseAt = 0;\n private counter = 0;\n\n /** Toasts currently rendered (including those playing their exit animation). */\n readonly items = signal<readonly SnackngItem[]>([]);\n /** Toasts accepted but still waiting for a free slot. */\n readonly queue = signal<readonly SnackngItem[]>([]);\n readonly pending = computed(() => this.queue().length);\n\n readonly stacks = computed<readonly SnackngStack[]>(() => {\n const byPosition = new Map<SnackngPosition, SnackngItem[]>();\n for (const item of this.items()) {\n const bucket = byPosition.get(item.position);\n bucket ? bucket.push(item) : byPosition.set(item.position, [item]);\n }\n return [...byPosition].map(([position, items]) => ({ position, items }));\n });\n\n add(item: Omit<SnackngItem, 'id' | 'leaving'>): {\n id: string;\n afterDismissed: Promise<SnackngDismissReason>;\n } {\n const id = `sng-${++this.counter}`;\n const afterDismissed = new Promise<SnackngDismissReason>((resolve) =>\n this.resolvers.set(id, resolve),\n );\n\n this.queue.update((queue) => [...queue, { ...item, id, leaving: false }]);\n this.pump();\n\n return { id, afterDismissed };\n }\n\n /**\n * Starts the exit animation; the item leaves the DOM on `finalize`. A toast\n * still queued is dropped outright, having never been shown.\n */\n dismiss(id: string, reason: SnackngDismissReason = 'manual'): void {\n if (this.queue().some((item) => item.id === id)) {\n this.queue.update((queue) => queue.filter((item) => item.id !== id));\n this.resolve(id, reason);\n return;\n }\n\n const target = this.items().find((item) => item.id === id);\n if (!target || target.leaving) {\n return;\n }\n this.reasons.set(id, reason);\n this.items.update((items) => items.map((i) => (i.id === id ? { ...i, leaving: true } : i)));\n }\n\n /** Removes the item and resolves its `afterDismissed` promise. */\n finalize(id: string): void {\n if (!this.resolvers.has(id)) {\n return;\n }\n this.items.update((items) => items.filter((item) => item.id !== id));\n this.resolve(id, this.reasons.get(id) ?? 'manual');\n this.reasons.delete(id);\n this.pump();\n }\n\n dismissAll(reason: SnackngDismissReason = 'manual'): void {\n // Drain the queue first, or it would march onto a screen just cleared.\n clearTimeout(this.pumpTimer);\n this.pumpTimer = undefined;\n for (const item of this.queue()) {\n this.resolve(item.id, reason);\n }\n this.queue.set([]);\n\n for (const item of this.items()) {\n this.dismiss(item.id, reason);\n }\n }\n\n /** The consumer. Runs on every add and every finalize. */\n private pump(): void {\n if (this.pumpTimer) {\n return; // a staggered release is already pending\n }\n\n while (this.queue().length) {\n // Counts leaving toasts too: they hold their slot until finalize removes\n // them, so ignoring them reads an expiring batch as free space.\n const onScreen = this.items();\n\n if (onScreen.length >= this.config.max) {\n if (this.config.overflow === 'dismiss-oldest') {\n // Evicting an already-leaving toast frees nothing.\n const victim = onScreen.find((item) => !item.leaving);\n if (victim) {\n this.dismiss(victim.id, 'replaced');\n }\n }\n return;\n }\n\n // Spaced by elapsed time, not queue length: callers add one at a time, so\n // a burst arrives as N pumps of one item and would never wait.\n const wait = this.config.stagger - (Date.now() - this.lastReleaseAt);\n if (this.config.stagger > 0 && wait > 0) {\n this.pumpTimer = setTimeout(() => {\n this.pumpTimer = undefined;\n this.pump();\n }, wait);\n return;\n }\n\n const [next, ...rest] = this.queue();\n this.queue.set(rest);\n this.items.update((items) => [...items, next]);\n this.lastReleaseAt = Date.now();\n }\n }\n\n private resolve(id: string, reason: SnackngDismissReason): void {\n this.resolvers.get(id)?.(reason);\n this.resolvers.delete(id);\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.pumpTimer);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { SNACKNG_CONFIG } from '../snackng.config';\nimport { SNACKNG_ICONS } from '../icons';\nimport { SnackngBuiltInType } from '../snackng.model';\nimport { SnackngItem, SnackngStore } from '../snackng.store';\n\nconst EXIT_DURATION = 200;\n/** Guards against `animationend` never firing (reduced motion, jsdom, backgrounded tab). */\nconst EXIT_FALLBACK = EXIT_DURATION + 150;\n\n@Component({\n selector: 'sng-toast',\n templateUrl: './snackng-toast.html',\n styleUrl: './snackng-toast.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class SnackngToast implements OnDestroy {\n readonly item = input.required<SnackngItem>();\n\n private readonly store = inject(SnackngStore);\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n\n private timer?: ReturnType<typeof setTimeout>;\n private exitTimer?: ReturnType<typeof setTimeout>;\n private armed = false;\n private remaining = 0;\n private startedAt = 0;\n private glareBound = false;\n\n protected readonly hostClasses = computed(() => {\n const item = this.item();\n const classes = [\n 'sng-toast',\n `sng--${item.type}`,\n `sng-at--${item.position}`,\n `sng-style--${item.style}`,\n item.leaving ? 'sng-leaving' : 'sng-entering',\n ...item.panelClass,\n ];\n if (item.effect === 'drift' || item.effect === 'both') {\n classes.push('sng-fx--drift');\n }\n if (item.effect === 'glare' || item.effect === 'both') {\n classes.push('sng-fx--glare');\n }\n return classes.join(' ');\n });\n\n /** Whether this toast tracks the pointer for the cursor glare effect. */\n protected readonly glareEnabled = computed(() => {\n const fx = this.item().effect;\n return fx === 'glare' || fx === 'both';\n });\n\n /** Null when the type brings its own SVG; unknown types fall back to `info`. */\n protected readonly iconPath = computed<string | null>(() => {\n const type = this.item().type;\n if (this.config.types[type]?.icon) {\n return null;\n }\n return SNACKNG_ICONS[type as SnackngBuiltInType] ?? SNACKNG_ICONS.info;\n });\n\n /** Custom types may supply raw SVG markup, trusted as authored config. */\n protected readonly iconSvg = computed<SafeHtml | null>(() => {\n const custom = this.config.types[this.item().type]?.icon;\n return custom ? this.sanitizer.bypassSecurityTrustHtml(custom) : null;\n });\n\n constructor() {\n effect(() => {\n this.applyCustomTypeColours();\n });\n\n effect(() => {\n if (this.item().leaving) {\n this.stopTimer();\n this.scheduleFinalize();\n } else {\n this.startTimer();\n }\n });\n\n // Bind pointer tracking once, only if this toast uses the glare effect.\n effect(() => {\n if (this.glareEnabled() && !this.glareBound) {\n this.bindGlare();\n }\n });\n }\n\n /**\n * Points a custom type's surface at its own `--snackng-<type>-*` tokens.\n *\n * The built-ins get theirs from a `:host(.sng--success)` rule, but a custom\n * type's name is only known at runtime, so no stylesheet can name its tokens\n * — the element has to. Written as properties (not `style=`) so the glare's\n * inline `--sng-glare-*` writes survive.\n *\n * The fallbacks are the neutral surface `:host` already resolves to, so a\n * type with no tokens set looks exactly as it did before.\n */\n private applyCustomTypeColours(): void {\n const type = this.item().type;\n // SNACKNG_ICONS is keyed by the built-ins, which own a :host rule already.\n if (type in SNACKNG_ICONS) {\n return;\n }\n const style = this.element.nativeElement.style;\n style.setProperty(\n '--sng-bg',\n `var(--snackng-${type}-bg, linear-gradient(135deg, ` +\n `rgb(var(--sng-c1) / var(--sng-tint)), ` +\n `rgb(var(--sng-c2) / calc(var(--sng-tint) - 0.06))))`,\n );\n style.setProperty('--sng-ink', `var(--snackng-${type}-ink, #ffffff)`);\n style.setProperty('--sng-solid', `var(--snackng-${type}-solid, #47556a)`);\n }\n\n /** Writes the cursor position into CSS vars the glare layer reads. Runs\n * outside Angular — it only mutates style, no change detection needed. */\n private bindGlare(): void {\n this.glareBound = true;\n const el = this.element.nativeElement;\n this.zone.runOutsideAngular(() => {\n el.addEventListener('pointermove', this.onGlareMove);\n el.addEventListener('pointerleave', this.onGlareLeave);\n });\n }\n\n private readonly onGlareMove = (event: PointerEvent): void => {\n const el = this.element.nativeElement;\n const rect = el.getBoundingClientRect();\n if (!rect.width || !rect.height) {\n return;\n }\n el.style.setProperty('--sng-glare-x', `${((event.clientX - rect.left) / rect.width) * 100}%`);\n el.style.setProperty('--sng-glare-y', `${((event.clientY - rect.top) / rect.height) * 100}%`);\n el.style.setProperty('--sng-glare-op', '1');\n };\n\n private readonly onGlareLeave = (): void => {\n this.element.nativeElement.style.setProperty('--sng-glare-op', '0');\n };\n\n protected onAction(): void {\n const action = this.item().action;\n action?.handler?.();\n if (action?.dismissOnClick !== false) {\n this.store.dismiss(this.item().id, 'action');\n }\n }\n\n protected onDismiss(): void {\n this.store.dismiss(this.item().id, 'manual');\n }\n\n protected pause(): void {\n if (!this.config.pauseOnHover || !this.timer) {\n return;\n }\n this.remaining -= Date.now() - this.startedAt;\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n protected resume(): void {\n if (!this.config.pauseOnHover || this.timer || this.remaining <= 0 || this.item().leaving) {\n return;\n }\n this.arm(this.remaining);\n }\n\n /** Arms once per toast: re-running on later item updates would reset a paused timer. */\n private startTimer(): void {\n const duration = this.item().duration;\n if (this.armed || duration <= 0) {\n return;\n }\n this.armed = true;\n this.remaining = duration;\n this.arm(duration);\n }\n\n private arm(ms: number): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.store.dismiss(this.item().id, 'timeout'), ms);\n }\n\n private stopTimer(): void {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n private scheduleFinalize(): void {\n if (this.exitTimer) {\n return;\n }\n const finalize = () => {\n clearTimeout(this.exitTimer);\n this.store.finalize(this.item().id);\n };\n this.element.nativeElement.addEventListener('animationend', finalize, { once: true });\n this.exitTimer = setTimeout(finalize, EXIT_FALLBACK);\n }\n\n ngOnDestroy(): void {\n this.stopTimer();\n clearTimeout(this.exitTimer);\n if (this.glareBound) {\n const el = this.element.nativeElement;\n el.removeEventListener('pointermove', this.onGlareMove);\n el.removeEventListener('pointerleave', this.onGlareLeave);\n }\n }\n}\n","@let toast = item();\n\n<!-- No aria-live here: SnackngLiveRegion announces instead. -->\n@if (glareEnabled()) {\n <div class=\"sng-glare\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"sng-icon\" aria-hidden=\"true\">\n @if (iconPath(); as path) {\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path [attr.d]=\"path\" fill=\"currentColor\" />\n </svg>\n } @else {\n <span class=\"sng-icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n }\n</div>\n\n<div class=\"sng-body\">\n @if (toast.title) {\n <p class=\"sng-title\">{{ toast.title }}</p>\n }\n <p class=\"sng-message\">{{ toast.message }}</p>\n</div>\n\n@if (toast.action; as action) {\n <button type=\"button\" class=\"sng-action\" (click)=\"onAction()\">{{ action.label }}</button>\n}\n\n@if (toast.dismissible) {\n <button type=\"button\" class=\"sng-close\" (click)=\"onDismiss()\" aria-label=\"Close notification\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterEveryRender,\n inject,\n} from '@angular/core';\nimport { SnackngToast } from '../snackng-toast/snackng-toast';\nimport { SnackngStore } from '../snackng.store';\n\nconst SHIFT_DURATION = 260;\nconst SHIFT_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n/** Guarded: test environments such as jsdom render without `matchMedia`. */\nfunction prefersReducedMotion(): boolean {\n return (\n typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n@Component({\n selector: 'sng-host',\n imports: [SnackngToast],\n templateUrl: './snackng-host.html',\n styleUrl: './snackng-host.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SnackngHost {\n private readonly store = inject(SnackngStore);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n protected readonly stacks = this.store.stacks;\n\n private readonly offsets = new Map<string, number>();\n private readonly shifts = new Map<string, Animation>();\n\n constructor() {\n afterEveryRender(() => this.absorbLayoutShift());\n }\n\n /**\n * FLIP: offset each slot back to where it was, then animate that offset away,\n * so neighbours glide into a freed gap instead of snapping.\n *\n * Measured with `offsetTop` rather than `getBoundingClientRect`: the latter\n * includes transforms and would read an in-flight shift instead of the layout\n * beneath it. Stacks are full height and top-anchored, so a slot's offsetTop\n * only changes when it truly moves. Applied to the slot, never the toast, to\n * leave the toast's own enter/exit transform alone.\n */\n private absorbLayoutShift(): void {\n const slots = this.element.nativeElement.querySelectorAll<HTMLElement>('.sng-slot');\n const present = new Set<string>();\n\n for (const slot of slots) {\n const id = slot.dataset['sngId'];\n if (!id) {\n continue;\n }\n present.add(id);\n\n const top = slot.offsetTop;\n const previous = this.offsets.get(id);\n this.offsets.set(id, top);\n\n if (previous === undefined || previous === top || prefersReducedMotion()) {\n continue;\n }\n\n this.shifts.get(id)?.cancel();\n this.shifts.set(\n id,\n slot.animate([{ transform: `translateY(${previous - top}px)` }, { transform: 'none' }], {\n duration: SHIFT_DURATION,\n easing: SHIFT_EASING,\n }),\n );\n }\n\n for (const id of [...this.offsets.keys()]) {\n if (!present.has(id)) {\n this.offsets.delete(id);\n this.shifts.delete(id);\n }\n }\n }\n}\n","@for (stack of stacks(); track stack.position) {\n <div class=\"sng-stack\" [class]=\"'sng-stack--' + stack.position\">\n @for (item of stack.items; track item.id) {\n <div class=\"sng-slot\" [attr.data-sng-id]=\"item.id\">\n <sng-toast [item]=\"item\" />\n </div>\n }\n </div>\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n OnDestroy,\n PLATFORM_ID,\n createComponent,\n inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SNACKNG_CONFIG } from './snackng.config';\nimport { SnackngLiveRegion } from './live-region';\nimport { SnackngHost } from './snackng-host/snackng-host';\nimport { SnackngStore } from './snackng.store';\nimport {\n SnackngDismissReason,\n SnackngOptions,\n SnackngPoliteness,\n SnackngRef,\n SnackngStyle,\n SnackngType,\n} from './snackng.model';\n\nconst NOOP_REF: SnackngRef = {\n id: 'sng-noop',\n dismiss: () => {},\n afterDismissed: Promise.resolve<SnackngDismissReason>('manual'),\n};\n\n/**\n * A variant shortcut (`success`, `danger`, …). Callable directly, and also\n * carries a method per built-in glass preset so you can pick a look inline:\n * `snackng.success.solid('Saved')` is sugar for\n * `snackng.success('Saved', { style: 'solid' })`.\n */\nexport interface SnackngVariantFn {\n (message: string, options?: SnackngOptions): SnackngRef;\n glass(message: string, options?: SnackngOptions): SnackngRef;\n solid(message: string, options?: SnackngOptions): SnackngRef;\n translucent(message: string, options?: SnackngOptions): SnackngRef;\n transparent(message: string, options?: SnackngOptions): SnackngRef;\n frosted(message: string, options?: SnackngOptions): SnackngRef;\n flat(message: string, options?: SnackngOptions): SnackngRef;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SnackngService implements OnDestroy {\n private readonly store = inject(SnackngStore);\n private readonly config = inject(SNACKNG_CONFIG);\n private readonly liveRegion = inject(SnackngLiveRegion);\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private host?: ComponentRef<SnackngHost>;\n\n /**\n * Toasts accepted but still waiting for a free slot under `overflow: 'queue'`.\n * Useful for a \"3 more\" affordance.\n */\n readonly pending = this.store.pending;\n\n /** Callable shortcut with per-preset sugar, e.g. `success.solid('Saved')`. */\n readonly success = this.variant('success');\n readonly warning = this.variant('warning');\n readonly danger = this.variant('danger');\n readonly info = this.variant('info');\n\n /** Builds a callable variant carrying a method per built-in preset. */\n private variant(type: SnackngType): SnackngVariantFn {\n const withStyle =\n (style?: SnackngStyle) =>\n (message: string, options?: SnackngOptions): SnackngRef =>\n this.show(type, message, style ? { ...options, style } : options);\n\n return Object.assign(withStyle(), {\n glass: withStyle('glass'),\n solid: withStyle('solid'),\n translucent: withStyle('translucent'),\n transparent: withStyle('transparent'),\n frosted: withStyle('frosted'),\n flat: withStyle('flat'),\n });\n }\n\n show(type: SnackngType, message: string, options: SnackngOptions = {}): SnackngRef {\n // Client-only: no-op rather than throw on `document` during SSR.\n if (!this.isBrowser) {\n return NOOP_REF;\n }\n\n this.ensureHost();\n\n const politeness = this.resolvePoliteness(type, options);\n const { id, afterDismissed } = this.store.add({\n type,\n message,\n title: options.title,\n duration: options.duration ?? this.config.duration,\n position: options.position ?? this.config.position,\n dismissible: options.dismissible ?? this.config.dismissible,\n action: options.action,\n style: options.style ?? this.config.style,\n effect: options.effect ?? this.config.effect,\n panelClass: normalizeClasses(options.panelClass),\n politeness,\n });\n\n this.liveRegion.announce([options.title, message].filter(Boolean).join('. '), politeness);\n\n return {\n id,\n afterDismissed,\n dismiss: () => this.store.dismiss(id, 'manual'),\n };\n }\n\n dismissAll(): void {\n this.store.dismissAll();\n }\n\n private resolvePoliteness(type: SnackngType, options: SnackngOptions): SnackngPoliteness {\n if (options.politeness) {\n return options.politeness;\n }\n const configured = this.config.types[type]?.politeness;\n if (configured) {\n return configured;\n }\n // Errors interrupt; everything else waits for a pause.\n return type === 'danger' ? 'assertive' : 'polite';\n }\n\n private ensureHost(): void {\n if (this.host) {\n return;\n }\n this.host = createComponent(SnackngHost, { environmentInjector: this.injector });\n this.appRef.attachView(this.host.hostView);\n this.document.body.appendChild(this.host.location.nativeElement);\n }\n\n ngOnDestroy(): void {\n if (this.host) {\n this.appRef.detachView(this.host.hostView);\n this.host.destroy();\n this.host = undefined;\n }\n }\n}\n\nfunction normalizeClasses(panelClass: string | string[] | undefined): string[] {\n if (!panelClass) {\n return [];\n }\n return Array.isArray(panelClass) ? panelClass : [panelClass];\n}\n","/*\n * Public API Surface of snackng\n */\n\nexport { SnackngService } from './lib/snackng.service';\nexport type { SnackngVariantFn } from './lib/snackng.service';\nexport { provideSnackng, SNACKNG_CONFIG, SNACKNG_DEFAULTS } from './lib/snackng.config';\nexport type { SnackngConfig } from './lib/snackng.config';\nexport type {\n SnackngAction,\n SnackngBuiltInStyle,\n SnackngBuiltInType,\n SnackngDismissReason,\n SnackngEffect,\n SnackngOptions,\n SnackngOverflow,\n SnackngPoliteness,\n SnackngPosition,\n SnackngRef,\n SnackngStyle,\n SnackngType,\n SnackngTypeDef,\n} from './lib/snackng.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snackng",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "The easiest way to show toasts and snackbars in Angular with a glass design, zero UI dependencies and CSS-variable theming. No Material, no CDK, no Tailwind required.",
|
|
5
5
|
"author": "xgreymx",
|
|
6
6
|
"keywords": [
|
package/types/snackng.d.ts
CHANGED
|
@@ -22,9 +22,10 @@ interface SnackngAction {
|
|
|
22
22
|
dismissOnClick?: boolean;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Definition for a custom type. Built-in types already have icon and
|
|
26
|
-
* a custom type
|
|
27
|
-
* `--snackng-<type>-bg`
|
|
25
|
+
* Definition for a custom type. Built-in types already have icon and colours;
|
|
26
|
+
* a custom type starts from the neutral surface and is recoloured through
|
|
27
|
+
* `--snackng-<type>-bg`, `--snackng-<type>-ink` and `--snackng-<type>-solid`,
|
|
28
|
+
* set anywhere they inherit to the toast (`:root` is simplest).
|
|
28
29
|
*/
|
|
29
30
|
interface SnackngTypeDef {
|
|
30
31
|
/**
|
|
@@ -121,6 +122,7 @@ interface SnackngConfig {
|
|
|
121
122
|
*/
|
|
122
123
|
stagger: number;
|
|
123
124
|
pauseOnHover: boolean;
|
|
125
|
+
/** Show the close button. Overridable per call via `options.dismissible`. */
|
|
124
126
|
dismissible: boolean;
|
|
125
127
|
/** Default glass preset for every toast. Overridable per call via `options.style`. */
|
|
126
128
|
style: SnackngStyle;
|
|
@@ -137,4 +139,4 @@ declare const SNACKNG_CONFIG: InjectionToken<SnackngConfig>;
|
|
|
137
139
|
declare function provideSnackng(config?: Partial<SnackngConfig>): EnvironmentProviders;
|
|
138
140
|
|
|
139
141
|
export { SNACKNG_CONFIG, SNACKNG_DEFAULTS, SnackngService, provideSnackng };
|
|
140
|
-
export type { SnackngAction, SnackngBuiltInStyle, SnackngBuiltInType, SnackngConfig, SnackngDismissReason, SnackngEffect, SnackngOptions, SnackngPoliteness, SnackngPosition, SnackngRef, SnackngStyle, SnackngType, SnackngTypeDef, SnackngVariantFn };
|
|
142
|
+
export type { SnackngAction, SnackngBuiltInStyle, SnackngBuiltInType, SnackngConfig, SnackngDismissReason, SnackngEffect, SnackngOptions, SnackngOverflow, SnackngPoliteness, SnackngPosition, SnackngRef, SnackngStyle, SnackngType, SnackngTypeDef, SnackngVariantFn };
|