@atlasng/design-system 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/fesm2022/atlasng-design-system-buttons-breadcrumbs.mjs +24 -0
- package/fesm2022/atlasng-design-system-buttons-breadcrumbs.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-buttons-help.mjs +35 -0
- package/fesm2022/atlasng-design-system-buttons-help.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-buttons-navigation-toggle.mjs +28 -0
- package/fesm2022/atlasng-design-system-buttons-navigation-toggle.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-buttons-navigation.mjs +24 -0
- package/fesm2022/atlasng-design-system-buttons-navigation.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-buttons-social-media.mjs +121 -0
- package/fesm2022/atlasng-design-system-buttons-social-media.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-cookie-banner.mjs +274 -0
- package/fesm2022/atlasng-design-system-cookie-banner.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-indicators-end-of-results.mjs +31 -0
- package/fesm2022/atlasng-design-system-indicators-end-of-results.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-indicators-no-results.mjs +33 -0
- package/fesm2022/atlasng-design-system-indicators-no-results.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-indicators-results.mjs +50 -0
- package/fesm2022/atlasng-design-system-indicators-results.mjs.map +1 -0
- package/fesm2022/atlasng-design-system-text-link.mjs +49 -0
- package/fesm2022/atlasng-design-system-text-link.mjs.map +1 -0
- package/fesm2022/atlasng-design-system.mjs +6 -0
- package/fesm2022/atlasng-design-system.mjs.map +1 -0
- package/package.json +70 -0
- package/sass/_index.scss +3 -0
- package/sass/_mat-defaults.scss +27 -0
- package/sass/internal/_breakpoints.scss +150 -0
- package/sass/internal/_sass-utils.scss +45 -0
- package/sass/internal/_token-utils.scss +59 -0
- package/types/atlasng-design-system-buttons-breadcrumbs.d.ts +20 -0
- package/types/atlasng-design-system-buttons-help.d.ts +17 -0
- package/types/atlasng-design-system-buttons-navigation-toggle.d.ts +10 -0
- package/types/atlasng-design-system-buttons-navigation.d.ts +11 -0
- package/types/atlasng-design-system-buttons-social-media.d.ts +54 -0
- package/types/atlasng-design-system-cookie-banner.d.ts +132 -0
- package/types/atlasng-design-system-indicators-end-of-results.d.ts +17 -0
- package/types/atlasng-design-system-indicators-no-results.d.ts +20 -0
- package/types/atlasng-design-system-indicators-results.d.ts +30 -0
- package/types/atlasng-design-system-text-link.d.ts +24 -0
- package/types/atlasng-design-system.d.ts +2 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Directive, input, inject, ElementRef, model, output, computed, contentChild, Renderer2, DOCUMENT, signal, effect, RendererStyleFlags2, DestroyRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { MatButton } from '@angular/material/button';
|
|
4
|
+
import { MatIcon } from '@angular/material/icon';
|
|
5
|
+
import { TrackClick, provideEventScope } from '@atlasng/analytics';
|
|
6
|
+
import { IdGenerator, AnyLink } from '@atlasng/common';
|
|
7
|
+
import { RESIZE_OBSERVER } from '@atlasng/core';
|
|
8
|
+
import { TextLink } from '@atlasng/design-system/text-link';
|
|
9
|
+
|
|
10
|
+
/** Prefix used when generating a custom title id if one is not provided by the consumer. */
|
|
11
|
+
const DEFAULT_TITLE_ID_PREFIX = 'ang-cookie-banner-title';
|
|
12
|
+
/** Class applied to the external container that hosts banner spacing and animation state. */
|
|
13
|
+
const CONTAINER_CLASS = 'ang-cookie-banner-container';
|
|
14
|
+
/** Class toggled when the banner opens to drive enter animations. */
|
|
15
|
+
const OPENED_CLASS = 'ang-cookie-banner-opened';
|
|
16
|
+
/** Class toggled when the banner closes to drive exit animations. */
|
|
17
|
+
const CLOSED_CLASS = 'ang-cookie-banner-closed';
|
|
18
|
+
/** CSS custom property used to reserve layout spacing for the banner height. */
|
|
19
|
+
const SPACING_VARIABLE = '--ang-cookie-banner-spacing';
|
|
20
|
+
/**
|
|
21
|
+
* Marks projected logo content inside the cookie banner.
|
|
22
|
+
*/
|
|
23
|
+
class CookieBannerLogo {
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerLogo, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
25
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.7", type: CookieBannerLogo, isStandalone: true, selector: "ang-cookie-banner-logo, [angCookieBannerLogo]", host: { classAttribute: "ang-cookie-banner-logo" }, ngImport: i0 });
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerLogo, decorators: [{
|
|
28
|
+
type: Directive,
|
|
29
|
+
args: [{
|
|
30
|
+
selector: 'ang-cookie-banner-logo, [angCookieBannerLogo]',
|
|
31
|
+
host: { class: 'ang-cookie-banner-logo' },
|
|
32
|
+
}]
|
|
33
|
+
}] });
|
|
34
|
+
/**
|
|
35
|
+
* Marks projected title content and guarantees it has an id for aria labelling.
|
|
36
|
+
*/
|
|
37
|
+
class CookieBannerTitle {
|
|
38
|
+
/**
|
|
39
|
+
* Id used for accessibility. Generates a default id if not provided.
|
|
40
|
+
*/
|
|
41
|
+
id = input(inject(IdGenerator).getId(DEFAULT_TITLE_ID_PREFIX), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
42
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
43
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.7", type: CookieBannerTitle, isStandalone: true, selector: "ang-cookie-banner-title, [angCookieBannerTitle]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id()" }, classAttribute: "ang-cookie-banner-title" }, ngImport: i0 });
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerTitle, decorators: [{
|
|
46
|
+
type: Directive,
|
|
47
|
+
args: [{
|
|
48
|
+
selector: 'ang-cookie-banner-title, [angCookieBannerTitle]',
|
|
49
|
+
host: {
|
|
50
|
+
class: 'ang-cookie-banner-title',
|
|
51
|
+
'[attr.id]': 'id()',
|
|
52
|
+
},
|
|
53
|
+
}]
|
|
54
|
+
}], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }] } });
|
|
55
|
+
/**
|
|
56
|
+
* Marks projected description content inside the cookie banner.
|
|
57
|
+
*/
|
|
58
|
+
class CookieBannerDescription {
|
|
59
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
60
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.7", type: CookieBannerDescription, isStandalone: true, selector: "ang-cookie-banner-description, [angCookieBannerDescription]", host: { classAttribute: "ang-cookie-banner-description" }, ngImport: i0 });
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerDescription, decorators: [{
|
|
63
|
+
type: Directive,
|
|
64
|
+
args: [{
|
|
65
|
+
selector: 'ang-cookie-banner-description, [angCookieBannerDescription]',
|
|
66
|
+
host: { class: 'ang-cookie-banner-description' },
|
|
67
|
+
}]
|
|
68
|
+
}] });
|
|
69
|
+
/**
|
|
70
|
+
* Marks a projected action element and optionally closes the banner when clicked.
|
|
71
|
+
*/
|
|
72
|
+
class CookieBannerAction {
|
|
73
|
+
/**
|
|
74
|
+
* When true, this action requests closing the banner after click.
|
|
75
|
+
*/
|
|
76
|
+
closeOnClick = input(true, ...(ngDevMode ? [{ debugName: "closeOnClick" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/** Reference to the parent cookie banner. */
|
|
78
|
+
banner = inject(CookieBanner);
|
|
79
|
+
/**
|
|
80
|
+
* Closes the parent banner only when both action-level and banner-level
|
|
81
|
+
* closeOnClick settings are enabled.
|
|
82
|
+
*/
|
|
83
|
+
handleClick() {
|
|
84
|
+
if (this.closeOnClick() && this.banner.closeOnClick()) {
|
|
85
|
+
this.banner.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
89
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.7", type: CookieBannerAction, isStandalone: true, selector: "ang-cookie-banner-action, [angCookieBannerAction]", inputs: { closeOnClick: { classPropertyName: "closeOnClick", publicName: "closeOnClick", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick()" }, classAttribute: "ang-cookie-banner-action" }, ngImport: i0 });
|
|
90
|
+
}
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerAction, decorators: [{
|
|
92
|
+
type: Directive,
|
|
93
|
+
args: [{
|
|
94
|
+
selector: 'ang-cookie-banner-action, [angCookieBannerAction]',
|
|
95
|
+
host: {
|
|
96
|
+
class: 'ang-cookie-banner-action',
|
|
97
|
+
'(click)': 'handleClick()',
|
|
98
|
+
},
|
|
99
|
+
}]
|
|
100
|
+
}], propDecorators: { closeOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnClick", required: false }] }] } });
|
|
101
|
+
/**
|
|
102
|
+
* Marks the container for the cookie banner, which is used to apply spacing and animation classes.
|
|
103
|
+
*/
|
|
104
|
+
class CookieBannerContainer {
|
|
105
|
+
/**
|
|
106
|
+
* Reference to the host element.
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
el = inject(ElementRef).nativeElement;
|
|
110
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerContainer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
111
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.7", type: CookieBannerContainer, isStandalone: true, selector: "ang-cookie-banner-container, [angCookieBannerContainer]", host: { classAttribute: "ang-cookie-banner-container" }, ngImport: i0 });
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBannerContainer, decorators: [{
|
|
114
|
+
type: Directive,
|
|
115
|
+
args: [{
|
|
116
|
+
selector: 'ang-cookie-banner-container, [angCookieBannerContainer]',
|
|
117
|
+
host: { class: 'ang-cookie-banner-container' },
|
|
118
|
+
}]
|
|
119
|
+
}] });
|
|
120
|
+
/**
|
|
121
|
+
* Cookie consent banner.
|
|
122
|
+
*
|
|
123
|
+
* Supports projected title/description/action content, emits user intent events,
|
|
124
|
+
* and can auto-close when users activate action buttons.
|
|
125
|
+
*/
|
|
126
|
+
class CookieBanner {
|
|
127
|
+
/**
|
|
128
|
+
* Controls whether the banner is visible.
|
|
129
|
+
*/
|
|
130
|
+
opened = model(true, ...(ngDevMode ? [{ debugName: "opened" }] : /* istanbul ignore next */ []));
|
|
131
|
+
/**
|
|
132
|
+
* Optional privacy policy link configuration.
|
|
133
|
+
*/
|
|
134
|
+
privacyPolicy = input(...(ngDevMode ? [undefined, { debugName: "privacyPolicy" }] : /* istanbul ignore next */ []));
|
|
135
|
+
/**
|
|
136
|
+
* Global close behavior for built-in click handlers.
|
|
137
|
+
*/
|
|
138
|
+
closeOnClick = input(true, ...(ngDevMode ? [{ debugName: "closeOnClick" }] : /* istanbul ignore next */ []));
|
|
139
|
+
/** Emits when the user accepts all cookies. */
|
|
140
|
+
allowAll = output();
|
|
141
|
+
/** Emits when the user accepts only necessary cookies. */
|
|
142
|
+
allowNecessary = output();
|
|
143
|
+
/** Emits when the user chooses to customize cookie settings. */
|
|
144
|
+
customize = output();
|
|
145
|
+
/**
|
|
146
|
+
* Id used by aria-labelledby. Falls back to a generated id if no title directive is projected.
|
|
147
|
+
*/
|
|
148
|
+
titleId = computed(() => this.titleDir()?.id() ?? this.idGenerator.getId(DEFAULT_TITLE_ID_PREFIX), ...(ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []));
|
|
149
|
+
/** Reference to the projected title directive. */
|
|
150
|
+
titleDir = contentChild(CookieBannerTitle, { ...(ngDevMode ? { debugName: "titleDir" } : /* istanbul ignore next */ {}), descendants: true });
|
|
151
|
+
/** Reference to the id generator. */
|
|
152
|
+
idGenerator = inject(IdGenerator);
|
|
153
|
+
/** Renderer used to update host/container classes and inline CSS variables. */
|
|
154
|
+
renderer = inject(Renderer2);
|
|
155
|
+
/**
|
|
156
|
+
* External element that receives spacing and animation classes.
|
|
157
|
+
* Falls back to document body when no explicit container directive is projected.
|
|
158
|
+
*/
|
|
159
|
+
containerEl = inject(CookieBannerContainer, { optional: true })?.el ?? inject(DOCUMENT).body;
|
|
160
|
+
/** Native host element of this banner instance. */
|
|
161
|
+
el = inject(ElementRef).nativeElement;
|
|
162
|
+
/** Current measured banner block size in pixels. */
|
|
163
|
+
height = signal(0, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
164
|
+
/** Initializes the cookie banner. */
|
|
165
|
+
constructor() {
|
|
166
|
+
this.initializeContainer();
|
|
167
|
+
this.monitorHeight();
|
|
168
|
+
let isFirstChange = true;
|
|
169
|
+
effect(() => {
|
|
170
|
+
const animationClasses = this.opened() ? OPENED_CLASS : CLOSED_CLASS;
|
|
171
|
+
if (isFirstChange) {
|
|
172
|
+
isFirstChange = false;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.setAnimationClasses(animationClasses);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
const { containerEl, renderer } = this;
|
|
179
|
+
effect(() => {
|
|
180
|
+
const height = `${this.height()}px`;
|
|
181
|
+
renderer.setStyle(containerEl, SPACING_VARIABLE, height, RendererStyleFlags2.DashCase);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Open the banner.
|
|
186
|
+
*/
|
|
187
|
+
open() {
|
|
188
|
+
this.opened.set(true);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Close the banner.
|
|
192
|
+
*/
|
|
193
|
+
close() {
|
|
194
|
+
this.opened.set(false);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Emits the selected action and closes the banner when closeOnClick is enabled.
|
|
198
|
+
*
|
|
199
|
+
* @param ref Emitter associated with the selected banner action.
|
|
200
|
+
*/
|
|
201
|
+
handleClick(ref) {
|
|
202
|
+
ref.emit();
|
|
203
|
+
if (this.closeOnClick()) {
|
|
204
|
+
this.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Handles the end of an animation event.
|
|
209
|
+
*
|
|
210
|
+
* @param event The animation event.
|
|
211
|
+
*/
|
|
212
|
+
handleAnimationEnd(event) {
|
|
213
|
+
if (event.animationName === 'ang-cookie-banner-closed') {
|
|
214
|
+
this.renderer.setStyle(this.el, 'display', 'none');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Registers container-level classes/styles and ensures they are removed on destroy.
|
|
219
|
+
*/
|
|
220
|
+
initializeContainer() {
|
|
221
|
+
const { containerEl, renderer } = this;
|
|
222
|
+
renderer.addClass(containerEl, CONTAINER_CLASS);
|
|
223
|
+
inject(DestroyRef).onDestroy(() => {
|
|
224
|
+
renderer.removeClass(containerEl, CONTAINER_CLASS);
|
|
225
|
+
renderer.removeClass(containerEl, OPENED_CLASS);
|
|
226
|
+
renderer.removeClass(containerEl, CLOSED_CLASS);
|
|
227
|
+
renderer.removeStyle(containerEl, SPACING_VARIABLE, RendererStyleFlags2.DashCase);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Observes host size changes and updates the container spacing CSS variable.
|
|
232
|
+
*/
|
|
233
|
+
monitorHeight() {
|
|
234
|
+
const ResizeObserver = inject(RESIZE_OBSERVER);
|
|
235
|
+
if (ResizeObserver) {
|
|
236
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
237
|
+
this.height.set(entries[0].borderBoxSize[0].blockSize);
|
|
238
|
+
});
|
|
239
|
+
resizeObserver.observe(this.el);
|
|
240
|
+
inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Applies open/closed animation classes to both container and host elements.
|
|
245
|
+
*
|
|
246
|
+
* @param classes Animation class token to apply.
|
|
247
|
+
*/
|
|
248
|
+
setAnimationClasses(classes) {
|
|
249
|
+
const { containerEl, el, renderer } = this;
|
|
250
|
+
renderer.removeClass(containerEl, OPENED_CLASS);
|
|
251
|
+
renderer.removeClass(containerEl, CLOSED_CLASS);
|
|
252
|
+
renderer.removeClass(el, OPENED_CLASS);
|
|
253
|
+
renderer.removeClass(el, CLOSED_CLASS);
|
|
254
|
+
renderer.removeStyle(el, 'display');
|
|
255
|
+
renderer.addClass(containerEl, classes);
|
|
256
|
+
renderer.addClass(el, classes);
|
|
257
|
+
}
|
|
258
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBanner, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
259
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: CookieBanner, isStandalone: true, selector: "ang-cookie-banner", inputs: { opened: { classPropertyName: "opened", publicName: "opened", isSignal: true, isRequired: false, transformFunction: null }, privacyPolicy: { classPropertyName: "privacyPolicy", publicName: "privacyPolicy", isSignal: true, isRequired: false, transformFunction: null }, closeOnClick: { classPropertyName: "closeOnClick", publicName: "closeOnClick", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "openedChange", allowAll: "allowAll", allowNecessary: "allowNecessary", customize: "customize" }, host: { listeners: { "animationend": "handleAnimationEnd($event)" }, classAttribute: "ang-cookie-banner" }, providers: [provideEventScope('cookie-banner')], queries: [{ propertyName: "titleDir", first: true, predicate: CookieBannerTitle, descendants: true, isSignal: true }], ngImport: i0, template: "<section class=\"ang-cookie-banner-section\" [attr.aria-labelledby]=\"titleId()\">\n <ng-content select=\"ang-cookie-banner-logo, [angCookieBannerLogo]\" />\n\n <div class=\"ang-cookie-banner-content\">\n <ng-content select=\"ang-cookie-banner-title, [angCookieBannerTitle]\">\n <h2 class=\"ang-cookie-banner-title\" [id]=\"titleId()\">Manage your privacy preferences</h2>\n </ng-content>\n\n <ng-content>\n <p class=\"ang-cookie-banner-description\">\n Cookies and similar technologies are used to play videos and to improve this website.\n </p>\n </ng-content>\n\n @if (privacyPolicy(); as policy) {\n <a angTextLink class=\"ang-cookie-banner-privacy-policy\" target=\"_blank\" [angAnyLink]=\"policy\">\n Privacy policy\n <mat-icon fontIcon=\"arrow_right_alt\" />\n </a>\n }\n </div>\n\n <div class=\"ang-cookie-banner-actions\">\n <ng-content select=\"ang-cookie-banner-action, [angCookieBannerAction]\">\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowAll)\">\n Allow all\n </button>\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowNecessary)\">\n Allow necessary only\n </button>\n <button matButton=\"outlined\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(customize)\">\n Customize\n </button>\n </ng-content>\n </div>\n</section>\n", styles: ["body.ang-cookie-banner-container{overflow-y:auto;padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}body.ang-cookie-banner-container .ang-cookie-banner{position:fixed}.ang-cookie-banner-container:not(body){position:relative;overflow-y:hidden;padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px);--ang-cookie-banner-opened-offset: 175%;--ang-cookie-banner-closed-offset: 150%}.ang-cookie-banner-container:not(body) .ang-cookie-banner{position:absolute}.ang-cookie-banner{display:block;inset:auto 0 0;overflow-y:hidden;z-index:1000;background-color:var(--ang-cookie-banner-container-color, var(--mat-sys-surface-bright));border-top-left-radius:var(--ang-cookie-banner-container-shape, var(--mat-sys-corner-large));border-top-right-radius:var(--ang-cookie-banner-container-shape, var(--mat-sys-corner-large));box-shadow:var(--ang-cookie-banner-container-elevation, 0px -16px 64px 32px color-mix(in srgb, var(--mat-sys-tertiary) 24%, transparent))}.ang-cookie-banner .ang-cookie-banner-section{display:flex;flex-direction:column;gap:32px;padding:24px}.ang-cookie-banner .ang-cookie-banner-content{display:flex;flex-direction:column;max-width:716px;margin:0 auto;gap:16px}.ang-cookie-banner .ang-cookie-banner-title{margin:0;color:var(--ang-cookie-banner-title-color, var(--mat-sys-on-surface));font-family:var(--ang-cookie-banner-title-font, var(--mat-sys-title-medium-font));font-size:var(--ang-cookie-banner-title-size, var(--mat-sys-title-medium-size));font-weight:var(--ang-cookie-banner-title-weight, var(--mat-sys-title-medium-weight));line-height:var(--ang-cookie-banner-title-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--ang-cookie-banner-title-tracking, var(--mat-sys-title-medium-tracking))}.ang-cookie-banner .ang-cookie-banner-description{margin:0;flex:auto;color:var(--ang-cookie-banner-description-color, var(--mat-sys-on-surface-variant));font-family:var(--ang-cookie-banner-description-font, var(--mat-sys-body-large-font));font-size:var(--ang-cookie-banner-description-size, var(--mat-sys-body-large-size));font-weight:var(--ang-cookie-banner-description-weight, var(--mat-sys-body-large-weight));line-height:var(--ang-cookie-banner-description-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-cookie-banner-description-tracking, var(--mat-sys-body-large-tracking))}.ang-cookie-banner .ang-cookie-banner-privacy-policy{height:48px;color:var(--ang-cookie-banner-privacy-policy-color, var(--mat-sys-on-surface));font-family:var(--ang-cookie-banner-description-font, var(--mat-sys-body-large-font));font-size:var(--ang-cookie-banner-description-size, var(--mat-sys-body-large-size));line-height:var(--ang-cookie-banner-description-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-cookie-banner-description-tracking, var(--mat-sys-body-large-tracking))}.ang-cookie-banner .ang-cookie-banner-actions{display:flex;flex-wrap:wrap;gap:16px}.ang-cookie-banner .ang-cookie-banner-action{flex:1 1 188px;min-width:188px}@media(min-width:960px){.ang-cookie-banner .ang-cookie-banner-section{flex-direction:row;justify-content:center}.ang-cookie-banner .ang-cookie-banner-content{max-width:668px;margin:0 24px}.ang-cookie-banner .ang-cookie-banner-actions{flex-direction:column;flex-wrap:nowrap;width:304px;margin-left:16px}.ang-cookie-banner .ang-cookie-banner-action{flex:unset}}@media(prefers-reduced-motion:no-preference){.ang-cookie-banner.ang-cookie-banner-opened{animation:ang-cookie-banner-opened 1s ease-in forwards}.ang-cookie-banner.ang-cookie-banner-closed{animation:ang-cookie-banner-closed 1s ease-out forwards}.ang-cookie-banner-container.ang-cookie-banner-opened{animation:ang-cookie-banner-container-opened 1s ease-in forwards}.ang-cookie-banner-container.ang-cookie-banner-closed{animation:ang-cookie-banner-container-closed 1s ease-out forwards}}@media(prefers-reduced-motion:reduce){.ang-cookie-banner.ang-cookie-banner-closed{display:none}.ang-cookie-banner.ang-cookie-banner-closed{padding-bottom:0;scroll-padding-bottom:0}}@keyframes ang-cookie-banner-opened{0%{opacity:0;transform:translateY(calc(var(--ang-cookie-banner-opened-offset, 100%) + env(safe-area-inset-bottom)))}to{opacity:1;transform:translateY(0)}}@keyframes ang-cookie-banner-closed{0%{display:block;opacity:1;transform:translateY(0)}to{display:none;opacity:0;transform:translateY(calc(var(--ang-cookie-banner-closed-offset, 100%) + env(safe-area-inset-bottom)))}}@keyframes ang-cookie-banner-container-opened{0%{padding-bottom:0;scroll-padding-bottom:0}to{padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}}@keyframes ang-cookie-banner-container-closed{0%{padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}to{padding-bottom:0;scroll-padding-bottom:0}}\n"], dependencies: [{ kind: "directive", type: AnyLink, selector: "[angAnyLink]", inputs: ["angAnyLink", "target", "rel", "download", "queryParams", "queryParamsHandling", "fragment", "preserveFragment", "skipLocationChange", "relativeTo", "browserUrl", "replaceUrl", "state", "info"], exportAs: ["angAnyLink"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TextLink, selector: "a[angTextLink]" }, { kind: "directive", type: TrackClick, selector: "[angTrackClick]", inputs: ["angTrackClick", "angTrackClickOptions", "angTrackClickOn", "angTrackClickDisabled"], exportAs: ["angTrackClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
260
|
+
}
|
|
261
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookieBanner, decorators: [{
|
|
262
|
+
type: Component,
|
|
263
|
+
args: [{ selector: 'ang-cookie-banner', imports: [AnyLink, MatButton, MatIcon, TextLink, TrackClick], providers: [provideEventScope('cookie-banner')], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
264
|
+
class: 'ang-cookie-banner',
|
|
265
|
+
'(animationend)': 'handleAnimationEnd($event)',
|
|
266
|
+
}, template: "<section class=\"ang-cookie-banner-section\" [attr.aria-labelledby]=\"titleId()\">\n <ng-content select=\"ang-cookie-banner-logo, [angCookieBannerLogo]\" />\n\n <div class=\"ang-cookie-banner-content\">\n <ng-content select=\"ang-cookie-banner-title, [angCookieBannerTitle]\">\n <h2 class=\"ang-cookie-banner-title\" [id]=\"titleId()\">Manage your privacy preferences</h2>\n </ng-content>\n\n <ng-content>\n <p class=\"ang-cookie-banner-description\">\n Cookies and similar technologies are used to play videos and to improve this website.\n </p>\n </ng-content>\n\n @if (privacyPolicy(); as policy) {\n <a angTextLink class=\"ang-cookie-banner-privacy-policy\" target=\"_blank\" [angAnyLink]=\"policy\">\n Privacy policy\n <mat-icon fontIcon=\"arrow_right_alt\" />\n </a>\n }\n </div>\n\n <div class=\"ang-cookie-banner-actions\">\n <ng-content select=\"ang-cookie-banner-action, [angCookieBannerAction]\">\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowAll)\">\n Allow all\n </button>\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowNecessary)\">\n Allow necessary only\n </button>\n <button matButton=\"outlined\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(customize)\">\n Customize\n </button>\n </ng-content>\n </div>\n</section>\n", styles: ["body.ang-cookie-banner-container{overflow-y:auto;padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}body.ang-cookie-banner-container .ang-cookie-banner{position:fixed}.ang-cookie-banner-container:not(body){position:relative;overflow-y:hidden;padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px);--ang-cookie-banner-opened-offset: 175%;--ang-cookie-banner-closed-offset: 150%}.ang-cookie-banner-container:not(body) .ang-cookie-banner{position:absolute}.ang-cookie-banner{display:block;inset:auto 0 0;overflow-y:hidden;z-index:1000;background-color:var(--ang-cookie-banner-container-color, var(--mat-sys-surface-bright));border-top-left-radius:var(--ang-cookie-banner-container-shape, var(--mat-sys-corner-large));border-top-right-radius:var(--ang-cookie-banner-container-shape, var(--mat-sys-corner-large));box-shadow:var(--ang-cookie-banner-container-elevation, 0px -16px 64px 32px color-mix(in srgb, var(--mat-sys-tertiary) 24%, transparent))}.ang-cookie-banner .ang-cookie-banner-section{display:flex;flex-direction:column;gap:32px;padding:24px}.ang-cookie-banner .ang-cookie-banner-content{display:flex;flex-direction:column;max-width:716px;margin:0 auto;gap:16px}.ang-cookie-banner .ang-cookie-banner-title{margin:0;color:var(--ang-cookie-banner-title-color, var(--mat-sys-on-surface));font-family:var(--ang-cookie-banner-title-font, var(--mat-sys-title-medium-font));font-size:var(--ang-cookie-banner-title-size, var(--mat-sys-title-medium-size));font-weight:var(--ang-cookie-banner-title-weight, var(--mat-sys-title-medium-weight));line-height:var(--ang-cookie-banner-title-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--ang-cookie-banner-title-tracking, var(--mat-sys-title-medium-tracking))}.ang-cookie-banner .ang-cookie-banner-description{margin:0;flex:auto;color:var(--ang-cookie-banner-description-color, var(--mat-sys-on-surface-variant));font-family:var(--ang-cookie-banner-description-font, var(--mat-sys-body-large-font));font-size:var(--ang-cookie-banner-description-size, var(--mat-sys-body-large-size));font-weight:var(--ang-cookie-banner-description-weight, var(--mat-sys-body-large-weight));line-height:var(--ang-cookie-banner-description-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-cookie-banner-description-tracking, var(--mat-sys-body-large-tracking))}.ang-cookie-banner .ang-cookie-banner-privacy-policy{height:48px;color:var(--ang-cookie-banner-privacy-policy-color, var(--mat-sys-on-surface));font-family:var(--ang-cookie-banner-description-font, var(--mat-sys-body-large-font));font-size:var(--ang-cookie-banner-description-size, var(--mat-sys-body-large-size));line-height:var(--ang-cookie-banner-description-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-cookie-banner-description-tracking, var(--mat-sys-body-large-tracking))}.ang-cookie-banner .ang-cookie-banner-actions{display:flex;flex-wrap:wrap;gap:16px}.ang-cookie-banner .ang-cookie-banner-action{flex:1 1 188px;min-width:188px}@media(min-width:960px){.ang-cookie-banner .ang-cookie-banner-section{flex-direction:row;justify-content:center}.ang-cookie-banner .ang-cookie-banner-content{max-width:668px;margin:0 24px}.ang-cookie-banner .ang-cookie-banner-actions{flex-direction:column;flex-wrap:nowrap;width:304px;margin-left:16px}.ang-cookie-banner .ang-cookie-banner-action{flex:unset}}@media(prefers-reduced-motion:no-preference){.ang-cookie-banner.ang-cookie-banner-opened{animation:ang-cookie-banner-opened 1s ease-in forwards}.ang-cookie-banner.ang-cookie-banner-closed{animation:ang-cookie-banner-closed 1s ease-out forwards}.ang-cookie-banner-container.ang-cookie-banner-opened{animation:ang-cookie-banner-container-opened 1s ease-in forwards}.ang-cookie-banner-container.ang-cookie-banner-closed{animation:ang-cookie-banner-container-closed 1s ease-out forwards}}@media(prefers-reduced-motion:reduce){.ang-cookie-banner.ang-cookie-banner-closed{display:none}.ang-cookie-banner.ang-cookie-banner-closed{padding-bottom:0;scroll-padding-bottom:0}}@keyframes ang-cookie-banner-opened{0%{opacity:0;transform:translateY(calc(var(--ang-cookie-banner-opened-offset, 100%) + env(safe-area-inset-bottom)))}to{opacity:1;transform:translateY(0)}}@keyframes ang-cookie-banner-closed{0%{display:block;opacity:1;transform:translateY(0)}to{display:none;opacity:0;transform:translateY(calc(var(--ang-cookie-banner-closed-offset, 100%) + env(safe-area-inset-bottom)))}}@keyframes ang-cookie-banner-container-opened{0%{padding-bottom:0;scroll-padding-bottom:0}to{padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}}@keyframes ang-cookie-banner-container-closed{0%{padding-bottom:var(--ang-cookie-banner-spacing, 0px);scroll-padding-bottom:var(--ang-cookie-banner-spacing, 0px)}to{padding-bottom:0;scroll-padding-bottom:0}}\n"] }]
|
|
267
|
+
}], ctorParameters: () => [], propDecorators: { opened: [{ type: i0.Input, args: [{ isSignal: true, alias: "opened", required: false }] }, { type: i0.Output, args: ["openedChange"] }], privacyPolicy: [{ type: i0.Input, args: [{ isSignal: true, alias: "privacyPolicy", required: false }] }], closeOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnClick", required: false }] }], allowAll: [{ type: i0.Output, args: ["allowAll"] }], allowNecessary: [{ type: i0.Output, args: ["allowNecessary"] }], customize: [{ type: i0.Output, args: ["customize"] }], titleDir: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CookieBannerTitle), { ...{ descendants: true }, isSignal: true }] }] } });
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Generated bundle index. Do not edit.
|
|
271
|
+
*/
|
|
272
|
+
|
|
273
|
+
export { CookieBanner, CookieBannerAction, CookieBannerDescription, CookieBannerLogo, CookieBannerTitle };
|
|
274
|
+
//# sourceMappingURL=atlasng-design-system-cookie-banner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system-cookie-banner.mjs","sources":["../../../../libs/design-system/cookie-banner/src/lib/cookie-banner.ts","../../../../libs/design-system/cookie-banner/src/lib/cookie-banner.html","../../../../libs/design-system/cookie-banner/src/atlasng-design-system-cookie-banner.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n OutputEmitterRef,\n Renderer2,\n RendererStyleFlags2,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { provideEventScope, TrackClick } from '@atlasng/analytics';\nimport { AnyLink, AnyLinkCommand, IdGenerator } from '@atlasng/common';\nimport { RESIZE_OBSERVER } from '@atlasng/core';\nimport { TextLink } from '@atlasng/design-system/text-link';\n\n/** Prefix used when generating a custom title id if one is not provided by the consumer. */\nconst DEFAULT_TITLE_ID_PREFIX = 'ang-cookie-banner-title';\n\n/** Class applied to the external container that hosts banner spacing and animation state. */\nconst CONTAINER_CLASS = 'ang-cookie-banner-container';\n/** Class toggled when the banner opens to drive enter animations. */\nconst OPENED_CLASS = 'ang-cookie-banner-opened';\n/** Class toggled when the banner closes to drive exit animations. */\nconst CLOSED_CLASS = 'ang-cookie-banner-closed';\n/** CSS custom property used to reserve layout spacing for the banner height. */\nconst SPACING_VARIABLE = '--ang-cookie-banner-spacing';\n\n/**\n * Marks projected logo content inside the cookie banner.\n */\n@Directive({\n selector: 'ang-cookie-banner-logo, [angCookieBannerLogo]',\n host: { class: 'ang-cookie-banner-logo' },\n})\nexport class CookieBannerLogo {}\n\n/**\n * Marks projected title content and guarantees it has an id for aria labelling.\n */\n@Directive({\n selector: 'ang-cookie-banner-title, [angCookieBannerTitle]',\n host: {\n class: 'ang-cookie-banner-title',\n '[attr.id]': 'id()',\n },\n})\nexport class CookieBannerTitle {\n /**\n * Id used for accessibility. Generates a default id if not provided.\n */\n readonly id = input(inject(IdGenerator).getId(DEFAULT_TITLE_ID_PREFIX));\n}\n\n/**\n * Marks projected description content inside the cookie banner.\n */\n@Directive({\n selector: 'ang-cookie-banner-description, [angCookieBannerDescription]',\n host: { class: 'ang-cookie-banner-description' },\n})\nexport class CookieBannerDescription {}\n\n/**\n * Marks a projected action element and optionally closes the banner when clicked.\n */\n@Directive({\n selector: 'ang-cookie-banner-action, [angCookieBannerAction]',\n host: {\n class: 'ang-cookie-banner-action',\n '(click)': 'handleClick()',\n },\n})\nexport class CookieBannerAction {\n /**\n * When true, this action requests closing the banner after click.\n */\n readonly closeOnClick = input(true);\n\n /** Reference to the parent cookie banner. */\n private readonly banner = inject(CookieBanner);\n\n /**\n * Closes the parent banner only when both action-level and banner-level\n * closeOnClick settings are enabled.\n */\n protected handleClick(): void {\n if (this.closeOnClick() && this.banner.closeOnClick()) {\n this.banner.close();\n }\n }\n}\n\n/**\n * Marks the container for the cookie banner, which is used to apply spacing and animation classes.\n */\n@Directive({\n selector: 'ang-cookie-banner-container, [angCookieBannerContainer]',\n host: { class: 'ang-cookie-banner-container' },\n})\nexport class CookieBannerContainer {\n /**\n * Reference to the host element.\n * @internal\n */\n readonly el = inject(ElementRef).nativeElement as HTMLElement;\n}\n\n/**\n * Cookie consent banner.\n *\n * Supports projected title/description/action content, emits user intent events,\n * and can auto-close when users activate action buttons.\n */\n@Component({\n selector: 'ang-cookie-banner',\n imports: [AnyLink, MatButton, MatIcon, TextLink, TrackClick],\n templateUrl: './cookie-banner.html',\n styleUrl: './cookie-banner.scss',\n providers: [provideEventScope('cookie-banner')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ang-cookie-banner',\n '(animationend)': 'handleAnimationEnd($event)',\n },\n})\nexport class CookieBanner {\n /**\n * Controls whether the banner is visible.\n */\n readonly opened = model(true);\n\n /**\n * Optional privacy policy link configuration.\n */\n readonly privacyPolicy = input<AnyLinkCommand>();\n\n /**\n * Global close behavior for built-in click handlers.\n */\n readonly closeOnClick = input(true);\n\n /** Emits when the user accepts all cookies. */\n readonly allowAll = output<void>();\n\n /** Emits when the user accepts only necessary cookies. */\n readonly allowNecessary = output<void>();\n\n /** Emits when the user chooses to customize cookie settings. */\n readonly customize = output<void>();\n\n /**\n * Id used by aria-labelledby. Falls back to a generated id if no title directive is projected.\n */\n protected readonly titleId = computed(() => this.titleDir()?.id() ?? this.idGenerator.getId(DEFAULT_TITLE_ID_PREFIX));\n\n /** Reference to the projected title directive. */\n private readonly titleDir = contentChild(CookieBannerTitle, { descendants: true });\n\n /** Reference to the id generator. */\n private readonly idGenerator = inject(IdGenerator);\n\n /** Renderer used to update host/container classes and inline CSS variables. */\n private readonly renderer = inject(Renderer2);\n\n /**\n * External element that receives spacing and animation classes.\n * Falls back to document body when no explicit container directive is projected.\n */\n private readonly containerEl = inject(CookieBannerContainer, { optional: true })?.el ?? inject(DOCUMENT).body;\n\n /** Native host element of this banner instance. */\n private readonly el = inject(ElementRef).nativeElement as HTMLElement;\n\n /** Current measured banner block size in pixels. */\n private readonly height = signal(0);\n\n /** Initializes the cookie banner. */\n constructor() {\n this.initializeContainer();\n this.monitorHeight();\n\n let isFirstChange = true;\n effect(() => {\n const animationClasses = this.opened() ? OPENED_CLASS : CLOSED_CLASS;\n if (isFirstChange) {\n isFirstChange = false;\n } else {\n this.setAnimationClasses(animationClasses);\n }\n });\n\n const { containerEl, renderer } = this;\n effect(() => {\n const height = `${this.height()}px`;\n renderer.setStyle(containerEl, SPACING_VARIABLE, height, RendererStyleFlags2.DashCase);\n });\n }\n\n /**\n * Open the banner.\n */\n open(): void {\n this.opened.set(true);\n }\n\n /**\n * Close the banner.\n */\n close(): void {\n this.opened.set(false);\n }\n\n /**\n * Emits the selected action and closes the banner when closeOnClick is enabled.\n *\n * @param ref Emitter associated with the selected banner action.\n */\n protected handleClick(ref: OutputEmitterRef<void>): void {\n ref.emit();\n if (this.closeOnClick()) {\n this.close();\n }\n }\n\n /**\n * Handles the end of an animation event.\n *\n * @param event The animation event.\n */\n protected handleAnimationEnd(event: AnimationEvent): void {\n if (event.animationName === 'ang-cookie-banner-closed') {\n this.renderer.setStyle(this.el, 'display', 'none');\n }\n }\n\n /**\n * Registers container-level classes/styles and ensures they are removed on destroy.\n */\n private initializeContainer(): void {\n const { containerEl, renderer } = this;\n renderer.addClass(containerEl, CONTAINER_CLASS);\n inject(DestroyRef).onDestroy(() => {\n renderer.removeClass(containerEl, CONTAINER_CLASS);\n renderer.removeClass(containerEl, OPENED_CLASS);\n renderer.removeClass(containerEl, CLOSED_CLASS);\n renderer.removeStyle(containerEl, SPACING_VARIABLE, RendererStyleFlags2.DashCase);\n });\n }\n\n /**\n * Observes host size changes and updates the container spacing CSS variable.\n */\n private monitorHeight(): void {\n const ResizeObserver = inject(RESIZE_OBSERVER);\n\n if (ResizeObserver) {\n const resizeObserver = new ResizeObserver((entries) => {\n this.height.set(entries[0].borderBoxSize[0].blockSize);\n });\n\n resizeObserver.observe(this.el);\n inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n }\n }\n\n /**\n * Applies open/closed animation classes to both container and host elements.\n *\n * @param classes Animation class token to apply.\n */\n private setAnimationClasses(classes: string): void {\n const { containerEl, el, renderer } = this;\n renderer.removeClass(containerEl, OPENED_CLASS);\n renderer.removeClass(containerEl, CLOSED_CLASS);\n renderer.removeClass(el, OPENED_CLASS);\n renderer.removeClass(el, CLOSED_CLASS);\n renderer.removeStyle(el, 'display');\n renderer.addClass(containerEl, classes);\n renderer.addClass(el, classes);\n }\n}\n","<section class=\"ang-cookie-banner-section\" [attr.aria-labelledby]=\"titleId()\">\n <ng-content select=\"ang-cookie-banner-logo, [angCookieBannerLogo]\" />\n\n <div class=\"ang-cookie-banner-content\">\n <ng-content select=\"ang-cookie-banner-title, [angCookieBannerTitle]\">\n <h2 class=\"ang-cookie-banner-title\" [id]=\"titleId()\">Manage your privacy preferences</h2>\n </ng-content>\n\n <ng-content>\n <p class=\"ang-cookie-banner-description\">\n Cookies and similar technologies are used to play videos and to improve this website.\n </p>\n </ng-content>\n\n @if (privacyPolicy(); as policy) {\n <a angTextLink class=\"ang-cookie-banner-privacy-policy\" target=\"_blank\" [angAnyLink]=\"policy\">\n Privacy policy\n <mat-icon fontIcon=\"arrow_right_alt\" />\n </a>\n }\n </div>\n\n <div class=\"ang-cookie-banner-actions\">\n <ng-content select=\"ang-cookie-banner-action, [angCookieBannerAction]\">\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowAll)\">\n Allow all\n </button>\n <button matButton=\"filled\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(allowNecessary)\">\n Allow necessary only\n </button>\n <button matButton=\"outlined\" angTrackClick class=\"ang-cookie-banner-action\" (click)=\"handleClick(customize)\">\n Customize\n </button>\n </ng-content>\n </div>\n</section>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as i2 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
|
+
import * as i1 from '@angular/material/divider';
|
|
6
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* End of Results Indicator Component
|
|
10
|
+
*/
|
|
11
|
+
class EndOfResultsIndicator {
|
|
12
|
+
/** Label text placed before the results count */
|
|
13
|
+
label = input('Results:', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
14
|
+
/** Description placed after the results count in it's own text box */
|
|
15
|
+
description = input('End of results', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
16
|
+
/** Number of results */
|
|
17
|
+
count = input.required(...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: EndOfResultsIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: EndOfResultsIndicator, isStandalone: true, selector: "ang-end-of-results-indicator", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<mat-divider />\n<div class=\"container\">\n <div class=\"results-count\">{{ label() }} {{ count() | number }}</div>\n <div class=\"end-message\">{{ description() }}</div>\n</div>\n", styles: [":host{display:block}:host .container{display:grid;grid-template-columns:1fr;justify-items:stretch;gap:.75rem;margin-top:2rem}:host .container .results-count,:host .container .end-message{box-sizing:border-box;display:flex;justify-content:center;align-items:center;min-height:3.5rem;min-width:7.75rem;padding:.5rem 1rem;border-style:solid;border-width:1px;font-family:var(--ang-end-of-results-text-font, var(--mat-sys-label-large-font));font-size:var(--ang-end-of-results-text-size, var(--mat-sys-label-large-size));font-weight:var(--ang-end-of-results-text-weight, var(--mat-sys-label-large-weight));line-height:var(--ang-end-of-results-text-line-height, var(--mat-sys-label-large-line-height));letter-spacing:var(--ang-end-of-results-text-tracking, var(--mat-sys-label-large-tracking));color:var(--ang-end-of-results-color, var(--mat-sys-on-surface-variant));background-color:var(--ang-end-of-results-background-color, var(--mat-sys-surface-bright));border-color:var(--ang-end-of-results-border-color, var(--mat-sys-outline-variant));border-radius:var(--mat-sys-corner-small)}@media(min-width:640px){:host .container{grid-auto-flow:column;grid-auto-columns:1fr;justify-content:center;width:fit-content;margin-left:auto;margin-right:auto}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: EndOfResultsIndicator, decorators: [{
|
|
22
|
+
type: Component,
|
|
23
|
+
args: [{ selector: 'ang-end-of-results-indicator', imports: [CommonModule, MatDividerModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-divider />\n<div class=\"container\">\n <div class=\"results-count\">{{ label() }} {{ count() | number }}</div>\n <div class=\"end-message\">{{ description() }}</div>\n</div>\n", styles: [":host{display:block}:host .container{display:grid;grid-template-columns:1fr;justify-items:stretch;gap:.75rem;margin-top:2rem}:host .container .results-count,:host .container .end-message{box-sizing:border-box;display:flex;justify-content:center;align-items:center;min-height:3.5rem;min-width:7.75rem;padding:.5rem 1rem;border-style:solid;border-width:1px;font-family:var(--ang-end-of-results-text-font, var(--mat-sys-label-large-font));font-size:var(--ang-end-of-results-text-size, var(--mat-sys-label-large-size));font-weight:var(--ang-end-of-results-text-weight, var(--mat-sys-label-large-weight));line-height:var(--ang-end-of-results-text-line-height, var(--mat-sys-label-large-line-height));letter-spacing:var(--ang-end-of-results-text-tracking, var(--mat-sys-label-large-tracking));color:var(--ang-end-of-results-color, var(--mat-sys-on-surface-variant));background-color:var(--ang-end-of-results-background-color, var(--mat-sys-surface-bright));border-color:var(--ang-end-of-results-border-color, var(--mat-sys-outline-variant));border-radius:var(--mat-sys-corner-small)}@media(min-width:640px){:host .container{grid-auto-flow:column;grid-auto-columns:1fr;justify-content:center;width:fit-content;margin-left:auto;margin-right:auto}}\n"] }]
|
|
24
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: true }] }] } });
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generated bundle index. Do not edit.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export { EndOfResultsIndicator };
|
|
31
|
+
//# sourceMappingURL=atlasng-design-system-indicators-end-of-results.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system-indicators-end-of-results.mjs","sources":["../../../../libs/design-system/indicators/end-of-results/src/lib/end-of-results.ts","../../../../libs/design-system/indicators/end-of-results/src/lib/end-of-results.html","../../../../libs/design-system/indicators/end-of-results/src/atlasng-design-system-indicators-end-of-results.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { MatDividerModule } from '@angular/material/divider';\n\n/**\n * End of Results Indicator Component\n */\n@Component({\n selector: 'ang-end-of-results-indicator',\n imports: [CommonModule, MatDividerModule],\n templateUrl: './end-of-results.html',\n styleUrl: './end-of-results.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EndOfResultsIndicator {\n /** Label text placed before the results count */\n readonly label = input('Results:');\n\n /** Description placed after the results count in it's own text box */\n readonly description = input('End of results');\n\n /** Number of results */\n readonly count = input.required<number>();\n}\n","<mat-divider />\n<div class=\"container\">\n <div class=\"results-count\">{{ label() }} {{ count() | number }}</div>\n <div class=\"end-message\">{{ description() }}</div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAIA;;AAEG;MAQU,qBAAqB,CAAA;;AAEvB,IAAA,KAAK,GAAG,KAAK,CAAC,UAAU,4EAAC;;AAGzB,IAAA,WAAW,GAAG,KAAK,CAAC,gBAAgB,kFAAC;;AAGrC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;uGAR9B,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdlC,yLAKA,EAAA,MAAA,EAAA,CAAA,2tCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,YAAY,8BAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAK7B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;+BACE,8BAA8B,EAAA,OAAA,EAC/B,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGxB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yLAAA,EAAA,MAAA,EAAA,CAAA,2tCAAA,CAAA,EAAA;;;AEZjD;;AAEG;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/material/button';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { TrackClick, provideEventScope } from '@atlasng/analytics';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Empty-state indicator shown when a results list has no matches.
|
|
9
|
+
*
|
|
10
|
+
* The component renders a short message and a clear action that
|
|
11
|
+
* consumers can wire to reset search or filter state.
|
|
12
|
+
*/
|
|
13
|
+
class NoResultsIndicator {
|
|
14
|
+
/** Message shown above the action button. */
|
|
15
|
+
description = input('No results. Adjust filters or search again.', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
16
|
+
/** Button label used for the clear action. */
|
|
17
|
+
label = input('Clear filters', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
18
|
+
/** Emitted when the action button is clicked. */
|
|
19
|
+
clearClick = output();
|
|
20
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: NoResultsIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
21
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: NoResultsIndicator, isStandalone: true, selector: "ang-no-results-indicator", inputs: { description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clearClick: "clearClick" }, providers: [provideEventScope('no-results-indicator')], ngImport: i0, template: "<div class=\"description\">{{ description() }}</div>\n<button matButton=\"filled\" angTrackClick (click)=\"clearClick.emit()\">{{ label() }}</button>\n", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .description{margin-bottom:1.5rem;color:var(--ang-no-results-text-color, var(--mat-sys-on-surface));font-family:var(--ang-no-results-text-font, var(--mat-sys-body-large-font));font-size:var(--ang-no-results-text-size, var(--mat-sys-body-large-size));font-weight:var(--ang-no-results-text-weight, var(--mat-sys-body-large-weight));line-height:var(--ang-no-results-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-no-results-text-tracking, var(--mat-sys-body-large-tracking))}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: TrackClick, selector: "[angTrackClick]", inputs: ["angTrackClick", "angTrackClickOptions", "angTrackClickOn", "angTrackClickDisabled"], exportAs: ["angTrackClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
22
|
+
}
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: NoResultsIndicator, decorators: [{
|
|
24
|
+
type: Component,
|
|
25
|
+
args: [{ selector: 'ang-no-results-indicator', imports: [MatButtonModule, TrackClick], providers: [provideEventScope('no-results-indicator')], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"description\">{{ description() }}</div>\n<button matButton=\"filled\" angTrackClick (click)=\"clearClick.emit()\">{{ label() }}</button>\n", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .description{margin-bottom:1.5rem;color:var(--ang-no-results-text-color, var(--mat-sys-on-surface));font-family:var(--ang-no-results-text-font, var(--mat-sys-body-large-font));font-size:var(--ang-no-results-text-size, var(--mat-sys-body-large-size));font-weight:var(--ang-no-results-text-weight, var(--mat-sys-body-large-weight));line-height:var(--ang-no-results-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--ang-no-results-text-tracking, var(--mat-sys-body-large-tracking))}\n"] }]
|
|
26
|
+
}], propDecorators: { description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], clearClick: [{ type: i0.Output, args: ["clearClick"] }] } });
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Generated bundle index. Do not edit.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export { NoResultsIndicator };
|
|
33
|
+
//# sourceMappingURL=atlasng-design-system-indicators-no-results.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system-indicators-no-results.mjs","sources":["../../../../libs/design-system/indicators/no-results/src/lib/no-results.ts","../../../../libs/design-system/indicators/no-results/src/lib/no-results.html","../../../../libs/design-system/indicators/no-results/src/atlasng-design-system-indicators-no-results.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { provideEventScope, TrackClick } from '@atlasng/analytics';\n\n/**\n * Empty-state indicator shown when a results list has no matches.\n *\n * The component renders a short message and a clear action that\n * consumers can wire to reset search or filter state.\n */\n@Component({\n selector: 'ang-no-results-indicator',\n imports: [MatButtonModule, TrackClick],\n templateUrl: './no-results.html',\n styleUrl: './no-results.scss',\n providers: [provideEventScope('no-results-indicator')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NoResultsIndicator {\n /** Message shown above the action button. */\n readonly description = input('No results. Adjust filters or search again.');\n\n /** Button label used for the clear action. */\n readonly label = input('Clear filters');\n\n /** Emitted when the action button is clicked. */\n readonly clearClick = output<void>();\n}\n","<div class=\"description\">{{ description() }}</div>\n<button matButton=\"filled\" angTrackClick (click)=\"clearClick.emit()\">{{ label() }}</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAIA;;;;;AAKG;MASU,kBAAkB,CAAA;;AAEpB,IAAA,WAAW,GAAG,KAAK,CAAC,6CAA6C,kFAAC;;AAGlE,IAAA,KAAK,GAAG,KAAK,CAAC,eAAe,4EAAC;;IAG9B,UAAU,GAAG,MAAM,EAAQ;uGARzB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAHlB,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfxD,yJAEA,EAAA,MAAA,EAAA,CAAA,ikBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAM1B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,WAC3B,CAAC,eAAe,EAAE,UAAU,CAAC,EAAA,SAAA,EAG3B,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,EAAA,eAAA,EACrC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yJAAA,EAAA,MAAA,EAAA,CAAA,ikBAAA,CAAA,EAAA;;;AEhBjD;;AAEG;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { formatNumber } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, computed, inject, LOCALE_ID, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Displays a localized "value of total" style indicator.
|
|
7
|
+
*
|
|
8
|
+
* Example output: "Showing 5 of 120 results".
|
|
9
|
+
*/
|
|
10
|
+
class ResultsIndicator {
|
|
11
|
+
/** Current value to display (for example, number of visible results). */
|
|
12
|
+
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
13
|
+
/** Maximum or total value to display. */
|
|
14
|
+
total = input.required(...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
|
|
15
|
+
/** Word or separator symbol between value and total. Defaults to "of". */
|
|
16
|
+
separator = input('of', ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
|
|
17
|
+
/** Optional text shown before the numeric segment. */
|
|
18
|
+
prefix = input('', ...(ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []));
|
|
19
|
+
/** Optional text shown after the numeric segment. */
|
|
20
|
+
suffix = input('', ...(ngDevMode ? [{ debugName: "suffix" }] : /* istanbul ignore next */ []));
|
|
21
|
+
/**
|
|
22
|
+
* Final display string composed from prefix/value/separator/total/suffix.
|
|
23
|
+
* Numeric values are localized using the active Angular locale.
|
|
24
|
+
*/
|
|
25
|
+
text = computed(() => {
|
|
26
|
+
const parts = [
|
|
27
|
+
this.prefix(),
|
|
28
|
+
formatNumber(this.value(), this.locale),
|
|
29
|
+
this.separator(),
|
|
30
|
+
formatNumber(this.total(), this.locale),
|
|
31
|
+
this.suffix(),
|
|
32
|
+
];
|
|
33
|
+
return parts.join(' ').trim();
|
|
34
|
+
}, ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
|
|
35
|
+
/** Locale used for number formatting, injected from Angular DI. */
|
|
36
|
+
locale = inject(LOCALE_ID);
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ResultsIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: ResultsIndicator, isStandalone: true, selector: "ang-results-indicator", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: true, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `{{ text() }}`, isInline: true, styles: [":host{display:inline-flex;justify-content:center;align-items:center;min-height:3.5rem;border-radius:.5rem;padding:0 1rem;font-family:var(--ang-results-text-font, var(--mat-sys-label-large-font));font-size:var(--ang-results-text-size, var(--mat-sys-label-large-size));font-weight:var(--ang-results-text-weight, var(--mat-sys-label-large-weight));line-height:var(--ang-results-text-line-height, var(--mat-sys-label-large-line-height));letter-spacing:var(--ang-results-text-tracking, var(--mat-sys-label-large-tracking));color:var(--ang-results-color, var(--mat-sys-on-surface-variant));background-color:var(--ang-results-background-color, var(--mat-sys-surface-bright));border:1px solid var(--ang-results-border-color, var(--mat-sys-outline-variant))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ResultsIndicator, decorators: [{
|
|
41
|
+
type: Component,
|
|
42
|
+
args: [{ selector: 'ang-results-indicator', template: `{{ text() }}`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-flex;justify-content:center;align-items:center;min-height:3.5rem;border-radius:.5rem;padding:0 1rem;font-family:var(--ang-results-text-font, var(--mat-sys-label-large-font));font-size:var(--ang-results-text-size, var(--mat-sys-label-large-size));font-weight:var(--ang-results-text-weight, var(--mat-sys-label-large-weight));line-height:var(--ang-results-text-line-height, var(--mat-sys-label-large-line-height));letter-spacing:var(--ang-results-text-tracking, var(--mat-sys-label-large-tracking));color:var(--ang-results-color, var(--mat-sys-on-surface-variant));background-color:var(--ang-results-background-color, var(--mat-sys-surface-bright));border:1px solid var(--ang-results-border-color, var(--mat-sys-outline-variant))}\n"] }]
|
|
43
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: true }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }] } });
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Generated bundle index. Do not edit.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
export { ResultsIndicator };
|
|
50
|
+
//# sourceMappingURL=atlasng-design-system-indicators-results.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system-indicators-results.mjs","sources":["../../../../libs/design-system/indicators/results/src/lib/results.ts","../../../../libs/design-system/indicators/results/src/atlasng-design-system-indicators-results.ts"],"sourcesContent":["import { formatNumber } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, LOCALE_ID } from '@angular/core';\n\n/**\n * Displays a localized \"value of total\" style indicator.\n *\n * Example output: \"Showing 5 of 120 results\".\n */\n@Component({\n selector: 'ang-results-indicator',\n template: `{{ text() }}`,\n styleUrl: './results.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ResultsIndicator {\n /** Current value to display (for example, number of visible results). */\n readonly value = input.required<number>();\n\n /** Maximum or total value to display. */\n readonly total = input.required<number>();\n\n /** Word or separator symbol between value and total. Defaults to \"of\". */\n readonly separator = input('of');\n\n /** Optional text shown before the numeric segment. */\n readonly prefix = input('');\n\n /** Optional text shown after the numeric segment. */\n readonly suffix = input('');\n\n /**\n * Final display string composed from prefix/value/separator/total/suffix.\n * Numeric values are localized using the active Angular locale.\n */\n protected readonly text = computed(() => {\n const parts = [\n this.prefix(),\n formatNumber(this.value(), this.locale),\n this.separator(),\n formatNumber(this.total(), this.locale),\n this.suffix(),\n ];\n\n return parts.join(' ').trim();\n });\n\n /** Locale used for number formatting, injected from Angular DI. */\n private readonly locale = inject(LOCALE_ID);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA;;;;AAIG;MAOU,gBAAgB,CAAA;;AAElB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,IAAA,SAAS,GAAG,KAAK,CAAC,IAAI,gFAAC;;AAGvB,IAAA,MAAM,GAAG,KAAK,CAAC,EAAE,6EAAC;;AAGlB,IAAA,MAAM,GAAG,KAAK,CAAC,EAAE,6EAAC;AAE3B;;;AAGG;AACgB,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,MAAM,EAAE;YACb,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE;YAChB,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE;SACd;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC/B,IAAA,CAAC,2EAAC;;AAGe,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;uGAjChC,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,qsBAJjB,CAAA,YAAA,CAAc,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ivBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIb,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,QAAA,EACvB,CAAA,YAAA,CAAc,EAAA,eAAA,EAEP,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,ivBAAA,CAAA,EAAA;;;ACZjD;;AAEG;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import * as i1 from '@atlasng/analytics';
|
|
5
|
+
import { TrackClick } from '@atlasng/analytics';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Styled anchor directive for AtlasNG text links.
|
|
9
|
+
*/
|
|
10
|
+
class TextLink {
|
|
11
|
+
/** Focus manager. */
|
|
12
|
+
focusMonitor = inject(FocusMonitor);
|
|
13
|
+
/** Native host anchor element. */
|
|
14
|
+
element = inject(ElementRef).nativeElement;
|
|
15
|
+
/**
|
|
16
|
+
* Moves focus to the host anchor using the Angular CDK focus monitor.
|
|
17
|
+
*
|
|
18
|
+
* @param origin Focus origin to apply when moving focus.
|
|
19
|
+
* @param options Optional focus options passed to the underlying focus call.
|
|
20
|
+
*/
|
|
21
|
+
focus(origin = 'program', options) {
|
|
22
|
+
if (origin) {
|
|
23
|
+
this.focusMonitor.focusVia(this.element, origin, options);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.element.focus(options);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TextLink, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: TextLink, isStandalone: true, selector: "a[angTextLink]", host: { classAttribute: "ang-text-link" }, hostDirectives: [{ directive: i1.TrackClick, inputs: ["angTrackClick", "angTrackTextLink", "angTrackClickOptions", "angTrackTextLinkOptions"] }], ngImport: i0, template: "<span class=\"ang-text-link--label\">\n <ng-content />\n</span>\n\n<span class=\"ang-text-link--icons\">\n <ng-content select=\".material-icons, mat-icon, [matButtonIcon]\" />\n</span>\n", styles: [".ang-text-link{display:inline-flex;align-items:center;color:var(--ang-text-link-button-color, var(--mat-sys-on-surface));text-decoration:underline;font-weight:600}.ang-text-link:focus-visible{outline:solid 2px var(--ang-text-link-button-color, var(--mat-sys-on-surface));outline-offset:1px}.ang-text-link .ang-text-link--icons{position:relative;display:inline-flex;align-items:center;overflow-y:visible;height:0}.ang-text-link .ang-text-link--icons:not(:empty){margin-left:var(--ang-text-link-button-icon-offset, 4px)}.ang-text-link .ang-text-link--icons .material-icons,.ang-text-link .ang-text-link--icons mat-icon,.ang-text-link .ang-text-link--icons [matButtonIcon]{width:var(--ang-text-link-button-icon-size, 24px);height:var(--ang-text-link-button-icon-size, 24px);font-size:var(--ang-text-link-button-icon-size, 24px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TextLink, decorators: [{
|
|
33
|
+
type: Component,
|
|
34
|
+
args: [{ selector: 'a[angTextLink]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
35
|
+
class: 'ang-text-link',
|
|
36
|
+
}, hostDirectives: [
|
|
37
|
+
{
|
|
38
|
+
directive: TrackClick,
|
|
39
|
+
inputs: ['angTrackClick: angTrackTextLink', 'angTrackClickOptions: angTrackTextLinkOptions'],
|
|
40
|
+
},
|
|
41
|
+
], template: "<span class=\"ang-text-link--label\">\n <ng-content />\n</span>\n\n<span class=\"ang-text-link--icons\">\n <ng-content select=\".material-icons, mat-icon, [matButtonIcon]\" />\n</span>\n", styles: [".ang-text-link{display:inline-flex;align-items:center;color:var(--ang-text-link-button-color, var(--mat-sys-on-surface));text-decoration:underline;font-weight:600}.ang-text-link:focus-visible{outline:solid 2px var(--ang-text-link-button-color, var(--mat-sys-on-surface));outline-offset:1px}.ang-text-link .ang-text-link--icons{position:relative;display:inline-flex;align-items:center;overflow-y:visible;height:0}.ang-text-link .ang-text-link--icons:not(:empty){margin-left:var(--ang-text-link-button-icon-offset, 4px)}.ang-text-link .ang-text-link--icons .material-icons,.ang-text-link .ang-text-link--icons mat-icon,.ang-text-link .ang-text-link--icons [matButtonIcon]{width:var(--ang-text-link-button-icon-size, 24px);height:var(--ang-text-link-button-icon-size, 24px);font-size:var(--ang-text-link-button-icon-size, 24px)}\n"] }]
|
|
42
|
+
}] });
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generated bundle index. Do not edit.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
export { TextLink };
|
|
49
|
+
//# sourceMappingURL=atlasng-design-system-text-link.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system-text-link.mjs","sources":["../../../../libs/design-system/text-link/src/lib/text-link.ts","../../../../libs/design-system/text-link/src/lib/text-link.html","../../../../libs/design-system/text-link/src/atlasng-design-system-text-link.ts"],"sourcesContent":["import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, ViewEncapsulation } from '@angular/core';\nimport { TrackClick } from '@atlasng/analytics';\n\n/**\n * Styled anchor directive for AtlasNG text links.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'a[angTextLink]',\n templateUrl: './text-link.html',\n styleUrl: './text-link.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ang-text-link',\n },\n hostDirectives: [\n {\n directive: TrackClick,\n inputs: ['angTrackClick: angTrackTextLink', 'angTrackClickOptions: angTrackTextLinkOptions'],\n },\n ],\n})\nexport class TextLink {\n /** Focus manager. */\n private readonly focusMonitor = inject(FocusMonitor);\n\n /** Native host anchor element. */\n private readonly element = inject(ElementRef).nativeElement as HTMLElement;\n\n /**\n * Moves focus to the host anchor using the Angular CDK focus monitor.\n *\n * @param origin Focus origin to apply when moving focus.\n * @param options Optional focus options passed to the underlying focus call.\n */\n focus(origin: FocusOrigin = 'program', options?: FocusOptions): void {\n if (origin) {\n this.focusMonitor.focusVia(this.element, origin, options);\n } else {\n this.element.focus(options);\n }\n }\n}\n","<span class=\"ang-text-link--label\">\n <ng-content />\n</span>\n\n<span class=\"ang-text-link--icons\">\n <ng-content select=\".material-icons, mat-icon, [matButtonIcon]\" />\n</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAIA;;AAEG;MAkBU,QAAQ,CAAA;;AAEF,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGnC,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAA4B;AAE1E;;;;;AAKG;AACH,IAAA,KAAK,CAAC,MAAA,GAAsB,SAAS,EAAE,OAAsB,EAAA;QAC3D,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;QAC3D;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC7B;IACF;uGAnBW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,uQCxBrB,8LAOA,EAAA,MAAA,EAAA,CAAA,6zBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDiBa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAjBpB,SAAS;+BAEE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,eAAe;qBACvB,EAAA,cAAA,EACe;AACd,wBAAA;AACE,4BAAA,SAAS,EAAE,UAAU;AACrB,4BAAA,MAAM,EAAE,CAAC,iCAAiC,EAAE,+CAA+C,CAAC;AAC7F,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,8LAAA,EAAA,MAAA,EAAA,CAAA,6zBAAA,CAAA,EAAA;;;AEtBH;;AAEG;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlasng-design-system.mjs","sources":["../../../../libs/design-system/src/index.ts","../../../../libs/design-system/src/atlasng-design-system.ts"],"sourcesContent":["export default {};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA,YAAe,EAAE;;ACAjB;;AAEG"}
|