@fylib/adapter-angular 0.2.3 → 0.2.7

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 (49) hide show
  1. package/dist/components/accordion.component.d.ts +3 -0
  2. package/dist/components/accordion.component.js +105 -194
  3. package/dist/components/badge.component.d.ts +3 -0
  4. package/dist/components/badge.component.js +30 -81
  5. package/dist/components/button.component.d.ts +3 -0
  6. package/dist/components/button.component.js +79 -194
  7. package/dist/components/card.component.d.ts +3 -0
  8. package/dist/components/card.component.js +76 -147
  9. package/dist/components/chart.component.d.ts +3 -0
  10. package/dist/components/chart.component.js +81 -141
  11. package/dist/components/icon.component.d.ts +3 -0
  12. package/dist/components/icon.component.js +39 -62
  13. package/dist/components/input.component.d.ts +3 -0
  14. package/dist/components/input.component.js +120 -221
  15. package/dist/components/modal.component.d.ts +3 -0
  16. package/dist/components/modal.component.js +121 -247
  17. package/dist/components/nav-link.component.d.ts +3 -0
  18. package/dist/components/nav-link.component.js +43 -92
  19. package/dist/components/notification-menu.component.d.ts +3 -0
  20. package/dist/components/notification-menu.component.js +205 -367
  21. package/dist/components/select.component.d.ts +3 -0
  22. package/dist/components/select.component.js +116 -188
  23. package/dist/components/table.component.d.ts +3 -0
  24. package/dist/components/table.component.js +235 -332
  25. package/dist/components/text.component.d.ts +3 -0
  26. package/dist/components/text.component.js +22 -32
  27. package/dist/components/toast.component.d.ts +3 -0
  28. package/dist/components/toast.component.js +58 -163
  29. package/dist/directives/animation.directive.d.ts +3 -0
  30. package/dist/directives/animation.directive.js +15 -22
  31. package/dist/directives/theme-vars.directive.d.ts +3 -0
  32. package/dist/directives/theme-vars.directive.js +12 -19
  33. package/dist/directives/wallpaper.directive.d.ts +3 -0
  34. package/dist/directives/wallpaper.directive.js +19 -31
  35. package/dist/layouts/layout.component.d.ts +3 -0
  36. package/dist/layouts/layout.component.js +36 -130
  37. package/dist/layouts/slot.component.d.ts +3 -0
  38. package/dist/layouts/slot.component.js +240 -596
  39. package/dist/schematics/ng-add/index.js +120 -11
  40. package/dist/schematics/ng-add/index.js.map +1 -1
  41. package/dist/services/fylib.service.d.ts +3 -0
  42. package/dist/services/fylib.service.js +19 -26
  43. package/dist/services/notification.service.d.ts +3 -0
  44. package/dist/services/notification.service.js +13 -16
  45. package/dist/services/sse.service.d.ts +3 -0
  46. package/dist/services/sse.service.js +11 -18
  47. package/dist/services/webclient.service.d.ts +3 -0
  48. package/dist/services/webclient.service.js +9 -12
  49. package/package.json +5 -4
@@ -1,12 +1,3 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
1
  import { Component, Input, Output, EventEmitter, inject, ViewEncapsulation, signal, computed, effect } from '@angular/core';
11
2
  import { CommonModule } from '@angular/common';
12
3
  import { NotificationMenuDefinition } from '@fylib/catalog';
@@ -16,7 +7,9 @@ import { FyIconComponent } from './icon.component';
16
7
  import { FyAccordionComponent } from './accordion.component';
17
8
  import { FyNotificationService } from '../services/notification.service';
18
9
  import { FyWebClientService } from '../services/webclient.service';
