diff --git a/libs/core/notification/directives/notification-footer-content.directive.ts b/libs/core/notification/directives/notification-footer-content.directive.ts index 396cbbe5f32..49890483d2c 100644 --- a/libs/core/notification/directives/notification-footer-content.directive.ts +++ b/libs/core/notification/directives/notification-footer-content.directive.ts @@ -1,11 +1,10 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ selector: '[fdNotificationFooterContent], [fd-notification-footer-content]', - standalone: true + standalone: true, + host: { + class: 'fd-notification__footer-content' + } }) -export class NotificationFooterContentDirective { - /** @hidden */ - @HostBinding('class.fd-notification__footer-content') - fdNotificationTitleClass = true; -} +export class NotificationFooterContentDirective {} diff --git a/libs/core/notification/directives/notification-group-growing-item-title.directive.spec.ts b/libs/core/notification/directives/notification-group-growing-item-title.directive.spec.ts new file mode 100644 index 00000000000..224400ae73c --- /dev/null +++ b/libs/core/notification/directives/notification-group-growing-item-title.directive.spec.ts @@ -0,0 +1,36 @@ +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; + +@Component({ + template: `Notification Group Growing Item Title Test ` +}) +class TestComponent { + @ViewChild('directiveElement') + ref: ElementRef; +} +describe('NotificationGroupGrowingItemTitleDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [NotificationModule] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should assign class', () => { + expect(component.ref.nativeElement.className).toBe('fd-notification-group__growing-item-title'); + }); +}); diff --git a/libs/core/notification/directives/notification-group-growing-item-title.directive.ts b/libs/core/notification/directives/notification-group-growing-item-title.directive.ts new file mode 100644 index 00000000000..efc35bddb5e --- /dev/null +++ b/libs/core/notification/directives/notification-group-growing-item-title.directive.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[fdNotificationGroupGrowingItemTitle], [fd-notification-group-growing-item-title]', + standalone: true, + host: { + class: 'fd-notification-group__growing-item-title' + } +}) +export class NotificationGroupGrowingItemTitleDirective {} diff --git a/libs/core/notification/directives/notification-group-header-title.directive.spec.ts b/libs/core/notification/directives/notification-group-header-title.directive.spec.ts new file mode 100644 index 00000000000..72ab409f73a --- /dev/null +++ b/libs/core/notification/directives/notification-group-header-title.directive.spec.ts @@ -0,0 +1,44 @@ +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; + +@Component({ + template: `Notification Group Header Title Test ` +}) +class TestComponent { + @ViewChild('directiveElement') + ref: ElementRef; +} +describe('NotificationGroupHeaderTitleDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [NotificationModule] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should assign class', () => { + expect(component.ref.nativeElement.className).toBe('fd-notification-group__header-title'); + }); + + it('should assign default role', () => { + expect(component.ref.nativeElement.getAttribute('role')).toBe('heading'); + }); + + it('should assign default aria level', () => { + expect(component.ref.nativeElement.getAttribute('aria-level')).toBe('3'); + }); +}); diff --git a/libs/core/notification/directives/notification-group-header-title.directive.ts b/libs/core/notification/directives/notification-group-header-title.directive.ts new file mode 100644 index 00000000000..54e5f50f9ac --- /dev/null +++ b/libs/core/notification/directives/notification-group-header-title.directive.ts @@ -0,0 +1,35 @@ +import { Directive, input } from '@angular/core'; +import { FD_NOTIFICATION_GROUP_HEADER_TITLE } from '../token'; + +let notificationGroupHeaderTitleCounter = 0; + +@Directive({ + selector: '[fdNotificationGroupHeaderTitle], [fd-notification-group-header-title]', + standalone: true, + host: { + class: 'fd-notification-group__header-title', + role: 'heading', + '[attr.aria-level]': 'ariaLevel()', + '[attr.id]': 'id()' + }, + providers: [ + { + provide: FD_NOTIFICATION_GROUP_HEADER_TITLE, + useExisting: NotificationGroupHeaderTitleDirective + } + ] +}) +export class NotificationGroupHeaderTitleDirective { + /** + * aria-level for the title + * a numeric value from 1 to 6 + * default value is 3 + */ + ariaLevel = input<1 | 2 | 3 | 4 | 5 | 6>(3); + + /** + * id for the notification group header title + * if not set, a default value is provided + */ + id = input('fd-notification-group-header-title-' + ++notificationGroupHeaderTitleCounter); +} diff --git a/libs/core/notification/directives/notification-indicator.directive.spec.ts b/libs/core/notification/directives/notification-indicator.directive.spec.ts deleted file mode 100644 index 357012478d3..00000000000 --- a/libs/core/notification/directives/notification-indicator.directive.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { NotificationModule } from '../notification.module'; -import { IndicatorStates, NotificationIndicatorDirective } from './notification-indicator.directive'; - -@Component({ - template: `
` -}) -class TestComponent { - @ViewChild(NotificationIndicatorDirective, { static: true }) - directive: NotificationIndicatorDirective; - type: IndicatorStates; -} -describe('NotificationIndicatorDirective', () => { - let component: TestComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [TestComponent], - imports: [NotificationModule] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TestComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should assign class', () => { - component.directive.buildComponentCssClass(); - expect(component.directive.elementRef.nativeElement.className).toContain('fd-notification__indicator'); - }); - - it('should assign success class', () => { - component.type = 'success'; - component.directive.buildComponentCssClass(); - fixture.detectChanges(); - expect(component.directive.elementRef.nativeElement.classList).toContain('fd-notification__indicator--success'); - }); -}); diff --git a/libs/core/notification/directives/notification-indicator.directive.ts b/libs/core/notification/directives/notification-indicator.directive.ts deleted file mode 100644 index df4147f7a4a..00000000000 --- a/libs/core/notification/directives/notification-indicator.directive.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core'; -import { CssClassBuilder, applyCssClass } from '@fundamental-ngx/cdk/utils'; - -export type IndicatorStates = 'success' | 'error' | 'warning' | 'information'; - -@Directive({ - selector: '[fdNotificationIndicator], [fd-notification-indicator]', - standalone: true -}) -export class NotificationIndicatorDirective implements OnChanges, OnInit, CssClassBuilder { - /** Type of the indicator. Can be 'success' | 'error' | 'warning' | 'information' */ - @Input() - type: IndicatorStates; - - /** Apply user custom styles */ - @Input() - class: string; - - /** @hidden */ - constructor(public readonly elementRef: ElementRef) {} - - /** @hidden - * CssClassBuilder interface implementation - * function must return single string - * function is responsible for order which css classes are applied - */ - @applyCssClass - buildComponentCssClass(): string[] { - return ['fd-notification__indicator', this.type ? 'fd-notification__indicator--' + this.type : '', this.class]; - } - - /** @hidden */ - ngOnChanges(): void { - this.buildComponentCssClass(); - } - - /** @hidden */ - ngOnInit(): void { - this.buildComponentCssClass(); - } -} diff --git a/libs/core/notification/directives/notification-limit-description.directive.ts b/libs/core/notification/directives/notification-limit-description.directive.ts deleted file mode 100644 index 57e794ceb2f..00000000000 --- a/libs/core/notification/directives/notification-limit-description.directive.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Directive, HostBinding } from '@angular/core'; - -@Directive({ - selector: '[fdNotificationLimitDescription], [fd-notification-limit-description]', - standalone: true -}) -export class NotificationLimitDescriptionDirective { - /** @hidden */ - @HostBinding('class.fd-notification__limit--description') - fdNotificationDescriptionClass = true; -} diff --git a/libs/core/notification/directives/notification-limit-title.directive.ts b/libs/core/notification/directives/notification-limit-title.directive.ts deleted file mode 100644 index de28c55c922..00000000000 --- a/libs/core/notification/directives/notification-limit-title.directive.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Directive, HostBinding } from '@angular/core'; - -@Directive({ - selector: '[fdNotificationLimitTitle], [fd-notification-limit-title]', - standalone: true -}) -export class NotificationLimitTitleDirective { - /** @hidden */ - @HostBinding('class.fd-notification__limit--title') - fdNotificationTitleClass = true; -} diff --git a/libs/core/notification/directives/notification-list.directive.spec.ts b/libs/core/notification/directives/notification-list.directive.spec.ts new file mode 100644 index 00000000000..fcaab854831 --- /dev/null +++ b/libs/core/notification/directives/notification-list.directive.spec.ts @@ -0,0 +1,44 @@ +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; + +@Component({ + template: `
Notification List Test
` +}) +class TestComponent { + @ViewChild('directiveElement') + ref: ElementRef; +} +describe('NotificationListDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [NotificationModule] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should assign class', () => { + expect(component.ref.nativeElement.className).toBe('fd-notification-list'); + }); + + it('should assign default role', () => { + expect(component.ref.nativeElement.getAttribute('role')).toBe('list'); + }); + + it('should assign default aria lebel', () => { + expect(component.ref.nativeElement.getAttribute('aria-label')).toBe('Notifications'); + }); +}); diff --git a/libs/core/notification/directives/notification-list.directive.ts b/libs/core/notification/directives/notification-list.directive.ts new file mode 100644 index 00000000000..b5aba1bf45b --- /dev/null +++ b/libs/core/notification/directives/notification-list.directive.ts @@ -0,0 +1,18 @@ +import { Directive, input } from '@angular/core'; + +@Directive({ + selector: '[fdNotificationList], [fd-notification-list]', + standalone: true, + host: { + class: 'fd-notification-list', + role: 'list', + '[attr.aria-label]': 'ariaLabel()' + } +}) +export class NotificationListDirective { + /** + * aria-label attribute for the element + * Default is set to 'Notifications' + */ + ariaLabel = input('Notifications'); +} diff --git a/libs/core/notification/directives/notification-message-strip-container.directive.spec.ts b/libs/core/notification/directives/notification-message-strip-container.directive.spec.ts new file mode 100644 index 00000000000..daccf3f7fa5 --- /dev/null +++ b/libs/core/notification/directives/notification-message-strip-container.directive.spec.ts @@ -0,0 +1,36 @@ +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; + +@Component({ + template: `
Notification Message Strip Container Test
` +}) +class TestComponent { + @ViewChild('directiveElement') + ref: ElementRef; +} +describe('NotificationMessageStripContainerDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [NotificationModule] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should assign class', () => { + expect(component.ref.nativeElement.className).toBe('fd-notification__message-strip-container'); + }); +}); diff --git a/libs/core/notification/directives/notification-message-strip-container.directive.ts b/libs/core/notification/directives/notification-message-strip-container.directive.ts new file mode 100644 index 00000000000..ab0df21e410 --- /dev/null +++ b/libs/core/notification/directives/notification-message-strip-container.directive.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[fdNotificationMessageStripContainer], [fd-notification-message-strip-container]', + standalone: true, + host: { + class: 'fd-notification__message-strip-container' + } +}) +export class NotificationMessageStripContainerDirective {} diff --git a/libs/core/notification/directives/notification-limit-description.directive.spec.ts b/libs/core/notification/directives/notification-message-strip.directive.spec.ts similarity index 82% rename from libs/core/notification/directives/notification-limit-description.directive.spec.ts rename to libs/core/notification/directives/notification-message-strip.directive.spec.ts index 80ddf1f5405..d95722064c1 100644 --- a/libs/core/notification/directives/notification-limit-description.directive.spec.ts +++ b/libs/core/notification/directives/notification-message-strip.directive.spec.ts @@ -3,13 +3,13 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NotificationModule } from '../notification.module'; @Component({ - template: `

Notification Limit Description Test

` + template: `
Notification Message Strip Test
` }) class TestComponent { @ViewChild('directiveElement') ref: ElementRef; } -describe('NotificationLimitDescriptionDirective', () => { +describe('NotificationMessageStripDirective', () => { let component: TestComponent; let fixture: ComponentFixture; @@ -31,6 +31,6 @@ describe('NotificationLimitDescriptionDirective', () => { }); it('should assign class', () => { - expect(component.ref.nativeElement.className).toBe('fd-notification__limit--description'); + expect(component.ref.nativeElement.className).toBe('fd-notification-message-strip'); }); }); diff --git a/libs/core/notification/directives/notification-message-strip.directive.ts b/libs/core/notification/directives/notification-message-strip.directive.ts new file mode 100644 index 00000000000..617daa0e7ff --- /dev/null +++ b/libs/core/notification/directives/notification-message-strip.directive.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[fdNotificationMessageStrip], [fd-notification-message-strip]', + standalone: true, + host: { + class: 'fd-notification-message-strip' + } +}) +export class NotificationMessageStripDirective {} diff --git a/libs/core/notification/directives/notification-paragraph.directive.spec.ts b/libs/core/notification/directives/notification-paragraph.directive.spec.ts index a1c79d9cc69..a94622bae4f 100644 --- a/libs/core/notification/directives/notification-paragraph.directive.spec.ts +++ b/libs/core/notification/directives/notification-paragraph.directive.spec.ts @@ -33,4 +33,8 @@ describe('NotificationParagraphDirective', () => { it('should assign class', () => { expect(component.ref.nativeElement.className).toBe('fd-notification__paragraph'); }); + + it('should have a default id', () => { + expect(component.ref.nativeElement.getAttribute('id')).toBeTruthy(); + }); }); diff --git a/libs/core/notification/directives/notification-paragraph.directive.ts b/libs/core/notification/directives/notification-paragraph.directive.ts index 73e6fa130a4..443ef952164 100644 --- a/libs/core/notification/directives/notification-paragraph.directive.ts +++ b/libs/core/notification/directives/notification-paragraph.directive.ts @@ -1,11 +1,26 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive, input } from '@angular/core'; +import { FD_NOTIFICATION_PARAGRAPH } from '../token'; + +let notificationParagraphCounter = 0; @Directive({ selector: '[fdNotificationParagraph], [fd-notification-paragraph]', - standalone: true + standalone: true, + host: { + class: 'fd-notification__paragraph', + '[attr.id]': 'id()' + }, + providers: [ + { + provide: FD_NOTIFICATION_PARAGRAPH, + useExisting: NotificationParagraphDirective + } + ] }) export class NotificationParagraphDirective { - /** @hidden */ - @HostBinding('class.fd-notification__paragraph') - fdNotificationParagraphClass = true; + /** + * id for the notification paragraph + * if not set, a default value is provided + */ + id = input('fd-notification-paragraph-' + ++notificationParagraphCounter); } diff --git a/libs/core/notification/directives/notification-limit-title.directive.spec.ts b/libs/core/notification/directives/notification-popover.directive.spec.ts similarity index 83% rename from libs/core/notification/directives/notification-limit-title.directive.spec.ts rename to libs/core/notification/directives/notification-popover.directive.spec.ts index 93acfd27d94..0990650d704 100644 --- a/libs/core/notification/directives/notification-limit-title.directive.spec.ts +++ b/libs/core/notification/directives/notification-popover.directive.spec.ts @@ -3,13 +3,13 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NotificationModule } from '../notification.module'; @Component({ - template: `

Notification Limit Title Test

