@factor_ec/ui 4.0.11 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +49 -10
  2. package/fesm2022/factor_ec-ui.mjs +725 -461
  3. package/fesm2022/factor_ec-ui.mjs.map +1 -1
  4. package/lib/avatar/avatar.component.d.ts +17 -0
  5. package/lib/chart.service.d.ts +18 -0
  6. package/lib/icon/icon.component.d.ts +14 -0
  7. package/lib/{io/image → image}/image.component.d.ts +4 -5
  8. package/lib/message.service.d.ts +14 -4
  9. package/lib/models/chart.d.ts +12 -0
  10. package/lib/models/ui-options.d.ts +9 -0
  11. package/lib/observe-intersecting.directive.d.ts +8 -9
  12. package/lib/progress/progress.component.d.ts +10 -0
  13. package/lib/{io/rating → rating}/rating.component.d.ts +2 -4
  14. package/lib/ui.module.d.ts +13 -0
  15. package/lib/ui.service.d.ts +8 -0
  16. package/package.json +7 -7
  17. package/public-api.d.ts +12 -8
  18. package/esm2022/factor_ec-ui.mjs +0 -5
  19. package/esm2022/lib/io/avatar/avatar.component.mjs +0 -75
  20. package/esm2022/lib/io/icon/icon.component.mjs +0 -96
  21. package/esm2022/lib/io/image/image.component.mjs +0 -84
  22. package/esm2022/lib/io/progress/progress.component.mjs +0 -43
  23. package/esm2022/lib/io/rating/rating.component.mjs +0 -74
  24. package/esm2022/lib/message-content/message-content.component.mjs +0 -20
  25. package/esm2022/lib/message-dialog/message-dialog.component.mjs +0 -33
  26. package/esm2022/lib/message.service.mjs +0 -60
  27. package/esm2022/lib/models/message-content.mjs +0 -2
  28. package/esm2022/lib/models/message-options.mjs +0 -2
  29. package/esm2022/lib/models/task.mjs +0 -2
  30. package/esm2022/lib/models/ui-configuration.mjs +0 -2
  31. package/esm2022/lib/nav/timeline/timeline.component.mjs +0 -102
  32. package/esm2022/lib/observe-intersecting.directive.mjs +0 -44
  33. package/esm2022/lib/progress.service.mjs +0 -48
  34. package/esm2022/public-api.mjs +0 -13
  35. package/lib/io/avatar/avatar.component.d.ts +0 -21
  36. package/lib/io/icon/icon.component.d.ts +0 -22
  37. package/lib/io/progress/progress.component.d.ts +0 -14
  38. package/lib/message-content/message-content.component.d.ts +0 -7
  39. package/lib/message-dialog/message-dialog.component.d.ts +0 -10
  40. package/lib/models/task.d.ts +0 -10
  41. package/lib/models/ui-configuration.d.ts +0 -7
  42. package/lib/nav/timeline/timeline.component.d.ts +0 -18
  43. package/lib/progress.service.d.ts +0 -15
  44. package/scss/components/avatar.scss +0 -15
  45. package/scss/components/collapsible.scss +0 -46
  46. package/scss/components/dropdown.scss +0 -56
  47. package/scss/components/icon.scss +0 -40
  48. package/scss/components/image.scss +0 -62
  49. package/scss/components/index.scss +0 -10
  50. package/scss/components/list.scss +0 -63
  51. package/scss/components/ph.scss +0 -27
  52. package/scss/components/popup.scss +0 -7
  53. package/scss/components/progress.scss +0 -119
  54. package/scss/components/rating.scss +0 -61
  55. package/scss/index.scss +0 -5
  56. package/scss/mixins/breakpoints.scss +0 -123
  57. package/scss/mixins.scss +0 -1
  58. package/scss/reboot.scss +0 -586
  59. package/scss/root.scss +0 -52
  60. package/scss/variables.scss +0 -116