19
- let FyNotificationMenuComponent = class FyNotificationMenuComponent extends BaseFyComponent {
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ export class FyNotificationMenuComponent extends BaseFyComponent {
20
13
  set notifications(value) {
21
14
  this._notifications.set(value ?? []);
22
15
  }
@@ -26,7 +19,7 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
26
19
  constructor() {
27
20
  super(inject(FyLibService), 'fy-notification-menu');
28
21
  this.notify = inject(FyNotificationService);
29
- this._notifications = signal([]);
22
+ this._notifications = signal([], ...(ngDevMode ? [{ debugName: "_notifications" }] : /* istanbul ignore next */ []));
30
23
  this.unreadCount = 0;
31
24
  this.activeAnimations = null;
32
25
  this.activeEffects = null;
@@ -35,10 +28,10 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
35
28
  this.fyClearAll = new EventEmitter();
36
29
  this.fyViewAll = new EventEmitter();
37
30
  this.fyNotificationClick = new EventEmitter();
38
- this.isOpen = signal(false);
39
- this.isClosing = signal(false);
31
+ this.isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
32
+ this.isClosing = signal(false, ...(ngDevMode ? [{ debugName: "isClosing" }] : /* istanbul ignore next */ []));
40
33
  this.webClient = inject(FyWebClientService, { optional: true });
41
- this.themeTokens = computed(() => this.fylib.tokens().effects?.notificationMenu);
34
+ this.themeTokens = computed(() => this.fylib.tokens().effects?.notificationMenu, ...(ngDevMode ? [{ debugName: "themeTokens" }] : /* istanbul ignore next */ []));
42
35
  this.resolvedConfig = computed(() => {
43
36
  const themeConfig = this.themeTokens()?.config;
44
37
  const def = NotificationMenuDefinition.defaultProps;
@@ -55,8 +48,8 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
55
48
  readApiMethod: this.readApiMethod ?? themeConfig?.readApiMethod ?? def.readApiMethod,
56
49
  readApiHeaders: this.readApiHeaders ?? themeConfig?.readApiHeaders
57
50
  };
58
- });
59
- this.visibleLimit = signal(10);
51
+ }, ...(ngDevMode ? [{ debugName: "resolvedConfig" }] : /* istanbul ignore next */ []));
52
+ this.visibleLimit = signal(10, ...(ngDevMode ? [{ debugName: "visibleLimit" }] : /* istanbul ignore next */ []));
60
53
  this.displayNotifications = computed(() => {
61
54
  const config = this.resolvedConfig();
62
55
  const notifications = this._notifications();
@@ -64,9 +57,9 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
64
57
  return notifications;
65
58
  const limit = this.visibleLimit();
66
59
  return notifications.slice(0, limit);
67
- });
68
- this.shouldScroll = computed(() => this._notifications().length > 5);
69
- this.scrollHeight = computed(() => this.themeTokens()?.dropdown?.maxHeight || '320px');
60
+ }, ...(ngDevMode ? [{ debugName: "displayNotifications" }] : /* istanbul ignore next */ []));
61
+ this.shouldScroll = computed(() => this._notifications().length > 5, ...(ngDevMode ? [{ debugName: "shouldScroll" }] : /* istanbul ignore next */ []));
62
+ this.scrollHeight = computed(() => this.themeTokens()?.dropdown?.maxHeight || '320px', ...(ngDevMode ? [{ debugName: "scrollHeight" }] : /* istanbul ignore next */ []));
70
63
  this.accordionItems = computed(() => {
71
64
  return this.displayNotifications().map(item => ({
72
65
  id: item.id,
@@ -74,7 +67,7 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
74
67
  subtitle: item.description,
75
68
  content: item.details
76
69
  }));
77
- });
70
+ }, ...(ngDevMode ? [{ debugName: "accordionItems" }] : /* istanbul ignore next */ []));
78
71
  // Sincroniza com o FyNotificationService usando effect