` + template: `
Notification Popover Test
` }) class TestComponent { @ViewChild('directiveElement') ref: ElementRef; } -describe('NotificationLimitTitleDirective', () => { +describe('NotificationPopoverDirective', () => { let component: TestComponent; let fixture: ComponentFixture; @@ -31,6 +31,6 @@ describe('NotificationLimitTitleDirective', () => { }); it('should assign class', () => { - expect(component.ref.nativeElement.className).toBe('fd-notification__limit--title'); + expect(component.ref.nativeElement.className).toBe('fd-notification-popover'); }); }); diff --git a/libs/core/notification/directives/notification-popover.directive.ts b/libs/core/notification/directives/notification-popover.directive.ts new file mode 100644 index 00000000000..1e6698c3c05 --- /dev/null +++ b/libs/core/notification/directives/notification-popover.directive.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[fdNotificationPopover], [fd-notification-popover]', + standalone: true, + host: { + class: 'fd-notification-popover' + } +}) +export class NotificationPopoverDirective {} diff --git a/libs/core/notification/directives/notification-separator.directive.ts b/libs/core/notification/directives/notification-separator.directive.ts index 4f1be025ee0..07fa0b33ef1 100644 --- a/libs/core/notification/directives/notification-separator.directive.ts +++ b/libs/core/notification/directives/notification-separator.directive.ts @@ -1,11 +1,10 @@ -import { Directive, HostBinding } from '@angular/core'; +import { Directive } from '@angular/core'; @Directive({ selector: '[fdNotificationSeparator], [fd-notification-separator]', - standalone: true + standalone: true, + host: { + class: 'fd-notification__separator' + } }) -export class NotificationSeparatorDirective { - /** @hidden */ - @HostBinding('class.fd-notification__separator') - fdNotificationSeparatorClass = true; -} +export class NotificationSeparatorDirective {} diff --git a/libs/core/notification/directives/notification-title.directive.spec.ts b/libs/core/notification/directives/notification-title.directive.spec.ts index 666022d5aea..99124c658b8 100644 --- a/libs/core/notification/directives/notification-title.directive.spec.ts +++ b/libs/core/notification/directives/notification-title.directive.spec.ts @@ -33,4 +33,8 @@ describe('NotificationTitleDirective', () => { it('should assign class', () => { expect(component.ref.nativeElement.className).toBe('fd-notification__title fd-notification__title--unread'); }); + + it('should have a default id', () => { + expect(component.ref.nativeElement.getAttribute('id')).toBeTruthy(); + }); }); diff --git a/libs/core/notification/directives/notification-title.directive.ts b/libs/core/notification/directives/notification-title.directive.ts index 402b675c214..c29d9969e40 100644 --- a/libs/core/notification/directives/notification-title.directive.ts +++ b/libs/core/notification/directives/notification-title.directive.ts @@ -1,16 +1,33 @@ -import { Directive, HostBinding, Input } from '@angular/core'; +import { Directive, input } from '@angular/core'; +import { FD_NOTIFICATION_TITLE } from '../token'; + +let notificationTitleCounter = 0; @Directive({ selector: '[fdNotificationTitle], [fd-notification-title]', - standalone: true + standalone: true, + host: { + class: 'fd-notification__title', + '[class.fd-notification__title--unread]': 'unread()', + '[attr.id]': 'id()' + }, + providers: [ + { + provide: FD_NOTIFICATION_TITLE, + useExisting: NotificationTitleDirective + } + ] }) export class NotificationTitleDirective { - /** @hidden */ - @HostBinding('class.fd-notification__title') - fdNotificationTitleClass = true; + /** + * Whether the notification title is unread. + * default is false + */ + unread = input(false); - /** Whether the title is unread. */ - @Input() - @HostBinding('class.fd-notification__title--unread') - unread = false; + /** + * id for the notification title + * if not set, a default value is provided + */ + id = input('fd-notification-title-' + ++notificationTitleCounter); } diff --git a/libs/core/notification/index.ts b/libs/core/notification/index.ts index 417383156c0..c1ca7193810 100644 --- a/libs/core/notification/index.ts +++ b/libs/core/notification/index.ts @@ -1,23 +1,39 @@ +// Directives export * from './directives/notification-footer-content.directive'; -export * from './directives/notification-indicator.directive'; -export * from './directives/notification-limit-description.directive'; -export * from './directives/notification-limit-title.directive'; +export * from './directives/notification-group-growing-item-title.directive'; +export * from './directives/notification-group-header-title.directive'; +export * from './directives/notification-list.directive'; +export * from './directives/notification-message-strip-container.directive'; +export * from './directives/notification-message-strip.directive'; export * from './directives/notification-paragraph.directive'; +export * from './directives/notification-popover.directive'; export * from './directives/notification-separator.directive'; export * from './directives/notification-title.directive'; + +// Components export * from './notification-actions/notification-actions.component'; export * from './notification-body/notification-body.component'; export * from './notification-content/notification-content.component'; export * from './notification-footer/notification-footer.component'; +export * from './notification-group-growing-item/notification-group-growing-item.component'; export * from './notification-group-header/notification-group-header.component'; export * from './notification-group-list/notification-group-list.component'; export * from './notification-group/notification-group.component'; export * from './notification-header/notification-header.component'; -export * from './notification-limit/notification-limit.component'; +export * from './notification-link/notification-link.component'; +export * from './notification/notification.component'; + +// Service export * from './notification-service/notification.service'; + +// Utils export * from './notification-utils/notification-config'; export * from './notification-utils/notification-container'; export * from './notification-utils/notification-group-base'; export * from './notification-utils/notification-ref'; + +// Module export * from './notification.module'; -export * from './notification/notification.component'; + +// Token +export * from './token'; diff --git a/libs/core/notification/notification-actions/notification-actions.component.ts b/libs/core/notification/notification-actions/notification-actions.component.ts index a2ebae5e162..611c7122fac 100644 --- a/libs/core/notification/notification-actions/notification-actions.component.ts +++ b/libs/core/notification/notification-actions/notification-actions.component.ts @@ -1,11 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - ContentChildren, - HostBinding, - QueryList, - ViewEncapsulation -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, ContentChildren, QueryList, ViewEncapsulation } from '@angular/core'; import { ButtonComponent, FD_BUTTON_COMPONENT } from '@fundamental-ngx/core/button'; @Component({ @@ -13,13 +6,12 @@ import { ButtonComponent, FD_BUTTON_COMPONENT } from '@fundamental-ngx/core/butt template: ``, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + host: { + class: 'fd-notification__actions' + } }) export class NotificationActionsComponent { - /** @hidden */ - @HostBinding('class.fd-notification__actions') - fdNotificationActionsClass = true; - /** @hidden */ @ContentChildren(FD_BUTTON_COMPONENT) buttons: QueryList; diff --git a/libs/core/notification/notification-body/notification-body.component.ts b/libs/core/notification/notification-body/notification-body.component.ts index 242da160972..7816fe451b4 100644 --- a/libs/core/notification/notification-body/notification-body.component.ts +++ b/libs/core/notification/notification-body/notification-body.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, HostBinding, ViewEncapsulation } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; import { NotificationGroupBaseDirective } from '../notification-utils/notification-group-base'; @Component({ @@ -6,10 +6,9 @@ import { NotificationGroupBaseDirective } from '../notification-utils/notificati template: ``, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + host: { + class: 'fd-notification__body' + } }) -export class NotificationBodyComponent extends NotificationGroupBaseDirective { - /** @hidden */ - @HostBinding('class.fd-notification__body') - fdNotificationBodyClass = true; -} +export class NotificationBodyComponent extends NotificationGroupBaseDirective {} diff --git a/libs/core/notification/notification-content/notification-content.component.ts b/libs/core/notification/notification-content/notification-content.component.ts index d69e0924a93..4b8e44f13ec 100644 --- a/libs/core/notification/notification-content/notification-content.component.ts +++ b/libs/core/notification/notification-content/notification-content.component.ts @@ -1,14 +1,13 @@ -import { ChangeDetectionStrategy, Component, HostBinding, ViewEncapsulation } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; @Component({ selector: 'fd-notification-content', template: ``, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + host: { + class: 'fd-notification__content' + } }) -export class NotificationContentComponent { - /** @hidden */ - @HostBinding('class.fd-notification__content') - fdNotificationFooterClass = true; -} +export class NotificationContentComponent {} diff --git a/libs/core/notification/notification-footer/notification-footer.component.ts b/libs/core/notification/notification-footer/notification-footer.component.ts index 3308ac8701b..17caf35bc37 100644 --- a/libs/core/notification/notification-footer/notification-footer.component.ts +++ b/libs/core/notification/notification-footer/notification-footer.component.ts @@ -1,14 +1,13 @@ -import { ChangeDetectionStrategy, Component, HostBinding, ViewEncapsulation } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; @Component({ selector: 'fd-notification-footer', template: ``, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + host: { + class: 'fd-notification__footer' + } }) -export class NotificationFooterComponent { - /** @hidden */ - @HostBinding('class.fd-notification__footer') - fdNotificationFooterClass = true; -} +export class NotificationFooterComponent {} diff --git a/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.spec.ts b/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.spec.ts new file mode 100644 index 00000000000..595345eb5b7 --- /dev/null +++ b/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.spec.ts @@ -0,0 +1,47 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; +import { By } from '@angular/platform-browser'; + +@Component({ + selector: 'fd-notification-group-growing-item-test', + template: ` Notification Group Growing Item Test ` +}) +class TestWrapperComponent {} + +describe('NotificationGroupGrowingItemComponent', () => { + let component: TestWrapperComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestWrapperComponent], + imports: [NotificationModule] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should apply proper class', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-growing-item')); + expect(attributeElement.nativeElement.classList.contains('fd-notification-group__growing-item')).toBe(true); + }); + + it('should apply proper role', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-growing-item')); + expect(attributeElement.nativeElement.getAttribute('role')).toBe('button'); + }); + + it('should have proper tabindex', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-growing-item')); + expect(attributeElement.nativeElement.getAttribute('tabindex')).toBe('0'); + }); +}); diff --git a/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.ts b/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.ts new file mode 100644 index 00000000000..86115e974c5 --- /dev/null +++ b/libs/core/notification/notification-group-growing-item/notification-group-growing-item.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'fd-notification-group-growing-item', + standalone: true, + template: ` `, + host: { + class: 'fd-notification-group__growing-item', + role: 'button', + '[tabindex]': '0' + } +}) +export class NotificationGroupGrowingItemComponent {} diff --git a/libs/core/notification/notification-group-header/notification-group-header.component.spec.ts b/libs/core/notification/notification-group-header/notification-group-header.component.spec.ts index 45cfb59c8d1..c10a406a71c 100644 --- a/libs/core/notification/notification-group-header/notification-group-header.component.spec.ts +++ b/libs/core/notification/notification-group-header/notification-group-header.component.spec.ts @@ -1,41 +1,33 @@ -import { Component, ElementRef, EventEmitter, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { IconComponent } from '@fundamental-ngx/core/icon'; +import { Component, viewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NotificationModule } from '../notification.module'; +import { By } from '@angular/platform-browser'; +import { NotificationGroupHeaderComponent } from './notification-group-header.component'; @Component({ - template: ` - - Notification Group Header - - ` + selector: 'fd-notification-group-header-test', + template: ` + Today + ` }) -class TestComponent { - @ViewChild('groupHeaderRef', { read: ElementRef }) - groupHeaderRef: ElementRef; - - expanded = false; - - expandedChange: EventEmitter = new EventEmitter(); +class TestWrapperComponent { + notificationGroupHeader = viewChild('notificationGroupHeader'); } describe('NotificationGroupHeaderComponent', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let button: ElementRef; - let buttonIcon: ElementRef; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [TestComponent], + let component: TestWrapperComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestWrapperComponent], imports: [NotificationModule] }).compileComponents(); - })); + }); beforeEach(() => { - fixture = TestBed.createComponent(TestComponent); - component = fixture.debugElement.componentInstance; + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.componentInstance; fixture.detectChanges(); }); @@ -43,19 +35,40 @@ describe('NotificationGroupHeaderComponent', () => { expect(component).toBeTruthy(); }); - it('should assign class', () => { - expect(component.groupHeaderRef.nativeElement.className).toContain('fd-notification__group-header'); + it('should apply proper class', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + expect(attributeElement.nativeElement.classList.contains('fd-notification-group__header')).toBe(true); }); - it('should change the icon when the button is clicked', () => { - button = fixture.debugElement.query(By.css('button')); - buttonIcon = fixture.debugElement.query(By.directive(IconComponent)); + it('should apply proper role', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + expect(attributeElement.nativeElement.getAttribute('role')).toBe('button'); + }); - expect(buttonIcon.nativeElement.classList).toContain('sap-icon--slim-arrow-right'); + it('should have proper tabindex', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + expect(attributeElement.nativeElement.getAttribute('tabindex')).toBe('0'); + }); - button.nativeElement.click(); - fixture.detectChanges(); + it('should have default title', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + expect(attributeElement.nativeElement.title).toBe('Expand/Collapse'); + }); + + it('should have expanded set to false by default', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + expect(attributeElement.nativeElement.getAttribute('aria-expanded')).toBe("false"); + }); - expect(buttonIcon.nativeElement.classList).toContain('sap-icon--slim-arrow-down'); + it('should have an arrow', () => { + const headerArrowElement = fixture.debugElement.query(By.css('.fd-notification-group__header-arrow')); + expect(headerArrowElement).toBeTruthy(); + }); + + it('should expand when toggleExpand method is called', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-header')); + component.notificationGroupHeader()?.toggleExpand(); + fixture.detectChanges(); + expect(attributeElement.nativeElement.getAttribute('aria-expanded')).toBe("true"); }); }); diff --git a/libs/core/notification/notification-group-header/notification-group-header.component.ts b/libs/core/notification/notification-group-header/notification-group-header.component.ts index 66d43fc5121..d5dbba00ac5 100644 --- a/libs/core/notification/notification-group-header/notification-group-header.component.ts +++ b/libs/core/notification/notification-group-header/notification-group-header.component.ts @@ -1,107 +1,85 @@ +import { ENTER, SPACE } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, Component, - EventEmitter, - HostBinding, - Input, - Output, + HostListener, ViewEncapsulation, computed, inject, + input, signal } from '@angular/core'; -import { Nullable, RtlService } from '@fundamental-ngx/cdk/utils'; +import { KeyUtil, Nullable, RtlService } from '@fundamental-ngx/cdk/utils'; import { ButtonComponent } from '@fundamental-ngx/core/button'; -import { - ContentDensityDirective, - ContentDensityMode, - LocalContentDensityMode -} from '@fundamental-ngx/core/content-density'; +import { ContentDensityDirective } from '@fundamental-ngx/core/content-density'; import { IconComponent } from '@fundamental-ngx/core/icon'; import { NotificationGroupBaseDirective } from '../notification-utils/notification-group-base'; +import { FD_NOTIFICATION_GROUP_HEADER } from '../token'; @Component({ selector: 'fd-notification-group-header', template: ` - -
- -
- + + `, + host: { + class: 'fd-notification-group__header', + role: 'button', + '[tabindex]': '0', + '[attr.title]': 'title()', + '[attr.aria-controls]': 'ariaControls()', + '[attr.aria-expanded]': 'expanded()', + '(click)': 'toggleExpand()' + }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [ButtonComponent, ContentDensityDirective, IconComponent] + imports: [ButtonComponent, ContentDensityDirective, IconComponent], + providers: [ + { + provide: FD_NOTIFICATION_GROUP_HEADER, + useExisting: NotificationGroupHeaderComponent + } + ] }) export class NotificationGroupHeaderComponent extends NotificationGroupBaseDirective { - /** @hidden */ - @HostBinding('class.fd-notification__group-header') - fdNotificationGroupHeaderClass = true; - - /** Whether the expand button is in compact mode */ - @Input() - expandCompact: boolean; - - /** aria-label of the expand button */ - @Input() - expandAriaLabel: Nullable; - - /** aria-labelledby of the expand button */ - @Input() - expandAriaLabelledBy: Nullable; - - /** Whether the button is in expanded state */ - @Input() - set expanded(value: boolean) { - this._expanded$.set(value); - } + /** + * Title for the group header + * default value: "Expand/Collapse" + */ + title = input('Expand/Collapse'); - get expanded(): boolean { - return this._expanded$(); - } - - /** Output event triggered when the Expand button is clicked */ - @Output() - expandedChange = new EventEmitter(); + /** + * id of the list element that the group header controls + * string value + */ + ariaControls = signal>(''); /** @hidden */ - get expandDescribedBy(): string { - return this.notificationHeader?.first?.uniqueId; - } + expanded = signal(false); /** @hidden */ readonly _buttonIcon$ = computed(() => - this._expanded$() ? 'slim-arrow-down' : this._rtlService?.rtlSignal() ? 'slim-arrow-left' : 'slim-arrow-right' + this.expanded() ? 'slim-arrow-down' : this._rtlService?.rtlSignal() ? 'slim-arrow-left' : 'slim-arrow-right' ); /** @hidden */ - readonly _expanded$ = signal(true); + private readonly _rtlService = inject(RtlService, { optional: true }); /** @hidden */ - get _expandButtonContentDensity(): LocalContentDensityMode { - return typeof this.expandCompact === 'undefined' ? 'global' : ContentDensityMode.COMPACT; + @HostListener('keydown', ['$event']) + keydownHandler(event: KeyboardEvent): void { + if (KeyUtil.isKeyCode(event, [ENTER, SPACE])) { + this.toggleExpand(); + event.preventDefault(); + } } - /** @hidden */ - private readonly _rtlService = inject(RtlService, { optional: true }); - /** Method that toggles the Notification list content */ toggleExpand(): void { - this._expanded$.update((expanded) => !expanded); - this.expandedChange.emit(this.expanded); + this.expanded.update((expanded) => !expanded); } } diff --git a/libs/core/notification/notification-group-list/notification-group-list.component.spec.ts b/libs/core/notification/notification-group-list/notification-group-list.component.spec.ts index a55c16dc23e..489fafc240d 100644 --- a/libs/core/notification/notification-group-list/notification-group-list.component.spec.ts +++ b/libs/core/notification/notification-group-list/notification-group-list.component.spec.ts @@ -1,51 +1,42 @@ -import { Component, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { NotificationGroupHeaderComponent } from '../notification-group-header/notification-group-header.component'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NotificationModule } from '../notification.module'; +import { By } from '@angular/platform-browser'; @Component({ - template: ` - - - - ` + selector: 'fd-notification-group-list-test', + template: ` Notification Group List Test ` }) -class TestComponent { - @ViewChild(NotificationGroupHeaderComponent) - notificationGroupHeader: NotificationGroupHeaderComponent; - - expanded = false; -} +class TestWrapperComponent {} describe('NotificationGroupListComponent', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let notificationGroupHeader; + let component: TestWrapperComponent; + let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [NotificationModule], - declarations: [TestComponent] + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestWrapperComponent], + imports: [NotificationModule] }).compileComponents(); - })); + }); beforeEach(() => { - fixture = TestBed.createComponent(TestComponent); + fixture = TestBed.createComponent(TestWrapperComponent); component = fixture.componentInstance; fixture.detectChanges(); - notificationGroupHeader = component.notificationGroupHeader; }); it('should create', () => { expect(component).toBeTruthy(); }); - it('should emit value properly', () => { - jest.spyOn(notificationGroupHeader.expandedChange, 'emit'); - const event: any = { target: { value: true } }; - notificationGroupHeader.toggleExpand(event); - fixture.detectChanges(); + it('should apply proper class', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-list')); + expect(attributeElement.nativeElement.classList.contains('fd-notification-group__list')).toBe(true); + }); - expect(notificationGroupHeader.expandedChange.emit).toHaveBeenCalledWith(event.target.value); + it('should apply proper role', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group-list')); + expect(attributeElement.nativeElement.getAttribute('role')).toBe('list'); }); }); diff --git a/libs/core/notification/notification-group-list/notification-group-list.component.ts b/libs/core/notification/notification-group-list/notification-group-list.component.ts index 389395d5cb6..85d67a62bc4 100644 --- a/libs/core/notification/notification-group-list/notification-group-list.component.ts +++ b/libs/core/notification/notification-group-list/notification-group-list.component.ts @@ -1,57 +1,59 @@ import { - AfterContentInit, + AfterViewInit, ChangeDetectionStrategy, - ChangeDetectorRef, Component, - ContentChild, - forwardRef, - OnDestroy, - ViewEncapsulation + ViewEncapsulation, + contentChildren, + input } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { NotificationGroupHeaderComponent } from '../notification-group-header/notification-group-header.component'; +import { NotificationComponent } from '../notification/notification.component'; +import { FD_NOTIFICATION, FD_NOTIFICATION_GROUP_LIST } from '../token'; + +let notificationGroupListCounter = 0; @Component({ selector: 'fd-notification-group-list', - template: ` - - @if (expanded) { - + template: ``, + host: { + class: 'fd-notification-group__list', + role: 'list', + '[attr.id]': 'id()' + }, + providers: [ + { + provide: FD_NOTIFICATION_GROUP_LIST, + useExisting: NotificationGroupListComponent } - `, + ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [] }) -export class NotificationGroupListComponent implements AfterContentInit, OnDestroy { - /** @hidden */ - @ContentChild(forwardRef(() => NotificationGroupHeaderComponent)) - groupHeader: NotificationGroupHeaderComponent; - - /** Whether the Notification list content is expanded */ - expanded: boolean; - - /** @hidden */ - private readonly _subscriptions = new Subscription(); +export class NotificationGroupListComponent implements AfterViewInit { + /** + * id of the element labelling the group list + */ + ariaLabelledBy = input(); - /** @hidden */ - constructor(private readonly _changeDetectorRef: ChangeDetectorRef) {} + /** + * id for the notification group list + * if not set, a default value is provided + */ + id = input('fd-notification-group-list-' + ++notificationGroupListCounter); - /** @hidden */ - ngAfterContentInit(): void { - this.expanded = this.groupHeader.expanded; - - this._subscriptions.add( - this.groupHeader.expandedChange.subscribe((value) => { - this.expanded = value; - this._changeDetectorRef.detectChanges(); - }) - ); - } + /** + * @hidden + */ + notifications = contentChildren(FD_NOTIFICATION); - /** @hidden */ - ngOnDestroy(): void { - this._subscriptions.unsubscribe(); + /** + * @hidden + */ + ngAfterViewInit(): void { + this.notifications()?.forEach((notification) => { + notification.role.set('listitem'); + notification.ariaLevel.set(2); + }); } } diff --git a/libs/core/notification/notification-group/notification-group.component.spec.ts b/libs/core/notification/notification-group/notification-group.component.spec.ts index 05b6065d693..7818662ebe4 100644 --- a/libs/core/notification/notification-group/notification-group.component.spec.ts +++ b/libs/core/notification/notification-group/notification-group.component.spec.ts @@ -1,31 +1,42 @@ -import { Component, ElementRef, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { Component, viewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NotificationModule } from '../notification.module'; +import { By } from '@angular/platform-browser'; +import { NotificationGroupComponent } from './notification-group.component'; +import { NotificationGroupListComponent } from '../notification-group-list/notification-group-list.component'; +import { NotificationGroupHeaderComponent } from '../notification-group-header/notification-group-header.component'; @Component({ - template: ` ` + selector: 'fd-notification-group-test', + template: ` + + Today + + + Notifications + + ` }) -class TestComponent { - @ViewChild('notificationGroupRef', { read: ElementRef }) - notificationGroupRef: ElementRef; - - mobile = false; +class TestWrapperComponent { + notificationGroup = viewChild('notificationGroup'); + notificationGroupList = viewChild('notificationGroupList'); + notificationGroupHeader = viewChild('notificationGroupHeader'); } describe('NotificationGroupComponent', () => { - let component: TestComponent; - let fixture: ComponentFixture; + let component: TestWrapperComponent; + let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [TestComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestWrapperComponent], imports: [NotificationModule] }).compileComponents(); - })); + }); beforeEach(() => { - fixture = TestBed.createComponent(TestComponent); - component = fixture.debugElement.componentInstance; + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.componentInstance; fixture.detectChanges(); }); @@ -33,15 +44,43 @@ describe('NotificationGroupComponent', () => { expect(component).toBeTruthy(); }); - it('should assign class', () => { - expect(component.notificationGroupRef.nativeElement.className).toContain( - 'fd-notification fd-notification--group fd-notification-custom-block' - ); + it('should apply proper class', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.classList.contains('fd-notification-group')).toBe(true); }); - it('should assign additional classes', () => { - component.mobile = true; - fixture.detectChanges(); - expect(component.notificationGroupRef.nativeElement.classList).toContain('fd-notification--mobile'); + it('should apply proper role', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('role')).toBe('listitem'); + }); + + it('should have proper tabindex', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('tabindex')).toBe('-1'); + }); + + it('should have proper aria-level', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('aria-level')).toBe('1'); + }); + + it('should apply aria-label as input', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('aria-label')).toBe('Notification Group Test Aria Label'); + }); + + it('should affect the aria-description when aria-expanded changes', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('aria-description')).toBe('Notification group expanded'); + }); + + it('should set aria-labelledby from fd-notification-group-header-title child element', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('aria-labelledby')).toBe('fd-notification-group-header-title-test-1'); + }); + + it('should set aria-controls of fd-notification-group-header', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-group')); + expect(attributeElement.nativeElement.getAttribute('aria-labelledby')).toBe('fd-notification-group-header-title-test-1'); }); }); diff --git a/libs/core/notification/notification-group/notification-group.component.ts b/libs/core/notification/notification-group/notification-group.component.ts index 83423a2d654..54e27dca2cf 100644 --- a/libs/core/notification/notification-group/notification-group.component.ts +++ b/libs/core/notification/notification-group/notification-group.component.ts @@ -1,68 +1,65 @@ -import { - ChangeDetectionStrategy, - Component, - ElementRef, - HostBinding, - Inject, - Input, - OnChanges, - OnInit, - Optional, - ViewEncapsulation -} from '@angular/core'; -import { CssClassBuilder, applyCssClass } from '@fundamental-ngx/cdk/utils'; -import { BasePopoverClass, FD_POPOVER_COMPONENT } from '@fundamental-ngx/core/popover'; +import { AfterViewInit, Component, computed, contentChild, input } from '@angular/core'; +import { NotificationGroupHeaderTitleDirective } from '../directives/notification-group-header-title.directive'; +import { NotificationGroupHeaderComponent } from '../notification-group-header/notification-group-header.component'; +import { NotificationGroupListComponent } from '../notification-group-list/notification-group-list.component'; +import { FD_NOTIFICATION_GROUP_HEADER, FD_NOTIFICATION_GROUP_HEADER_TITLE, FD_NOTIFICATION_GROUP_LIST } from '../token'; @Component({ selector: 'fd-notification-group', - template: ``, - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + template: `
+ + @if (isExpanded()) { + + + } +
`, + host: { + class: 'fd-notification-group', + role: 'listitem', + '[tabindex]': '-1', + '[attr.aria-level]': '1', + '[attr.aria-label]': 'ariaLabel()', + '[attr.aria-labelledby]': 'ariaLabelledBy()', + '[attr.aria-description]': 'ariaDescription()' + } }) -export class NotificationGroupComponent implements OnChanges, OnInit, CssClassBuilder { - /** User's custom classes */ - @Input() - class: string; +export class NotificationGroupComponent implements AfterViewInit { + /** + * Whether the group is expanded + * default value is false + */ + expanded = input(false); - /** Whether the Notification Group is in mobile mode */ - @Input() mobile = false; + /** + * input property to set aria-label + * accepts a string value + */ + ariaLabel = input(); - /** User defined width for the notification */ - @HostBinding('style.width') - @Input() - width: string; + /** @hidden */ + readonly ariaLabelledBy = computed(() => this.groupTitle()?.id()); /** @hidden */ - constructor( - public readonly elementRef: ElementRef, - @Optional() @Inject(FD_POPOVER_COMPONENT) private _popover: BasePopoverClass - ) { - if (this._popover) { - this._popover.focusTrapped = true; - this._popover.focusAutoCapture = true; - } - } + readonly ariaDescription = computed( + () => `Notification group ${this.groupHeader()?.expanded() ? 'expanded' : 'collapsed'}` + ); - /** @hidden CssClassBuilder interface implementation - * function is responsible for order which css classes are applied - */ - @applyCssClass - buildComponentCssClass(): string[] { - return [ - 'fd-notification fd-notification--group fd-notification-custom-block', - this.mobile ? 'fd-notification--mobile' : '', - this.class - ]; - } + /** @hidden */ + readonly isExpanded = computed(() => this.groupHeader()?.expanded()); /** @hidden */ - ngOnChanges(): void { - this.buildComponentCssClass(); - } + readonly groupHeader = contentChild(FD_NOTIFICATION_GROUP_HEADER); + + /** @hidden */ + readonly groupTitle = contentChild(FD_NOTIFICATION_GROUP_HEADER_TITLE); + + /** @hidden */ + readonly groupList = contentChild(FD_NOTIFICATION_GROUP_LIST); /** @hidden */ - ngOnInit(): void { - this.buildComponentCssClass(); + ngAfterViewInit(): void { + this.groupHeader()?.ariaControls.set(this.groupList()?.id()); + this.groupHeader()?.expanded.set(this.expanded()); } } diff --git a/libs/core/notification/notification-header/notification-header.component.ts b/libs/core/notification/notification-header/notification-header.component.ts index 2e874e65d94..f588783b996 100644 --- a/libs/core/notification/notification-header/notification-header.component.ts +++ b/libs/core/notification/notification-header/notification-header.component.ts @@ -1,20 +1,23 @@ -import { ChangeDetectionStrategy, Component, HostBinding, Input, ViewEncapsulation } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core'; let notificationHeaderCounter = 0; + @Component({ selector: 'fd-notification-header', - template: ``, + template: ` + `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true + standalone: true, + host: { + class: 'fd-notification__header', + '[attr.id]': 'uniqueId()' + } }) export class NotificationHeaderComponent { - /** @hidden */ - @HostBinding('class.fd-notification__header') - fdNotificationHeaderClass = true; - - /** Unique id for the notification header */ - @HostBinding('attr.id') - @Input() - uniqueId = `fd-notification-header-${++notificationHeaderCounter}`; + /** + * Unique id for the notification header + * if not set, a default value is provided + */ + uniqueId = input('fd-notification-header-' + ++notificationHeaderCounter); } diff --git a/libs/core/notification/notification-limit/notification-limit.component.spec.ts b/libs/core/notification/notification-limit/notification-limit.component.spec.ts deleted file mode 100644 index 4387e094bd6..00000000000 --- a/libs/core/notification/notification-limit/notification-limit.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { whenStable } from '@fundamental-ngx/core/tests'; -import { NotificationModule } from '../notification.module'; -import { NotificationLimitComponent } from './notification-limit.component'; - -describe('NotificationLimitComponent', () => { - let component: NotificationLimitComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [NotificationModule] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(NotificationLimitComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should apply proper css classes', async () => { - await whenStable(fixture); - - expect(fixture.nativeElement.classList.contains('fd-notification__limit')).toBe(true); - }); -}); diff --git a/libs/core/notification/notification-limit/notification-limit.component.ts b/libs/core/notification/notification-limit/notification-limit.component.ts deleted file mode 100644 index 37862b2547b..00000000000 --- a/libs/core/notification/notification-limit/notification-limit.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ChangeDetectionStrategy, Component, HostBinding, ViewEncapsulation } from '@angular/core'; - -@Component({ - selector: 'fd-notification-limit', - template: ``, - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true -}) -export class NotificationLimitComponent { - /** @hidden */ - @HostBinding('class.fd-notification__limit') - fdNotificationLimitClass = true; -} diff --git a/libs/core/notification/notification-link/notification-link.component.spec.ts b/libs/core/notification/notification-link/notification-link.component.spec.ts new file mode 100644 index 00000000000..e7b33e2b440 --- /dev/null +++ b/libs/core/notification/notification-link/notification-link.component.spec.ts @@ -0,0 +1,53 @@ +import { Component, viewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NotificationModule } from '../notification.module'; +import { By } from '@angular/platform-browser'; +import { NotificationLinkComponent } from './notification-link.component'; + +@Component({ + selector: 'fd-notification-link-test', + template: ` ` +}) +class TestWrapperComponent { + notificationLink = viewChild('notificationLink'); +} + +describe('NotificationLinkComponent', () => { + let component: TestWrapperComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestWrapperComponent], + imports: [NotificationModule] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should apply proper class', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-link')); + expect(attributeElement.nativeElement.classList.contains('fd-notification__link')).toBe(true); + }); + + it('should apply proper role', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-link')); + expect(attributeElement.nativeElement.getAttribute('role')).toBe('link'); + }); + + it('should change the inner text when toggleShowMore method is called', () => { + const attributeElement = fixture.debugElement.query(By.css('fd-notification-link')); + expect(attributeElement.nativeElement.innerHTML).toEqual('More'); + component.notificationLink()?.toggleShowMore(); + fixture.detectChanges(); + expect(attributeElement.nativeElement.innerHTML).toEqual('Less'); + }); +}); diff --git a/libs/core/notification/notification-link/notification-link.component.ts b/libs/core/notification/notification-link/notification-link.component.ts new file mode 100644 index 00000000000..44a9e047f4b --- /dev/null +++ b/libs/core/notification/notification-link/notification-link.component.ts @@ -0,0 +1,27 @@ +import { Component, signal } from '@angular/core'; + +@Component({ + selector: 'fd-notification-link', + standalone: true, + template: `{{ showMore() ? 'Less' : 'More' }}`, + host: { + class: 'fd-link fd-notification__link', + tabindex: '0', + role: 'link', + '(click)': 'toggleShowMore()' + } +}) +export class NotificationLinkComponent { + /** + * signal to control the show more/less + * default value is false + */ + showMore = signal(false); + + /** + * Method to toggle show more functionality + */ + toggleShowMore(): void { + this.showMore.update((value) => !value); + } +} diff --git a/libs/core/notification/notification-utils/notification-config.ts b/libs/core/notification/notification-utils/notification-config.ts index 3f88160d58c..eeaf8e6a332 100644 --- a/libs/core/notification/notification-utils/notification-config.ts +++ b/libs/core/notification/notification-utils/notification-config.ts @@ -25,9 +25,6 @@ export class NotificationConfig { /** Custom width of the notification. */ width?: string; - /** Whether the notification is in mobile mode. */ - mobile?: boolean; - /** * Whether the notification should trap focus within itself. * @default true diff --git a/libs/core/notification/notification-utils/notification-container.ts b/libs/core/notification/notification-utils/notification-container.ts index c211117f2b6..aff9e4a6440 100644 --- a/libs/core/notification/notification-utils/notification-container.ts +++ b/libs/core/notification/notification-utils/notification-container.ts @@ -11,13 +11,13 @@ import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/ flex-direction: column; z-index: 5000; align-items: flex-end; - top: 4.75rem; + top: 2rem; right: 2rem; } ` ], host: { - '[class.fd-notification-container]': 'true' + class: 'fd-notification-container' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/libs/core/notification/notification-utils/notification-group-base.ts b/libs/core/notification/notification-utils/notification-group-base.ts index 3aff71497bd..8aceda41300 100644 --- a/libs/core/notification/notification-utils/notification-group-base.ts +++ b/libs/core/notification/notification-utils/notification-group-base.ts @@ -53,7 +53,7 @@ export abstract class NotificationGroupBaseDirective implements AfterViewInit { .filter((b) => !b.hasAttribute('aria-describedby')) .forEach((b) => { // setting aria-describedby on each button with an id of related header - this._renderer.setAttribute(b, 'aria-describedby', firstHeader.uniqueId); + this._renderer.setAttribute(b, 'aria-describedby', firstHeader.uniqueId()); }); }); }); diff --git a/libs/core/notification/notification.module.ts b/libs/core/notification/notification.module.ts index 69add04a3fd..7a0d6b88132 100644 --- a/libs/core/notification/notification.module.ts +++ b/libs/core/notification/notification.module.ts @@ -1,44 +1,58 @@ import { NgModule } from '@angular/core'; import { DynamicComponentService } from '@fundamental-ngx/cdk/utils'; + +// Directives import { NotificationFooterContentDirective } from './directives/notification-footer-content.directive'; -import { NotificationIndicatorDirective } from './directives/notification-indicator.directive'; -import { NotificationLimitDescriptionDirective } from './directives/notification-limit-description.directive'; -import { NotificationLimitTitleDirective } from './directives/notification-limit-title.directive'; +import { NotificationGroupGrowingItemTitleDirective } from './directives/notification-group-growing-item-title.directive'; +import { NotificationGroupHeaderTitleDirective } from './directives/notification-group-header-title.directive'; +import { NotificationListDirective } from './directives/notification-list.directive'; +import { NotificationMessageStripContainerDirective } from './directives/notification-message-strip-container.directive'; +import { NotificationMessageStripDirective } from './directives/notification-message-strip.directive'; import { NotificationParagraphDirective } from './directives/notification-paragraph.directive'; +import { NotificationPopoverDirective } from './directives/notification-popover.directive'; import { NotificationSeparatorDirective } from './directives/notification-separator.directive'; import { NotificationTitleDirective } from './directives/notification-title.directive'; + +// Components import { NotificationActionsComponent } from './notification-actions/notification-actions.component'; import { NotificationBodyComponent } from './notification-body/notification-body.component'; import { NotificationContentComponent } from './notification-content/notification-content.component'; import { NotificationFooterComponent } from './notification-footer/notification-footer.component'; +import { NotificationGroupGrowingItemComponent } from './notification-group-growing-item/notification-group-growing-item.component'; import { NotificationGroupHeaderComponent } from './notification-group-header/notification-group-header.component'; import { NotificationGroupListComponent } from './notification-group-list/notification-group-list.component'; import { NotificationGroupComponent } from './notification-group/notification-group.component'; import { NotificationHeaderComponent } from './notification-header/notification-header.component'; -import { NotificationLimitComponent } from './notification-limit/notification-limit.component'; +import { NotificationLinkComponent } from './notification-link/notification-link.component'; +import { NotificationComponent } from './notification/notification.component'; + +// Utils import { NotificationService } from './notification-service/notification.service'; import { NotificationContainer } from './notification-utils/notification-container'; -import { NotificationComponent } from './notification/notification.component'; const components = [ NotificationComponent, + NotificationContainer, + NotificationLinkComponent, + NotificationBodyComponent, + NotificationGroupComponent, NotificationHeaderComponent, NotificationFooterComponent, - NotificationBodyComponent, - NotificationContainer, NotificationActionsComponent, NotificationContentComponent, - NotificationLimitComponent, - NotificationGroupHeaderComponent, - NotificationGroupComponent, NotificationGroupListComponent, + NotificationGroupHeaderComponent, + NotificationGroupGrowingItemComponent, + NotificationListDirective, NotificationTitleDirective, - NotificationIndicatorDirective, + NotificationPopoverDirective, + NotificationSeparatorDirective, NotificationParagraphDirective, + NotificationMessageStripDirective, NotificationFooterContentDirective, - NotificationSeparatorDirective, - NotificationLimitTitleDirective, - NotificationLimitDescriptionDirective + NotificationGroupHeaderTitleDirective, + NotificationMessageStripContainerDirective, + NotificationGroupGrowingItemTitleDirective ]; @NgModule({ diff --git a/libs/core/notification/notification/notification.component.scss b/libs/core/notification/notification/notification.component.scss index 920a55bfbee..93dc39e25a0 100644 --- a/libs/core/notification/notification/notification.component.scss +++ b/libs/core/notification/notification/notification.component.scss @@ -1,5 +1,17 @@ +@import 'fundamental-styles/dist/link'; @import 'fundamental-styles/dist/notification'; -.fd-notification-custom-block { - display: block; +.fd-notification { + display: flex; +} + +.fd-notification-message-strip:has(.fd-has-display-none) { + padding-block: 0; + padding-inline: 0; +} + +.fd-notification-container { + .fd-notification { + margin-block-end: 0.5rem; + } } diff --git a/libs/core/notification/notification/notification.component.ts b/libs/core/notification/notification/notification.component.ts index e14ad288fc2..c99a13462f2 100644 --- a/libs/core/notification/notification/notification.component.ts +++ b/libs/core/notification/notification/notification.component.ts @@ -10,28 +10,29 @@ import { ComponentRef, DestroyRef, EmbeddedViewRef, - HostBinding, HostListener, - Inject, - Input, OnInit, - Optional, TemplateRef, Type, - ViewChild, ViewContainerRef, ViewEncapsulation, computed, - inject + contentChild, + inject, + input, + signal, + viewChild } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { NavigationStart, Router } from '@angular/router'; import { AbstractFdNgxClass, KeyUtil, Nullable, RtlService } from '@fundamental-ngx/cdk/utils'; -import { FD_POPOVER_COMPONENT, PopoverComponent } from '@fundamental-ngx/core/popover'; import { BehaviorSubject } from 'rxjs'; import { filter, take } from 'rxjs/operators'; +import { NotificationParagraphDirective } from '../directives/notification-paragraph.directive'; +import { NotificationTitleDirective } from '../directives/notification-title.directive'; import { NotificationConfig } from '../notification-utils/notification-config'; import { NotificationRef } from '../notification-utils/notification-ref'; +import { FD_NOTIFICATION, FD_NOTIFICATION_PARAGRAPH, FD_NOTIFICATION_TITLE } from '../token'; @Component({ selector: 'fd-notification', @@ -42,36 +43,60 @@ import { NotificationRef } from '../notification-utils/notification-ref'; styleUrl: './notification.component.scss', encapsulation: ViewEncapsulation.None, host: { - '[attr.aria-labelledby]': 'ariaLabelledBy', + '[attr.aria-labelledby]': 'ariaLabelledBy()', '[attr.aria-label]': 'ariaLabel', + '[attr.aria-level]': 'ariaLevel()', + '[attr.role]': 'role()', '[attr.dir]': '_dir$()', - role: 'alertdialog', - '[attr.id]': 'id' + '[attr.id]': 'id', + '[tabindex]': '0', + '[style.width]': 'width' }, + providers: [ + { + provide: FD_NOTIFICATION, + useExisting: NotificationComponent + } + ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true }) export class NotificationComponent extends AbstractFdNgxClass implements OnInit, AfterViewInit { /** @hidden */ - @ViewChild('vc', { read: ViewContainerRef }) - containerRef: ViewContainerRef; + containerRef = viewChild('vc', { read: ViewContainerRef }); /** User defined width for the notification */ - @HostBinding('style.width') - @Input() - width: string; + width = input>(); /** Whether the notificatioon is in mobile mode */ - @Input() mobile: boolean; + mobile = input(false); - /** - * @hidden - */ + /** @hidden */ _dir$ = computed(() => (this._rtlService?.rtlSignal() ? 'rtl' : 'ltr')); /** ID of the notification */ id: string; + /** + * aria-level of the Notificaion + * should be set to 2 in Notification Group + * default value is undefined + */ + ariaLevel = signal>(undefined); + + /** + * role of the Notificaion + * should be set to 'listitem' in Notification Group + * default value is undefined + */ + role = signal>(undefined); + + /** + * whether the Notificaion is selected + * default is set to false + */ + selected = input(false); + /** Whether the notification is dismissed with the ESC key */ escKeyCloseable = false; @@ -79,7 +104,7 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, closeOnNavigation = true; /** aria-labelledby attribute for the notification component element. */ - ariaLabelledBy: Nullable; + ariaLabelledBy = signal>(null); /** aria-label attribute for the notification component element. */ ariaLabel: Nullable; @@ -91,7 +116,13 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, childContent: TemplateRef | Type | undefined = undefined; /** Reference to the component or the embedded view */ - public componentRef: ComponentRef | EmbeddedViewRef; + public componentRef: ComponentRef | EmbeddedViewRef | undefined; + + /** @hidden */ + private _notificationTitle = contentChild(FD_NOTIFICATION_TITLE); + + /** @hidden */ + private _notificationParagraph = contentChild(FD_NOTIFICATION_PARAGRAPH); /** @hidden */ private readonly _destroyRef = inject(DestroyRef); @@ -103,25 +134,32 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, private _focusTrap: FocusTrap; /** @hidden */ - @HostBinding('class.fd-notification--in-dialog') - get _inDialog(): boolean { - return this._popover?.mobile; - } + private _cdRef = inject(ChangeDetectorRef); /** @hidden */ - constructor( - private _componentFactoryResolver: ComponentFactoryResolver, - private _cdRef: ChangeDetectorRef, - private _router: Router, - private _focusTrapFactory: ConfigurableFocusTrapFactory, - @Optional() private _notificationConfig: NotificationConfig, - @Optional() private _notificationRef: NotificationRef, - @Optional() private _rtlService: RtlService, - @Optional() @Inject(FD_POPOVER_COMPONENT) private _popover: PopoverComponent - ) { - super(); + private _componentFactoryResolver = inject(ComponentFactoryResolver); + + /** @hidden */ + private _router = inject(Router); + + /** @hidden */ + private _focusTrapFactory = inject(ConfigurableFocusTrapFactory); + + /** @hidden */ + private _notificationConfig = inject(NotificationConfig, { optional: true }); + + /** @hidden */ + private _notificationRef = inject(NotificationRef, { optional: true }); - this._setNotificationConfig(this._notificationConfig); + /** @hidden */ + private _rtlService = inject(RtlService, { optional: true }); + + /** @hidden */ + constructor() { + super(); + if (this._notificationConfig) { + this._setNotificationConfig(this._notificationConfig); + } } /** @hidden Listen and close notification on Escape key */ @@ -149,6 +187,12 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, this._loadFromTemplate(this.childContent); } } + + if (this._notificationTitle()) { + this.ariaLabelledBy.set(this._notificationTitle()?.id()); + } else if (this._notificationParagraph()) { + this.ariaLabelledBy.set(this._notificationParagraph()?.id()); + } this._afterViewInit$.next(true); this._cdRef.detectChanges(); } @@ -170,10 +214,6 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, /** @hidden */ _setProperties(): void { this._addClassToElement('fd-notification'); - this._addClassToElement('fd-notification-custom-block'); - if (this.mobile) { - this._addClassToElement('fd-notification--mobile'); - } } /** @hidden Listen on NavigationStart event and dismiss the dialog */ @@ -184,24 +224,24 @@ export class NotificationComponent extends AbstractFdNgxClass implements OnInit, filter((event) => event instanceof NavigationStart && this.closeOnNavigation), takeUntilDestroyed(this._destroyRef) ) - .subscribe(() => this._notificationRef.dismiss()); + .subscribe(() => this._notificationRef?.dismiss()); } } /** @hidden */ private _loadFromComponent(content: Type): void { - this.containerRef.clear(); + this.containerRef()?.clear(); const componentFactory = this._componentFactoryResolver.resolveComponentFactory(content); - this.componentRef = this.containerRef.createComponent(componentFactory); + this.componentRef = this.containerRef()?.createComponent(componentFactory); } /** @hidden */ private _loadFromTemplate(content: TemplateRef): void { - this.containerRef.clear(); + this.containerRef()?.clear(); const context = { $implicit: this._notificationRef }; - this.componentRef = this.containerRef.createEmbeddedView(content, context); + this.componentRef = this.containerRef()?.createEmbeddedView(content, context); } /** @hidden */ diff --git a/libs/core/notification/token.ts b/libs/core/notification/token.ts new file mode 100644 index 00000000000..fad9ac7d204 --- /dev/null +++ b/libs/core/notification/token.ts @@ -0,0 +1,8 @@ +import { InjectionToken } from '@angular/core'; + +export const FD_NOTIFICATION = new InjectionToken('FdNotificationComponent'); +export const FD_NOTIFICATION_TITLE = new InjectionToken('FdNotificationTitleDirective'); +export const FD_NOTIFICATION_PARAGRAPH = new InjectionToken('FdNotificationParagraphDirective'); +export const FD_NOTIFICATION_GROUP_HEADER = new InjectionToken('FdNotificationGroupHeaderComponent'); +export const FD_NOTIFICATION_GROUP_HEADER_TITLE = new InjectionToken('FdNotificationGroupHeaderTitleDirective'); +export const FD_NOTIFICATION_GROUP_LIST = new InjectionToken('FdNotificationGroupListComponent'); diff --git a/libs/docs/core/notification/e2e/notification.e2e-spec.ts b/libs/docs/core/notification/e2e/notification.e2e-spec.ts deleted file mode 100644 index 2d05b8b0f25..00000000000 --- a/libs/docs/core/notification/e2e/notification.e2e-spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { - click, - getElementClass, - getText, - isElementDisplayed, - refreshPage, - scrollIntoView, - waitForElDisplayed, - waitForNotDisplayed, - waitForPresent -} from '../../../../../e2e'; -import { NotificationPo } from './notification.po'; - -describe('Notification component test', () => { - const notificationPage = new NotificationPo(); - const { - defaultExample, - openTemplateExample, - asContentExample, - groupExample, - button, - closeButton, - rejectButton, - approveButton, - tabsItem, - notificationBody, - notificationIndicator, - messageStrip, - result, - avatar, - notificationContainer, - cdkOverlay, - notification, - tabPanel, - notificationHeader, - overflowButton, - messageToast, - forwardButton - } = notificationPage; - - beforeEach(async () => { - await notificationPage.open(); - }, 1); - - afterEach(async () => { - await refreshPage(); - await notificationPage.waitForRoot(); - await waitForElDisplayed(notificationPage.title); - }, 2); - - it('should check notification with avatar, success indicator and unread title', async () => { - await expect(await isElementDisplayed(defaultExample + avatar)).toBe(true, `avatar does not exist`); - await expect(await isElementDisplayed(defaultExample + notificationIndicator + '--success')).toBe( - true, - `no success indicator` - ); - }); - - it('should check Notification with error indicator and no avatar', async () => { - await expect(await isElementDisplayed(defaultExample + notificationIndicator + '--error')).toBe( - true, - `no error indicator` - ); - }); - - it('should check notification with message strip, unread title and custom width', async () => { - await expect(await isElementDisplayed(defaultExample + messageStrip)).toBe( - true, - `message strip is not displayed` - ); - await click(defaultExample + messageStrip + button); - await expect(await isElementDisplayed(defaultExample + messageStrip)).toBe( - false, - `message strip is not hidden` - ); - }); - - it('should check notification in Component as content example', async () => { - await click(asContentExample + button); - await expect(await isElementDisplayed(notificationContainer)).toBe(true, `notification is not opened`); - await expect(await getElementClass(notificationContainer + messageStrip)).toContain('success'); - await click(notificationContainer + button); - await expect(await getText(asContentExample + result)).toContain('Open Button Clicked'); - await click(asContentExample + button); - await click(notificationContainer + closeButton); - await expect(await getText(asContentExample + result)).toContain('Close Button Click'); - }); - - it('should check template as content example', async () => { - await click(openTemplateExample + button); - await expect(await isElementDisplayed(notificationContainer)).toBe(true, `notification is not opened`); - await waitForNotDisplayed(notificationContainer, 0, 10000); - await expect(await getText(openTemplateExample + result)).toContain('dismissed'); - await click(openTemplateExample + button); - await click(notificationContainer + button); - await expect(await getText(openTemplateExample + result)).toContain('Open Button Clicked'); - await click(openTemplateExample + button); - await click(notificationContainer + closeButton); - await expect(await getText(openTemplateExample + result)).toContain('Close Button Click'); - }); - - it('should check approve actions with notification', async () => { - for (let i = 0; i < 2; i++) { - await checkActions('Approve', approveButton, i); - } - }); - - it('should check reject actions with notification', async () => { - for (let i = 0; i < 2; i++) { - await checkActions('Reject', rejectButton, i); - } - }); - - it('should check forward actions with notification', async () => { - for (let i = 0; i < 2; i++) { - await checkActions('Forward', forwardButton, i); - } - }); - - it('should check RTL and LTR orientation', async () => { - await notificationPage.checkRtlSwitch(); - }); - - async function checkActions(action: string, buttonChoice: string, index: number): Promise { - await scrollIntoView(defaultExample + overflowButton, index); - await click(defaultExample + overflowButton, index); - await click(buttonChoice); - await expect(await waitForPresent(messageToast)).toBe(true); - await expect(await getText(messageToast)).toBe(`${action} action performed`); - } -}); diff --git a/libs/docs/core/notification/e2e/notification.po.ts b/libs/docs/core/notification/e2e/notification.po.ts deleted file mode 100644 index faa8e031ab9..00000000000 --- a/libs/docs/core/notification/e2e/notification.po.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CoreBaseComponentPo, waitForElDisplayed } from '../../../../../e2e'; - -export class NotificationPo extends CoreBaseComponentPo { - private url = '/notification'; - - defaultExample = 'fd-notification-options-example '; - openTemplateExample = 'fd-notification-open-template-example '; - asContentExample = 'fd-notification-component-as-content-example '; - groupExample = 'fd-notification-group-example '; - cdkOverlay = '.cdk-overlay-container '; - - notificationContainer = '.fd-notification-container '; - notification = '.fd-notification '; - button = '.fd-button'; - openButton = this.button + '[label="Open"]'; - closeButton = this.button + '[glyph="decline"]'; - - actionSheetItem = '.fd-action-sheet__item'; - - approveButton = this.actionSheetItem + '[label="Approve"]'; - rejectButton = this.actionSheetItem + '[label="Reject"]'; - forwardButton = this.actionSheetItem + '[label="Forward"]'; - cancelButton = this.actionSheetItem + '[label="Cancel"]'; - overflowButton = this.button + '[glyph="overflow"]'; - - tabPanel = '.fd-tabs__panel'; - tabsItem = '.fd-tabs__item'; - notificationHeader = '.fd-notification__group-header '; - notificationBody = '.fd-notification__body '; - result = 'span:nth-child(2)'; - notificationActions = '.fd-notification__actions '; - messageStrip = '.fd-message-strip '; - notificationIndicator = this.notificationBody + '.fd-notification__indicator'; - avatar = this.notificationBody + '.fd-avatar'; - messageToast = '.fd-message-toast'; - - async open(): Promise { - await super.open(this.url); - await this.waitForRoot(); - await waitForElDisplayed(this.title); - } -} diff --git a/libs/docs/core/notification/e2e/tsconfig.json b/libs/docs/core/notification/e2e/tsconfig.json deleted file mode 100644 index 2d345834a6d..00000000000 --- a/libs/docs/core/notification/e2e/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../../../../e2e/tsconfig.json", - "include": ["./**/*.e2e-spec.ts"] -} diff --git a/libs/docs/core/notification/examples/component-as-content/notification-component-as-content-example.component.ts b/libs/docs/core/notification/examples/component-as-content/notification-component-as-content-example.component.ts index 3506597f3d7..26e3419011e 100644 --- a/libs/docs/core/notification/examples/component-as-content/notification-component-as-content-example.component.ts +++ b/libs/docs/core/notification/examples/component-as-content/notification-component-as-content-example.component.ts @@ -28,8 +28,7 @@ export class NotificationComponentAsContentExampleComponent { title: 'Notification Title', paragraph: 'Notification Description', firstFooterContent: 'SAP Analytics Cloud', - secondFooterContent: 'Just Now', - open: 'Open' + secondFooterContent: 'Just Now' }, width: '500px' }); diff --git a/libs/docs/core/notification/examples/component-as-content/notification-content.component.html b/libs/docs/core/notification/examples/component-as-content/notification-content.component.html index 4d8497f577d..505bd8f61cd 100644 --- a/libs/docs/core/notification/examples/component-as-content/notification-content.component.html +++ b/libs/docs/core/notification/examples/component-as-content/notification-content.component.html @@ -1,10 +1,12 @@ - A success message strip. +
+ A success message strip. +
-

+

{{ notificationRef.data.title }} -

+

{{ notificationRef.data.paragraph }} @@ -20,11 +22,6 @@

- - - - +
+ +

Notifications(30)

+ + + + +
+
+ A dismissible warning message strip. +
+
    + + + Today + - - -

    New Messages (2)

    -
    - - @if (expandedByDate) { - - } - - -
    - - -

    There are 30 more notifications

    -

    - You need to close or take action on the listed notifications to display more. -

    -
    + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    - - + + More + +
    + + + + Yesterday + - - -
    -

    Today (2)

    -
    - - @if (expandedByType1) { - - } - - -
    - + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    + + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    - - - -
    -

    Today (2)

    -
    - - @if (expandedByType2) { - - } - - -
    - -
    - - - - - -

    Orders waiting for approval (3)

    -
    - - - -
    - -
    -
    - -
    + +
+
- - @for (notification of notifications; track notification) { - - - - -
-

- {{ notification.title }} -

-
-

- {{ notification.paragraph }} -

- - {{ notification.footerContent1 }} - - {{ notification.footerContent2 }} - -
- - - - -
- } -
- - @for (notification of notificationsWarning; track notification) { - - - - -
-

- {{ notification.title }} -

-
-

- {{ notification.paragraph }} -

- - {{ notification.footerContent1 }} - - {{ notification.footerContent2 }} - -
- - - - -
- } -
diff --git a/libs/docs/core/notification/examples/notification-group/notification-group-example.component.ts b/libs/docs/core/notification/examples/notification-group/notification-group-example.component.ts index c7d39460e3e..bd1f4ccaee8 100644 --- a/libs/docs/core/notification/examples/notification-group/notification-group-example.component.ts +++ b/libs/docs/core/notification/examples/notification-group/notification-group-example.component.ts @@ -3,13 +3,16 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { AvatarComponent } from '@fundamental-ngx/core/avatar'; import { ButtonComponent } from '@fundamental-ngx/core/button'; -import { IndicatorStates, NotificationModule } from '@fundamental-ngx/core/notification'; +import { IconComponent } from '@fundamental-ngx/core/icon'; +import { MessageStripModule } from '@fundamental-ngx/core/message-strip'; +import { NotificationModule } from '@fundamental-ngx/core/notification'; +import { ObjectStatusComponent } from '@fundamental-ngx/core/object-status'; import { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover'; +import { ToolbarModule } from '@fundamental-ngx/core/toolbar'; import { FDP_ICON_TAB_BAR } from '@fundamental-ngx/platform/icon-tab-bar'; export type Notification = { avatar: string; - indicator: IndicatorStates; title: string; unread: boolean; paragraph: string; @@ -31,7 +34,11 @@ export type Notification = { NotificationModule, FDP_ICON_TAB_BAR, NgTemplateOutlet, - AvatarComponent + AvatarComponent, + MessageStripModule, + ToolbarModule, + ObjectStatusComponent, + IconComponent ] }) export class NotificationGroupExampleComponent { @@ -43,7 +50,6 @@ export class NotificationGroupExampleComponent { notifications: Notification[] = [ { avatar: 'batch-payments', - indicator: 'success', title: 'Your leave request has been accepted', unread: false, paragraph: @@ -54,7 +60,6 @@ export class NotificationGroupExampleComponent { }, { avatar: 'customer', - indicator: 'success', title: 'Your leave request has been accepted', unread: true, paragraph: @@ -68,7 +73,6 @@ export class NotificationGroupExampleComponent { notificationsWarning: Notification[] = [ { avatar: 'work-history', - indicator: 'warning', title: 'Approve order #1234', unread: true, paragraph: 'Adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', @@ -78,7 +82,6 @@ export class NotificationGroupExampleComponent { }, { avatar: 'sap-box', - indicator: 'warning', title: 'Approve order #5678', unread: true, paragraph: 'Consectetur adipiscing elit tempor incididunt ut labore et dolore magna aliqua.', diff --git a/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.html b/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.html deleted file mode 100644 index 90c684d58c1..00000000000 --- a/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.html +++ /dev/null @@ -1,261 +0,0 @@ -

Notification In Popover Dialog

- - - - - - - -
-

Your leave request has been accepted

-
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut - labore et dolore magna aliqua. -

- - Author name - - Timestamp - -
- - - - - - -
  • -
  • -
  • -
  • -
    -
    -
    -
    -
    - - - - -
    -

    Your leave request has been accepted

    -
    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut - labore et dolore magna aliqua. -

    - - Author name - - Timestamp - -
    - - - - - - -
  • -
  • -
  • -
  • -
    -
    -
    -
    -
    -
    -
    -

    Notification Group In Popover Dialog

    - - - - - - - - - -

    New Messages (2)

    -
    - - @if (expandedByDate) { - - } - - -
    - - -

    There are 30 more notifications

    -

    - You need to close or take action on the listed notifications to display more. -

    -
    -
    -
    - - - - -
    -

    Today (2)

    -
    - - @if (expandedByType1) { - - } - - -
    - -
    - - - -
    -

    Today (2)

    -
    - - @if (expandedByType2) { - - } - - -
    - -
    -
    - - - - -

    Orders waiting for approval (3)

    -
    - - - -
    - -
    -
    -
    -
    -
    -
    - - @for (notification of notifications; track notification) { - - - - -
    -

    - {{ notification.title }} -

    -
    -

    - {{ notification.paragraph }} -

    - - {{ notification.footerContent1 }} - - {{ notification.footerContent2 }} - -
    - - - - -
    - } -
    - - @for (notification of notificationsWarning; track notification) { - - - - -
    -

    - {{ notification.title }} -

    -
    -

    - {{ notification.paragraph }} -

    - - {{ notification.footerContent1 }} - - {{ notification.footerContent2 }} - -
    - - - - -
    - } -
    diff --git a/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.ts b/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.ts deleted file mode 100644 index 30ea168e29e..00000000000 --- a/libs/docs/core/notification/examples/notification-mobile/notification-mobile-example.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { NgTemplateOutlet } from '@angular/common'; -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { ActionSheetComponent, ActionSheetModule } from '@fundamental-ngx/core/action-sheet'; -import { AvatarComponent } from '@fundamental-ngx/core/avatar'; -import { ButtonComponent } from '@fundamental-ngx/core/button'; -import { MessageToastModule, MessageToastService } from '@fundamental-ngx/core/message-toast'; -import { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode'; -import { IndicatorStates, NotificationModule } from '@fundamental-ngx/core/notification'; -import { PopoverComponent, PopoverTriggerDirective } from '@fundamental-ngx/core/popover'; -import { FDP_ICON_TAB_BAR } from '@fundamental-ngx/platform/icon-tab-bar'; - -export type Notification = { - avatar: string; - indicator: IndicatorStates; - title: string; - unread: boolean; - paragraph: string; - footerContent1: string; - footerContent2: string; - actionButton: string; -}; - -@Component({ - selector: 'fd-notification-mobile-example', - templateUrl: './notification-mobile-example.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [ - ButtonComponent, - PopoverTriggerDirective, - PopoverComponent, - NotificationModule, - ActionSheetModule, - FDP_ICON_TAB_BAR, - NgTemplateOutlet, - AvatarComponent, - MessageToastModule - ] -}) -export class NotificationMobileExampleComponent { - @ViewChild(ActionSheetComponent) - actionSheetComponent: ActionSheetComponent; - - expanded = true; - expandedByDate = true; - expandedByType1 = true; - expandedByType2 = false; - expandedByPriority = true; - - notifications: Notification[] = [ - { - avatar: 'batch-payments', - indicator: 'success', - title: 'Your leave request has been accepted', - unread: false, - paragraph: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', - footerContent1: 'SAP Analytics Cloud', - footerContent2: '7 minutes ago', - actionButton: 'Accept' - }, - { - avatar: 'customer', - indicator: 'success', - title: 'Your leave request has been accepted', - unread: true, - paragraph: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', - footerContent1: 'SAP Analytics Cloud', - footerContent2: '7 minutes ago', - actionButton: 'Accept' - } - ]; - - notificationsWarning: Notification[] = [ - { - avatar: 'work-history', - indicator: 'warning', - title: 'Approve order #1234', - unread: true, - paragraph: 'Adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', - footerContent1: 'SAP Ariba', - footerContent2: '7 minutes ago', - actionButton: 'Accept' - }, - { - avatar: 'sap-box', - indicator: 'warning', - title: 'Approve order #5678', - unread: true, - paragraph: 'Consectetur adipiscing elit tempor incididunt ut labore et dolore magna aliqua.', - footerContent1: 'SAP Ariba', - footerContent2: '2 days ago', - actionButton: 'Accept' - } - ]; - - mobileConfig: MobileModeConfig = { - title: 'Notifications', - hasCloseButton: true, - dialogConfig: { verticalPadding: false, horizontalPadding: false } - }; - - constructor(private _messageToastService: MessageToastService) {} - - actionPicked(action: string): void { - this.openMessageToast(action); - this.actionSheetComponent.close(); - } - - openMessageToast(action: string): void { - const content = `${action} action performed`; - this._messageToastService.open(content, { - duration: 2000 - }); - } -} diff --git a/libs/docs/core/notification/examples/notification-options/notification-options-example.component.html b/libs/docs/core/notification/examples/notification-options/notification-options-example.component.html index a8198f9f960..8ea181416c3 100644 --- a/libs/docs/core/notification/examples/notification-options/notification-options-example.component.html +++ b/libs/docs/core/notification/examples/notification-options/notification-options-example.component.html @@ -1,153 +1,158 @@ -

    Notification with avatar, success indicator and unread title

    +

    Notification with avatar, priority indicator, unread title and object status

    - + -
    -

    Your leave request has been accepted

    + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et - dolore magna aliqua. + Description of notification topic lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua.

    - SAP Analytics Cloud + Product Name - Just Now + Feature Name + + 11:11 AM +
    -
    -

    Notification with error indicator and no avatar

    +

    Notification with priority indicator, title, object status, and two action buttons

    -
    -

    Your leave request has been accepted

    + +

    Notification Title

    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et - dolore magna aliqua. -

    +

    Description of notification topic

    - Author name + Product Name - 7 minutes ago + Feature Name + + 11:11 AM +
    - - + +
    -

    Notification with message strip, unread title and custom width

    -
    - - A dismissible warning message strip. - - - - -

    Your leave request has been accepted

    -
    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore - et dolore magna aliqua. -

    - - SAP Ariba - - 7 minutes ago - -
    - - - - - - -
  • -
  • -
  • -
    -
    - -
    -
    -
    -
    +

    Notification with avatar, unread title, overflow button with actions (action sheet control)

    + + + + + +

    Notification Title

    +
    +

    Description of notification topic

    + + Product Name + + Feature Name + + 11:11 AM + +
    + + + + + + +
  • +
  • +
  • +
    +
    + +
    +
    +
    -

    Notification in mobile mode

    -
    - - - - -
    -

    Your leave request has been accepted

    -
    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore - et dolore magna aliqua. -

    - - Author name - - Timestamp - -
    - - - - - - -
  • -
  • -
  • -
  • -
    -
    -
    -
    -
    -
    +

    Notification with avatar, priority indicator, unread title and object status

    + +
    + A dismissible error message strip. +
    + + + + + +

    + Notification Title (unread) lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +

    + Description of notification topic lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    + + Product Name + + Feature Name + + 11:11 AM + + +
    + + + +
    +
    diff --git a/libs/docs/core/notification/examples/notification-options/notification-options-example.component.ts b/libs/docs/core/notification/examples/notification-options/notification-options-example.component.ts index 0a45d9e1fcb..e44ea6d3369 100644 --- a/libs/docs/core/notification/examples/notification-options/notification-options-example.component.ts +++ b/libs/docs/core/notification/examples/notification-options/notification-options-example.component.ts @@ -2,9 +2,11 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ActionSheetComponent, ActionSheetModule } from '@fundamental-ngx/core/action-sheet'; import { AvatarComponent } from '@fundamental-ngx/core/avatar'; import { ButtonComponent } from '@fundamental-ngx/core/button'; +import { IconComponent } from '@fundamental-ngx/core/icon'; import { MessageStripComponent } from '@fundamental-ngx/core/message-strip'; import { MessageToastModule, MessageToastService } from '@fundamental-ngx/core/message-toast'; import { NotificationModule } from '@fundamental-ngx/core/notification'; +import { ObjectStatusComponent } from '@fundamental-ngx/core/object-status'; @Component({ selector: 'fd-notification-options-example', @@ -17,7 +19,9 @@ import { NotificationModule } from '@fundamental-ngx/core/notification'; ButtonComponent, MessageStripComponent, ActionSheetModule, - MessageToastModule + MessageToastModule, + ObjectStatusComponent, + IconComponent ] }) export class NotificationOptionsExampleComponent { diff --git a/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.html b/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.html index b0e35c1cef1..63c5507899d 100644 --- a/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.html +++ b/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.html @@ -3,33 +3,38 @@ - + -
    -

    Your leave request has been accepted

    + +

    Notification Title (unread)

    - -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et - dolore magna aliqua. -

    - +

    Description of notification topic.

    - Long author name - SAP Analytics Cloud incididunt ut labore + Product Name + + Feature Name - 7 minutes ago + 11:11 AM +
    - - diff --git a/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.ts b/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.ts index a528def66d5..a93614a2de8 100644 --- a/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.ts +++ b/libs/docs/core/notification/examples/template-as-content/notification-open-template-example.component.ts @@ -1,15 +1,16 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, TemplateRef, ViewChild } from '@angular/core'; import { AvatarComponent } from '@fundamental-ngx/core/avatar'; import { ButtonComponent } from '@fundamental-ngx/core/button'; +import { IconComponent } from '@fundamental-ngx/core/icon'; import { NotificationModule, NotificationService } from '@fundamental-ngx/core/notification'; +import { ObjectStatusComponent } from '@fundamental-ngx/core/object-status'; @Component({ selector: 'fd-notification-open-template-example', changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './notification-open-template-example.component.html', - styles: ['.action-button {margin-left: 12px;}'], standalone: true, - imports: [ButtonComponent, NotificationModule, AvatarComponent] + imports: [ButtonComponent, NotificationModule, AvatarComponent, ObjectStatusComponent, IconComponent] }) export class NotificationOpenTemplateExampleComponent { @ViewChild('notificationTemplate') notificationTemplate: TemplateRef; @@ -21,7 +22,7 @@ export class NotificationOpenTemplateExampleComponent { ) {} open(): void { - const notificationRef = this.notificationService.open(this.notificationTemplate); + const notificationRef = this.notificationService.open(this.notificationTemplate, { width: '450px' }); setTimeout(() => notificationRef.dismiss('dismissed'), 4000); notificationRef.afterClosed.subscribe( (result) => { diff --git a/libs/docs/core/notification/notification-docs-header/notification-docs-header.component.html b/libs/docs/core/notification/notification-docs-header/notification-docs-header.component.html index 36423910368..b198e3d68f9 100644 --- a/libs/docs/core/notification/notification-docs-header/notification-docs-header.component.html +++ b/libs/docs/core/notification/notification-docs-header/notification-docs-header.component.html @@ -6,83 +6,96 @@ Notifications are the best way to make users aware of a situation that requires timely action or attention. This could be a situation that has just arisen or a task triggered by a workflow.

    - Use notifications in the following cases: +

    Use notifications in the following cases:

      -
    • To make users aware of situations that require attention.
    • +
    • Alert users to situations requiring immediate attention.
    • - To reduce the amount of information and the number of actions to a minimum, but provide enough - information to help users decide if the information is important. -
    • -
    • - The notification list items and notification list groups are only used in the SAP Fiori notifications - popover. + Simplify information and actions, providing enough detail for users to determine the importance of the + notification.
    +
    +

    - Users access notifications by clicking the bell icon in the shell bar at the top right of the screen. In the - notifications popover, the user can order notifications in various ways, take action, and navigate to the - source of a specific notification.
    - High-priority notifications are shown using the banner. The banner appears on the upper right-hand corner of - the screen for a short period of time and then disappears. It's recommended to set a notification to high - priority if you need to get the user’s immediate attention. In this case you need to use the - NotificationService and pass the content of the notifications as a template or a component. + The notification list items and notification list groups are specifically used in the SAP Fiori + notifications popover. Users can access notifications by selecting the bell icon in the shell bar at the + top-right corner of the screen.

    +

    + High-priority notifications are displayed using the banner, which appears in the upper-right corner for a + brief duration. It's advisable to set notifications to high priority when immediate user attention is + needed. In these cases, use the NotificationService and pass the notification content as a + template or a component. +

    + +

    Notification Components and Directives

    • - fd-notification component. The width input property controls the width of the - notification. The width of the notification cannot exceed 40rem. The input property - mobile specifies if the notification is in mobile mode. + fd-notification component: The width input property defines the notification's + width.
    • - fd-notification-body component. A container for an avatar (optional), a message strip - (optional) and a notification content (required). + fd-notification-message-strip-container directive: Applied to a div element + containing a Message Strip. This container adds the necessary spacing around the message.
    • - fd-notification-content component. A container for the notification header, paragraph and - footer. + fd-notification-body component: A container for an avatar (optional), notification content + (required), and notification actions.
    • - fd-notification-header component. Consists of a mandatory title and an optional priority - indicator. + fd-notification-content component: Holds the notification header, paragraph, footer, and + optional object status.
    • - fd-notification-indicator directive. The type input property specifies the - priority of the notification. Options include "success", "error", "warning" and "information". + fd-notification-header component: Includes a mandatory title and an optional priority + indicator (icon with color).
    • - fd-notification-title directive. The “read” or “unread” status of a notification is - visualized using medium and bold headlines. Unclicked/unopened notifications are shown as “unread” and - in bold. To control this state use the unread property. + fd-notification-title directive: The notification's read/unread state is reflected in the + text style (medium or bold). Unread notifications are shown in bold. Control this state with the + unread property and ensure to use a semantically appropriate heading element.
    • -
    • fd-notification-paragraph directive.
    • +
    • fd-notification-paragraph directive: Defines the main notification text.
    • - fd-notification-footer component. Contains information about the author/source and a - mandatory timestamp. The content is divided by a separator. + fd-notification-footer component: Displays the author/source and a mandatory timestamp, + separated by a divider.
    • -
    • fd-notification-footer-content directive.
    • -
    • fd-notification-separator directive.
    • +
    • fd-notification-footer-content directive: Defines the content within the footer.
    • +
    • fd-notification-separator directive: Adds a visual divider between footer elements.
    • - fd-notification-actions component. The actions associated with notifications allow users to - act on notifications from within the notification popover. If more than one actions is exposed, all - actions move into the overflow (Action Sheet component). It's recommended to display only - self-explanatory actions that don’t require additional context. + fd-notification-actions component: Provides actions users can take directly within the + notification popover. If multiple actions are present, they are moved to an overflow menu (using the + Action Sheet component). Only include self-explanatory actions that don't require additional context.
    - Notification Groups +

    Notification Groups

    • - fd-notification-group component. The width input property controls the width - of the group. + fd-notification-popover directive: A container inside the Popover body, which includes a + toolbar for notification actions, Message Strip, and Notification List. +
    • +
    • + fd-notification-message-strip directive: : A container holding the Message Strip component. +
    • +
    • fd-notification-list directive:: A list holding Notification Groups.
    • +
    • fd-notification-group component:Consists of a header, group list, and growing item.
    • +
    • + fd-notification-group-header component: Handles the expand/collapse of the notification + group, with an arrow indicating the state and a title. +
    • +
    • + fd-notification-group-header-title directive: Defines the heading for the notification + group.
    • +
    • fd-notification-group-list component: Holds a grouped list of notifications.
    • - fd-notification-group-list component. Contains the header of the group and aggregated - single notification items. + fd-notification-group-growing-item component: A button to display additional notifications + within a group.
    • - fd-notification-group-header component. Contains an expand/collapse button, group priority - (indicator), title with item counter and actions. The expanded property controls the - display and hide the individual items. + fd-notification-group-growing-item-title directive: Defines the text for the + fd-notification-group-growing-item.
    diff --git a/libs/docs/core/notification/notification-docs.component.html b/libs/docs/core/notification/notification-docs.component.html index 92bfa5d6cf5..d5849ec9744 100644 --- a/libs/docs/core/notification/notification-docs.component.html +++ b/libs/docs/core/notification/notification-docs.component.html @@ -1,10 +1,5 @@ Notification - - Notification Component can be used with a lot of different types and sizes. Also there is example of container - usage. It is possible to provide container reference, where should the notification belong. By default it is a - body - element. - + @@ -42,25 +37,8 @@ Notification Group - - Items are added to a list based on internal events within apps or systems. The list can display various types of - notifications, which can differ in terms of appearance, content, and functionality. The list can be ordered by Date - (the most recent notification appears first), by Type (notifications appear as grouped notifications ordered from - A-Z) and by Priority (from highest to lowest priority). - + - - - - Notifications in Popover Dialog - - - Notifications are carried inside a Popover. Popover can be responsive (on mobile become Dialog) or not. - - - - - diff --git a/libs/docs/core/notification/notification-docs.component.ts b/libs/docs/core/notification/notification-docs.component.ts index 217c98f1f6e..118f51e2651 100644 --- a/libs/docs/core/notification/notification-docs.component.ts +++ b/libs/docs/core/notification/notification-docs.component.ts @@ -11,7 +11,6 @@ import { } from '@fundamental-ngx/docs/shared'; import { NotificationComponentAsContentExampleComponent } from './examples/component-as-content/notification-component-as-content-example.component'; import { NotificationGroupExampleComponent } from './examples/notification-group/notification-group-example.component'; -import { NotificationMobileExampleComponent } from './examples/notification-mobile/notification-mobile-example.component'; import { NotificationOptionsExampleComponent } from './examples/notification-options/notification-options-example.component'; import { NotificationOpenTemplateExampleComponent } from './examples/template-as-content/notification-open-template-example.component'; @@ -24,8 +23,6 @@ const templateTs = 'template-as-content/notification-open-template-example.compo const templateH = 'template-as-content/notification-open-template-example.component.html'; const groupTs = 'notification-group/notification-group-example.component.ts'; const groupH = 'notification-group/notification-group-example.component.html'; -const mobileTs = 'notification-mobile/notification-mobile-example.component.ts'; -const mobileH = 'notification-mobile/notification-mobile-example.component.html'; @Component({ selector: 'app-notification', @@ -40,8 +37,7 @@ const mobileH = 'notification-mobile/notification-mobile-example.component.html' SeparatorComponent, NotificationOpenTemplateExampleComponent, NotificationComponentAsContentExampleComponent, - NotificationGroupExampleComponent, - NotificationMobileExampleComponent + NotificationGroupExampleComponent ] }) export class NotificationDocsComponent { @@ -111,18 +107,4 @@ export class NotificationDocsComponent { fileName: 'notification-group-example' } ]; - - mobile: ExampleFile[] = [ - { - language: 'typescript', - code: getAssetFromModuleAssets(mobileTs), - fileName: 'notification-mobile-example', - component: 'NotificationMobileExampleComponent' - }, - { - language: 'html', - code: getAssetFromModuleAssets(mobileH), - fileName: 'notification-mobile-example' - } - ]; } diff --git a/libs/docs/core/notification/project.json b/libs/docs/core/notification/project.json index e9b779095be..f0a00b48ff1 100644 --- a/libs/docs/core/notification/project.json +++ b/libs/docs/core/notification/project.json @@ -4,15 +4,5 @@ "sourceRoot": "libs/docs/core/notification", "projectType": "library", "prefix": "fundamental-ngx", - "tags": ["type:lib", "scope:docs"], - "targets": { - "e2e": { - "executor": "@fundamental-ngx/nx-plugin:e2e-test", - "options": { - "e2eFiles": ["libs/docs/core/notification/e2e/**/*.e2e-spec.ts"], - "devServerTarget": "docs:serve:e2e" - }, - "outputs": ["{workspaceRoot}/allure-results/docs-core-notification"] - } - } + "tags": ["type:lib", "scope:docs"] } diff --git a/package.json b/package.json index ceead147f77..9e0212f3c0a 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@angular/platform-browser": "18.0.3", "@angular/platform-browser-dynamic": "18.0.3", "@angular/router": "18.0.3", - "@fundamental-styles/cx": "0.37.8", + "@fundamental-styles/cx": "0.38.0", "@nx/angular": "19.2.3", "@sap-theming/theming-base-content": "11.18.0", "@stackblitz/sdk": "1.9.0", @@ -58,7 +58,7 @@ "fast-deep-equal": "3.1.3", "focus-trap": "7.1.0", "focus-visible": "5.2.1", - "fundamental-styles": "0.37.8", + "fundamental-styles": "0.38.0", "fuse.js": "7.0.0", "highlight.js": "11.7.0", "intl": "1.2.5", @@ -92,7 +92,7 @@ "@nx/js": "19.2.3", "@nx/plugin": "19.2.3", "@nx/workspace": "19.2.3", - "@sap-ui/common-css": "0.37.8", + "@sap-ui/common-css": "0.38.0", "@schematics/angular": "18.0.4", "@swc-node/register": "1.9.2", "@swc/cli": "0.3.12", diff --git a/yarn.lock b/yarn.lock index f30b843ba0b..bb2b112f5f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -607,15 +607,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.24.7, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.4, @babel/generator@npm:^7.7.2": - version: 7.25.5 - resolution: "@babel/generator@npm:7.25.5" +"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.24.7, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6, @babel/generator@npm:^7.7.2": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" dependencies: - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10/e6d046afe739cfa706c40c127b7436731acb2a3146d408a7d89dbf16448491b35bc09b7d285cc19c2c1f8980d74b5a99df200d67c859bb5260986614685b0770 + checksum: 10/541e4fbb6ea7806f44232d70f25bf09dee9a57fe43d559e375536870ca5261ebb4647fec3af40dcbb3325ea2a49aff040e12a4e6f88609eaa88f10c4e27e31f8 languageName: node linkType: hard @@ -852,12 +852,12 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.24.5, @babel/helpers@npm:^7.24.7, @babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" + version: 7.25.6 + resolution: "@babel/helpers@npm:7.25.6" dependencies: "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/4fcb8167eba9853e30b8b235b81b923ef7b707396b0e23d7a4fa3e811729506755576cb9ec736e8b92cf19e5a1ec61e83d182904d8e6a0953803c6bebc2e1592 + "@babel/types": "npm:^7.25.6" + checksum: 10/43abc8d017b754619aa189d05e2bdb54aaf44f03ec0439e89b3e7c180d538adb01ce9014a1689f632a7e8b17655c72bfac0a92268476eec708b41d3ba0a65296 languageName: node linkType: hard @@ -873,14 +873,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.5, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/parser@npm:7.25.4" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.5, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" dependencies: - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" bin: parser: ./bin/babel-parser.js - checksum: 10/343b8a76c43549e370fe96f4f6d564382a6cdff60e9c3b8a594c51e4cefd58ec9945e82e8c4dfbf15ac865a04e4b29806531440760748e28568e6aec21bc9cb5 + checksum: 10/830aab72116aa14eb8d61bfa8f9d69fc8f3a43d909ce993cb4350ae14d3af1a2f740a54410a22d821c48a253263643dfecbc094f9608e6a70ce9ff3c0bbfe91a languageName: node linkType: hard @@ -1043,24 +1043,24 @@ __metadata: linkType: hard "@babel/plugin-syntax-import-assertions@npm:^7.24.1, @babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bd065cd73ae3dbe69e6f9167aa605da3df77d69bbad2ede95e4aa9e7af7744d5bc1838b928c77338ca62df7691a7adf6e608279be50c18e4b3c70cf77e3013d7 + checksum: 10/36a756a695e2f18d406bfdfd6823023e3810d13fdb27ec2a5cb90ae95326edb1e744e3451a8a31bf6bd91646236643c5e8024ecf71102cc93309ec80592ebb17 languageName: node linkType: hard "@babel/plugin-syntax-import-attributes@npm:^7.24.1, @babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/22fc50bd85a491bb8d22065f330a41f60d66f2f2d7a1deb73e80c8a4b5d7a42a092a03f8da18800650eca0fc14585167cc4e5c9fab351f0d390d1592347162ae + checksum: 10/5afeba6b8979e61e8e37af905514891920eab103a08b36216f5518474328f9fae5204357bfadf6ce4cc80cb96848cdb7b8989f164ae93bd063c86f3f586728c0 languageName: node linkType: hard @@ -2100,11 +2100,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4": - version: 7.25.4 - resolution: "@babel/runtime@npm:7.25.4" + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/70d2a420c24a3289ea6c4addaf3a1c4186bc3d001c92445faa3cd7601d7d2fbdb32c63b3a26b9771e20ff2f511fa76b726bf256f823cdb95bc37b8eadbd02f70 + checksum: 10/0c4134734deb20e1005ffb9165bf342e1074576621b246d8e5e41cc7cb315a885b7d98950fbf5c63619a2990a56ae82f444d35fe8c4691a0b70c2fe5673667dc languageName: node linkType: hard @@ -2120,28 +2120,28 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.24.5, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/traverse@npm:7.25.4" + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.4" - "@babel/parser": "npm:^7.25.4" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/a85c16047ab8e454e2e758c75c31994cec328bd6d8b4b22e915fa7393a03b3ab96d1218f43dc7ef77c957cc488dc38100bdf504d08a80a131e89b2e49cfa2be5 + checksum: 10/de75a918299bc27a44ec973e3f2fa8c7902bbd67bd5d39a0be656f3c1127f33ebc79c12696fbc8170a0b0e1072a966d4a2126578d7ea2e241b0aeb5d16edc738 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.24.5, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.25.4 - resolution: "@babel/types@npm:7.25.4" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.24.5, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" dependencies: "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10/d4a1194612d0a2a6ce9a0be325578b43d74e5f5278c67409468ba0a924341f0ad349ef0245ee8a36da3766efe5cc59cd6bb52547674150f97d8dc4c8cfa5d6b8 + checksum: 10/7b54665e1b51f525fe0f451efdd9fe7a4a6dfba3fd4956c3530bc77336b66ffe3d78c093796ed044119b5d213176af7cf326f317a2057c538d575c6cefcb3562 languageName: node linkType: hard @@ -2857,9 +2857,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/aix-ppc64@npm:0.23.1" +"@esbuild/aix-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/aix-ppc64@npm:0.24.0" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -2885,9 +2885,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm64@npm:0.23.1" +"@esbuild/android-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm64@npm:0.24.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -2913,9 +2913,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm@npm:0.23.1" +"@esbuild/android-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm@npm:0.24.0" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -2941,9 +2941,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-x64@npm:0.23.1" +"@esbuild/android-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-x64@npm:0.24.0" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -2969,9 +2969,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-arm64@npm:0.23.1" +"@esbuild/darwin-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-arm64@npm:0.24.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -2997,9 +2997,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-x64@npm:0.23.1" +"@esbuild/darwin-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-x64@npm:0.24.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3025,9 +3025,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-arm64@npm:0.23.1" +"@esbuild/freebsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-arm64@npm:0.24.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3053,9 +3053,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-x64@npm:0.23.1" +"@esbuild/freebsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-x64@npm:0.24.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3081,9 +3081,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm64@npm:0.23.1" +"@esbuild/linux-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm64@npm:0.24.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3109,9 +3109,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm@npm:0.23.1" +"@esbuild/linux-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm@npm:0.24.0" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3137,9 +3137,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ia32@npm:0.23.1" +"@esbuild/linux-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ia32@npm:0.24.0" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3165,9 +3165,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-loong64@npm:0.23.1" +"@esbuild/linux-loong64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-loong64@npm:0.24.0" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -3193,9 +3193,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-mips64el@npm:0.23.1" +"@esbuild/linux-mips64el@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-mips64el@npm:0.24.0" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3221,9 +3221,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ppc64@npm:0.23.1" +"@esbuild/linux-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ppc64@npm:0.24.0" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3249,9 +3249,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-riscv64@npm:0.23.1" +"@esbuild/linux-riscv64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-riscv64@npm:0.24.0" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3277,9 +3277,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-s390x@npm:0.23.1" +"@esbuild/linux-s390x@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-s390x@npm:0.24.0" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3305,9 +3305,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-x64@npm:0.23.1" +"@esbuild/linux-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-x64@npm:0.24.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3333,16 +3333,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/netbsd-x64@npm:0.23.1" +"@esbuild/netbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/netbsd-x64@npm:0.24.0" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-arm64@npm:0.23.1" +"@esbuild/openbsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-arm64@npm:0.24.0" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard @@ -3368,9 +3368,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-x64@npm:0.23.1" +"@esbuild/openbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-x64@npm:0.24.0" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3396,9 +3396,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/sunos-x64@npm:0.23.1" +"@esbuild/sunos-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/sunos-x64@npm:0.24.0" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3424,9 +3424,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-arm64@npm:0.23.1" +"@esbuild/win32-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-arm64@npm:0.24.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -3452,9 +3452,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-ia32@npm:0.23.1" +"@esbuild/win32-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-ia32@npm:0.24.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3480,9 +3480,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-x64@npm:0.23.1" +"@esbuild/win32-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-x64@npm:0.24.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3499,9 +3499,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 10/f053f371c281ba173fe6ee16dbc4fe544c84870d58035ccca08dba7f6ce1830d895ce3237a0db89ba37616524775dca82f1c502066b58e2d5712d7f87f5ba17c + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 10/934b6d3588c7f16b18d41efec4fdb89616c440b7e3256b8cb92cfd31ae12908600f2b986d6c1e61a84cbc10256b1dd3448cd1eec79904bd67ac365d0f1aba2e2 languageName: node linkType: hard @@ -3585,10 +3585,10 @@ __metadata: languageName: node linkType: hard -"@fundamental-styles/cx@npm:0.37.8": - version: 0.37.8 - resolution: "@fundamental-styles/cx@npm:0.37.8" - checksum: 10/6afeae5648d5fd799a80dc604839415109f6afeea051dd0f6401eb82089b041eb223ac1ab6771b687ba222b7db8842e51977cb06d60597c84323cd8882c98392 +"@fundamental-styles/cx@npm:0.38.0": + version: 0.38.0 + resolution: "@fundamental-styles/cx@npm:0.38.0" + checksum: 10/f3ad7e8f886849260670a08b1b3a8576bacee6f4eeea1ee8363021f5a554ecd20ddaeebc2fe6e880785acc70ca6b511941bc9fe54e6c6058854317f8d7e53dfe languageName: node linkType: hard @@ -3648,9 +3648,9 @@ __metadata: linkType: hard "@inquirer/figures@npm:^1.0.2": - version: 1.0.5 - resolution: "@inquirer/figures@npm:1.0.5" - checksum: 10/60a51b2cdef03c89be25071c23d8c4ae427c56d8ac1b00bf054ca7be446674adc4edd66c15465fe6a81ff0726b024bf37f8a2903a8387ef968d33058da3e7a15 + version: 1.0.6 + resolution: "@inquirer/figures@npm:1.0.6" + checksum: 10/1b9023d331c41f09d0848b8920885d535cdaf52edd782009e003b2f3b2df6a6a6a26fb8ecd05eb3c3df3df9d080e042ca525438a1513cdcc4410f3eefce3e4e0 languageName: node linkType: hard @@ -4239,6 +4239,175 @@ __metadata: languageName: node linkType: hard +"@napi-rs/nice-android-arm-eabi@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-android-arm-eabi@npm:1.0.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-android-arm64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-android-arm64@npm:1.0.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-arm64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-darwin-arm64@npm:1.0.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-x64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-darwin-x64@npm:1.0.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-freebsd-x64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-freebsd-x64@npm:1.0.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.0.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-musl@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.0.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-s390x-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.0.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.0.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-musl@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-x64-musl@npm:1.0.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-win32-arm64-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.0.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-ia32-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.0.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-x64-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.0.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice@npm:^1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice@npm:1.0.1" + dependencies: + "@napi-rs/nice-android-arm-eabi": "npm:1.0.1" + "@napi-rs/nice-android-arm64": "npm:1.0.1" + "@napi-rs/nice-darwin-arm64": "npm:1.0.1" + "@napi-rs/nice-darwin-x64": "npm:1.0.1" + "@napi-rs/nice-freebsd-x64": "npm:1.0.1" + "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.0.1" + "@napi-rs/nice-linux-arm64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-arm64-musl": "npm:1.0.1" + "@napi-rs/nice-linux-ppc64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-riscv64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-s390x-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-x64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-x64-musl": "npm:1.0.1" + "@napi-rs/nice-win32-arm64-msvc": "npm:1.0.1" + "@napi-rs/nice-win32-ia32-msvc": "npm:1.0.1" + "@napi-rs/nice-win32-x64-msvc": "npm:1.0.1" + dependenciesMeta: + "@napi-rs/nice-android-arm-eabi": + optional: true + "@napi-rs/nice-android-arm64": + optional: true + "@napi-rs/nice-darwin-arm64": + optional: true + "@napi-rs/nice-darwin-x64": + optional: true + "@napi-rs/nice-freebsd-x64": + optional: true + "@napi-rs/nice-linux-arm-gnueabihf": + optional: true + "@napi-rs/nice-linux-arm64-gnu": + optional: true + "@napi-rs/nice-linux-arm64-musl": + optional: true + "@napi-rs/nice-linux-ppc64-gnu": + optional: true + "@napi-rs/nice-linux-riscv64-gnu": + optional: true + "@napi-rs/nice-linux-s390x-gnu": + optional: true + "@napi-rs/nice-linux-x64-gnu": + optional: true + "@napi-rs/nice-linux-x64-musl": + optional: true + "@napi-rs/nice-win32-arm64-msvc": + optional: true + "@napi-rs/nice-win32-ia32-msvc": + optional: true + "@napi-rs/nice-win32-x64-msvc": + optional: true + checksum: 10/ae265aa365b325830115c1cda49b05ea05e6f1163944a1485c0643c9552380cd32a2aaf12b326f353538ca6244222963eb2e9767a4713c9432eadecd027f90ea + languageName: node + linkType: hard + "@ngtools/webpack@npm:18.0.4": version: 18.0.4 resolution: "@ngtools/webpack@npm:18.0.4" @@ -4372,8 +4541,8 @@ __metadata: linkType: hard "@npmcli/package-json@npm:^5.0.0, @npmcli/package-json@npm:^5.1.0": - version: 5.2.0 - resolution: "@npmcli/package-json@npm:5.2.0" + version: 5.2.1 + resolution: "@npmcli/package-json@npm:5.2.1" dependencies: "@npmcli/git": "npm:^5.0.0" glob: "npm:^10.2.2" @@ -4382,7 +4551,7 @@ __metadata: normalize-package-data: "npm:^6.0.0" proc-log: "npm:^4.0.0" semver: "npm:^7.5.3" - checksum: 10/c3d2218877bfc005bca3b7a11f53825bf16a68811b8e8ed0c9b219cceb8e8e646d70efab8c5d6decbd8007f286076468b3f456dab4d41d648aff73a5f3a6fce2 + checksum: 10/304a819b93f79a6e0e56cb371961a66d2db72142e310d545ecbbbe4d917025a30601aa8e63a5f0cc28f0fe281c116bdaf79b334619b105a1d027a2b769ecd137 languageName: node linkType: hard @@ -5170,13 +5339,12 @@ __metadata: linkType: hard "@rollup/plugin-node-resolve@npm:^15.2.3": - version: 15.2.3 - resolution: "@rollup/plugin-node-resolve@npm:15.2.3" + version: 15.3.0 + resolution: "@rollup/plugin-node-resolve@npm:15.3.0" dependencies: "@rollup/pluginutils": "npm:^5.0.1" "@types/resolve": "npm:1.20.2" deepmerge: "npm:^4.2.2" - is-builtin-module: "npm:^3.2.1" is-module: "npm:^1.0.0" resolve: "npm:^1.22.1" peerDependencies: @@ -5184,13 +5352,13 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10/d36a6792fbe9d8673d3a7c7dc88920be669ac54fba02ac0093d3c00fc9463fce2e87da1906a2651016742709c3d202b367fb49a62acd0d98f18409343f27b8b4 + checksum: 10/214596dd0ecf0822a135e6cb604f6a4469bac4a9d6b43608d277b47c34762e800b79f5f1c18ea0f7317448165ac0cff2439b35446641e093a5bc5c372940c819 languageName: node linkType: hard "@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": - version: 5.1.0 - resolution: "@rollup/pluginutils@npm:5.1.0" + version: 5.1.2 + resolution: "@rollup/pluginutils@npm:5.1.2" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" @@ -5200,150 +5368,157 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10/abb15eaec5b36f159ec351b48578401bedcefdfa371d24a914cfdbb1e27d0ebfbf895299ec18ccc343d247e71f2502cba21202bc1362d7ef27d5ded699e5c2b2 + checksum: 10/cc1fe3285ab48915a6535ab2f0c90dc511bd3e63143f8e9994bb036c6c5071fd14d641cff6c89a7fde6a4faa85227d4e2cf46ee36b7d962099e0b9e4c9b8a4b0 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.1" +"@rollup/rollup-android-arm-eabi@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-android-arm64@npm:4.21.1" +"@rollup/rollup-android-arm64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-android-arm64@npm:4.24.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.21.1" +"@rollup/rollup-darwin-arm64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.24.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.21.1" +"@rollup/rollup-darwin-x64@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.24.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.1" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.1" +"@rollup/rollup-linux-arm-musleabihf@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.1" +"@rollup/rollup-linux-arm64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.1" +"@rollup/rollup-linux-arm64-musl@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.1" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.1" +"@rollup/rollup-linux-riscv64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.1" +"@rollup/rollup-linux-s390x-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.1" +"@rollup/rollup-linux-x64-gnu@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.1" +"@rollup/rollup-linux-x64-musl@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.1" +"@rollup/rollup-win32-arm64-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.1" +"@rollup/rollup-win32-ia32-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.21.1": - version: 4.21.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.1" +"@rollup/rollup-win32-x64-msvc@npm:4.24.0": + version: 4.24.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@rollup/wasm-node@npm:^4.18.0": - version: 4.21.1 - resolution: "@rollup/wasm-node@npm:4.21.1" + version: 4.24.0 + resolution: "@rollup/wasm-node@npm:4.24.0" dependencies: - "@types/estree": "npm:1.0.5" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 10/949ada011b6d1b1c5908e9c5bc07fb3a6558f914c658a9f0c6f2ff73d65cb7bec02a80ef284957e728a64c92ca0e8d1a20eacd0bdebac07f35549944d052c4eb + checksum: 10/f2bb258d558dc77ba797898a41ee533598c5509d6b31e7c9f894da6c5ec6a28c26f80b9b3c0df7ef4b199a995ff280907a86acd78b8425ddb04d5c0b0779f826 languageName: node linkType: hard -"@sap-theming/theming-base-content@npm:11.18.0, @sap-theming/theming-base-content@npm:^11.18.0": +"@sap-theming/theming-base-content@npm:11.18.0": version: 11.18.0 resolution: "@sap-theming/theming-base-content@npm:11.18.0" checksum: 10/4762f45806c4079bd1202635b1cb27517c662450b75c2fc85f63de1aad3fc9d50bd794cca17b25b48be3bceacc08f001f6e252f964f75a521184eed97995df58 languageName: node linkType: hard -"@sap-ui/common-css@npm:0.37.8": - version: 0.37.8 - resolution: "@sap-ui/common-css@npm:0.37.8" +"@sap-theming/theming-base-content@npm:^11.18.0": + version: 11.18.2 + resolution: "@sap-theming/theming-base-content@npm:11.18.2" + checksum: 10/71235613d566767406514ee924bcc6959456fff5be30c63d7731d5f224ab4e9156aaf0d2c01f08db53ea0bcd05539f5d956cddeb07c1911c1c170dad01bb79e6 + languageName: node + linkType: hard + +"@sap-ui/common-css@npm:0.38.0": + version: 0.38.0 + resolution: "@sap-ui/common-css@npm:0.38.0" dependencies: "@sap-theming/theming-base-content": "npm:^11.18.0" - checksum: 10/7a517c69ecf50e9b39225d00f44e3795f43045bc9b02d7918a5b1dd710f9ea5e3fbb5738da4eb4a1038ab21919a32063089e04e5c87b8f6b71726fac33268e53 + checksum: 10/1ae2dc1f5c5f867c06d7026288fd59d7237d18d8f4312e4afb1f279029765cf3ff0ca83fc6e0920c03da21036c127b574526cf0ecb50365856a38e45a29fedc6 languageName: node linkType: hard @@ -5983,26 +6158,50 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.0.0 + resolution: "@types/express-serve-static-core@npm:5.0.0" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10/fc40cdeae61113d8b2335f4b0f9334a7a64388a0931f2e98f8fc9bdadd0b13b501a70da14c256ae4aa140db49bd2eff75a99a683266d561e62540784a61dc489 languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.19.5 - resolution: "@types/express-serve-static-core@npm:4.19.5" +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/49350c6315eeb7d640e13e6138ba6005121b3b610b1e25746fccd5b86b559be810a4ba384b9bd7eee288975b5bd8cf67c1772c646254b812beaa488774eb5513 + checksum: 10/a2e00b6c5993f0dd63ada2239be81076fe0220314b9e9fde586e8946c9c09ce60f9a2dd0d74410ee2b5fd10af8c3e755a32bb3abf134533e2158142488995455 + languageName: node + linkType: hard + +"@types/express@npm:*": + version: 5.0.0 + resolution: "@types/express@npm:5.0.0" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10/45b199ab669caa33e6badafeebf078e277ea95042309d325a04b1ec498f33d33fd5a4ae9c8e358342367b178fe454d7323c5dfc8002bf27070b210a2c6cc11f0 languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.21": +"@types/express@npm:^4.17.13, @types/express@npm:^4.17.21": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -6192,9 +6391,9 @@ __metadata: linkType: hard "@types/lodash@npm:*": - version: 4.17.7 - resolution: "@types/lodash@npm:4.17.7" - checksum: 10/b8177f19cf962414a66989837481b13f546afc2e98e8d465bec59e6ac03a59c584eb7053ce511cde3a09c5f3096d22a5ae22cfb56b23f3b0da75b0743b6b1a44 + version: 4.17.9 + resolution: "@types/lodash@npm:4.17.9" + checksum: 10/49e35caaf668686be0bad9e9bef88456903a21999d3fd8bf91c302e0d5328398fb59fee793d0afbaf6edeca1b46c3e8109899d85ff3a433075178f1ab693e597 languageName: node linkType: hard @@ -6252,11 +6451,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.5.0 - resolution: "@types/node@npm:22.5.0" + version: 22.7.4 + resolution: "@types/node@npm:22.7.4" dependencies: undici-types: "npm:~6.19.2" - checksum: 10/89af3bd217b1559b645a9ed16d4ae3add75749814cbd8eefddd1b96003d1973afb1c8a2b23d69f3a8cc6c532e3aa185eaf5cc29a6e7c42c311a2aad4c99430ae + checksum: 10/19ddab80c4eba2253c855ed67c9bbc47417183049d01e59010a738bd80d47338bab79fd1f44ae51516bd63a1db4bf21ddb38b16bf6401a2e93252068ec52e88b languageName: node linkType: hard @@ -6275,11 +6474,11 @@ __metadata: linkType: hard "@types/node@npm:^18.0.0, @types/node@npm:^18.16.9": - version: 18.19.46 - resolution: "@types/node@npm:18.19.46" + version: 18.19.54 + resolution: "@types/node@npm:18.19.54" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/011c579f55dffc8477615a691a75c0e9d406b6306c0723a4ba0f5f1cc059957e9762db3bd517daae2df2eeba4063f6e3579ab6cf7d3add26e9cc0cd2da755b69 + checksum: 10/99cbad8b8d7493c8c9b1df77229f5684dc1477383db8bd7692792700df1a059bc66cd49625bde29d8da072da6a553ed08cf914866a6989a66300355571db124e languageName: node linkType: hard @@ -6298,9 +6497,9 @@ __metadata: linkType: hard "@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 10/97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 + version: 6.9.16 + resolution: "@types/qs@npm:6.9.16" + checksum: 10/2e8918150c12735630f7ee16b770c72949274938c30306025f68aaf977227f41fe0c698ed93db1099e04916d582ac5a1faf7e3c7061c8d885d9169f59a184b6c languageName: node linkType: hard @@ -7349,11 +7548,11 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" dependencies: acorn: "npm:^8.11.0" - checksum: 10/59701dcb7070679622ba8e9c7f37577b4935565747ca0fd7c1c3ad30b3f1b1b008276282664e323b5495eb49f77fa12d3816fd06dc68e18f90fbebe759f71450 + checksum: 10/871386764e1451c637bb8ab9f76f4995d408057e9909be6fb5ad68537ae3375d85e6a6f170b98989f44ab3ff6c74ad120bc2779a3d577606e7a0cd2b4efcaf77 languageName: node linkType: hard @@ -7574,9 +7773,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10/1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac languageName: node linkType: hard @@ -7748,7 +7947,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.3.0, aria-query@npm:^5.0.0": +"aria-query@npm:5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -7757,6 +7956,13 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.0.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10/b2fe9bc98bd401bc322ccb99717c1ae2aaf53ea0d468d6e7aebdc02fac736e4a99b46971ee05b783b08ade23c675b2d8b60e4a1222a95f6e27bc4d2a0bfdcc03 + languageName: node + linkType: hard + "array-back@npm:^3.0.1, array-back@npm:^3.1.0": version: 3.1.0 resolution: "array-back@npm:3.1.0" @@ -7978,9 +8184,9 @@ __metadata: linkType: hard "aws4@npm:^1.8.0": - version: 1.13.1 - resolution: "aws4@npm:1.13.1" - checksum: 10/67a501fa36d2d082970b6708663696b406c693042fcf7a177850c92557780674a86fc538a3162db122cc656ae85e8fb895c1d42b399bae53488e6a13839fb65a + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10/290b9f84facbad013747725bfd8b4c42d0b3b04b5620d8418f0219832ef95a7dc597a4af7b1589ae7fce18bacde96f40911c3cda36199dd04d9f8e01f72fa50a languageName: node linkType: hard @@ -8040,13 +8246,13 @@ __metadata: linkType: hard "axios@npm:^1.0.0, axios@npm:^1.6.0": - version: 1.7.5 - resolution: "axios@npm:1.7.5" + version: 1.7.7 + resolution: "axios@npm:1.7.7" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10/6cbcfe943a84089f420a900a3a3aeb54ee94dcc9c2b81b150434896357be5d1079eff0b1bbb628597371e79f896b1bc5776df04184756ba99656ff31df9a75bf + checksum: 10/7f875ea13b9298cd7b40fd09985209f7a38d38321f1118c701520939de2f113c4ba137832fe8e3f811f99a38e12c8225481011023209a77b0c0641270e20cde1 languageName: node linkType: hard @@ -8076,7 +8282,7 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:9.1.3, babel-loader@npm:^9.1.2": +"babel-loader@npm:9.1.3": version: 9.1.3 resolution: "babel-loader@npm:9.1.3" dependencies: @@ -8089,6 +8295,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:^9.1.2": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10/f1f24ae3c22d488630629240b0eba9c935545f82ff843c214e8f8df66e266492b7a3d4cb34ef9c9721fb174ca222e900799951c3fd82199473bc6bac52ec03a3 + languageName: node + linkType: hard + "babel-plugin-const-enum@npm:^1.0.1": version: 1.2.0 resolution: "babel-plugin-const-enum@npm:1.2.0" @@ -8332,9 +8551,9 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" content-type: "npm:~1.0.5" @@ -8344,11 +8563,11 @@ __metadata: http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" + qs: "npm:6.13.0" raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10/3cf171b82190cf91495c262b073e425fc0d9e25cc2bf4540d43f7e7bbca27d6a9eae65ca367b6ef3993eea261159d9d2ab37ce444e8979323952e12eb3df319a + checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca languageName: node linkType: hard @@ -8398,16 +8617,16 @@ __metadata: linkType: hard "browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5, browserslist@npm:^4.22.1, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" + version: 4.24.0 + resolution: "browserslist@npm:4.24.0" dependencies: - caniuse-lite: "npm:^1.0.30001646" - electron-to-chromium: "npm:^1.5.4" + caniuse-lite: "npm:^1.0.30001663" + electron-to-chromium: "npm:^1.5.28" node-releases: "npm:^2.0.18" update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10/e266d18c6c6c5becf9a1a7aa264477677b9796387972e8fce34854bb33dc1666194dc28389780e5dc6566e68a95e87ece2ce222e1c4ca93c2b75b61dfebd5f1c + checksum: 10/26c1b8ba257a0b51b102080ba9d42945af2abaa8c4cf6da21cd47b3f123fc1e81640203b293214356c2c17d9d265bb3a5ed428b6d302f383576dd6ce8fd5036c languageName: node linkType: hard @@ -8717,10 +8936,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001653 - resolution: "caniuse-lite@npm:1.0.30001653" - checksum: 10/cd9b1c0fe03249e593789a11a9ef14f987b385e60441748945916b19e74e7bc5c82c40d4836496a647586651898741aed1598ae0792114a9f0d7d7fdb2b7deb0 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001663": + version: 1.0.30001666 + resolution: "caniuse-lite@npm:1.0.30001666" + checksum: 10/c3b5a85f658d140ba53f6e99ee824935194c78effd6f3b7e62c2c0d17f8886a12f5d4ce775f8faf7172f8373fffef713ecfbef2702beb053d558e92d47844b10 languageName: node linkType: hard @@ -8874,6 +9093,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.0": + version: 4.0.1 + resolution: "chokidar@npm:4.0.1" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10/62749d2173a60cc5632d6c6e0b7024f33aadce47b06d02e55ad03c7b8daaaf2fc85d4296c047473d04387fd992dab9384cc5263c70a3dc3018b7ebecfb5b5217 + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -8934,9 +9162,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.4.0 - resolution: "cjs-module-lexer@npm:1.4.0" - checksum: 10/b041096749792526120d8b8756929f8ef5dd4596502a0e1013f857e3027acd6091915fea77037921d70ee1a99988a100d994d3d3c2e323b04dd4c5ffd516cf13 + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10/6e830a1e00a34d416949bbc1924f3e8da65cef4a6a09e2b7fa35722e2d1c34bf378d3baca987b698d1cbc3eb83e44b044039b4e82755c96f30e0f03d1d227637 languageName: node linkType: hard @@ -10252,9 +10480,9 @@ __metadata: linkType: hard "css-shorthand-properties@npm:^1.1.1": - version: 1.1.1 - resolution: "css-shorthand-properties@npm:1.1.1" - checksum: 10/f8de209800a3a577a531dc155a6ff6d86fc2688c70c5c4f9fa20073531bab49caa80435d14f7ef7d130d104527c76bd4b2c03d768d4ff56c585727f3c280e24b + version: 1.1.2 + resolution: "css-shorthand-properties@npm:1.1.2" + checksum: 10/2b8eb967f2ebb27169d21e4f9ea77ef51d0f1944c4b4b03092d59a7f6a90f816fcb72f6015b21d4a691d84454e03eb008aacb86503e080d74099168375a25772 languageName: node linkType: hard @@ -10880,14 +11108,14 @@ __metadata: linkType: hard "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.6 - resolution: "debug@npm:4.3.6" + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/d3adb9af7d57a9e809a68f404490cf776122acca16e6359a2702c0f462e510e91f9765c07f707b8ab0d91e03bad57328f3256f5082631cefb5393d0394d50fb7 + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a languageName: node linkType: hard @@ -11508,7 +11736,7 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.0.5": +"dompurify@npm:^3.0.5 <3.1.7": version: 3.1.6 resolution: "dompurify@npm:3.1.6" checksum: 10/036844bc9b717b172ba27f5863b56f950289a05d8eebfb702d6953bbf80bd021e480ce4217bd084567186f2d0ada13358ce5556963492cfe402d774e8667f120 @@ -11634,10 +11862,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.13 - resolution: "electron-to-chromium@npm:1.5.13" - checksum: 10/b3de6dbca66e399eacd4f7e2b7603394c8949c9e724d838a45e092725005ff435aabfbf00f738e45451eb23147684f7f9251a5ed75619a539642b2bccea20b45 +"electron-to-chromium@npm:^1.5.28": + version: 1.5.31 + resolution: "electron-to-chromium@npm:1.5.31" + checksum: 10/b1fc54bb6eca9a8e6ed3870d4d2de74f080b4e6384f3bbeef8c9d8911cbe3ccb1f57fd2c8f800b871841836134f2597a7edcb2e4dc644b9281b95fd0323cde46 languageName: node linkType: hard @@ -11690,6 +11918,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -11904,11 +12139,11 @@ __metadata: linkType: hard "esbuild-wasm@npm:>=0.15.13": - version: 0.23.1 - resolution: "esbuild-wasm@npm:0.23.1" + version: 0.24.0 + resolution: "esbuild-wasm@npm:0.24.0" bin: esbuild: bin/esbuild - checksum: 10/30677e4ea96211d15f7b3780d70ecee564267767bc4465ba6539f57b565f2505ab930ca409d7b85695b5931fc37afb508f62c694c2e2092dd519efdecf62959b + checksum: 10/73353a7256a235d819652ad6dc41a4f6a68ea5b96f8ee926eb6eaf59b2d58ef163488505fe8e3850f6f20c18e9afe217120c36a7e1a35faa254891bc57cff472 languageName: node linkType: hard @@ -11993,33 +12228,33 @@ __metadata: linkType: hard "esbuild@npm:>=0.15.13": - version: 0.23.1 - resolution: "esbuild@npm:0.23.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.23.1" - "@esbuild/android-arm": "npm:0.23.1" - "@esbuild/android-arm64": "npm:0.23.1" - "@esbuild/android-x64": "npm:0.23.1" - "@esbuild/darwin-arm64": "npm:0.23.1" - "@esbuild/darwin-x64": "npm:0.23.1" - "@esbuild/freebsd-arm64": "npm:0.23.1" - "@esbuild/freebsd-x64": "npm:0.23.1" - "@esbuild/linux-arm": "npm:0.23.1" - "@esbuild/linux-arm64": "npm:0.23.1" - "@esbuild/linux-ia32": "npm:0.23.1" - "@esbuild/linux-loong64": "npm:0.23.1" - "@esbuild/linux-mips64el": "npm:0.23.1" - "@esbuild/linux-ppc64": "npm:0.23.1" - "@esbuild/linux-riscv64": "npm:0.23.1" - "@esbuild/linux-s390x": "npm:0.23.1" - "@esbuild/linux-x64": "npm:0.23.1" - "@esbuild/netbsd-x64": "npm:0.23.1" - "@esbuild/openbsd-arm64": "npm:0.23.1" - "@esbuild/openbsd-x64": "npm:0.23.1" - "@esbuild/sunos-x64": "npm:0.23.1" - "@esbuild/win32-arm64": "npm:0.23.1" - "@esbuild/win32-ia32": "npm:0.23.1" - "@esbuild/win32-x64": "npm:0.23.1" + version: 0.24.0 + resolution: "esbuild@npm:0.24.0" + dependencies: + "@esbuild/aix-ppc64": "npm:0.24.0" + "@esbuild/android-arm": "npm:0.24.0" + "@esbuild/android-arm64": "npm:0.24.0" + "@esbuild/android-x64": "npm:0.24.0" + "@esbuild/darwin-arm64": "npm:0.24.0" + "@esbuild/darwin-x64": "npm:0.24.0" + "@esbuild/freebsd-arm64": "npm:0.24.0" + "@esbuild/freebsd-x64": "npm:0.24.0" + "@esbuild/linux-arm": "npm:0.24.0" + "@esbuild/linux-arm64": "npm:0.24.0" + "@esbuild/linux-ia32": "npm:0.24.0" + "@esbuild/linux-loong64": "npm:0.24.0" + "@esbuild/linux-mips64el": "npm:0.24.0" + "@esbuild/linux-ppc64": "npm:0.24.0" + "@esbuild/linux-riscv64": "npm:0.24.0" + "@esbuild/linux-s390x": "npm:0.24.0" + "@esbuild/linux-x64": "npm:0.24.0" + "@esbuild/netbsd-x64": "npm:0.24.0" + "@esbuild/openbsd-arm64": "npm:0.24.0" + "@esbuild/openbsd-x64": "npm:0.24.0" + "@esbuild/sunos-x64": "npm:0.24.0" + "@esbuild/win32-arm64": "npm:0.24.0" + "@esbuild/win32-ia32": "npm:0.24.0" + "@esbuild/win32-x64": "npm:0.24.0" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -12071,7 +12306,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/f55fbd0bfb0f86ce67a6d2c6f6780729d536c330999ecb9f5a38d578fb9fda820acbbc67d6d1d377eed8fed50fc38f14ff9cb014f86dafab94269a7fb2177018 + checksum: 10/500f83a1216d6548053007b85c070d8293395db344605b17418c6cf1217e5e8d338fa77fc8af27c23faa121c5528e5b0004d46d3a0cdeb87d48f1b5fa0164bc5 languageName: node linkType: hard @@ -12235,10 +12470,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard @@ -12318,14 +12553,14 @@ __metadata: linkType: hard "eslint-module-utils@npm:^2.7.3": - version: 2.8.2 - resolution: "eslint-module-utils@npm:2.8.2" + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10/d86a8c674717258ff599a82506b9b03626143a6c2d71b0b9ddb1afde4df0cbb9417340dc93c46398294a59c76cb7f3de911fa0199973dcdf4ffc3f8ecad09741 + checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee languageName: node linkType: hard @@ -12422,12 +12657,12 @@ __metadata: linkType: hard "eslint-scope@npm:^8.0.0": - version: 8.0.2 - resolution: "eslint-scope@npm:8.0.2" + version: 8.1.0 + resolution: "eslint-scope@npm:8.1.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/d17c2e1ff4d3a98911414a954531078db912e2747d6da8ea4cafd16d0526e32086c676ce9aeaffb3ca0ff695fc951ac3169d7f08a0b42962db683dff126cc95b + checksum: 10/4c34a12fbeb0677822a9e93e81f2027e39e6f27557c17bc1e5ff76debbd41e748c3673517561792bda9e276245f89fbfd9b0b24fcec3b33a04ee2196729b3489 languageName: node linkType: hard @@ -12708,41 +12943,41 @@ __metadata: linkType: hard "express@npm:^4.17.3": - version: 4.19.2 - resolution: "express@npm:4.19.2" + version: 4.21.0 + resolution: "express@npm:4.21.0" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" cookie: "npm:0.6.0" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" + finalhandler: "npm:1.3.1" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.10" proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" + qs: "npm:6.13.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/3fcd792536f802c059789ef48db3851b87e78fba103423e524144d79af37da7952a2b8d4e1a007f423329c7377d686d9476ac42e7d9ea413b80345d495e30a3a + checksum: 10/3b1ee5bc5b1bd996f688702519cebc9b63a24e506965f6e1773268238cfa2c24ffdb38cc3fcb4fde66f77de1c0bebd9ee058dad06bb9c6f084b525f3c09164d3 languageName: node linkType: hard @@ -12882,9 +13117,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 10/e8ee4712270de0d29eb0fbf41ffad0ac80952e8797be760e8bb62c4707f08f50a86fe2d7829681ca133c07d6eb4b4a75389a5fc36674c5b254a3ac0891a68fc7 + version: 3.0.2 + resolution: "fast-uri@npm:3.0.2" + checksum: 10/99224f0198e24a4072b9a8a25fc5fa553aa0153e00d29d41272096a6d97be417c9faa5978682868cbba46b09066dc9348563c7244057f3818067e7737db153b2 languageName: node linkType: hard @@ -13034,18 +13269,18 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" statuses: "npm:2.0.1" unpipe: "npm:~1.0.0" - checksum: 10/635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 + checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b languageName: node linkType: hard @@ -13197,12 +13432,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.4, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.15.0, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 10/70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 + checksum: 10/e3ab42d1097e90d28b913903841e6779eb969b62a64706a3eb983e894a5db000fbd89296f45f08885a0e54cd558ef62e81be1165da9be25a6c44920da10f424c languageName: node linkType: hard @@ -13465,7 +13700,7 @@ __metadata: "@angular/router": "npm:18.0.3" "@commitlint/cli": "npm:18.6.1" "@commitlint/config-conventional": "npm:18.6.1" - "@fundamental-styles/cx": "npm:0.37.8" + "@fundamental-styles/cx": "npm:0.38.0" "@jsdevtools/npm-publish": "npm:3.0.1" "@nx/angular": "npm:19.2.3" "@nx/devkit": "npm:19.2.3" @@ -13476,7 +13711,7 @@ __metadata: "@nx/plugin": "npm:19.2.3" "@nx/workspace": "npm:19.2.3" "@sap-theming/theming-base-content": "npm:11.18.0" - "@sap-ui/common-css": "npm:0.37.8" + "@sap-ui/common-css": "npm:0.38.0" "@schematics/angular": "npm:18.0.4" "@stackblitz/sdk": "npm:1.9.0" "@swc-node/register": "npm:1.9.2" @@ -13522,7 +13757,7 @@ __metadata: fast-glob: "npm:3.3.1" focus-trap: "npm:7.1.0" focus-visible: "npm:5.2.1" - fundamental-styles: "npm:0.37.8" + fundamental-styles: "npm:0.38.0" fuse.js: "npm:7.0.0" highlight.js: "npm:11.7.0" husky: "npm:8.0.2" @@ -13569,13 +13804,13 @@ __metadata: languageName: unknown linkType: soft -"fundamental-styles@npm:0.37.8": - version: 0.37.8 - resolution: "fundamental-styles@npm:0.37.8" +"fundamental-styles@npm:0.38.0": + version: 0.38.0 + resolution: "fundamental-styles@npm:0.38.0" peerDependencies: "@sap-theming/theming-base-content": ^11.18.0 - "@sap-ui/common-css": 0.37.8 - checksum: 10/d387a44e7faac9f5f963ef8f1d2f01b01a9263797b78689b63501260c0f287364db07c37b1650cd2fe855826914471b8c83d9ea4651f87ae6883b574b4b97f49 + "@sap-ui/common-css": 0.38.0 + checksum: 10/5df9e1bc5590ba9af9cdb9c4f6d32507267f4d5f9c985535aac23bddcff32bf23707a64ed367f0b16f80134775afcd432f03fe6d12ed654d64a32d7517f40e7e languageName: node linkType: hard @@ -16596,12 +16831,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.0, launch-editor@npm:^2.6.1": - version: 2.8.1 - resolution: "launch-editor@npm:2.8.1" + version: 2.9.1 + resolution: "launch-editor@npm:2.9.1" dependencies: picocolors: "npm:^1.0.0" shell-quote: "npm:^1.8.1" - checksum: 10/69adfc913c066b0bcd685103907525789db6af3585cdc5f8c1172f0fcebe2c4ea1cff1108f76e9c591c00134329a5fb29e5911e9c0c347618a5300978b6bb767 + checksum: 10/69eb1e69db4f0fcd34a42bd47e9adbad27cb5413408fcc746eb7b016128ce19d71a30629534b17aa5886488936aaa959bf7dab17307ad5ed6c7247a0d145be18 languageName: node linkType: hard @@ -17292,9 +17527,9 @@ __metadata: linkType: hard "loglevel@npm:^1.6.0": - version: 1.9.1 - resolution: "loglevel@npm:1.9.1" - checksum: 10/863cbbcddf850a937482c604e2d11586574a5110b746bb49c7cc04739e01f6035f6db841d25377106dd330bca7142d74995f15a97c5f3ea0af86d9472d4a99f4 + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10/6153d8db308323f7ee20130bc40309e7a976c30a10379d8666b596d9c6441965c3e074c8d7ee3347fe5cfc059c0375b6f3e8a10b93d5b813cc5547f5aa412a29 languageName: node linkType: hard @@ -17611,14 +17846,14 @@ __metadata: linkType: hard "memfs@npm:^4.6.0": - version: 4.11.1 - resolution: "memfs@npm:4.11.1" + version: 4.12.0 + resolution: "memfs@npm:4.12.0" dependencies: "@jsonjoy.com/json-pack": "npm:^1.0.3" "@jsonjoy.com/util": "npm:^1.3.0" tree-dump: "npm:^1.0.1" tslib: "npm:^2.0.0" - checksum: 10/460b11266efb66291da5f117060123cc4ca024c35c6aae6c406be208885eb7b9cf09dd76cec70fcfe93e99128e0cf5abe161a9832a3979403c4bae131b30c12d + checksum: 10/02718be80ebc03ca47eebba59b60865b0c2579e3fbebd71e4e45e171f9dbf6ea77e836257926908618e82881ef01e3326a89112b408e8fb379ca30aec4eb79e6 languageName: node linkType: hard @@ -17648,10 +17883,10 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10/5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10/52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 languageName: node linkType: hard @@ -17670,8 +17905,8 @@ __metadata: linkType: hard "mermaid@npm:^10.6.0": - version: 10.9.1 - resolution: "mermaid@npm:10.9.1" + version: 10.9.2 + resolution: "mermaid@npm:10.9.2" dependencies: "@braintree/sanitize-url": "npm:^6.0.1" "@types/d3-scale": "npm:^4.0.3" @@ -17682,7 +17917,7 @@ __metadata: d3-sankey: "npm:^0.12.3" dagre-d3-es: "npm:7.0.10" dayjs: "npm:^1.11.7" - dompurify: "npm:^3.0.5" + dompurify: "npm:^3.0.5 <3.1.7" elkjs: "npm:^0.9.0" katex: "npm:^0.16.9" khroma: "npm:^2.0.0" @@ -17693,7 +17928,7 @@ __metadata: ts-dedent: "npm:^2.2.0" uuid: "npm:^9.0.0" web-worker: "npm:^1.2.0" - checksum: 10/13f90ec5995d994c5d6433173f973cc954294be8f90b9c05e32c43b5f0b68b83156de219c9a27396fad293e35ef9003f1dc347bc78543cd6975ca3742df7c261 + checksum: 10/e02fb2e6f61e8566e8369206e38a65c637e0a8ec8b56f88700108b10e477901fda34213bc9894418069930a538b889ecd72e691082e1340bdf15491cf805a472 languageName: node linkType: hard @@ -18386,7 +18621,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -18723,13 +18958,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.3.0": - version: 4.8.1 - resolution: "node-gyp-build@npm:4.8.1" + version: 4.8.2 + resolution: "node-gyp-build@npm:4.8.2" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10/b9297770f96a92e5f2b854f3fd5e4bd418df81d7785a81ab60cec5cf2e5e72dc2c3319808978adc572cfa3885e6b12338cb5f4034bed2cab35f0d76a4b75ccdf + checksum: 10/e3a365eed7a2d950864a1daa34527588c16fe43ae189d0aeb8fd1dfec91ba42a0e1b499322bff86c2832029fec4f5901bf26e32005e1e17a781dcd5177b6a657 languageName: node linkType: hard @@ -19149,9 +19384,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.2": - version: 2.2.12 - resolution: "nwsapi@npm:2.2.12" - checksum: 10/172119e9ef492467ebfb337f9b5fd12a94d2b519377cde3f6ec2f74a86f6d5c00ef3873539bed7142f908ffca4e35383179be2319d04a563071d146bfa3f1673 + version: 2.2.13 + resolution: "nwsapi@npm:2.2.13" + checksum: 10/f7f30a236f2ee513ea8042f1a987481dc2b900167c47f7163882f0fcfe7ccb57b5c8daaf2c91008dc20a204fcd79e050aee25001433ad99990bbed5a8c74121c languageName: node linkType: hard @@ -19505,9 +19740,9 @@ __metadata: linkType: hard "ordered-binary@npm:^1.4.1": - version: 1.5.1 - resolution: "ordered-binary@npm:1.5.1" - checksum: 10/9b407e20ba90d4fc44938746295b3d301dcfa26983a88482e028e96479cd30dca6da33c052070bef034aa89280ff2befb75bbe4663f1f8210a12ce5586de2290 + version: 1.5.2 + resolution: "ordered-binary@npm:1.5.2" + checksum: 10/6e39bd04fee9e1befdd573c342b31e22a1cb588da4c0b3632f5d5861c45d1ec992328839b347a495f1f25be1ec7b42167abf2013b883363e9ed1d40339ac98af languageName: node linkType: hard @@ -19723,9 +19958,9 @@ __metadata: linkType: hard "package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10/ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 languageName: node linkType: hard @@ -20018,10 +20253,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10/701c99e1f08e3400bea4d701cf6f03517474bb1b608da71c78b1eb261415b645c5670dfae49808c89e12cea2dccd113b069f040a80de012da0400191c6dbd1c8 +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10/894e31f1b20e592732a87db61fff5b95c892a3fe430f9ab18455ebe69ee88ef86f8eb49912e261f9926fc53da9f93b46521523e33aefd9cb0a7b0d85d7096006 languageName: node linkType: hard @@ -20053,9 +20288,9 @@ __metadata: linkType: hard "peek-readable@npm:^5.1.3": - version: 5.1.4 - resolution: "peek-readable@npm:5.1.4" - checksum: 10/ca95a75ad12b4f94ee482e6f0c7517211cd063d319b62e39ba2741c5ce87b7dfbc1dd3dea7979abe499d46fbbe51efbc8976daca553729ca7ed535569ac6a24d + version: 5.2.0 + resolution: "peek-readable@npm:5.2.0" + checksum: 10/10efa3704f76cb7c1c0614653f9f4d0c30409bb432bb45c9012be51868956e6fde026590b1f13a1bfa5ca3984c99fe3e21491aa6be91688cb1fd1904d09c3536 languageName: node linkType: hard @@ -20073,10 +20308,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb languageName: node linkType: hard @@ -20167,14 +20402,14 @@ __metadata: linkType: hard "piscina@npm:^4.3.0, piscina@npm:^4.4.0": - version: 4.6.1 - resolution: "piscina@npm:4.6.1" + version: 4.7.0 + resolution: "piscina@npm:4.7.0" dependencies: - nice-napi: "npm:^1.0.2" + "@napi-rs/nice": "npm:^1.0.1" dependenciesMeta: - nice-napi: + "@napi-rs/nice": optional: true - checksum: 10/2fa88a92c030667a85c793253b57faf17ef043f0a1fa14011a80c5784bd8773876f0b12da11fd41da8f9974fe3bc84987c2f016c406c58c92fcb6164b63ad971 + checksum: 10/d4a7dc3d9ae849248d1432be87ce8d5823ef0682f01b43f0255a87a03d660bb46d3ae8c5fbe86306ded8baedbb57fe01ba888c9638f83883742423a718085e23 languageName: node linkType: hard @@ -21032,13 +21267,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.14, postcss@npm:^8.4.23, postcss@npm:^8.4.24, postcss@npm:^8.4.31, postcss@npm:^8.4.33, postcss@npm:^8.4.38": - version: 8.4.41 - resolution: "postcss@npm:8.4.41" + version: 8.4.47 + resolution: "postcss@npm:8.4.47" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10/6e6176c2407eff60493ca60a706c6b7def20a722c3adda94ea1ece38345eb99964191336fd62b62652279cec6938e79e0b1e1d477142c8d3516e7a725a74ee37 + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 languageName: node linkType: hard @@ -21246,12 +21481,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: 10/e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + checksum: 10/e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f languageName: node linkType: hard @@ -21296,16 +21531,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10/5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e - languageName: node - linkType: hard - -"qs@npm:^6.4.0": +"qs@npm:6.13.0, qs@npm:^6.4.0": version: 6.13.0 resolution: "qs@npm:6.13.0" dependencies: @@ -21582,6 +21808,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.0.1 + resolution: "readdirp@npm:4.0.1" + checksum: 10/f8a2d3308c9dd19d9da4fc7f19a02fc057259a80014949d8f3d98f4e6042896119fb96eb3f3e6a743747d12f0bf781b771902b0b03aba58f884589c50968fad4 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -21618,11 +21851,11 @@ __metadata: linkType: hard "regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" dependencies: regenerate: "npm:^1.4.2" - checksum: 10/b855152efdcca0ecc37ceb0cb6647a544344555fc293af3b57191b918e1bc9c95ee404a9a64a1d692bf66d45850942c29d93f2740c0d1980d3a8ea2ca63b184e + checksum: 10/9150eae6fe04a8c4f2ff06077396a86a98e224c8afad8344b1b656448e89e84edcd527e4b03aa5476774129eb6ad328ed684f9c1459794a935ec0cc17ce14329 languageName: node linkType: hard @@ -21975,26 +22208,26 @@ __metadata: linkType: hard "rollup@npm:^4.13.0, rollup@npm:^4.18.0": - version: 4.21.1 - resolution: "rollup@npm:4.21.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.21.1" - "@rollup/rollup-android-arm64": "npm:4.21.1" - "@rollup/rollup-darwin-arm64": "npm:4.21.1" - "@rollup/rollup-darwin-x64": "npm:4.21.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.21.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.21.1" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.21.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.21.1" - "@rollup/rollup-linux-x64-musl": "npm:4.21.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.21.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.21.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.21.1" - "@types/estree": "npm:1.0.5" + version: 4.24.0 + resolution: "rollup@npm:4.24.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.24.0" + "@rollup/rollup-android-arm64": "npm:4.24.0" + "@rollup/rollup-darwin-arm64": "npm:4.24.0" + "@rollup/rollup-darwin-x64": "npm:4.24.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.24.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.24.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.24.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.24.0" + "@rollup/rollup-linux-x64-musl": "npm:4.24.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.24.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.24.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.24.0" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -22033,7 +22266,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/cbf862d725e217ed6c0dcb9f49aca057bb75488d2a39e97b4ab2687fd95fbd6ed81663510e2f8e9ce810154fef8d2e6a5bcd2cdb0624a31100db0389feb0c474 + checksum: 10/291dce8f180628a73d6749119a3e50aa917c416075302bc6f6ac655affc7f0ce9d7f025bef7318d424d0c5623dcb83e360f9ea0125273b6a2285c232172800cc languageName: node linkType: hard @@ -22212,15 +22445,15 @@ __metadata: linkType: hard "sass@npm:^1.42.1, sass@npm:^1.69.5": - version: 1.77.8 - resolution: "sass@npm:1.77.8" + version: 1.79.4 + resolution: "sass@npm:1.79.4" dependencies: - chokidar: "npm:>=3.0.0 <4.0.0" + chokidar: "npm:^4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 10/4bf6e3007fef62dd6dfc657c89c2890872a6b5dc43e2dc4d61bcf9ae1bdc2dd95b59454a3cbd3c8363c98b673b028e1578b26135190d0f2a8a184a38ab41e99b + checksum: 10/82e2ee5c2e46c96818454c7d97bcfb5b36c1c27de3b1e705adad7a49a8b32226c5254cc4c8804f45db2b6aa018848973177274c2b1137d4caf7abb5cb7bbf8b9 languageName: node linkType: hard @@ -22404,9 +22637,9 @@ __metadata: languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" dependencies: debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -22421,7 +22654,7 @@ __metadata: on-finished: "npm:2.4.1" range-parser: "npm:~1.2.1" statuses: "npm:2.0.1" - checksum: 10/ec66c0ad109680ad8141d507677cfd8b4e40b9559de23191871803ed241718e99026faa46c398dcfb9250676076573bd6bfe5d0ec347f88f4b7b8533d1d391cb + checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0 languageName: node linkType: hard @@ -22469,15 +22702,15 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 10/699b2d4c29807a51d9b5e0f24955346911437aebb0178b3c4833ad30d3eca93385ff9927254f5c16da345903cad39d9cd4a532198c95a5129cc4ed43911b15a4 + send: "npm:0.19.0" + checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 languageName: node linkType: hard @@ -22761,10 +22994,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 languageName: node linkType: hard @@ -23577,8 +23810,8 @@ __metadata: linkType: hard "terser@npm:^5.26.0": - version: 5.31.6 - resolution: "terser@npm:5.31.6" + version: 5.34.1 + resolution: "terser@npm:5.34.1" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -23586,7 +23819,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/78057c58025151c9bdad82a050f0b51175f9fe3117d8ee369ca7effe038cdd540da2fd5985a4f8ee08dba5616e7911e1392d40670698ff42a49fec338d369e80 + checksum: 10/4389f39b5b841e2a7795ee733b54bf8fc44f8784a78c213dae32c7e6adc66c3bb258ebdcbacb8e7f1fa08fceb20bfc4ce4f7666d42bbfc29ab71126e89614c34 languageName: node linkType: hard @@ -24283,12 +24516,12 @@ __metadata: linkType: hard "typescript@npm:>=3 < 6, typescript@npm:^5.0.4, typescript@npm:^5.4.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f + checksum: 10/f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b languageName: node linkType: hard @@ -24303,12 +24536,12 @@ __metadata: linkType: hard "typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.4.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/746fdd0865c5ce4f15e494c57ede03a9e12ede59cfdb40da3a281807853fe63b00ef1c912d7222143499aa82f18b8b472baa1830df8804746d09b55f6cf5b1cc + checksum: 10/8bfc7ca0d9feca4c3fcbd6c70741abfcd714197d6448e68225ae71e462447d904d3bfba49759a8fbe4956d87f054e2d346833c8349c222daa594a2626d4e1be8 languageName: node linkType: hard @@ -24320,18 +24553,20 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.1": - version: 1.0.38 - resolution: "ua-parser-js@npm:1.0.38" - checksum: 10/f2345e9bd0f9c5f85bcaa434535fae88f4bb891538e568106f0225b2c2937fbfbeb5782bd22320d07b6b3d68b350b8861574c1d7af072ff9b2362fb72d326fd9 + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 10/dd4026b6ece8a34a0d39b6de5542154c4506077d8def8647a300a29e1b3ffa0e23f5c8eeeb8101df6162b7b3eb3597d0b4adb031ae6104cbdb730d6ebc07f3c0 languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.19.2 - resolution: "uglify-js@npm:3.19.2" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 10/8b0af1fa5260e7f8bc3e9a1e08ae05023b7c96eeb8965e27f29724597389d4e703d4aa6f66e6cd87a14a84e431df73a358ee58c0afce6b615b40cc95fcbf4ec6 + checksum: 10/6b9639c1985d24580b01bb0ab68e78de310d38eeba7db45bec7850ab4093d8ee464d80ccfaceda9c68d1c366efbee28573b52f95e69ac792354c145acd380b11 languageName: node linkType: hard @@ -24388,9 +24623,9 @@ __metadata: linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10/39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 10/3c3dabdb1d22aef4904399f9e810d0b71c0b12b3815169d96fac97e56d5642840c6071cf709adcace2252bc6bb80242396c2ec74b37224eb015c5f7aca40bad7 languageName: node linkType: hard @@ -24405,9 +24640,9 @@ __metadata: linkType: hard "unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10/06661bc8aba2a60c7733a7044f3e13085808939ad17924ffd4f5222a650f88009eb7c09481dc9c15cfc593d4ad99bd1cde8d54042733b335672591a81c52601c + version: 2.2.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" + checksum: 10/9fd53c657aefe5d3cb8208931b4c34fbdb30bb5aa9a6c6bf744e2f3036f00b8889eeaf30cb55a873b76b6ee8b5801ea770e1c49b3352141309f58f0ebb3011d8 languageName: node linkType: hard @@ -24524,16 +24759,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c + checksum: 10/7678dd8609750588d01aa7460e8eddf2ff9d16c2a52fb1811190e0d056390f1fdffd94db3cf8fb209cf634ab4fa9407886338711c71cc6ccade5eeb22b093734 languageName: node linkType: hard @@ -25313,8 +25548,8 @@ __metadata: linkType: hard "webpack@npm:^5.80.0": - version: 5.94.0 - resolution: "webpack@npm:5.94.0" + version: 5.95.0 + resolution: "webpack@npm:5.95.0" dependencies: "@types/estree": "npm:^1.0.5" "@webassemblyjs/ast": "npm:^1.12.1" @@ -25344,7 +25579,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/648449c5fbbb0839814116e3b2b044ac6c75a7ba272435155ddeb1e64dfaa2f8079be3adfbb691f648b69900756ce0f6fb73beab0ced3cf5e0fd46868b4593a6 + checksum: 10/0377ad3a550b041f26237c96fb55754625b0ce6bae83c1c2447e3262ad056b0b0ad770dcbb92b59f188e9a2bd56155ce910add17dcf023cfbe78bdec774380c1 languageName: node linkType: hard