@@ -1,193 +1,434 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, Input, HostBinding, Inject, EventEmitter, PLATFORM_ID, Directive, Output, Injectable, ApplicationRef } from '@angular/core';
3
- import * as i1$1 from '@angular/common';
4
- import { CommonModule, isPlatformBrowser } from '@angular/common';
5
- import * as i1 from '@factor_ec/utils';
6
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
- import { ReplaySubject } from 'rxjs';
8
- import * as i1$2 from '@angular/material/snack-bar';
9
- import { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';
10
- import * as i2$1 from '@angular/material/dialog';
11
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
2
+ import { inject, input, computed, signal, effect, Component, HostBinding, Injectable, InjectionToken, ElementRef, output, PLATFORM_ID, Directive, Input, NgModule } from '@angular/core';
3
+ import { ColorService, StringService } from '@factor_ec/utils';
4
+ import * as d3 from 'd3';
5
+ import * as i3 from '@angular/material/dialog';
6
+ import { MAT_DIALOG_DATA, MatDialogModule, MatDialog } from '@angular/material/dialog';
7
+ import { MAT_SNACK_BAR_DATA, MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';
12
8
  import * as i2 from '@angular/material/button';
13
9
  import { MatButtonModule } from '@angular/material/button';
10
+ import { ReplaySubject } from 'rxjs';
11
+ import * as i1 from '@angular/common';
12
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
13
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
14
14
 
15
15
  class AvatarComponent {
16
- set src(value) {
17
- if (value && value.trim() != '') {
18
- this._src = value;
19
- let image = new Image();
20
- image.src = value;
21
- image.onload = () => {
22
- if ("decode" in image) {
23
- image.decode().then(() => {
24
- this.loaded = true;
25
- });
26
- }
27
- else {
28
- console.error('Image.decode not available.');
29
- }
30
- };
31
- }
32
- }
33
- set label(value) {
34
- this._label = value;
35
- this.initials = this.getInitials(value);
36
- }
16
+ colorService = inject(ColorService);
17
+ color = input();
18
+ initials = computed(() => {
19
+ return this.getInitials(this.label());
20
+ });
21
+ label = input.required();
22
+ loaded = signal(false);
23
+ src = input();
37
24
  get backgroundColor() {
38
- return this.color || this.colorService.hex(this._label);
25
+ return this.color() || this.colorService.hex(this.label());
39
26
  }
40
27
  get backgroundImage() {
41
- return this._src ? `url(${this._src})` : '';
28
+ return this.src() ? `url(${this.src()})` : '';
42
29
  }
30
+ class = input();
43
31
  get hostClasses() {
44
- return [
45
- 'ft-avatar',
46
- this.class
47
- ].join(' ');
32
+ return ['ft-avatar', this.class()].join(' ');
48
33
  }
49
- constructor(colorService) {
50
- this.colorService = colorService;
51
- this.class = '';
52
- }
53
- ngOnInit() {
34
+ constructor() {
35
+ // Usa `effect` para reaccionar a los cambios en el valor de `src`
36
+ effect(() => {
37
+ const value = this.src();
38
+ if (value && value.trim() !== '') {
39
+ const image = new Image();
40
+ image.src = value;
41
+ image.onload = () => {
42
+ if ('decode' in image) {
43
+ image.decode().then(() => {
44
+ this.loaded.set(true);
45
+ });
46
+ }
47
+ else {
48
+ console.error('Image.decode not available.');
49
+ }
50
+ };
51
+ }
52
+ });
54
53
  }
55
54
  getInitials(value) {
56
- let allInitials = value.match(/\b\w/g) || [];
57
- let initials = ((allInitials.shift() || '') + (allInitials.pop() || '')).toUpperCase();
55
+ const allInitials = value.match(/\b\w/g) || [];
56
+ const initials = ((allInitials.shift() || '') + (allInitials.pop() || '')).toUpperCase();
58
57
  return initials;
59
58
  }
60
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: AvatarComponent, deps: [{ token: i1.ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
61
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: AvatarComponent, isStandalone: true, selector: "ft-avatar", inputs: { color: "color", src: "src", label: "label", class: "class" }, host: { properties: { "style.background-color": "this.backgroundColor", "style.background-image": "this.backgroundImage", "class": "this.hostClasses" } }, ngImport: i0, template: "<div *ngIf=\"!loaded\">{{ initials }}</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: AvatarComponent, isStandalone: true, selector: "ft-avatar", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.background-color": "this.backgroundColor", "style.background-image": "this.backgroundImage", "class": "this.hostClasses" } }, ngImport: i0, template: "@if (!loaded()) {\n<div>{{ initials() }}</div>\n}", styles: [":host{display:inline-flex;align-items:center;justify-content:center;color:var(--ft-avatar-color);background-color:var(--ft-avatar-bg);background-size:cover;background-repeat:no-repeat;border-radius:calc(var(--ft-avatar-size) / 2);font-size:calc(var(--ft-avatar-size) - var(--ft-avatar-size) * .6);min-width:var(--ft-avatar-size);min-height:var(--ft-avatar-size);cursor:default;-webkit-user-select:none;user-select:none}\n"] });
62
61
  }
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: AvatarComponent, decorators: [{
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: AvatarComponent, decorators: [{
64
63
  type: Component,
65
- args: [{ selector: 'ft-avatar', standalone: true, imports: [CommonModule], template: "<div *ngIf=\"!loaded\">{{ initials }}</div>" }]
66
- }], ctorParameters: function () { return [{ type: i1.ColorService }]; }, propDecorators: { color: [{
67
- type: Input
68
- }], src: [{
69
- type: Input
70
- }], label: [{
71
- type: Input
72
- }], backgroundColor: [{
64
+ args: [{ selector: 'ft-avatar', standalone: true, imports: [], template: "@if (!loaded()) {\n<div>{{ initials() }}</div>\n}", styles: [":host{display:inline-flex;align-items:center;justify-content:center;color:var(--ft-avatar-color);background-color:var(--ft-avatar-bg);background-size:cover;background-repeat:no-repeat;border-radius:calc(var(--ft-avatar-size) / 2);font-size:calc(var(--ft-avatar-size) - var(--ft-avatar-size) * .6);min-width:var(--ft-avatar-size);min-height:var(--ft-avatar-size);cursor:default;-webkit-user-select:none;user-select:none}\n"] }]
65
+ }], ctorParameters: () => [], propDecorators: { backgroundColor: [{
73
66
  type: HostBinding,
74
67
  args: ['style.background-color']
75
68
  }], backgroundImage: [{
76
69
  type: HostBinding,
77
70
  args: ['style.background-image']
78
- }], class: [{
79
- type: Input
80
71
  }], hostClasses: [{
81
72
  type: HostBinding,
82
73
  args: ['class']
83
74
  }] } });
84
75
 
85
- class IconComponent {
86
- set collection(collection) {
87
- this._collection = collection;
88
- this.update();
89
- }
90
- set mode(mode) {
91
- this._mode = mode;
92
- this.update();
76
+ class ChartService {
77
+ resizeTimeout;
78
+ charts = new Map();
79
+ constructor() {
80
+ window.addEventListener('resize', this.handleResize.bind(this));
93
81
  }
94
- set name(name) {
95
- this._name = name;
96
- this.update();
82
+ remove(element) {
83
+ this.charts.delete(element);
97
84
  }
98
- set path(path) {
99
- this._path = path;
100
- this.update();
85
+ render(element, items) {
86
+ // Clear svg
87
+ const svg = d3.select(element).html('');
88
+ // Resize event
89
+ if (!this.charts.has(element)) {
90
+ this.charts.set(element, items);
91
+ }
92
+ const values = [0];
93
+ items.forEach((item) => {
94
+ item.data.forEach((i) => {
95
+ if (typeof i[item.field] === 'number') {
96
+ values.push(i[item.field]);
97
+ }
98
+ });
99
+ });
100
+ if (values.length > 0) {
101
+ const domain = d3.extent(values);
102
+ // Dibujo los gráficos
103
+ items.forEach((item) => {
104
+ switch (item.type) {
105
+ case 'limit':
106
+ this.drawLimitChart(svg, { ...item, domain });
107
+ break;
108
+ case 'column':
109
+ this.drawColumnChart(svg, { ...item, domain });
110
+ break;
111
+ case 'line':
112
+ this.drawLineChart(svg, { ...item, domain });
113
+ break;
114
+ case 'circle':
115
+ this.drawCircleChart(svg, { ...item, domain });
116
+ break;
117
+ case 'event':
118
+ this.drawEventsPlaceholder(svg, { ...item, domain });
119
+ break;
120
+ }
121
+ });
122
+ }
101
123
  }
102
- get hostClasses() {
103
- return [
104
- 'ft-icon',
105
- this.class
106
- ].join(' ');
124
+ drawAxis(svg, values, domain) {
125
+ const element = svg.node()?.getBoundingClientRect();
126
+ const yScale = d3
127
+ .scaleLinear()
128
+ .domain(domain)
129
+ .range([element?.height || 0 - 4, 4]);
130
+ // Dibuja el eje en X
131
+ svg.select('.x-axis').remove();
132
+ svg
133
+ .append('rect')
134
+ .attr('class', 'x-axis')
135
+ .attr('fill', 'rgba(0, 0, 0, 0.08)')
136
+ .attr('x', 0)
137
+ .attr('width', element?.width || 0)
138
+ .attr('height', 1)
139
+ .attr('shape-rendering', 'crispEdges')
140
+ .attr('y', yScale(0));
141
+ /*
142
+ const yScale = d3.scaleLinear().domain([-5000, 8000]).range([this.height, 0]);
143
+ const yAxisGenerator = d3.axisLeft(yScale).ticks(8);
144
+ this.svg.append('g').call(yAxisGenerator).style('transform', 'translateX(50px)');
145
+ */
146
+ }
147
+ drawCircleChart(svg, options) {
148
+ const domRect = svg.node().getBoundingClientRect();
149
+ const xAccessor = (d) => d[options.categoryField];
150
+ const yAccessor = (d) => d[options.field] || 0;
151
+ const xScale = d3
152
+ .scaleBand()
153
+ .domain(options.data.map(xAccessor))
154
+ .range([0, domRect.width])
155
+ .padding(typeof options.padding === 'number' ? options.padding : 0);
156
+ const yScale = d3
157
+ .scaleLinear()
158
+ .domain(options.domain ?? [
159
+ Math.min(d3.min(options.data, yAccessor), 0),
160
+ d3.max(options.data, yAccessor),
161
+ ])
162
+ .range([domRect.height - 10, 10]);
163
+ const circles = svg
164
+ .append('g')
165
+ .attr('class', 'ft-chart__circle')
166
+ .selectAll(`circle`)
167
+ .data(options.data);
168
+ circles
169
+ .enter()
170
+ .append('circle')
171
+ .style('stroke', options.color ?? '#ff9800')
172
+ .attr('stroke-width', options.strokeWidth ?? 1)
173
+ .style('fill', 'var(--ft-body-bg)')
174
+ .attr('r', 1.5)
175
+ .merge(circles)
176
+ .attr('cx', (d) => Math.round((xScale(xAccessor(d)) || 0) + xScale.bandwidth() / 2))
177
+ .attr('cy', (d) => Math.round(yScale(yAccessor(d))));
178
+ circles.exit().remove();
179
+ }
180
+ drawColumnChart(svg, options) {
181
+ const element = svg.node().getBoundingClientRect();
182
+ const xAccessor = (d) => d[options.categoryField];
183
+ //const xAccessor = (d: any) => (new Date(d[options.categoryField]))?.getTime();
184
+ const yAccessor = (d) => d[options.field] || 0;
185
+ const xScale = d3
186
+ .scaleBand()
187
+ .domain(options.data.map(xAccessor))
188
+ .range([0, element.width])
189
+ .padding(options.padding ?? 0.5);
190
+ const yScale = d3
191
+ .scaleLinear()
192
+ .domain(options.domain
193
+ ? options.domain
194
+ : [
195
+ Math.min(d3.min(options.data, yAccessor), 0),
196
+ d3.max(options.data, yAccessor),
197
+ ])
198
+ .range([element.height - 4, 4]);
199
+ const columns = svg
200
+ .append('g')
201
+ .attr('class', 'ft-chart__column')
202
+ .selectAll('rect')
203
+ .data(options.data);
204
+ columns
205
+ .enter()
206
+ .append('rect')
207
+ .attr('x', (d) => xScale(xAccessor(d)))
208
+ .attr('y', (d) => yScale(yAccessor(d)))
209
+ .attr('shape-rendering', 'crispEdges')
210
+ .attr('fill', options.color ?? '#ff9800')
211
+ .attr('title', (d) => d[options.field])
212
+ .merge(columns)
213
+ .attr('width', Math.max(1, xScale.bandwidth()))
214
+ .attr('height', (d) => Math.abs(yScale(yAccessor(d)) - yScale(0)));
215
+ columns.exit().remove();
216
+ }
217
+ drawLineChart(svg, options) {
218
+ const domRect = svg.node().getBoundingClientRect();
219
+ const xAccessor = (d) => d[options.categoryField];
220
+ const yAccessor = (d) => d[options.field] || 0;
221
+ const xScale = d3
222
+ .scaleBand()
223
+ .domain(options.data.map(xAccessor))
224
+ .range([0, domRect.width])
225
+ .padding(typeof options.padding === 'number' ? options.padding : 0);
226
+ const yScale = d3
227
+ .scaleLinear()
228
+ .domain(options.domain ?? [
229
+ Math.min(d3.min(options.data, yAccessor), 0),
230
+ d3.max(options.data, yAccessor),
231
+ ])
232
+ .range([domRect.height - 10, 10]);
233
+ const lineGenerator = d3
234
+ .line()
235
+ .x((d) => Math.round((xScale(xAccessor(d)) || 0) + xScale.bandwidth() / 2))
236
+ .y((d) => Math.round(yScale(yAccessor(d))));
237
+ svg
238
+ .append('path')
239
+ .attr('class', 'ft-chart__line')
240
+ .attr('fill', 'none')
241
+ .attr('stroke', options.color ?? '#ff9800')
242
+ .attr('stroke-width', options.strokeWidth ?? 2)
243
+ .attr('stroke-linecap', 'round')
244
+ .attr('d', lineGenerator(options.data));
245
+ }
246
+ drawLimitChart(svg, options) {
247
+ const element = svg.node().getBoundingClientRect();
248
+ const yAccessor = (d) => d[options.field] || 0;
249
+ const yScale = d3
250
+ .scaleLinear()
251
+ .domain(options.domain
252
+ ? options.domain
253
+ : [
254
+ Math.min(d3.min(options.data, yAccessor), 0),
255
+ d3.max(options.data, yAccessor),
256
+ ])
257
+ .range([element.height - 4, 4]);
258
+ const line = svg.append('g').selectAll('rect').data([options.data[0]]);
259
+ line
260
+ .enter()
261
+ .append('rect')
262
+ .attr('x', 0)
263
+ .attr('y', (d) => yScale(yAccessor(d)) + 1)
264
+ .attr('shape-rendering', 'crispEdges')
265
+ .attr('fill', options.color ?? '#ff9800')
266
+ .attr('title', 0)
267
+ .attr('width', () => '100%')
268
+ .attr('height', 1);
269
+ line.exit().remove();
270
+ line
271
+ .enter()
272
+ .append('text')
273
+ .attr('style', 'font-weight: 600; font-size: var(--ft-text-font-size-sm);')
274
+ .attr('x', 0)
275
+ .attr('y', (d) => yScale(yAccessor(d)) + 16)
276
+ .attr('fill', 'var(--ft-danger-color)')
277
+ .text(options.label);
278
+ }
279
+ drawEventsPlaceholder(svg, options) {
280
+ const domRect = svg.node().getBoundingClientRect();
281
+ const xAccessor = (d) => d[options.categoryField];
282
+ const yAccessor = (d) => d[options.field] || 0;
283
+ const xScale = d3
284
+ .scaleBand()
285
+ .domain(options.data.map(xAccessor))
286
+ .range([0, domRect.width])
287
+ .padding(typeof options.padding === 'number' ? options.padding : 0);
288
+ const yScale = d3
289
+ .scaleLinear()
290
+ .domain(options.domain ?? [
291
+ Math.min(d3.min(options.data, yAccessor), 0),
292
+ d3.max(options.data, yAccessor),
293
+ ])
294
+ .range([domRect.height, 0]);
295
+ const columns = svg
296
+ .append('g')
297
+ .attr('class', 'ft-chart__placeholder')
298
+ .selectAll('rect')
299
+ .data(options.data);
300
+ columns
301
+ .enter()
302
+ .append('rect')
303
+ .attr('x', (d) => xScale(d[options.categoryField]))
304
+ .attr('y', () => 0)
305
+ .attr('shape-rendering', 'crispEdges')
306
+ .attr('fill', 'rgba(0,0,0,0)')
307
+ .attr('tabindex', 0)
308
+ .merge(columns)
309
+ .attr('width', Math.max(1, xScale.bandwidth()))
310
+ .attr('height', () => yScale(0))
311
+ .on('click', (event, d) => {
312
+ if (options.click) {
313
+ options.click(event, d);
314
+ }
315
+ });
316
+ columns.exit().remove();
107
317
  }
108
- constructor(configuration) {
109
- this.configuration = configuration;
110
- this.class = '';
318
+ handleResize() {
319
+ clearTimeout(this.resizeTimeout);
320
+ this.resizeTimeout = setTimeout(() => {
321
+ for (const [element, items] of this.charts.entries()) {
322
+ this.render(element, items);
323
+ }
324
+ }, 300);
111
325
  }
112
- ngOnInit() {
113
- this.update();
326
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
327
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ChartService, providedIn: 'root' });
328
+ }
329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ChartService, decorators: [{
330
+ type: Injectable,
331
+ args: [{
332
+ providedIn: 'root',
333
+ }]
334
+ }], ctorParameters: () => [] });
335
+
336
+ const UI_OPTIONS = new InjectionToken('UI_OPTIONS');
337
+
338
+ class UiService {
339
+ options = inject(UI_OPTIONS);
340
+ get() {
341
+ return this.options;
114
342
  }
115
- update() {
343
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
344
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiService, providedIn: 'root' });
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiService, decorators: [{
347
+ type: Injectable,
348
+ args: [{
349
+ providedIn: 'root'
350
+ }]
351
+ }] });
352
+
353
+ class IconComponent {
354
+ options = inject(UiService);
355
+ collection = input();
356
+ mode = input();
357
+ name = input.required();
358
+ path = input();
359
+ src = input();
360
+ url = computed(() => {
361
+ let collection = this.collection();
362
+ let mode = this.mode();
363
+ let path = this.path();
364
+ const options = this.options.get().iconSettings;
116
365
  // Set the default collection if the mode is external
117
- if (!this._collection) {
118
- if (this.configuration.icon && this.configuration.icon.collection) {
119
- this._collection = this.configuration.icon.collection;
366
+ if (!this.collection()) {
367
+ if (options && options.collection) {
368
+ collection = options.collection;
120
369
  }
121
- else if (this._mode === 'external') {
122
- this._collection = 'icons';
370
+ else if (this.mode() === 'external') {
371
+ collection = 'icons';
123
372
  }
124
373
  }
125
- if (!this._mode) {
126
- if (this.configuration.icon && this.configuration.icon.mode) {
127
- this._mode = this.configuration.icon.mode;
374
+ if (!this.mode()) {
375
+ if (this.options.get().iconSettings && options.mode) {
376
+ mode = options.mode;
128
377
  }
129
378
  else {
130
- this._mode = 'external';
379
+ mode = 'external';
131
380
  }
132
381
  }
133
- if (this._mode === 'external') {
382
+ if (mode === 'external') {
134
383
  // If the icon mode is external
135
- if (!this._path) {
136
- if (this.configuration.icon && this.configuration.icon.path) {
137
- this._path = this.configuration.icon.path;
384
+ if (!this.path()) {
385
+ if (options && 'path' in options) {
386
+ path = options.path;
138
387
  }
139
388
  else {
140
- this._path = 'assets';
389
+ path = 'assets';
141
390
  }
142
391
  }
143
- this.url = `${this._path}/${this._collection}.svg#${this._name}`;
392
+ return `${path}/${collection}.svg#${this.name()}`;
144
393
  }
145
394
  else {
146
395
  // If the icon mode is inline
147
- const name = this._collection && this._collection !== 'unset' ? `${this._collection}--${this._name}` : this._name;
148
- this.url = `#${name}`;
396
+ const name = this.collection() && this.collection() !== 'unset'
397
+ ? `${this.collection()}--${this.name()}`
398
+ : this.name();
399
+ return `#${name}`;
149
400
  }
401
+ });
402
+ class = input();
403
+ get hostClasses() {
404
+ return ['ft-icon', this.class()].join(' ');
150
405
  }
151
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: IconComponent, deps: [{ token: 'FactorUiConfiguration' }], target: i0.ɵɵFactoryTarget.Component }); }
152
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: IconComponent, isStandalone: true, selector: "ft-icon", inputs: { collection: "collection", mode: "mode", name: "name", path: "path", src: "src", class: "class" }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "<svg *ngIf=\"!src; else imageTemplate\">\n <use attr.xlink:href=\"{{ url }}\" attr.href=\"{{ url }}\" />\n</svg>\n<ng-template #imageTemplate>\n <img [src]=\"src\" />\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
406
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
407
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: IconComponent, isStandalone: true, selector: "ft-icon", inputs: { collection: { classPropertyName: "collection", publicName: "collection", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, path: { classPropertyName: "path", publicName: "path", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "@if (!src()) {\n<svg>\n <use attr.href=\"{{ url() }}\" />\n</svg>\n} @else {\n<img [src]=\"src()\" alt=\"\" />\n}", styles: [":host{line-height:0;display:inline-block}:host svg{width:1em;height:1em;vertical-align:middle;fill:currentColor;display:inline-block}:host img{height:1em;vertical-align:middle;display:inline-block}:host.ft-icon--1{font-size:1rem}:host.ft-icon--2{font-size:1.5rem}:host.ft-icon--3{font-size:2rem}:host.ft-icon--4{font-size:3rem}:host.ft-icon--5{font-size:4.5rem}:host.ft-icon--6{font-size:8rem}:host.ft-icon--7{font-size:16rem}:host.ft-icon--8{font-size:32rem}\n"] });
153
408
  }
154
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: IconComponent, decorators: [{
409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: IconComponent, decorators: [{
155
410
  type: Component,
156
- args: [{ selector: 'ft-icon', standalone: true, imports: [CommonModule], template: "<svg *ngIf=\"!src; else imageTemplate\">\n <use attr.xlink:href=\"{{ url }}\" attr.href=\"{{ url }}\" />\n</svg>\n<ng-template #imageTemplate>\n <img [src]=\"src\" />\n</ng-template>" }]
157
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
158
- type: Inject,
159
- args: ['FactorUiConfiguration']
160
- }] }]; }, propDecorators: { collection: [{
161
- type: Input
162
- }], mode: [{
163
- type: Input
164
- }], name: [{
165
- type: Input
166
- }], path: [{
167
- type: Input
168
- }], src: [{
169
- type: Input
170
- }], class: [{
171
- type: Input
172
- }], hostClasses: [{
411
+ args: [{ selector: 'ft-icon', standalone: true, imports: [], template: "@if (!src()) {\n<svg>\n <use attr.href=\"{{ url() }}\" />\n</svg>\n} @else {\n<img [src]=\"src()\" alt=\"\" />\n}", styles: [":host{line-height:0;display:inline-block}:host svg{width:1em;height:1em;vertical-align:middle;fill:currentColor;display:inline-block}:host img{height:1em;vertical-align:middle;display:inline-block}:host.ft-icon--1{font-size:1rem}:host.ft-icon--2{font-size:1.5rem}:host.ft-icon--3{font-size:2rem}:host.ft-icon--4{font-size:3rem}:host.ft-icon--5{font-size:4.5rem}:host.ft-icon--6{font-size:8rem}:host.ft-icon--7{font-size:16rem}:host.ft-icon--8{font-size:32rem}\n"] }]
412
+ }], propDecorators: { hostClasses: [{
173
413
  type: HostBinding,
174
414
  args: ['class']
175
415
  }] } });
176
416
 
177
417
  class ImageComponent {
178
- constructor(element) {
179
- this.element = element;
180
- this.class = '';
181
- this.loading = false;
182
- this.shown = false;
183
- }
418
+ element = inject(ElementRef);
419
+ class = input('');
420
+ error;
421
+ loading = false;
422
+ src = input.required();
423
+ alt = input('');
424
+ shown = false;
184
425
  ngOnInit() {
185
426
  if ("IntersectionObserver" in window) {
186
427
  let elementObserver = new IntersectionObserver((entries, observer) => {
187
428
  entries.forEach((entry) => {
188
429
  if (entry.isIntersecting) {
189
430
  let image = new Image();
190
- image.src = this.src;
431
+ image.src = this.src();
191
432
  setTimeout(() => {
192
433
  if (!this.shown && !this.error) {
193
434
  this.loading = true;
@@ -226,90 +467,354 @@ class ImageComponent {
226
467
  get hostClasses() {
227
468
  return [
228
469
  'ft-image',
229
- this.class
470
+ this.class()
230
471
  ].join(' ');
231
472
  }
232
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ImageComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: ImageComponent, isStandalone: true, selector: "ft-image", inputs: { class: "class", src: "src" }, host: { properties: { "class.ft-image--error": "this.error", "class.ft-image--loading": "this.loading", "class": "this.hostClasses" } }, ngImport: i0, template: "<img *ngIf=\"shown\" [src]=\"src\" />\n<ft-icon name=\"warning\" size=\"2\" *ngIf=\"error\"></ft-icon>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "ft-icon", inputs: ["collection", "mode", "name", "path", "src", "class"] }] }); }
473
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
474
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: ImageComponent, isStandalone: true, selector: "ft-image", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: true, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.ft-image--error": "this.error", "class.ft-image--loading": "this.loading", "class": "this.hostClasses" } }, ngImport: i0, template: "@if (shown) {\n <img [src]=\"src()\" [alt]=\"alt()\" />\n}\n@if (error) {\n <ft-icon name=\"warning\" size=\"2\"></ft-icon>\n}", dependencies: [{ kind: "component", type: IconComponent, selector: "ft-icon", inputs: ["collection", "mode", "name", "path", "src", "class"] }] });
234
475
  }
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ImageComponent, decorators: [{
476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ImageComponent, decorators: [{
236
477
  type: Component,
237
478
  args: [{ selector: 'ft-image', standalone: true, imports: [
238
- CommonModule,
239
479
  IconComponent
240
- ], template: "<img *ngIf=\"shown\" [src]=\"src\" />\n<ft-icon name=\"warning\" size=\"2\" *ngIf=\"error\"></ft-icon>\n" }]
241
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { class: [{
242
- type: Input
243
- }], error: [{
480
+ ], template: "@if (shown) {\n <img [src]=\"src()\" [alt]=\"alt()\" />\n}\n@if (error) {\n <ft-icon name=\"warning\" size=\"2\"></ft-icon>\n}" }]
481
+ }], propDecorators: { error: [{
244
482
  type: HostBinding,
245
483
  args: ['class.ft-image--error']
246
484
  }], loading: [{
247
485
  type: HostBinding,
248
486
  args: ['class.ft-image--loading']
249
- }], src: [{
250
- type: Input
251
487
  }], hostClasses: [{
252
488
  type: HostBinding,
253
489
  args: ['class']
254
490
  }] } });
255
491
 
256
- class ProgressComponent {
257
- constructor() {
258
- this.class = '';
259
- this.mode = 'indeterminate';
260
- this.overlay = false;
492
+ class MessageContentComponent {
493
+ data = inject(MAT_SNACK_BAR_DATA);
494
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
495
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: MessageContentComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
496
+ @switch (data.message?.type) { @case ('html') {
497
+ <div [innerHTML]="data.message?.content"></div>
498
+ } @default {
499
+ {{ data.message?.content }}
500
+ } }
501
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: MatSnackBarModule }] });
502
+ }
503
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageContentComponent, decorators: [{
504
+ type: Component,
505
+ args: [{
506
+ standalone: true,
507
+ imports: [MatSnackBarModule],
508
+ template: `
509
+ @switch (data.message?.type) { @case ('html') {
510
+ <div [innerHTML]="data.message?.content"></div>
511
+ } @default {
512
+ {{ data.message?.content }}
513
+ } }
514
+ `,
515
+ }]
516
+ }] });
517
+ class MessageDialogComponent {
518
+ data = inject(MAT_DIALOG_DATA);
519
+ beforeSelect = output();
520
+ select(value) {
521
+ this.beforeSelect.emit(value);
261
522
  }
523
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
524
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: MessageDialogComponent, isStandalone: true, selector: "ng-component", outputs: { beforeSelect: "beforeSelect" }, ngImport: i0, template: `
525
+ @if (data.options?.title) {
526
+ <h1 mat-dialog-title class="ft-message__title">
527
+ @if (data.options?.titleIcon) {
528
+ <ft-icon
529
+ [name]="data.options?.titleIcon?.name"
530
+ [collection]="data.options?.titleIcon?.collection"
531
+ [ngClass]="data.options?.titleIcon?.class"
532
+ ></ft-icon>
533
+ }
534
+ <div>{{ data.options?.title }}</div>
535
+ </h1>
536
+ }
537
+ <div
538
+ mat-dialog-content
539
+ class="ft-message__content"
540
+ [ngClass]="data.options?.class"
541
+ >
542
+ @if (data.options?.icon) {
543
+ <ft-icon
544
+ [name]="data.options?.icon?.name"
545
+ [collection]="data.options?.icon?.collection"
546
+ [ngClass]="data.options?.icon?.class"
547
+ ></ft-icon>
548
+ } @switch (data.message?.type) { @case ('html') {
549
+ <div [innerHTML]="data.message?.content"></div>
550
+ } @default {
551
+ {{ data.message?.content }}
552
+ } }
553
+ </div>
554
+ @if (data.options.actionsVisible) {
555
+ <div mat-dialog-actions class="ft-message__actions">
556
+ @if (data.options?.actions?.length > 0) { @for (action of
557
+ data.options?.actions; track action; let i = $index) { @switch
558
+ (action.type) { @case ('raised') {
559
+ <button
560
+ type="button"
561
+ mat-raised-button
562
+ [color]="action.metadata?.color"
563
+ (click)="select(action.value)"
564
+ >
565
+ {{ action.label }}
566
+ </button>
567
+ } @case ('flat') {
568
+ <button
569
+ type="button"
570
+ mat-flat-button
571
+ [color]="action.metadata?.color"
572
+ (click)="select(action.value)"
573
+ >
574
+ {{ action.label }}
575
+ </button>
576
+ } @case ('stroked') {
577
+ <button
578
+ type="button"
579
+ mat-stroked-button
580
+ [color]="action.metadata?.color"
581
+ (click)="select(action.value)"
582
+ >
583
+ {{ action.label }}
584
+ </button>
585
+ } @default {
586
+ <button type="button" mat-button (click)="select(action.value)">
587
+ {{ action.label }}
588
+ </button>
589
+ } } } } @else {
590
+ <button
591
+ type="button"
592
+ mat-flat-button
593
+ color="primary"
594
+ (click)="select('-1')"
595
+ i18n
596
+ >
597
+ Accept
598
+ </button>
599
+ }
600
+ </div>
601
+ }
602
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: IconComponent, selector: "ft-icon", inputs: ["collection", "mode", "name", "path", "src", "class"] }] });
603
+ }
604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageDialogComponent, decorators: [{
605
+ type: Component,
606
+ args: [{
607
+ standalone: true,
608
+ imports: [CommonModule, MatButtonModule, MatDialogModule, IconComponent],
609
+ template: `
610
+ @if (data.options?.title) {
611
+ <h1 mat-dialog-title class="ft-message__title">
612
+ @if (data.options?.titleIcon) {
613
+ <ft-icon
614
+ [name]="data.options?.titleIcon?.name"
615
+ [collection]="data.options?.titleIcon?.collection"
616
+ [ngClass]="data.options?.titleIcon?.class"
617
+ ></ft-icon>
618
+ }
619
+ <div>{{ data.options?.title }}</div>
620
+ </h1>
621
+ }
622
+ <div
623
+ mat-dialog-content
624
+ class="ft-message__content"
625
+ [ngClass]="data.options?.class"
626
+ >
627
+ @if (data.options?.icon) {
628
+ <ft-icon
629
+ [name]="data.options?.icon?.name"
630
+ [collection]="data.options?.icon?.collection"
631
+ [ngClass]="data.options?.icon?.class"
632
+ ></ft-icon>
633
+ } @switch (data.message?.type) { @case ('html') {
634
+ <div [innerHTML]="data.message?.content"></div>
635
+ } @default {
636
+ {{ data.message?.content }}
637
+ } }
638
+ </div>
639
+ @if (data.options.actionsVisible) {
640
+ <div mat-dialog-actions class="ft-message__actions">
641
+ @if (data.options?.actions?.length > 0) { @for (action of
642
+ data.options?.actions; track action; let i = $index) { @switch
643
+ (action.type) { @case ('raised') {
644
+ <button
645
+ type="button"
646
+ mat-raised-button
647
+ [color]="action.metadata?.color"
648
+ (click)="select(action.value)"
649
+ >
650
+ {{ action.label }}
651
+ </button>
652
+ } @case ('flat') {
653
+ <button
654
+ type="button"
655
+ mat-flat-button
656
+ [color]="action.metadata?.color"
657
+ (click)="select(action.value)"
658
+ >
659
+ {{ action.label }}
660
+ </button>
661
+ } @case ('stroked') {
662
+ <button
663
+ type="button"
664
+ mat-stroked-button
665
+ [color]="action.metadata?.color"
666
+ (click)="select(action.value)"
667
+ >
668
+ {{ action.label }}
669
+ </button>
670
+ } @default {
671
+ <button type="button" mat-button (click)="select(action.value)">
672
+ {{ action.label }}
673
+ </button>
674
+ } } } } @else {
675
+ <button
676
+ type="button"
677
+ mat-flat-button
678
+ color="primary"
679
+ (click)="select('-1')"
680
+ i18n
681
+ >
682
+ Accept
683
+ </button>
684
+ }
685
+ </div>
686
+ }
687
+ `,
688
+ }]
689
+ }] });
690
+ class MessageService {
691
+ snackBar = inject(MatSnackBar);
692
+ dialog = inject(MatDialog);
693
+ stringService = inject(StringService);
694
+ show(message, options) {
695
+ const selectionSource = new ReplaySubject(undefined);
696
+ const selection = selectionSource.asObservable();
697
+ const defaults = {
698
+ type: 'notification',
699
+ duration: 2000,
700
+ actionsVisible: true,
701
+ };
702
+ options = Object.assign(defaults, options);
703
+ const data = {
704
+ message: typeof message === 'string'
705
+ ? { content: message, type: 'text' }
706
+ : message,
707
+ options,
708
+ };
709
+ let dialogRef;
710
+ switch (options.type) {
711
+ default:
712
+ case 'notification':
713
+ this.snackBar.openFromComponent(MessageContentComponent, {
714
+ data,
715
+ panelClass: ['ft-message', 'ft-message--notification'],
716
+ duration: this.stringService.calculateReadingTime(typeof message === 'string' ? message : message.content),
717
+ verticalPosition: options.verticalPosition || 'bottom',
718
+ });
719
+ break;
720
+ case 'modal':
721
+ dialogRef = this.dialog.open(MessageDialogComponent, {
722
+ width: options.width || '350px',
723
+ data,
724
+ panelClass: ['ft-message', 'ft-message--modal'],
725
+ autoFocus: false,
726
+ disableClose: true,
727
+ });
728
+ dialogRef.componentInstance.beforeSelect.subscribe((response) => {
729
+ selectionSource.next(response);
730
+ dialogRef.close();
731
+ });
732
+ break;
733
+ }
734
+ return selection;
735
+ }
736
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
737
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageService, providedIn: 'root' });
738
+ }
739
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: MessageService, decorators: [{
740
+ type: Injectable,
741
+ args: [{
742
+ providedIn: 'root',
743
+ }]
744
+ }] });
745
+
746
+ class ObserveIntersectingDirective {
747
+ element = inject(ElementRef);
748
+ platformId = inject(PLATFORM_ID);
749
+ ftObserveIntersectingOptions = input();
750
+ event = output({ alias: 'ftObserveIntersecting' });
262
751
  ngOnInit() {
263
- this.value = 0;
752
+ if (isPlatformBrowser(this.platformId)) {
753
+ if ('IntersectionObserver' in window) {
754
+ const elementObserver = new IntersectionObserver((entries) => {
755
+ entries.forEach((entry) => {
756
+ this.event.emit(entry.isIntersecting);
757
+ });
758
+ }, this.ftObserveIntersectingOptions());
759
+ elementObserver.observe(this.element.nativeElement);
760
+ }
761
+ else {
762
+ console.error('ftObserveIntersecting not available in this browser.');
763
+ }
764
+ }
264
765
  }
766
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ObserveIntersectingDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
767
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.6", type: ObserveIntersectingDirective, isStandalone: true, selector: "[ftObserveIntersecting]", inputs: { ftObserveIntersectingOptions: { classPropertyName: "ftObserveIntersectingOptions", publicName: "ftObserveIntersectingOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { event: "ftObserveIntersecting" }, ngImport: i0 });
768
+ }
769
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ObserveIntersectingDirective, decorators: [{
770
+ type: Directive,
771
+ args: [{
772
+ selector: '[ftObserveIntersecting]',
773
+ standalone: true,
774
+ }]
775
+ }] });
776
+
777
+ class ProgressComponent {
778
+ mode = input('indeterminate');
779
+ overlay = input(false);
780
+ value = input(0);
781
+ class = input('');
265
782
  get hostClasses() {
266
783
  return [
267
784
  'ft-progress',
268
- this.overlay ? 'ft-progress--overlay' : '',
269
- this.class
785
+ this.overlay() ? 'ft-progress--overlay' : '',
786
+ this.class()
270
787
  ].join(' ');
271
788
  }
272
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
273
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: ProgressComponent, isStandalone: true, selector: "ft-progress", inputs: { class: "class", color: "color", mode: "mode", overlay: "overlay", size: "size", value: "value" }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "<svg [ngStyle]=\"{'--ft-bar-color': color}\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid\">\n <circle class=\"ft-track\" cx=\"50\" cy=\"50\" r=\"40\" />\n <circle class=\"ft-bar\" [ngClass]=\"mode === 'determinate' ? 'ft-bar--determinate' : 'ft-bar--indeterminate'\" cx=\"50\"\n cy=\"50\" r=\"40\"\n [ngStyle]=\"{'stroke-dashoffset': mode=='determinate'? 'calc((3.14159265 * 40 * 2 * (100 - '+value+')) / 100)' : null}\">\n </circle>\n</svg>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
789
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
790
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.6", type: ProgressComponent, isStandalone: true, selector: "ft-progress", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid\">\n <circle class=\"ft-track\" cx=\"50\" cy=\"50\" r=\"40\" />\n <circle class=\"ft-bar\" [ngClass]=\"mode() === 'determinate' ? 'ft-bar--determinate' : 'ft-bar--indeterminate'\" cx=\"50\"\n cy=\"50\" r=\"40\"\n [ngStyle]=\"{'stroke-dashoffset': mode() === 'determinate'? 'calc((3.14159265 * 40 * 2 * (100 - ' + value() + ')) / 100)' : null}\">\n </circle>\n</svg>", styles: [":host{line-height:0;display:inline-block}:host.ft-progress--1{font-size:1rem}:host.ft-progress--2{font-size:1.5rem}:host.ft-progress--3{font-size:2rem}:host.ft-progress--4{font-size:3rem}:host.ft-progress--5{font-size:4.5rem}:host.ft-progress--6{font-size:8rem}:host.ft-progress--7{font-size:16rem}:host.ft-progress--8{font-size:32rem}:host.ft-progress--overlay{position:fixed;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:10000;inset:0;font-size:42px}:host.ft-progress--overlay svg{background:#fff9;-webkit-backdrop-filter:saturate(50%) blur(3px);backdrop-filter:saturate(50%) blur(3px);box-shadow:0 3px 3px -2px #0003,0 3px 4px #00000024,0 1px 8px #0000001f;border-radius:100vh;padding:.3125rem;animation:ft-progress-reveal .2s;animation-fill-mode:forwards}:host.ft-progress--overlay svg .ft-track{display:none}svg{width:1em;height:1em;vertical-align:middle}svg .ft-track{fill:none;stroke-width:10;stroke:var(--ft-progress-track-color)}svg .ft-bar{fill:none;stroke-opacity:.9;stroke-width:6;stroke:var(--ft-progress-bar-color)}svg .ft-bar--indeterminate{animation:ft-progress-rotation 2s infinite linear}svg .ft-bar--determinate{stroke-dasharray:251.327412288}@keyframes ft-progress-reveal{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes ft-progress-rotation{0%{stroke-dashoffset:0;stroke-dasharray:150.6 100.4}50%{stroke-dasharray:1 250}to{stroke-dashoffset:502;stroke-dasharray:150.6 100.4}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
274
791
  }
275
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ProgressComponent, decorators: [{
792
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: ProgressComponent, decorators: [{
276
793
  type: Component,
277
- args: [{ selector: 'ft-progress', standalone: true, imports: [CommonModule], template: "<svg [ngStyle]=\"{'--ft-bar-color': color}\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid\">\n <circle class=\"ft-track\" cx=\"50\" cy=\"50\" r=\"40\" />\n <circle class=\"ft-bar\" [ngClass]=\"mode === 'determinate' ? 'ft-bar--determinate' : 'ft-bar--indeterminate'\" cx=\"50\"\n cy=\"50\" r=\"40\"\n [ngStyle]=\"{'stroke-dashoffset': mode=='determinate'? 'calc((3.14159265 * 40 * 2 * (100 - '+value+')) / 100)' : null}\">\n </circle>\n</svg>" }]
278
- }], ctorParameters: function () { return []; }, propDecorators: { class: [{
279
- type: Input
280
- }], color: [{
281
- type: Input
282
- }], mode: [{
283
- type: Input
284
- }], overlay: [{
285
- type: Input
286
- }], size: [{
287
- type: Input
288
- }], value: [{
289
- type: Input
290
- }], hostClasses: [{
794
+ args: [{ selector: 'ft-progress', standalone: true, imports: [CommonModule], template: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid\">\n <circle class=\"ft-track\" cx=\"50\" cy=\"50\" r=\"40\" />\n <circle class=\"ft-bar\" [ngClass]=\"mode() === 'determinate' ? 'ft-bar--determinate' : 'ft-bar--indeterminate'\" cx=\"50\"\n cy=\"50\" r=\"40\"\n [ngStyle]=\"{'stroke-dashoffset': mode() === 'determinate'? 'calc((3.14159265 * 40 * 2 * (100 - ' + value() + ')) / 100)' : null}\">\n </circle>\n</svg>", styles: [":host{line-height:0;display:inline-block}:host.ft-progress--1{font-size:1rem}:host.ft-progress--2{font-size:1.5rem}:host.ft-progress--3{font-size:2rem}:host.ft-progress--4{font-size:3rem}:host.ft-progress--5{font-size:4.5rem}:host.ft-progress--6{font-size:8rem}:host.ft-progress--7{font-size:16rem}:host.ft-progress--8{font-size:32rem}:host.ft-progress--overlay{position:fixed;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:10000;inset:0;font-size:42px}:host.ft-progress--overlay svg{background:#fff9;-webkit-backdrop-filter:saturate(50%) blur(3px);backdrop-filter:saturate(50%) blur(3px);box-shadow:0 3px 3px -2px #0003,0 3px 4px #00000024,0 1px 8px #0000001f;border-radius:100vh;padding:.3125rem;animation:ft-progress-reveal .2s;animation-fill-mode:forwards}:host.ft-progress--overlay svg .ft-track{display:none}svg{width:1em;height:1em;vertical-align:middle}svg .ft-track{fill:none;stroke-width:10;stroke:var(--ft-progress-track-color)}svg .ft-bar{fill:none;stroke-opacity:.9;stroke-width:6;stroke:var(--ft-progress-bar-color)}svg .ft-bar--indeterminate{animation:ft-progress-rotation 2s infinite linear}svg .ft-bar--determinate{stroke-dasharray:251.327412288}@keyframes ft-progress-reveal{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes ft-progress-rotation{0%{stroke-dashoffset:0;stroke-dasharray:150.6 100.4}50%{stroke-dasharray:1 250}to{stroke-dashoffset:502;stroke-dasharray:150.6 100.4}}\n"] }]
795
+ }], propDecorators: { hostClasses: [{
291
796
  type: HostBinding,
292
797
  args: ['class']
293
798
  }] } });
294
799
 
295
800
  class RatingComponent {
296
- constructor() {
297
- this.disabled = false;
298
- this.propagateChange = (_) => { };
299
- this.readOnly = false;
300
- this.stars = [
301
- { value: 1 },
302
- { value: 2 },
303
- { value: 3 },
304
- { value: 4 },
305
- { value: 5 }
306
- ];
307
- }
308
- ngOnInit() {
309
- }
801
+ disabled = false;
802
+ hoverValue;
803
+ propagateChange = (_) => { };
804
+ readOnly = input(false);
805
+ stars = [
806
+ { value: 1 },
807
+ { value: 2 },
808
+ { value: 3 },
809
+ { value: 4 },
810
+ { value: 5 }
811
+ ];
812
+ _value;
310
813
  get value() {
311
814
  return this._value;
312
815
  }
816
+ // TODO: Skipped for migration because:
817
+ // Accessor inputs cannot be migrated as they are too complex.
313
818
  set value(value) {
314
819
  this._value = value;
315
820
  this.propagateChange(this._value);
@@ -337,16 +842,16 @@ class RatingComponent {
337
842
  writeValue(value) {
338
843
  this.value = value;
339
844
  }
340
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
341
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: RatingComponent, isStandalone: true, selector: "ft-rating", inputs: { readOnly: "readOnly", value: "value" }, providers: [
845
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
846
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: RatingComponent, isStandalone: true, selector: "ft-rating", inputs: { readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null } }, providers: [
342
847
  {
343
848
  provide: NG_VALUE_ACCESSOR,
344
849
  useExisting: RatingComponent,
345
850
  multi: true
346
851
  }
347
- ], ngImport: i0, template: "<ng-container *ngFor=\"let star of stars\">\n <ng-container *ngTemplateOutlet=\"!readOnly? buttonTemplate : starTemplate; context:{star:star}\"></ng-container>\n</ng-container>\n<ng-template #buttonTemplate let-star=\"star\">\n <button type=\"button\" class=\"ft-rating__item\" *ngIf=\"!readOnly; else starTemplate\" [disabled]=\"disabled\"\n (mouseover)=\"setRate(star.value, true)\" (focus)=\"setRate(star.value, true)\" (blur)=\"setRate(0, true)\"\n (mouseout)=\"setRate(0, true)\" (click)=\"setRate(star.value)\">\n <ng-container *ngTemplateOutlet=\"starTemplate; context:{star:star}\"></ng-container>\n </button>\n</ng-template>\n<ng-template #starTemplate let-star=\"star\">\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
852
+ ], ngImport: i0, template: "@for (star of stars; track star) {\n <ng-container *ngTemplateOutlet=\"!readOnly()? buttonTemplate : starTemplate; context:{star:star}\"></ng-container>\n}\n<ng-template #buttonTemplate let-star=\"star\">\n @if (!readOnly()) {\n <button type=\"button\" class=\"ft-rating__item\" [disabled]=\"disabled\"\n (mouseover)=\"setRate(star.value, true)\" (focus)=\"setRate(star.value, true)\" (blur)=\"setRate(0, true)\"\n (mouseout)=\"setRate(0, true)\" (click)=\"setRate(star.value)\">\n <ng-container *ngTemplateOutlet=\"starTemplate; context:{star:star}\"></ng-container>\n </button>\n } @else {\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n }\n</ng-template>\n<ng-template #starTemplate let-star=\"star\">\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n</ng-template>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
348
853
  }
349
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: RatingComponent, decorators: [{
854
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: RatingComponent, decorators: [{
350
855
  type: Component,
351
856
  args: [{ selector: 'ft-rating', standalone: true, imports: [CommonModule], providers: [
352
857
  {
@@ -354,297 +859,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
354
859
  useExisting: RatingComponent,
355
860
  multi: true
356
861
  }
357
- ], template: "<ng-container *ngFor=\"let star of stars\">\n <ng-container *ngTemplateOutlet=\"!readOnly? buttonTemplate : starTemplate; context:{star:star}\"></ng-container>\n</ng-container>\n<ng-template #buttonTemplate let-star=\"star\">\n <button type=\"button\" class=\"ft-rating__item\" *ngIf=\"!readOnly; else starTemplate\" [disabled]=\"disabled\"\n (mouseover)=\"setRate(star.value, true)\" (focus)=\"setRate(star.value, true)\" (blur)=\"setRate(0, true)\"\n (mouseout)=\"setRate(0, true)\" (click)=\"setRate(star.value)\">\n <ng-container *ngTemplateOutlet=\"starTemplate; context:{star:star}\"></ng-container>\n </button>\n</ng-template>\n<ng-template #starTemplate let-star=\"star\">\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n</ng-template>" }]
358
- }], ctorParameters: function () { return []; }, propDecorators: { readOnly: [{
359
- type: Input
360
- }], value: [{
862
+ ], template: "@for (star of stars; track star) {\n <ng-container *ngTemplateOutlet=\"!readOnly()? buttonTemplate : starTemplate; context:{star:star}\"></ng-container>\n}\n<ng-template #buttonTemplate let-star=\"star\">\n @if (!readOnly()) {\n <button type=\"button\" class=\"ft-rating__item\" [disabled]=\"disabled\"\n (mouseover)=\"setRate(star.value, true)\" (focus)=\"setRate(star.value, true)\" (blur)=\"setRate(0, true)\"\n (mouseout)=\"setRate(0, true)\" (click)=\"setRate(star.value)\">\n <ng-container *ngTemplateOutlet=\"starTemplate; context:{star:star}\"></ng-container>\n </button>\n } @else {\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n }\n</ng-template>\n<ng-template #starTemplate let-star=\"star\">\n <svg [ngClass]=\"{'ft-rating__item-icon--hover': hoverValue >= star.value, 'ft-rating__item-icon--active': value >= star.value}\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M17.93 21.315c-.534.408-5.22-3.186-5.881-3.181-.663 0-5.307 3.656-5.846 3.254-.537-.403 1.29-6.165 1.081-6.822-.209-.656-4.972-4.138-4.772-4.796.201-.658 6.015-.627 6.55-1.036.533-.41 2.233-6.215 2.895-6.219.663 0 2.43 5.779 2.968 6.182.539.403 6.352.297 6.56.953.21.656-4.513 4.197-4.714 4.856-.2.658 1.692 6.398 1.159 6.808z\" />\n </svg>\n</ng-template>" }]
863
+ }], propDecorators: { value: [{
361
864
  type: Input
362
865
  }] } });
363
866
 
364
- class TimelineComponent {
365
- get hostClasses() {
366
- return [
367
- 'ft-timeline',
368
- this.class
369
- ].join(' ');
370
- }
371
- ;
372
- constructor() {
373
- this.startDate = new Date();
374
- this.data = [];
375
- this.dataParsed = {
376
- months: [],
377
- days: [],
378
- weekends: []
379
- };
380
- this.class = '';
381
- }
382
- ngOnInit() {
383
- this.addMonth(this.calcStartDate());
384
- }
385
- addMonth(date) {
386
- const month = this.getMonth(date.getMonth(), date.getFullYear());
387
- const currentDays = this.dataParsed.days.length;
388
- this.dataParsed.months = [...this.dataParsed.months, { date: month.days[0], daysInMonth: month.days.length }];
389
- this.dataParsed.days = [...this.dataParsed.days, ...month.days];
390
- this.dataParsed.weekends = [...this.dataParsed.weekends, ...month.weekends];
391
- if (!this.currentDate && month.currentDate) {
392
- this.currentDate = currentDays + month.currentDate;
393
- }
394
- this.dataParsed.days.some((day, index) => {
395
- if ([0, 6].includes(day.getDay())) {
396
- this.dataParsed.weekendStart = index;
397
- return true;
398
- }
399
- return false;
400
- });
401
- this.parseTasks();
402
- }
403
- calcStartDate() {
404
- return new Date();
405
- }
406
- getMonth(month, year) {
407
- const days = [];
408
- const weekends = [];
409
- let currentDate = null;
410
- let today = new Date();
411
- const date = new Date(year, month + 1, 0);
412
- for (let i = 1; i <= date.getDate(); i++) {
413
- const idate = new Date(year, month, i);
414
- if ([0, 6].includes(idate.getDay())) {
415
- if (idate.getDay() === 6) {
416
- weekends.push([idate]);
417
- }
418
- else {
419
- weekends[weekends.length - 1].push(idate);
420
- }
421
- }
422
- if (idate.getTime() === new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime()) {
423
- currentDate = i - 1;
424
- }
425
- days.push(idate);
426
- }
427
- const data = { days, weekends };
428
- if (currentDate) {
429
- data.currentDate = currentDate;
430
- }
431
- return data;
432
- }
433
- parseTasks() {
434
- let tasks = this.data.filter(task => task.endAt) /*.sort((a, b) => a.)*/;
435
- this.dataParsed.tasks = tasks.map((task) => {
436
- return {
437
- label: task.label,
438
- start: 10,
439
- type: task.type,
440
- size: 1
441
- };
442
- });
443
- }
444
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: TimelineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
445
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: TimelineComponent, isStandalone: true, selector: "ft-timeline", inputs: { data: "data", class: "class" }, host: { properties: { "style.--current-date": "this.currentDate", "class": "this.hostClasses" } }, ngImport: i0, template: "<div class=\"ft-weekends\" [style.--start]=\"dataParsed.weekendStart\">\n <div class=\"ft-weekends__item\" [style.--weekend-size]=\"weekend.length\" *ngFor=\"let weekend of dataParsed.weekends\">\n </div>\n</div>\n<div class=\"ft-current-date\" *ngIf=\"currentDate\"></div>\n<div class=\"ft-header\">\n <div class=\"ft-header__months\">\n <div [style.--days-in-month]=\"month.daysInMonth\" *ngFor=\"let month of dataParsed.months; let i = index\">{{\n month.date\n | date: 'MMMM, yyyy' }}</div>\n </div>\n <div class=\"ft-header__days\">\n <div *ngFor=\"let day of dataParsed.days; let i = index\">\n <div [ngClass]=\"{active: currentDate && currentDate === i}\">{{ day | date:'d' }}</div>\n </div>\n </div>\n</div>\n<div class=\"ft-tasks\">\n <button type=\"button\" class=\"ft-tasks__item\" [class.tasks__item--milestone]=\"task.type === 'milestone'\"\n [style.--start]=\"task.start\" [style.--days]=\"task.type === 'milestone' ? 1 : task.size\"\n style=\" --color-rgb: 130, 121, 210;\" *ngFor=\"let task of dataParsed.tasks;\">{{ task.label }}</button>\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] }); }
867
+ class UiModule {
868
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
869
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: UiModule, imports: [CommonModule,
870
+ AvatarComponent,
871
+ IconComponent,
872
+ ImageComponent,
873
+ ProgressComponent,
874
+ RatingComponent,
875
+ ObserveIntersectingDirective], exports: [AvatarComponent,
876
+ IconComponent,
877
+ ImageComponent,
878
+ ProgressComponent,
879
+ RatingComponent,
880
+ ObserveIntersectingDirective] });
881
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiModule, imports: [CommonModule,
882
+ ProgressComponent,
883
+ RatingComponent] });
446
884
  }
447
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: TimelineComponent, decorators: [{
448
- type: Component,
449
- args: [{ selector: 'ft-timeline', standalone: true, imports: [CommonModule], template: "<div class=\"ft-weekends\" [style.--start]=\"dataParsed.weekendStart\">\n <div class=\"ft-weekends__item\" [style.--weekend-size]=\"weekend.length\" *ngFor=\"let weekend of dataParsed.weekends\">\n </div>\n</div>\n<div class=\"ft-current-date\" *ngIf=\"currentDate\"></div>\n<div class=\"ft-header\">\n <div class=\"ft-header__months\">\n <div [style.--days-in-month]=\"month.daysInMonth\" *ngFor=\"let month of dataParsed.months; let i = index\">{{\n month.date\n | date: 'MMMM, yyyy' }}</div>\n </div>\n <div class=\"ft-header__days\">\n <div *ngFor=\"let day of dataParsed.days; let i = index\">\n <div [ngClass]=\"{active: currentDate && currentDate === i}\">{{ day | date:'d' }}</div>\n </div>\n </div>\n</div>\n<div class=\"ft-tasks\">\n <button type=\"button\" class=\"ft-tasks__item\" [class.tasks__item--milestone]=\"task.type === 'milestone'\"\n [style.--start]=\"task.start\" [style.--days]=\"task.type === 'milestone' ? 1 : task.size\"\n style=\" --color-rgb: 130, 121, 210;\" *ngFor=\"let task of dataParsed.tasks;\">{{ task.label }}</button>\n</div>" }]
450
- }], ctorParameters: function () { return []; }, propDecorators: { data: [{
451
- type: Input
452
- }], currentDate: [{
453
- type: HostBinding,
454
- args: ['style.--current-date']
455
- }], class: [{
456
- type: Input
457
- }], hostClasses: [{
458
- type: HostBinding,
459
- args: ['class']
460
- }] } });
461
-
462
- class ObserveIntersectingDirective {
463
- constructor(element, platformId = {}) {
464
- this.element = element;
465
- this.platformId = platformId;
466
- this.event = new EventEmitter();
467
- }
468
- ngOnInit() {
469
- if (isPlatformBrowser(this.platformId)) {
470
- if ("IntersectionObserver" in window) {
471
- const elementObserver = new IntersectionObserver((entries, observer) => {
472
- entries.forEach((entry) => {
473
- this.event.emit(entry.isIntersecting);
474
- });
475
- }, this.options);
476
- elementObserver.observe(this.element.nativeElement);
477
- }
478
- else {
479
- console.error('ftObserveIntersecting not available in this browser.');
480
- }
481
- }
482
- }
483
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ObserveIntersectingDirective, deps: [{ token: i0.ElementRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
484
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: ObserveIntersectingDirective, isStandalone: true, selector: "[ftObserveIntersecting]", inputs: { options: ["ftObserveIntersectingOptions", "options"] }, outputs: { event: "ftObserveIntersecting" }, ngImport: i0 }); }
485
- }
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ObserveIntersectingDirective, decorators: [{
487
- type: Directive,
885
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: UiModule, decorators: [{
886
+ type: NgModule,
488
887
  args: [{
489
- selector: '[ftObserveIntersecting]',
490
- standalone: true
491
- }]
492
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
493
- type: Inject,
494
- args: [PLATFORM_ID]
495
- }] }]; }, propDecorators: { options: [{
496
- type: Input,
497
- args: ['ftObserveIntersectingOptions']
498
- }], event: [{
499
- type: Output,
500
- args: ['ftObserveIntersecting']
501
- }] } });
502
-
503
- class MessageContentComponent {
504
- constructor(data) {
505
- this.data = data;
506
- }
507
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageContentComponent, deps: [{ token: MAT_SNACK_BAR_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
508
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: MessageContentComponent, isStandalone: true, selector: "ft-message-content", ngImport: i0, template: "<ng-container [ngSwitch]=\"data.message?.type\">\n <div *ngSwitchCase=\"'html'\" [innerHTML]=\"data.message?.content\"></div>\n <ng-container *ngSwitchDefault>{{ data.message?.content }}</ng-container>\n</ng-container>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
509
- }
510
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageContentComponent, decorators: [{
511
- type: Component,
512
- args: [{ selector: 'ft-message-content', standalone: true, imports: [CommonModule], template: "<ng-container [ngSwitch]=\"data.message?.type\">\n <div *ngSwitchCase=\"'html'\" [innerHTML]=\"data.message?.content\"></div>\n <ng-container *ngSwitchDefault>{{ data.message?.content }}</ng-container>\n</ng-container>" }]
513
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
514
- type: Inject,
515
- args: [MAT_SNACK_BAR_DATA]
516
- }] }]; } });
517
-
518
- class MessageDialogComponent {
519
- constructor(data) {
520
- this.data = data;
521
- this.beforeSelect = new EventEmitter();
522
- }
523
- select(value) {
524
- this.beforeSelect.emit(value);
525
- }
526
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageDialogComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
527
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: MessageDialogComponent, isStandalone: true, selector: "ft-message-dialog", outputs: { beforeSelect: "beforeSelect" }, ngImport: i0, template: "<h1 mat-dialog-title class=\"ft-message__title\" *ngIf=\"data.options?.title\">\n <ft-icon *ngIf=\"data.options?.titleIcon\" [name]=\"data.options?.titleIcon?.name\"\n [collection]=\"data.options?.titleIcon?.collection\" [ngClass]=\"data.options?.titleIcon?.class\"></ft-icon>\n <div>{{ data.options?.title }}</div>\n</h1>\n<div mat-dialog-content class=\"ft-message__content\" [ngClass]=\"data.options?.class\">\n <ft-icon *ngIf=\"data.options?.icon\" [name]=\"data.options?.icon?.name\" [collection]=\"data.options?.icon?.collection\"\n [ngClass]=\"data.options?.icon?.class\"></ft-icon>\n <ng-container [ngSwitch]=\"data.message?.type\">\n <div *ngSwitchCase=\"'html'\" [innerHTML]=\"data.message?.content\"></div>\n <ng-container *ngSwitchDefault>{{ data.message?.content }}</ng-container>\n </ng-container>\n</div>\n<div mat-dialog-actions class=\"ft-message__actions\" *ngIf=\"data.options.actionsVisible\">\n <ng-container *ngIf=\"data.options?.actions?.length > 0; else acceptTemplate\">\n <ng-container *ngFor=\"let action of data.options?.actions; let i = index\">\n <ng-container [ngSwitch]=\"action.type\">\n <button type=\"button\" *ngSwitchCase=\"'raised'\" mat-raised-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchCase=\"'flat'\" mat-flat-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchCase=\"'stroked'\" mat-stroked-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchDefault mat-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n<ng-template #acceptTemplate>\n <button type=\"button\" mat-stroked-button color=\"primary\" (click)=\"select('-1')\" i18n>Accept</button>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: IconComponent, selector: "ft-icon", inputs: ["collection", "mode", "name", "path", "src", "class"] }] }); }
528
- }
529
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageDialogComponent, decorators: [{
530
- type: Component,
531
- args: [{ selector: 'ft-message-dialog', standalone: true, imports: [
888
+ declarations: [],
889
+ imports: [
532
890
  CommonModule,
533
- MatButtonModule,
534
- IconComponent
535
- ], template: "<h1 mat-dialog-title class=\"ft-message__title\" *ngIf=\"data.options?.title\">\n <ft-icon *ngIf=\"data.options?.titleIcon\" [name]=\"data.options?.titleIcon?.name\"\n [collection]=\"data.options?.titleIcon?.collection\" [ngClass]=\"data.options?.titleIcon?.class\"></ft-icon>\n <div>{{ data.options?.title }}</div>\n</h1>\n<div mat-dialog-content class=\"ft-message__content\" [ngClass]=\"data.options?.class\">\n <ft-icon *ngIf=\"data.options?.icon\" [name]=\"data.options?.icon?.name\" [collection]=\"data.options?.icon?.collection\"\n [ngClass]=\"data.options?.icon?.class\"></ft-icon>\n <ng-container [ngSwitch]=\"data.message?.type\">\n <div *ngSwitchCase=\"'html'\" [innerHTML]=\"data.message?.content\"></div>\n <ng-container *ngSwitchDefault>{{ data.message?.content }}</ng-container>\n </ng-container>\n</div>\n<div mat-dialog-actions class=\"ft-message__actions\" *ngIf=\"data.options.actionsVisible\">\n <ng-container *ngIf=\"data.options?.actions?.length > 0; else acceptTemplate\">\n <ng-container *ngFor=\"let action of data.options?.actions; let i = index\">\n <ng-container [ngSwitch]=\"action.type\">\n <button type=\"button\" *ngSwitchCase=\"'raised'\" mat-raised-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchCase=\"'flat'\" mat-flat-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchCase=\"'stroked'\" mat-stroked-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n <button type=\"button\" *ngSwitchDefault mat-button [color]=\"action.metadata?.color\"\n (click)=\"select(action.value)\">{{ action.label }}</button>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n<ng-template #acceptTemplate>\n <button type=\"button\" mat-stroked-button color=\"primary\" (click)=\"select('-1')\" i18n>Accept</button>\n</ng-template>" }]
536
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
537
- type: Inject,
538
- args: [MAT_DIALOG_DATA]
539
- }] }]; }, propDecorators: { beforeSelect: [{
540
- type: Output
541
- }] } });
542
-
543
- class MessageService {
544
- constructor(snackBar, dialog) {
545
- this.snackBar = snackBar;
546
- this.dialog = dialog;
547
- }
548
- show(message, options) {
549
- const selectionSource = new ReplaySubject(undefined);
550
- const selection = selectionSource.asObservable();
551
- const defaults = {
552
- type: 'notification',
553
- duration: 2000,
554
- actionsVisible: true
555
- };
556
- options = Object.assign(defaults, options);
557
- const data = { message: typeof message === 'string' ? { content: message, type: 'text' } : message, options };
558
- let dialogRef;
559
- switch (options.type) {
560
- default:
561
- case 'notification':
562
- this.snackBar.openFromComponent(MessageContentComponent, {
563
- data,
564
- panelClass: ['ft-message', 'ft-message--notification', options.class || ''],
565
- duration: options.duration || 2000,
566
- verticalPosition: options.verticalPosition || 'bottom'
567
- });
568
- break;
569
- case 'modal':
570
- dialogRef = this.dialog.open(MessageDialogComponent, {
571
- width: options.width || '350px',
572
- data,
573
- panelClass: ['ft-message', 'ft-message--modal'],
574
- autoFocus: false,
575
- disableClose: true
576
- });
577
- dialogRef.componentInstance.beforeSelect.subscribe((response) => {
578
- selectionSource.next(response);
579
- dialogRef.close();
580
- });
581
- this.snackBar.dismiss();
582
- break;
583
- }
584
- return selection;
585
- }
586
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageService, deps: [{ token: i1$2.MatSnackBar }, { token: i2$1.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable }); }
587
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageService, providedIn: 'root' }); }
588
- }
589
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MessageService, decorators: [{
590
- type: Injectable,
591
- args: [{
592
- providedIn: 'root'
891
+ AvatarComponent,
892
+ IconComponent,
893
+ ImageComponent,
894
+ ProgressComponent,
895
+ RatingComponent,
896
+ ObserveIntersectingDirective
897
+ ],
898
+ exports: [
899
+ AvatarComponent,
900
+ IconComponent,
901
+ ImageComponent,
902
+ ProgressComponent,
903
+ RatingComponent,
904
+ ObserveIntersectingDirective
905
+ ]
593
906
  }]
594
- }], ctorParameters: function () { return [{ type: i1$2.MatSnackBar }, { type: i2$1.MatDialog }]; } });
595
-
596
- class ProgressService {
597
- constructor(viewContainerRef, injector) {
598
- this.viewContainerRef = viewContainerRef;
599
- this.injector = injector;
600
- }
601
- show() {
602
- if (!this.componentRef) {
603
- this.appRef = this.injector.get(ApplicationRef);
604
- // 1. Create a component reference from the component
605
- this.componentRef = this.viewContainerRef.createComponent(ProgressComponent);
606
- // 2. Attach component to the appRef so that it's inside the ng component tree
607
- this.appRef.attachView(this.componentRef.hostView);
608
- this.componentRef.instance.overlay = true;
609
- // 3. Get DOM element from component
610
- const domElem = this.componentRef.hostView
611
- .rootNodes[0];
612
- // 4. Append DOM element to the body
613
- document.body.appendChild(domElem);
614
- return true;
615
- }
616
- else {
617
- return false;
618
- }
619
- }
620
- hide() {
621
- if (this.componentRef) {
622
- this.appRef.detachView(this.componentRef.hostView);
623
- this.componentRef.destroy();
624
- this.componentRef = null;
625
- return true;
626
- }
627
- else {
628
- return false;
629
- }
630
- }
631
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ProgressService, deps: [{ token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
632
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ProgressService, providedIn: 'root' }); }
633
- }
634
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ProgressService, decorators: [{
635
- type: Injectable,
636
- args: [{
637
- providedIn: 'root'
638
- }]
639
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Injector }]; } });
640
-
641
- /*
642
- * Public API Surface of ui
643
- */
907
+ }] });
644
908
 
645
909
  /**
646
910
  * Generated bundle index. Do not edit.
647
911
  */
648
912
 
649
- export { AvatarComponent, IconComponent, ImageComponent, MessageService, ObserveIntersectingDirective, ProgressComponent, ProgressService, RatingComponent, TimelineComponent };
913
+ export { AvatarComponent, ChartService, IconComponent, ImageComponent, MessageContentComponent, MessageDialogComponent, MessageService, ObserveIntersectingDirective, ProgressComponent, RatingComponent, UI_OPTIONS, UiModule };
650
914
  //# sourceMappingURL=factor_ec-ui.mjs.map