79
72
  effect(() => {
80
73
  const current = this.notify.notifications();
@@ -199,106 +192,9 @@ let FyNotificationMenuComponent = class FyNotificationMenuComponent extends Base
199
192
  const anim = this.resolveAnim('open', undefined, NotificationMenuDefinition.features?.animations?.open);
200
193
  return anim ? ` fy-anim-${anim}` : '';
201
194
  }
202
- };
203
- __decorate([
204
- Input(),
205
- __metadata("design:type", Array),
206
- __metadata("design:paramtypes", [Array])
207
- ], FyNotificationMenuComponent.prototype, "notifications", null);
208
- __decorate([
209
- Input(),
210
- __metadata("design:type", Number)
211
- ], FyNotificationMenuComponent.prototype, "unreadCount", void 0);
212
- __decorate([
213
- Input(),
214
- __metadata("design:type", Boolean)
215
- ], FyNotificationMenuComponent.prototype, "showAllNotifications", void 0);
216
- __decorate([
217
- Input(),
218
- __metadata("design:type", Number)
219
- ], FyNotificationMenuComponent.prototype, "maxNotifications", void 0);
220
- __decorate([
221
- Input(),
222
- __metadata("design:type", Boolean)
223
- ], FyNotificationMenuComponent.prototype, "enableClearAll", void 0);
224
- __decorate([
225
- Input(),
226
- __metadata("design:type", Boolean)
227
- ], FyNotificationMenuComponent.prototype, "enableAccordion", void 0);
228
- __decorate([
229
- Input(),
230
- __metadata("design:type", Boolean)
231
- ], FyNotificationMenuComponent.prototype, "showViewAll", void 0);
232
- __decorate([
233
- Input(),
234
- __metadata("design:type", Object)
235
- ], FyNotificationMenuComponent.prototype, "viewAllPosition", void 0);
236
- __decorate([
237
- Input(),
238
- __metadata("design:type", Boolean)
239
- ], FyNotificationMenuComponent.prototype, "markAllAsReadOnOpen", void 0);
240
- __decorate([
241
- Input(),
242
- __metadata("design:type", Boolean)
243
- ], FyNotificationMenuComponent.prototype, "markAsReadOnClick", void 0);
244
- __decorate([
245
- Input(),
246
- __metadata("design:type", String)
247
- ], FyNotificationMenuComponent.prototype, "readApiEndpoint", void 0);
248
- __decorate([
249
- Input(),
250
- __metadata("design:type", String)
251
- ], FyNotificationMenuComponent.prototype, "readApiMethod", void 0);
252
- __decorate([
253
- Input(),
254
- __metadata("design:type", Object)
255
- ], FyNotificationMenuComponent.prototype, "readApiHeaders", void 0);
256
- __decorate([
257
- Input(),
258
- __metadata("design:type", Function)
259
- ], FyNotificationMenuComponent.prototype, "onRead", void 0);
260
- __decorate([
261
- Input(),
262
- __metadata("design:type", Function)
263
- ], FyNotificationMenuComponent.prototype, "onReadAll", void 0);
264
- __decorate([
265
- Input(),
266
- __metadata("design:type", Object)
267
- ], FyNotificationMenuComponent.prototype, "activeAnimations", void 0);
268
- __decorate([
269
- Input(),
270
- __metadata("design:type", Object)
271
- ], FyNotificationMenuComponent.prototype, "activeEffects", void 0);
272
- __decorate([
273
- Input(),
274
- __metadata("design:type", Object)
275
- ], FyNotificationMenuComponent.prototype, "customStyles", void 0);
276
- __decorate([
277
- Output(),
278
- __metadata("design:type", Object)
279
- ], FyNotificationMenuComponent.prototype, "fyOpen", void 0);
280
- __decorate([
281
- Output(),
282
- __metadata("design:type", Object)
283
- ], FyNotificationMenuComponent.prototype, "fyClearAll", void 0);
284
- __decorate([
285
- Output(),
286
- __metadata("design:type", Object)
287
- ], FyNotificationMenuComponent.prototype, "fyViewAll", void 0);
288
- __decorate([
289
- Output(),
290
- __metadata("design:type", Object)
291
- ], FyNotificationMenuComponent.prototype, "fyNotificationClick", void 0);
292
- FyNotificationMenuComponent = __decorate([
293
- Component({
294
- selector: 'fy-notification-menu',
295
- standalone: true,
296
- imports: [
297
- CommonModule,
298
- FyIconComponent,
299
- FyAccordionComponent
300
- ],
301
- template: `
195
+ }
196
+ FyNotificationMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: FyNotificationMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
197
+ FyNotificationMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: FyNotificationMenuComponent, isStandalone: true, selector: "fy-notification-menu", inputs: { notifications: "notifications", unreadCount: "unreadCount", showAllNotifications: "showAllNotifications", maxNotifications: "maxNotifications", enableClearAll: "enableClearAll", enableAccordion: "enableAccordion", showViewAll: "showViewAll", viewAllPosition: "viewAllPosition", markAllAsReadOnOpen: "markAllAsReadOnOpen", markAsReadOnClick: "markAsReadOnClick", readApiEndpoint: "readApiEndpoint", readApiMethod: "readApiMethod", readApiHeaders: "readApiHeaders", onRead: "onRead", onReadAll: "onReadAll", activeAnimations: "activeAnimations", activeEffects: "activeEffects", customStyles: "customStyles" }, outputs: { fyOpen: "fyOpen", fyClearAll: "fyClearAll", fyViewAll: "fyViewAll", fyNotificationClick: "fyNotificationClick" }, usesInheritance: true, ngImport: i0, template: `
302
198
  <div class="fy-notification-menu">
303
199
  <!-- Botão de Notificação -->
304
200
  <button
@@ -440,256 +336,198 @@ FyNotificationMenuComponent = __decorate([
440
336
  </div>
441
337
  }
442
338
  </div>
443
- `,
444
- styles: [`
445
- .fy-notification-menu {
446
- position: relative;
447
- display: inline-block;
448
- }
449
-
450
- .fy-notification-menu__trigger {
451
- background: transparent;
452
- border: none;
453
- padding: 8px;
454
- cursor: pointer;
455
- position: relative;
456
- display: flex;
457
- align-items: center;
458
- justify-content: center;
459
- font-size: 22px;
460
- border-radius: 50%;
461
- transition: background 0.2s;
462
- }
463
-
464
- .fy-notification-menu__trigger:hover {
465
- background: rgba(0,0,0,0.05);
466
- }
467
-
468
- .fy-notification-menu__badge {
469
- position: absolute;
470
- top: 4px;
471
- right: 4px;
472
- min-width: 18px;
473
- height: 18px;
474
- padding: 0 4px;
475
- border-radius: 9px;
476
- font-size: 10px;
477
- font-weight: bold;
478
- display: flex;
479
- align-items: center;
480
- justify-content: center;
481
- border: 2px solid var(--fy-colors-surface, #ffffff);
482
- }
483
-
484
- .fy-notification-menu__dropdown {
485
- position: absolute;
486
- top: 100%;
487
- right: 0;
488
- margin-top: 8px;
489
- z-index: 1000;
490
- display: flex;
491
- flex-direction: column;
492
- overflow: hidden;
493
- box-shadow: var(--fy-notificationMenu-dropdown-shadow, 0 10px 40px rgba(0,0,0,0.1));
494
- border: 1px solid var(--fy-notificationMenu-dropdown-borderColor, rgba(0,0,0,0.08));
495
- background-color: var(--fy-notificationMenu-dropdown-background, #fff);
496
- border-radius: var(--fy-notificationMenu-dropdown-borderRadius, 12px);
497
- max-height: var(--fy-notificationMenu-dropdown-maxHeight, 450px);
498
- }
499
-
500
- @media (max-width: 768px) {
501
- .fy-notification-menu__dropdown {
502
- position: fixed;
503
- top: calc(var(--fy-layout-header-height, 64px) + 8px);
504
- left: 16px;
505
- right: 16px;
506
- width: calc(100% - 32px) !important;
507
- max-height: calc(100vh - var(--fy-layout-header-height, 64px) - 32px) !important;
508
- margin-top: 0;
509
- z-index: 2000;
510
- }
511
- }
512
-
513
- .fy-notification-menu__header {
514
- padding: 12px 16px;
515
- display: flex;
516
- justify-content: space-between;
517
- align-items: center;
518
- border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));
519
- flex-shrink: 0;
520
- }
521
-
522
- .fy-notification-menu__header-actions {
523
- display: flex;
524
- align-items: center;
525
- gap: 8px;
526
- }
527
-
528
- .fy-notification-menu__title {
529
- font-weight: var(--fy-typography-fontWeight-bold, 600);
530
- font-size: 14px;
531
- }
532
-
533
- .fy-notification-menu__action-btn {
534
- background: transparent;
535
- border: none;
536
- color: var(--fy-colors-primary, #007aff);
537
- font-size: 12px;
538
- cursor: pointer;
539
- padding: 4px 8px;
540
- border-radius: 4px;
541
- }
542
-
543
- .fy-notification-menu__action-btn:hover {
544
- background: rgba(var(--fy-colors-primary-rgb), 0.08);
545
- }
546
-
547
- .fy-notification-menu__close-btn {
548
- display: none;
549
- background: transparent;
550
- border: none;
551
- color: var(--fy-colors-text, inherit);
552
- font-size: 20px;
553
- cursor: pointer;
554
- padding: 4px;
555
- line-height: 1;
556
- opacity: 0.6;
557
- transition: opacity 0.2s;
558
- }
559
-
560
- .fy-notification-menu__close-btn:hover {
561
- opacity: 1;
562
- }
563
-
564
- @media (max-width: 768px) {
565
- .fy-notification-menu__close-btn {
566
- display: inline-flex;
567
- align-items: center;
568
- justify-content: center;
569
- }
570
- }
571
-
572
- .fy-notification-menu__body {
573
- flex: 1;
574
- min-height: 0;
575
- overflow-y: auto;
576
- }
577
- .fy-notification-menu__body--scroll {
578
- max-height: var(--fy-notificationMenu-dropdown-maxHeight, 320px);
579
- }
580
-
581
- .fy-notification-menu__empty {
582
- padding: 32px 16px;
583
- text-align: center;
584
- color: var(--fy-colors-secondary, #86868b);
585
- font-size: 13px;
586
- }
587
-
588
- .fy-notification-menu__item {
589
- padding: 12px 16px;
590
- display: flex;
591
- gap: 12px;
592
- cursor: pointer;
593
- transition: background 0.2s;
594
- border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));
595
- position: relative;
596
- }
597
-
598
- .fy-notification-menu__item:hover {
599
- background: rgba(0,0,0,0.02);
600
- }
601
-
602
- .fy-notification-menu__item--unread {
603
- background: rgba(var(--fy-colors-primary-rgb), 0.02);
604
- }
605
-
606
- .fy-notification-menu__item--read {
607
- opacity: 0.6;
608
- filter: grayscale(0.4);
609
- transition: all 0.3s ease;
610
- }
611
-
612
- .fy-notification-menu__item--read:hover {
613
- opacity: 0.8;
614
- filter: grayscale(0.2);
615
- }
616
-
617
- .fy-notification-menu__accordion-item.fy-notification-menu__item--read ::ng-deep .fy-accordion__header {
618
- opacity: 0.7;
619
- }
620
-
621
- .fy-notification-menu__unread-dot {
622
- position: absolute;
623
- right: 12px;
624
- top: 12px;
625
- width: 8px;
626
- height: 8px;
627
- background: var(--fy-colors-primary, #007aff);
628
- border-radius: 50%;
629
- }
630
-
631
- .fy-notification-menu__item-content {
632
- flex: 1;
633
- }
634
-
635
- .fy-notification-menu__item-title {
636
- font-weight: 600;
637
- font-size: 13px;
638
- margin-bottom: 2px;
639
- }
640
-
641
- .fy-notification-menu__item-desc {
642
- font-size: 12px;
643
- color: var(--fy-colors-secondary, #86868b);
644
- line-height: 1.4;
645
- }
646
-
647
- .fy-notification-menu__item-date {
648
- font-size: 11px;
649
- color: var(--fy-colors-secondary, #86868b);
650
- margin-top: 4px;
651
- opacity: 0.7;
652
- }
339
+ `, isInline: true, styles: ["\n .fy-notification-menu {\n position: relative;\n display: inline-block;\n }\n\n .fy-notification-menu__trigger {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n border-radius: 50%;\n transition: background 0.2s;\n }\n\n .fy-notification-menu__trigger:hover {\n background: rgba(0,0,0,0.05);\n }\n\n .fy-notification-menu__badge {\n position: absolute;\n top: 4px;\n right: 4px;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--fy-colors-surface, #ffffff);\n }\n\n .fy-notification-menu__dropdown {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 8px;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--fy-notificationMenu-dropdown-shadow, 0 10px 40px rgba(0,0,0,0.1));\n border: 1px solid var(--fy-notificationMenu-dropdown-borderColor, rgba(0,0,0,0.08));\n background-color: var(--fy-notificationMenu-dropdown-background, #fff);\n border-radius: var(--fy-notificationMenu-dropdown-borderRadius, 12px);\n max-height: var(--fy-notificationMenu-dropdown-maxHeight, 450px);\n }\n\n @media (max-width: 768px) {\n .fy-notification-menu__dropdown {\n position: fixed;\n top: calc(var(--fy-layout-header-height, 64px) + 8px);\n left: 16px;\n right: 16px;\n width: calc(100% - 32px) !important;\n max-height: calc(100vh - var(--fy-layout-header-height, 64px) - 32px) !important;\n margin-top: 0;\n z-index: 2000;\n }\n }\n\n .fy-notification-menu__header {\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));\n flex-shrink: 0;\n }\n\n .fy-notification-menu__header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .fy-notification-menu__title {\n font-weight: var(--fy-typography-fontWeight-bold, 600);\n font-size: 14px;\n }\n\n .fy-notification-menu__action-btn {\n background: transparent;\n border: none;\n color: var(--fy-colors-primary, #007aff);\n font-size: 12px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .fy-notification-menu__action-btn:hover {\n background: rgba(var(--fy-colors-primary-rgb), 0.08);\n }\n\n .fy-notification-menu__close-btn {\n display: none;\n background: transparent;\n border: none;\n color: var(--fy-colors-text, inherit);\n font-size: 20px;\n cursor: pointer;\n padding: 4px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .fy-notification-menu__close-btn:hover {\n opacity: 1;\n }\n\n @media (max-width: 768px) {\n .fy-notification-menu__close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .fy-notification-menu__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n .fy-notification-menu__body--scroll {\n max-height: var(--fy-notificationMenu-dropdown-maxHeight, 320px);\n }\n\n .fy-notification-menu__empty {\n padding: 32px 16px;\n text-align: center;\n color: var(--fy-colors-secondary, #86868b);\n font-size: 13px;\n }\n\n .fy-notification-menu__item {\n padding: 12px 16px;\n display: flex;\n gap: 12px;\n cursor: pointer;\n transition: background 0.2s;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));\n position: relative;\n }\n\n .fy-notification-menu__item:hover {\n background: rgba(0,0,0,0.02);\n }\n\n .fy-notification-menu__item--unread {\n background: rgba(var(--fy-colors-primary-rgb), 0.02);\n }\n\n .fy-notification-menu__item--read {\n opacity: 0.6;\n filter: grayscale(0.4);\n transition: all 0.3s ease;\n }\n\n .fy-notification-menu__item--read:hover {\n opacity: 0.8;\n filter: grayscale(0.2);\n }\n\n .fy-notification-menu__accordion-item.fy-notification-menu__item--read ::ng-deep .fy-accordion__header {\n opacity: 0.7;\n }\n\n .fy-notification-menu__unread-dot {\n position: absolute;\n right: 12px;\n top: 12px;\n width: 8px;\n height: 8px;\n background: var(--fy-colors-primary, #007aff);\n border-radius: 50%;\n }\n\n .fy-notification-menu__item-content {\n flex: 1;\n }\n\n .fy-notification-menu__item-title {\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 2px;\n }\n\n .fy-notification-menu__item-desc {\n font-size: 12px;\n color: var(--fy-colors-secondary, #86868b);\n line-height: 1.4;\n }\n\n .fy-notification-menu__item-date {\n font-size: 11px;\n color: var(--fy-colors-secondary, #86868b);\n margin-top: 4px;\n opacity: 0.7;\n }\n\n .fy-notification-menu__item-actions {\n display: flex;\n align-items: center;\n margin-right: 20px;\n }\n\n .fy-notification-menu__read-btn {\n background: transparent;\n border: none;\n padding: 6px;\n border-radius: 4px;\n cursor: pointer;\n color: var(--fy-colors-primary, #007aff);\n opacity: 0.4;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .fy-notification-menu__read-btn:hover {\n opacity: 1;\n background: rgba(var(--fy-colors-primary-rgb), 0.1);\n }\n\n .fy-notification-menu__accordion-item {\n display: block;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));\n }\n\n .fy-notification-menu__footer {\n padding: 8px 16px;\n border-top: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));\n display: flex;\n flex-shrink: 0;\n }\n "], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: FyIconComponent, selector: "fy-icon", inputs: ["name", "size", "color", "strokeWidth", "variant", "set"] }, { kind: "component", type: FyAccordionComponent, selector: "fy-accordion", inputs: ["items", "activeIndex", "expandMode", "size", "status", "bordered", "flush", "animated", "lazy", "iconPosition", "disabled", "onOpen", "onClose", "onChange", "activeAnimations", "activeEffects", "customStyles"], outputs: ["fyOpen", "fyClose", "fyChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], encapsulation: i0.ViewEncapsulation.None });
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: FyNotificationMenuComponent, decorators: [{
341
+ type: Component,
342
+ args: [{ selector: 'fy-notification-menu', standalone: true, imports: [
343
+ CommonModule,
344
+ FyIconComponent,
345
+ FyAccordionComponent
346
+ ], template: `
347
+ <div class="fy-notification-menu">
348
+ <!-- Botão de Notificação -->
349
+ <button
350
+ class="fy-notification-menu__trigger"
351
+ (click)="toggleMenu()"
352
+ [style.color]="themeTokens()?.button?.textColor"
353
+ >
354
+ <fy-icon [name]="themeTokens()?.button?.icon || 'bell'"></fy-icon>
355
+ @if (unreadCountDisplay > 0) {
356
+ <span
357
+ class="fy-notification-menu__badge"
358
+ [style.background]="themeTokens()?.button?.badgeBackground"
359
+ [style.color]="themeTokens()?.button?.badgeTextColor"
360
+ >
361
+ {{ unreadCountDisplay > 99 ? '99+' : unreadCountDisplay }}
362
+ </span>
363
+ }
364
+ </button>
653
365
 
654
- .fy-notification-menu__item-actions {
655
- display: flex;
656
- align-items: center;
657
- margin-right: 20px;
658
- }
366
+ <!-- Dropdown -->
367
+ @if (isOpen() || isClosing()) {
368
+ <div
369
+ class="fy-notification-menu__dropdown"
370
+ [class]="composeAnimClasses(animationClassSuffix)"
371
+ [style.width]="themeTokens()?.dropdown?.width"
372
+ [style.background]="themeTokens()?.dropdown?.background"
373
+ [style.border-color]="themeTokens()?.dropdown?.borderColor"
374
+ [style.box-shadow]="themeTokens()?.dropdown?.shadow"
375
+ [style.border-radius]="themeTokens()?.dropdown?.borderRadius"
376
+ >
377
+ <!-- Header -->
378
+ <div class="fy-notification-menu__header">
379
+ <span class="fy-notification-menu__title">Notificações</span>
380
+
381
+ <div class="fy-notification-menu__header-actions">
382
+ @if (resolvedConfig().allowClear && notifications.length > 0) {
383
+ <button
384
+ class="fy-notification-menu__action-btn"
385
+ (click)="clearAll()"
386
+ >
387
+ Limpar tudo
388
+ </button>
389
+ }
390
+
391
+ @if (resolvedConfig().showViewAll && resolvedConfig().viewAllPosition.startsWith('header')) {
392
+ <button
393
+ class="fy-notification-menu__action-btn"
394
+ (click)="viewAll()"
395
+ >
396
+ Ver todas
397
+ </button>
398
+ }
659
399
 
660
- .fy-notification-menu__read-btn {
661
- background: transparent;
662
- border: none;
663
- padding: 6px;
664
- border-radius: 4px;
665
- cursor: pointer;
666
- color: var(--fy-colors-primary, #007aff);
667
- opacity: 0.4;
668
- transition: all 0.2s;
669
- display: flex;
670
- align-items: center;
671
- justify-content: center;
672
- }
400
+ <!-- Botão fechar (Mobile/Tablet) -->
401
+ <button class="fy-notification-menu__close-btn" (click)="closeMenu()">
402
+ <fy-icon name="x"></fy-icon>
403
+ </button>
404
+ </div>
405
+ </div>
673
406
 
674
- .fy-notification-menu__read-btn:hover {
675
- opacity: 1;
676
- background: rgba(var(--fy-colors-primary-rgb), 0.1);
677
- }
407
+ <!-- List -->
408
+ <div
409
+ class="fy-notification-menu__body"
410
+ [class.fy-notification-menu__body--scroll]="shouldScroll()"
411
+ >
412
+ @if (_notifications().length === 0) {
413
+ <div class="fy-notification-menu__empty">
414
+ Nenhuma notificação por enquanto.
415
+ </div>
416
+ }
678
417
 
679
- .fy-notification-menu__accordion-item {
680
- display: block;
681
- border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));
682
- }
418
+ @if (resolvedConfig().accordionMode) {
419
+ @for (item of displayNotifications(); track item.id) {
420
+ <div class="fy-notification-menu__item-wrapper">
421
+ <fy-accordion
422
+ [items]="[{ id: item.id, title: item.title, subtitle: item.description, content: item.details }]"
423
+ [flush]="true"
424
+ class="fy-notification-menu__accordion-item"
425
+ [class.fy-notification-menu__item--unread]="!item.read"
426
+ [class.fy-notification-menu__item--read]="item.read"
427
+ (fyExpand)="onItemExpand(item)"
428
+ >
429
+ </fy-accordion>
430
+ @if (!item.read) {
431
+ <div class="fy-notification-menu__unread-dot"></div>
432
+ }
433
+ </div>
434
+ }
435
+ } @else {
436
+ @for (item of displayNotifications(); track item.id) {
437
+ <div
438
+ class="fy-notification-menu__item"
439
+ [class.fy-notification-menu__item--unread]="!item.read"
440
+ [class.fy-notification-menu__item--read]="item.read"
441
+ (click)="onItemClick(item)"
442
+ >
443
+ @if (item.icon) {
444
+ <div class="fy-notification-menu__item-icon">
445
+ <fy-icon [name]="item.icon"></fy-icon>
446
+ </div>
447
+ }
448
+ <div class="fy-notification-menu__item-content">
449
+ <div class="fy-notification-menu__item-title">{{ item.title }}</div>
450
+ <div class="fy-notification-menu__item-desc">{{ item.description }}</div>
451
+ <div class="fy-notification-menu__item-date">{{ item.date | date:'short' }}</div>
452
+ </div>
453
+ @if (!item.read) {
454
+ <div class="fy-notification-menu__item-actions">
455
+ <button class="fy-notification-menu__read-btn" (click)="onMarkAsRead($event, item)">
456
+ <fy-icon name="check"></fy-icon>
457
+ </button>
458
+ </div>
459
+ }
460
+ @if (!item.read) {
461
+ <div class="fy-notification-menu__unread-dot"></div>
462
+ }
463
+ </div>
464
+ }
465
+ }
466
+ </div>
683
467
 
684
- .fy-notification-menu__footer {
685
- padding: 8px 16px;
686
- border-top: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));
687
- display: flex;
688
- flex-shrink: 0;
468
+ <!-- Footer -->
469
+ @if (resolvedConfig().showViewAll && resolvedConfig().viewAllPosition.startsWith('footer')) {
470
+ <div
471
+ class="fy-notification-menu__footer"
472
+ [style.justify-content]="resolvedConfig().viewAllPosition.endsWith('right') ? 'flex-end' : 'flex-start'"
473
+ >
474
+ <button class="fy-notification-menu__action-btn" (click)="viewAll()">Ver todas</button>
475
+ @if (shouldScroll() && displayNotifications().length < _notifications().length) {
476
+ <button
477
+ class="fy-notification-menu__action-btn"
478
+ (click)="loadMore()"
479
+ >
480
+ Carregar mais
481
+ </button>
482
+ }
483
+ </div>
484
+ }
485
+ </div>
689
486
  }
690
- `],
691
- encapsulation: ViewEncapsulation.None
692
- }),
693
- __metadata("design:paramtypes", [])
694
- ], FyNotificationMenuComponent);
695
- export { FyNotificationMenuComponent };
487
+ </div>
488
+ `, encapsulation: ViewEncapsulation.None, styles: ["\n .fy-notification-menu {\n position: relative;\n display: inline-block;\n }\n\n .fy-notification-menu__trigger {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n border-radius: 50%;\n transition: background 0.2s;\n }\n\n .fy-notification-menu__trigger:hover {\n background: rgba(0,0,0,0.05);\n }\n\n .fy-notification-menu__badge {\n position: absolute;\n top: 4px;\n right: 4px;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--fy-colors-surface, #ffffff);\n }\n\n .fy-notification-menu__dropdown {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 8px;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--fy-notificationMenu-dropdown-shadow, 0 10px 40px rgba(0,0,0,0.1));\n border: 1px solid var(--fy-notificationMenu-dropdown-borderColor, rgba(0,0,0,0.08));\n background-color: var(--fy-notificationMenu-dropdown-background, #fff);\n border-radius: var(--fy-notificationMenu-dropdown-borderRadius, 12px);\n max-height: var(--fy-notificationMenu-dropdown-maxHeight, 450px);\n }\n\n @media (max-width: 768px) {\n .fy-notification-menu__dropdown {\n position: fixed;\n top: calc(var(--fy-layout-header-height, 64px) + 8px);\n left: 16px;\n right: 16px;\n width: calc(100% - 32px) !important;\n max-height: calc(100vh - var(--fy-layout-header-height, 64px) - 32px) !important;\n margin-top: 0;\n z-index: 2000;\n }\n }\n\n .fy-notification-menu__header {\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));\n flex-shrink: 0;\n }\n\n .fy-notification-menu__header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .fy-notification-menu__title {\n font-weight: var(--fy-typography-fontWeight-bold, 600);\n font-size: 14px;\n }\n\n .fy-notification-menu__action-btn {\n background: transparent;\n border: none;\n color: var(--fy-colors-primary, #007aff);\n font-size: 12px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n }\n\n .fy-notification-menu__action-btn:hover {\n background: rgba(var(--fy-colors-primary-rgb), 0.08);\n }\n\n .fy-notification-menu__close-btn {\n display: none;\n background: transparent;\n border: none;\n color: var(--fy-colors-text, inherit);\n font-size: 20px;\n cursor: pointer;\n padding: 4px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .fy-notification-menu__close-btn:hover {\n opacity: 1;\n }\n\n @media (max-width: 768px) {\n .fy-notification-menu__close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .fy-notification-menu__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n .fy-notification-menu__body--scroll {\n max-height: var(--fy-notificationMenu-dropdown-maxHeight, 320px);\n }\n\n .fy-notification-menu__empty {\n padding: 32px 16px;\n text-align: center;\n color: var(--fy-colors-secondary, #86868b);\n font-size: 13px;\n }\n\n .fy-notification-menu__item {\n padding: 12px 16px;\n display: flex;\n gap: 12px;\n cursor: pointer;\n transition: background 0.2s;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));\n position: relative;\n }\n\n .fy-notification-menu__item:hover {\n background: rgba(0,0,0,0.02);\n }\n\n .fy-notification-menu__item--unread {\n background: rgba(var(--fy-colors-primary-rgb), 0.02);\n }\n\n .fy-notification-menu__item--read {\n opacity: 0.6;\n filter: grayscale(0.4);\n transition: all 0.3s ease;\n }\n\n .fy-notification-menu__item--read:hover {\n opacity: 0.8;\n filter: grayscale(0.2);\n }\n\n .fy-notification-menu__accordion-item.fy-notification-menu__item--read ::ng-deep .fy-accordion__header {\n opacity: 0.7;\n }\n\n .fy-notification-menu__unread-dot {\n position: absolute;\n right: 12px;\n top: 12px;\n width: 8px;\n height: 8px;\n background: var(--fy-colors-primary, #007aff);\n border-radius: 50%;\n }\n\n .fy-notification-menu__item-content {\n flex: 1;\n }\n\n .fy-notification-menu__item-title {\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 2px;\n }\n\n .fy-notification-menu__item-desc {\n font-size: 12px;\n color: var(--fy-colors-secondary, #86868b);\n line-height: 1.4;\n }\n\n .fy-notification-menu__item-date {\n font-size: 11px;\n color: var(--fy-colors-secondary, #86868b);\n margin-top: 4px;\n opacity: 0.7;\n }\n\n .fy-notification-menu__item-actions {\n display: flex;\n align-items: center;\n margin-right: 20px;\n }\n\n .fy-notification-menu__read-btn {\n background: transparent;\n border: none;\n padding: 6px;\n border-radius: 4px;\n cursor: pointer;\n color: var(--fy-colors-primary, #007aff);\n opacity: 0.4;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .fy-notification-menu__read-btn:hover {\n opacity: 1;\n background: rgba(var(--fy-colors-primary-rgb), 0.1);\n }\n\n .fy-notification-menu__accordion-item {\n display: block;\n border-bottom: 1px solid var(--fy-colors-border, rgba(0,0,0,0.03));\n }\n\n .fy-notification-menu__footer {\n padding: 8px 16px;\n border-top: 1px solid var(--fy-colors-border, rgba(0,0,0,0.05));\n display: flex;\n flex-shrink: 0;\n }\n "] }]
489
+ }], ctorParameters: () => [], propDecorators: { notifications: [{
490
+ type: Input
491
+ }], unreadCount: [{
492
+ type: Input
493
+ }], showAllNotifications: [{
494
+ type: Input
495
+ }], maxNotifications: [{
496
+ type: Input
497
+ }], enableClearAll: [{
498
+ type: Input
499
+ }], enableAccordion: [{
500
+ type: Input
501
+ }], showViewAll: [{
502
+ type: Input
503
+ }], viewAllPosition: [{
504
+ type: Input
505
+ }], markAllAsReadOnOpen: [{
506
+ type: Input
507
+ }], markAsReadOnClick: [{
508
+ type: Input
509
+ }], readApiEndpoint: [{
510
+ type: Input
511
+ }], readApiMethod: [{
512
+ type: Input
513
+ }], readApiHeaders: [{
514
+ type: Input
515
+ }], onRead: [{
516
+ type: Input
517
+ }], onReadAll: [{
518
+ type: Input
519
+ }], activeAnimations: [{
520
+ type: Input
521
+ }], activeEffects: [{
522
+ type: Input
523
+ }], customStyles: [{
524
+ type: Input
525
+ }], fyOpen: [{
526
+ type: Output
527
+ }], fyClearAll: [{
528
+ type: Output
529
+ }], fyViewAll: [{
530
+ type: Output
531
+ }], fyNotificationClick: [{
532
+ type: Output
533
+ }] } });