diff --git a/.run/Watch Affected Tests.run.xml b/.run/Watch Affected Tests.run.xml new file mode 100644 index 000000000..4a5f607bb --- /dev/null +++ b/.run/Watch Affected Tests.run.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.run/serve demo.run.xml b/.run/serve demo.run.xml new file mode 100644 index 000000000..649b223b6 --- /dev/null +++ b/.run/serve demo.run.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/apps/chill-viking-ng-libs/src/app/app.component.html b/apps/chill-viking-ng-libs/src/app/app.component.html deleted file mode 100644 index 673afc13e..000000000 --- a/apps/chill-viking-ng-libs/src/app/app.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - -

Welcome {{ header.title$ | async }}

-
-

content

- -

Footer content

-

© 2022 {{ footer.copyrightHolder }}

-
-
diff --git a/apps/chill-viking-ng-libs/src/app/app.component.scss b/apps/chill-viking-ng-libs/src/app/app.component.scss deleted file mode 100644 index 2b8f57330..000000000 --- a/apps/chill-viking-ng-libs/src/app/app.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -h1 { - font-weight: bold; -} - -.copy { - background: pink; - color: purple; -} diff --git a/apps/chill-viking-ng-libs/src/app/app.component.spec.ts b/apps/chill-viking-ng-libs/src/app/app.component.spec.ts deleted file mode 100644 index 6e73f1026..000000000 --- a/apps/chill-viking-ng-libs/src/app/app.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { ChillVikingLayoutComponent } from '@chill-viking/layout'; -import { MockComponent } from 'ng-mocks'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [AppComponent, MockComponent(ChillVikingLayoutComponent)], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'chill-viking-ng-libs'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('chill-viking-ng-libs'); - }); -}); diff --git a/apps/chill-viking-ng-libs/src/app/app.component.ts b/apps/chill-viking-ng-libs/src/app/app.component.ts deleted file mode 100644 index d082f0857..000000000 --- a/apps/chill-viking-ng-libs/src/app/app.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component } from '@angular/core'; -import { LayoutContext } from '@chill-viking/layout'; -import { of } from 'rxjs'; - -@Component({ - selector: 'ng-libs-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], -}) -export class AppComponent { - title = 'chill-viking-ng-libs'; - data: LayoutContext = { - header: { - title$: of(this.title), - }, - footer: { - copyrightHolder: 'chill-viking', - }, - }; -} diff --git a/apps/chill-viking-ng-libs/src/app/app.module.ts b/apps/chill-viking-ng-libs/src/app/app.module.ts deleted file mode 100644 index 96ffda4cf..000000000 --- a/apps/chill-viking-ng-libs/src/app/app.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { ChillVikingLayoutModule } from '@chill-viking/layout'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, ChillVikingLayoutModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.scss b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.scss new file mode 100644 index 000000000..4d03b79ec --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.scss @@ -0,0 +1,61 @@ +.cta-btn { + padding: 10px 20px; + font-size: 16px; + border-radius: 4px; + cursor: pointer; + display: flex; + align-items: center; + font-weight: bold; + + mat-icon { + margin-right: 10px; + } + + &.primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; + + &:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; + } + &:active { + color: #fff; + background-color: #204d74; + border-color: #122b40; + } + &:disabled { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; + cursor: not-allowed; + opacity: 0.65; + } + } + + &.secondary { + color: #333; + background-color: #fff; + border-color: #ccc; + + &:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; + } + &:active { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; + } + &:disabled { + color: #333; + background-color: #fff; + border-color: #ccc; + cursor: not-allowed; + opacity: 0.65; + } + } +} diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.spec.ts b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.spec.ts new file mode 100644 index 000000000..e042f9326 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { first } from 'rxjs'; + +import { ChillVikingCallToActionComponent } from './chill-viking-call-to-action.component'; + +describe('ChillVikingCallToActionComponent', () => { + let component: ChillVikingCallToActionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChillVikingCallToActionComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ChillVikingCallToActionComponent); + component = fixture.componentInstance; + }); + + it('should create', () => { + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); + + it('should emit to clicked when button clicked', (done) => { + let usedClick = false; + component.clicked.pipe(first()).subscribe(() => { + expect(usedClick).toBeTruthy(); + done(); + }); + + usedClick = true; + const button = fixture.nativeElement.querySelector('button'); + expect(button).toBeInstanceOf(HTMLButtonElement); + button.click(); + }); + + it('should default to primary', () => { + expect(component.type).toEqual('primary'); + }); + + describe('when type is primary', () => { + beforeEach(() => { + fixture.detectChanges(); + }); + + it('should use primary class for button', () => { + const button = fixture.nativeElement.querySelector( + 'button.cta-btn.primary:not(secondary)', + ); + expect(button).toBeInstanceOf(HTMLButtonElement); + }); + }); + + describe('when type is secondary', () => { + beforeEach(() => { + component.type = 'secondary'; + fixture.detectChanges(); + }); + + it('should use secondary class for button', () => { + const button = fixture.nativeElement.querySelector( + 'button.cta-btn.secondary:not(primary)', + ); + expect(button).toBeInstanceOf(HTMLButtonElement); + }); + }); +}); diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.ts b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.ts new file mode 100644 index 000000000..98a20f122 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-call-to-action/chill-viking-call-to-action.component.ts @@ -0,0 +1,34 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, + ViewEncapsulation, +} from '@angular/core'; + +@Component({ + selector: 'ng-libs-cta', + standalone: true, + imports: [CommonModule], + template: ` + + `, + styleUrls: ['./chill-viking-call-to-action.component.scss'], + encapsulation: ViewEncapsulation.Emulated, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ChillVikingCallToActionComponent { + @Input() + type: 'primary' | 'secondary' = 'primary'; + + @Output() + clicked = new EventEmitter(); + + buttonClick(): void { + this.clicked.next({}); + } +} diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.html b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.html new file mode 100644 index 000000000..e815dd68b --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.html @@ -0,0 +1,11 @@ +
+
+ Chill Viking +
+
+

{{ title$ | async }}

+ +

{{ subTitle }}

+
+
+
diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.scss b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.scss new file mode 100644 index 000000000..fef8d5af4 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.scss @@ -0,0 +1,29 @@ +.header-container { + display: flex; + flex-direction: row; + padding: 15px 5px; +} + +.header-image { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + + & img { + max-width: 90%; + } +} + +.header-title { + flex: 4; + display: flex; + flex-direction: column; + justify-content: center; +} + +@media (max-width: 600px) { + .header-container { + flex-direction: column; + } +} diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.spec.ts b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.spec.ts new file mode 100644 index 000000000..1aac5e053 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.spec.ts @@ -0,0 +1,80 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { BehaviorSubject, of } from 'rxjs'; + +import { ChillVikingHeaderComponent } from './chill-viking-header.component'; + +describe('ChillVikingHeaderComponent', () => { + let component: ChillVikingHeaderComponent; + let fixture: ComponentFixture; + let subTitleSubject: BehaviorSubject; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChillVikingHeaderComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ChillVikingHeaderComponent); + component = fixture.componentInstance; + component.context = { + title$: of('Hello'), + }; + subTitleSubject = new BehaviorSubject('World'); + component.subTitle$ = subTitleSubject.asObservable(); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('OnInit', () => { + it('should throw error when context not set', () => { + component.context = undefined; + expect(() => component.ngOnInit()).toThrowError(); + }); + }); + + describe('elements', () => { + describe('header-image', () => { + it('should have expected image', () => { + const element = + fixture.nativeElement.querySelector('.header-image img'); + expect(element).toBeInstanceOf(HTMLImageElement); + const img: HTMLImageElement = element; + expect(img.src).toContain('/assets/viking.svg'); + expect(img.alt).toEqual('Chill Viking'); + }); + }); + + describe('header-title', () => { + let div: HTMLDivElement; + + beforeEach(() => { + const element = fixture.nativeElement.querySelector('.header-title'); + expect(element).toBeInstanceOf(HTMLDivElement); + div = element; + }); + + it('should display title in h1 element', () => { + const h1 = div.querySelector('h1'); + expect(h1).toBeInstanceOf(HTMLHeadingElement); + expect(h1?.textContent).toEqual('Hello'); + }); + + it('should display subTitle in h2 element', () => { + const h2 = div.querySelector('h2'); + expect(h2).toBeInstanceOf(HTMLHeadingElement); + expect(h2?.textContent).toEqual('World'); + }); + + describe('when subtitle$ not set', () => { + it('should not render h2', () => { + subTitleSubject.next(''); + fixture.detectChanges(); + const h2 = fixture.nativeElement.querySelector('.header-title h2'); + expect(h2).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.ts b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.ts new file mode 100644 index 000000000..f63851235 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/chill-viking-header/chill-viking-header.component.ts @@ -0,0 +1,37 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + Input, + OnInit, + ViewEncapsulation, +} from '@angular/core'; +import { LayoutHeaderContext } from '@chill-viking/layout'; +import { Observable, of } from 'rxjs'; + +@Component({ + selector: 'ng-libs-header', + standalone: true, + imports: [CommonModule], + templateUrl: './chill-viking-header.component.html', + styleUrls: ['./chill-viking-header.component.scss'], + encapsulation: ViewEncapsulation.Emulated, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ChillVikingHeaderComponent implements OnInit { + @Input() + context: LayoutHeaderContext | undefined; + + @Input() + subTitle$: Observable | undefined; + + title$: Observable | undefined; + + ngOnInit(): void { + if (!this.context) throw new Error('[context] not defined to drive header'); + + this.title$ = this.context?.title$; + + this.subTitle$ = this.subTitle$ ? this.subTitle$ : of(''); + } +} diff --git a/apps/chill-viking-ng-libs/src/app/features/features.ts b/apps/chill-viking-ng-libs/src/app/features/features.ts new file mode 100644 index 000000000..a9c9cb7f2 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/features/features.ts @@ -0,0 +1,2 @@ +export * from './chill-viking-call-to-action/chill-viking-call-to-action.component'; +export * from './chill-viking-header/chill-viking-header.component'; diff --git a/apps/chill-viking-ng-libs/src/app/pages/home/home.component.html b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.html new file mode 100644 index 000000000..5fc71a94d --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.html @@ -0,0 +1,39 @@ + + + + +
+
+

Overview

+
+
+ + Are you tired of tackling common Angular development challenges on your + own? + + +

+ Chill Viking, more specifically this repository, is here to help! Using + this repository, we aim to create npm packages that solve problems and + make your life easier. +

+

+ Check out our offerings and see how we can help you become an Angular + pro. +

+
+ + + open_in_new + Visit Repository + + + open_in_new + Ask Us a Question + +
+
+
+
diff --git a/apps/chill-viking-ng-libs/src/app/pages/home/home.component.scss b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.scss new file mode 100644 index 000000000..e1d0d8dd9 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.scss @@ -0,0 +1,49 @@ +.cv-layout-container { + padding: 0 15px; + + section { + min-height: 80vh; + display: flex; + flex-direction: column; + font-size: 1.5em; + + .cta { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + + ng-libs-cta { + margin-bottom: 15px; + } + + mat-icon { + margin-right: 10px; + } + } + + &#overview { + align-items: center; + justify-content: space-evenly; + + .question { + font-weight: bold; + } + + img { + max-width: 90%; + } + } + } +} + +// styles to move into @chill-viking/layout +cv-layout .cv-layout { + max-width: 100vw; + width: auto; // max-width to replace currently set width. + + .cv-layout-container { + max-width: 100%; + width: auto; // max-width to replace currently set width. + } +} diff --git a/apps/chill-viking-ng-libs/src/app/pages/home/home.component.spec.ts b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.spec.ts new file mode 100644 index 000000000..35c6d1e83 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MockComponent, MockProvider } from 'ng-mocks'; +import { ChillVikingCallToActionComponent } from '../../features/chill-viking-call-to-action/chill-viking-call-to-action.component'; +import { ChillVikingHeaderComponent } from '../../features/chill-viking-header/chill-viking-header.component'; +import { WindowRouterService } from '../../window-router.service'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + let router: WindowRouterService; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + HomeComponent, + MockComponent(ChillVikingHeaderComponent), + MockComponent(ChillVikingCallToActionComponent), + ], + providers: [MockProvider(WindowRouterService)], + }).compileComponents(); + + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + router = TestBed.inject(WindowRouterService); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('goToPackages', () => { + it('should navigate to /packages', () => { + router.navigate = jest.fn(); + + component.goToPackages(); + + expect(router.navigate).toHaveBeenCalledWith(['packages']); + }); + }); + + describe('goToRepository', () => { + it('should open new window to repository', () => { + router.open = jest.fn(); + + component.goToRepository(); + + expect(router.open).toHaveBeenCalledWith( + 'https://github.com/chill-viking/ng-libs', + ); + }); + }); + + describe('goToDiscussions', () => { + it('should open new window to discussions', () => { + router.open = jest.fn(); + + component.goToDiscussions(); + + expect(router.open).toHaveBeenCalledWith( + 'https://github.com/orgs/chill-viking/discussions', + ); + }); + }); +}); diff --git a/apps/chill-viking-ng-libs/src/app/pages/home/home.component.ts b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.ts new file mode 100644 index 000000000..f020dfa2f --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/pages/home/home.component.ts @@ -0,0 +1,53 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + ViewEncapsulation, +} from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { ChillVikingLayoutModule, LayoutContext } from '@chill-viking/layout'; +import { of } from 'rxjs'; +import { ChillVikingCallToActionComponent } from '../../features/chill-viking-call-to-action/chill-viking-call-to-action.component'; +import { ChillVikingHeaderComponent } from '../../features/chill-viking-header/chill-viking-header.component'; +import { WindowRouterService } from '../../window-router.service'; + +@Component({ + selector: 'ng-libs-home', + standalone: true, + imports: [ + CommonModule, + ChillVikingLayoutModule, + ChillVikingHeaderComponent, + ChillVikingCallToActionComponent, + MatIconModule, + ], + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class HomeComponent { + context: LayoutContext = { + header: { + title$: of('Chill Viking | ng-libs'), + }, + }; + + subTitle$ = of( + 'Elevate Your Angular Development with Our Handy npm Packages', + ); + + constructor(private _router: WindowRouterService) {} + + goToPackages(): void { + this._router.navigate(['packages']); + } + + goToRepository(): void { + this._router.open('https://github.com/chill-viking/ng-libs'); + } + + goToDiscussions(): void { + this._router.open('https://github.com/orgs/chill-viking/discussions'); + } +} diff --git a/apps/chill-viking-ng-libs/src/app/root.component.spec.ts b/apps/chill-viking-ng-libs/src/app/root.component.spec.ts new file mode 100644 index 000000000..c496ed2a3 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/root.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RootComponent } from './root.component'; + +describe('RootComponent', () => { + let component: RootComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RootComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(RootComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/chill-viking-ng-libs/src/app/root.component.ts b/apps/chill-viking-ng-libs/src/app/root.component.ts new file mode 100644 index 000000000..b38f65eb8 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/root.component.ts @@ -0,0 +1,18 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + ViewEncapsulation, +} from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + standalone: true, + selector: 'ng-libs-root', + imports: [CommonModule, RouterOutlet], + template: ` `, + styles: [], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RootComponent {} diff --git a/apps/chill-viking-ng-libs/src/app/routes.ts b/apps/chill-viking-ng-libs/src/app/routes.ts new file mode 100644 index 000000000..b97718fd2 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/routes.ts @@ -0,0 +1,14 @@ +import { RouterFeatures, Routes } from '@angular/router'; + +export const rootRoutes: Routes = [ + { + path: '', + loadComponent: () => + import('./pages/home/home.component').then((c) => { + // Have to use braces to work around prettier's approach of wrapping lines... ffs + return c.HomeComponent; + }), + }, +]; + +export const rootRouterFeatures: RouterFeatures[] = []; diff --git a/apps/chill-viking-ng-libs/src/app/window-router.service.spec.ts b/apps/chill-viking-ng-libs/src/app/window-router.service.spec.ts new file mode 100644 index 000000000..63ee074bd --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/window-router.service.spec.ts @@ -0,0 +1,43 @@ +import { TestBed } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { MockProvider } from 'ng-mocks'; + +import { WindowRouterService } from './window-router.service'; + +describe('WindowRouterService', () => { + let service: WindowRouterService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [MockProvider(Router)], + }); + service = TestBed.inject(WindowRouterService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('navigate', () => { + it('should use Router.navigate', () => { + const router = TestBed.inject(Router); + router.navigate = jest.fn(); + + service.navigate(['value', '1'], { fragment: '/' }); + + expect(router.navigate).toHaveBeenCalledWith(['value', '1'], { + fragment: '/', + }); + }); + }); + + describe('open', () => { + it('should use window.open', () => { + window.open = jest.fn(); + + service.open('hello'); + + expect(window.open).toHaveBeenCalledWith('hello'); + }); + }); +}); diff --git a/apps/chill-viking-ng-libs/src/app/window-router.service.ts b/apps/chill-viking-ng-libs/src/app/window-router.service.ts new file mode 100644 index 000000000..529b39992 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/app/window-router.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@angular/core'; +import { NavigationExtras, Router } from '@angular/router'; + +@Injectable({ + providedIn: 'root', +}) +export class WindowRouterService { + constructor(private _router: Router) {} + + navigate(commands: unknown[], extras?: NavigationExtras): void { + this._router.navigate(commands, extras); + } + + open(url: string): void { + window.open(url); + } +} diff --git a/apps/chill-viking-ng-libs/src/assets/viking.svg b/apps/chill-viking-ng-libs/src/assets/viking.svg new file mode 100644 index 000000000..f0a1b3152 --- /dev/null +++ b/apps/chill-viking-ng-libs/src/assets/viking.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/chill-viking-ng-libs/src/favicon.ico b/apps/chill-viking-ng-libs/src/favicon.ico index 317ebcb23..e272b80ca 100644 Binary files a/apps/chill-viking-ng-libs/src/favicon.ico and b/apps/chill-viking-ng-libs/src/favicon.ico differ diff --git a/apps/chill-viking-ng-libs/src/index.html b/apps/chill-viking-ng-libs/src/index.html index 12ef091cf..632b9c4cf 100644 --- a/apps/chill-viking-ng-libs/src/index.html +++ b/apps/chill-viking-ng-libs/src/index.html @@ -6,6 +6,10 @@ + diff --git a/apps/chill-viking-ng-libs/src/main.ts b/apps/chill-viking-ng-libs/src/main.ts index 17a5cd4e0..4ac0be442 100644 --- a/apps/chill-viking-ng-libs/src/main.ts +++ b/apps/chill-viking-ng-libs/src/main.ts @@ -1,7 +1,8 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { provideRouter } from '@angular/router'; +import { RootComponent } from './app/root.component'; +import { rootRouterFeatures, rootRoutes } from './app/routes'; -import { AppModule } from './app/app.module'; - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); +bootstrapApplication(RootComponent, { + providers: [provideRouter(rootRoutes, ...rootRouterFeatures)], +}); diff --git a/package-lock.json b/package-lock.json index c5dc5f686..3be21709c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,12 @@ "license": "MIT", "dependencies": { "@angular/animations": "~15.0.0", + "@angular/cdk": "^15.0.3", "@angular/common": "~15.0.0", "@angular/compiler": "~15.0.0", "@angular/core": "~15.0.0", "@angular/forms": "~15.0.0", + "@angular/material": "^15.0.3", "@angular/platform-browser": "~15.0.0", "@angular/platform-browser-dynamic": "~15.0.0", "@angular/router": "~15.0.0", @@ -977,6 +979,46 @@ "@angular/core": "15.0.4" } }, + "node_modules/@angular/cdk": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.0.3.tgz", + "integrity": "sha512-iRLV6V6ksIshDL8Cdn1+DUNTRLqj+DAqmYTWYCEvH4qU6o0XSeXrAHNW5zNFqWgCZbmWt03G5jOBWBNaxa9QKw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@angular/cli": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.0.4.tgz", @@ -1150,6 +1192,70 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" } }, + "node_modules/@angular/material": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.0.3.tgz", + "integrity": "sha512-x7c6Uc9SnQW0AGTFJZFMQHP80YzmrExtrNn5vYUyWB9QFiNM+jcsqAsSEoGhABU/G5xs8fd40Fj7o2HBixQ0fw==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/auto-init": "15.0.0-canary.7971d6ad5.0", + "@material/banner": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/button": "15.0.0-canary.7971d6ad5.0", + "@material/card": "15.0.0-canary.7971d6ad5.0", + "@material/checkbox": "15.0.0-canary.7971d6ad5.0", + "@material/chips": "15.0.0-canary.7971d6ad5.0", + "@material/circular-progress": "15.0.0-canary.7971d6ad5.0", + "@material/data-table": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dialog": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/drawer": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/fab": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/floating-label": "15.0.0-canary.7971d6ad5.0", + "@material/form-field": "15.0.0-canary.7971d6ad5.0", + "@material/icon-button": "15.0.0-canary.7971d6ad5.0", + "@material/image-list": "15.0.0-canary.7971d6ad5.0", + "@material/layout-grid": "15.0.0-canary.7971d6ad5.0", + "@material/line-ripple": "15.0.0-canary.7971d6ad5.0", + "@material/linear-progress": "15.0.0-canary.7971d6ad5.0", + "@material/list": "15.0.0-canary.7971d6ad5.0", + "@material/menu": "15.0.0-canary.7971d6ad5.0", + "@material/menu-surface": "15.0.0-canary.7971d6ad5.0", + "@material/notched-outline": "15.0.0-canary.7971d6ad5.0", + "@material/radio": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/segmented-button": "15.0.0-canary.7971d6ad5.0", + "@material/select": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/slider": "15.0.0-canary.7971d6ad5.0", + "@material/snackbar": "15.0.0-canary.7971d6ad5.0", + "@material/switch": "15.0.0-canary.7971d6ad5.0", + "@material/tab": "15.0.0-canary.7971d6ad5.0", + "@material/tab-bar": "15.0.0-canary.7971d6ad5.0", + "@material/tab-indicator": "15.0.0-canary.7971d6ad5.0", + "@material/tab-scroller": "15.0.0-canary.7971d6ad5.0", + "@material/textfield": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tooltip": "15.0.0-canary.7971d6ad5.0", + "@material/top-app-bar": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^15.0.0 || ^16.0.0", + "@angular/cdk": "15.0.3", + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "@angular/forms": "^15.0.0 || ^16.0.0", + "@angular/platform-browser": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/platform-browser": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.0.4.tgz", @@ -4282,6 +4388,754 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@material/animation": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-nOCOgzp/Vdgloyw/SjFCEtpcxXWtXUjvX+JCVg7o+EEtaGLBQdgjJUj5lt+RQ6e9r0eiMYKJ6l1+1TGGebsIfA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/auto-init": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-JmST/NkQpdJ1+nyAU8qbV1eRXbOwvpaTRy096Y5mOK1CeUsagUyrKkCeLsO56pmvayxnOIkJCOhH/8gzIsmiJA==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-OA23YGt9qTz5i+FdGgk4QpRkmby/w+k12YMlL7u+TmwWIiGom2AaOy/DbBCr2/uNJEJ6o0h+wcNBEmGe7bJutw==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/button": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-wXgoWl8NG4BZ2U8MCg4BLQLNla3IdyxBJIMSsJ1qvP2YswmG9HXTkS8y9mHTAhzzQEFQtlwDOyp4Ntq2Ep4WZA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-lyV4unJUG/onzNSLL5TjTGJxscBReG6+lNBvGSfgCafW2bfHW278BbqPDbPr52ONe6vg5INptZJ6bZx4FStGIQ==", + "dependencies": { + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-0YNba4Keg+a0U4JK+siLDbTyO13s40hm88kX7uQ46SmsQlY3fbMsdOpX9+y/PaOkOXIJIgX6g+c7ASM7c/6Zyw==", + "dependencies": { + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-RSFJhMtU28BhXWyQHMrThqkGMtYb16JOuKkZ54bc1AzIndQnniQoGpkb5tHx1hOCGhOUyAGVh/w8BHczWRsLbw==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-W8e90cxnERoP/OvsYSSkjP/HEeogYH1YJVBemKfTOQyAAMh3DmetBGdO6Gdf65/Jt7iYrvab5IPn0D7DWoMZlQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/checkbox": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-dE66rFNI9T2khLejoTyONQZqnHjUXsmdzDx1lI3qO918gtdkwdBVWvFm0U7+1VdHAB9sjP4o+mVL/3rNss2Jtg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/progress-indicator": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-JIg3GqnWGoiP5OXRkM7xjpoYIcal3a2vcvx8qUBK8rJZUXXShMcrFD8bpoEK+VIo7NXp5oR3baR3g063sTmv7g==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/checkbox": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/icon-button": "15.0.0-canary.7971d6ad5.0", + "@material/linear-progress": "15.0.0-canary.7971d6ad5.0", + "@material/list": "15.0.0-canary.7971d6ad5.0", + "@material/menu": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/select": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-JfRRdyewKuVGDLTxm0Bn/5MFgkPHo5fZ0JU6kCqI+SdOER/ceRti6xJtNfgV/lBPqstftARcKv116nQRy2085Q==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-P7+nNN1YdPISSOIECyECiYNcmAJn4ezogpkcGkGBKc0KZAzG47Y1prgLNFaHat5mE20GjLL50M7T4SU7F64dqA==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/button": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/icon-button": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-h+KV0egRy7zniZElzDW5duh/VDZUTO9SmMeC8FFiqJMvPe3V8xcH0zB+jL67hueLqFixSSJebbdXMbVce4nwOA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-LYuriNp3lecXXIj3lK22z0ym5bGHHIturofEV60BK9uHi4baBWS/ovTPAw5T8YvpADv5kyidg4mkgkPY9Ydexg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/list": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-M9SZKJI5wjbOwq0o8eknDrI27YE63wLg8qJHLvJWrWXdlm6yN0INilihExzmGHXpVHQ6sUdI4oyoAx1qr+vorQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-G58ZFK7M9r9xkLFP0Gufh1VKdcvRcTvYwEjBuG3+XOMDMjFzCDEMY4c54RG+tbwIiHmB8lw1Yl/dN3kFVc3kTA==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-xH8pdvB5oKO6OTY61vEs44eQJQY3GTobpzaxp+CIBH0UMobSl5KFee+j7MxpEbTkRGtMqWkzAA+vviT8hvmH+A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-Tjv2xnYr+VvsojRbRBVVmjxmut/y4hJrRCBMjU1982cTUYQlfqMaM7BUObt49jwRBKDLr2NjM+fwNIo0//YItA==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/focus-ring": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-xutZrHnrfnKftU3HUS9em8wO5Nb4zbnRrwDCGi3xnFR7bFP4u2J2ZUnVpO+RZfjr3A9l8chDavlFCL5HMfzt4A==", + "dependencies": { + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0" + } + }, + "node_modules/@material/form-field": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-N0UnlZ7j3GT4DGmMgJYMl9etOh7rsQjCjRRATWSnuAel+ir4a5HvLj9xQUyp0tlYuu9ZizB8ZOwbAz/XCiU94Q==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-BT+tHdRviY1o/yBgtX5NxfS7LfQtQSf7DiZfgP9eExSU5fDA6AfqJfZHyJdLmJCtFZbzlxJ0PBmt44NSlI2/DA==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-FrBosWy9VnqWYDR8XkQPt8cE6MPNq5g7oEvULImmqjRxhktTJCPfDZSWHpjLpAvU0quYZZprPDRrwM3qw69z/A==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-H4KEhaGaIuGHd3jKJqaoZkynJjqfyti4QhG6wiTt774Lv4Uri1+ZBxQ8FAFShEvETM2pfBy4mEECi/+M4V2ZTA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-f4tcd82xu1OT0wAVT/kHiWDmJy9fRt9QA5b+v81fTSVFK41mYpxy8jIQ5gdoIvY/0BWLh4HzUejG6j98AkyLEQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-3HlEEPv+RrtGPxq06QzCOAZoNJ8q6UtOOkRxh+buQy1F+Uv0n4BdmvUYsHZaSTn+kSlFMzIKDtRjUG2i7b4/hg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/progress-indicator": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-rYg3cM41MJTSNoFOj8IzF1CpPFK9DDlTFMbERFakRHB1QsfnebxkuoAyI8j5G/pDdvkeAmDbz4tbKK8yJdifRw==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-Xa+tXk8kMFMhdOYrIre1ye4L23i4LzEn48FN398742m1K/VY/IxAuslyQ5CmX77CxkOqbQFqwUarUTod0rEwjw==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/list": "15.0.0-canary.7971d6ad5.0", + "@material/menu-surface": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-7sRmwY7+a3gB5GM6Vl0sZzVVW3iu6QNW79vRias6nZKJMXbE/JDWnhcgkl9QkxvUolBIJ0y1ChgZyntO8Val/g==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-kMUDUqZ7ztvnwqCENZukztyA0oGZhY/mqd/WIaqRhIU58Q2mnDM6Vfd9fifeM61rIMnXHER2fvjjFzim50mw4g==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/floating-label": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-CRQAM2C1weVKVr8rQeQTrOISmTupXw+l9sfpdIx8tQ14fOebZFcEbW9LRRvDAMmUNZF6W6pwL74+zk46DYIKBg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-wpiLuHQtpMb846SSYvG2NQJl/wUi1NbVlCV+uGHSv5LFnbe10e537KFpjtjaDi/Y6e42bUxj8njN5cEZ3NfBUg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-S9S8260lwHreEgvOqg3EM0DF0y8ThuN9fFPVb+cCOAPzCn4Z2tO1pcvPfAmY8yZA7QIx9c5pt6Ci+q44LzPEYA==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-G02MQTQxHPhNlAIoOToCalxSba48VZ+CdrqkWr53eBb/P1I6Do0drMElqNmO5CYS5G/8AEScXmfJ0xSq92ABew==", + "dependencies": { + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-qu9nfKkPAxv6YFFObZAXHgaC0qq8i4Cr2lUbOQdL0E9HmKG+IE9ILualGJrAl2LOpCSJdwA0CjOuv2IsrscpHA==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/touch-target": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-MgbztOBl0Y7UHVPUTuXoAAYfBh+bwbRW9lkK/EJQ4YQrmZB/0L14S7feqh52JhFXVhjFzeYPFMQg+uP2hhHSpg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/floating-label": "15.0.0-canary.7971d6ad5.0", + "@material/line-ripple": "15.0.0-canary.7971d6ad5.0", + "@material/list": "15.0.0-canary.7971d6ad5.0", + "@material/menu": "15.0.0-canary.7971d6ad5.0", + "@material/menu-surface": "15.0.0-canary.7971d6ad5.0", + "@material/notched-outline": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-mlsNFWKOK38ECoB1onCFpi8HKRGgrElk0YioF3V0Joszp1HVV2Fn+SWoKg2LwWHaJet4iBYtNoCbQC6dH2YBeA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-OjbxB3vwZvhbTGP8EGLWoXyodbTMuwkvoFdblEiZtWrrPL0Us5hg/20n8VfUQ0N+c00mElsEv79Jsx+B0iTV+Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-svNOI1Kwu9Mg259SNTaGgyJqETRIPwQPkxYhHvWT4vYiHQkJJJe9kFBcIKi+sdTxqqoMZxyjC2SwS/1mkU4/xg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/button": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/icon-button": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-WBsTIq0NwccMAbt9YFcU1vhcmFOVpNDeZ9gNMJypk19ZiqDcZBZNDx0JmceRqTYrCxndqVwfD25qK0jFVplK9g==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-hmqRl9s7g1/8KpZ5rqANxUXrHi4PYO3GsGhASrYrB99/5ZX1ghdCGwEN1Lp9ntKIgZjd1s6qtzccBtmnW+boXA==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/focus-ring": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/tab-indicator": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-hEMnb2C1yOQPbqdFCTCuyMmjcqO4QIvPKAsbquAwOZc0tz/U88tzmfuhv1k77FB2hbESwN9sPpImU0g4Lrvfhw==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/tab": "15.0.0-canary.7971d6ad5.0", + "@material/tab-indicator": "15.0.0-canary.7971d6ad5.0", + "@material/tab-scroller": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-0X2tJf0E+CwL5Bx3Fqxi5Uuj1BgncKqd4yFpWE7cv8IZHphNReSOrCcSgUwUfirmee6MqkQ4Drk51Pf4ANj2OA==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-//Ih8ZPx92PLQwXhFzv6YCQc5xW2IH84GdIeJrdBNcQN6wgbQNsbU7h9m6jymtpWQgvvLY8E0+2qkNcnWejnag==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/tab": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-n9aWMZGyE2GBTr2Tx6n4hLp08uyIo1/xNqcZ0Kx2tKK1spPgTgp+g2fEKImGnnbfiCTJPNrcJ8bQ+Vy7Dp0n3Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/density": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/floating-label": "15.0.0-canary.7971d6ad5.0", + "@material/line-ripple": "15.0.0-canary.7971d6ad5.0", + "@material/notched-outline": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-4YUyQo4SOatHHH15/h2LBIyxmVxtefo+QC8bRopF13f/qq5lHpX/stK6chf1OR/z9BUxnNHZWXd2LG5SvJGs9Q==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-tRa/Uki/moIP6f/QJPrad2jHbSZ5NB5TRSfAS1NZof0KNFjW8n2lJVpgcgD+f1NENin3dWM4NpfJwxulGlWE7g==", + "dependencies": { + "@material/elevation": "15.0.0-canary.7971d6ad5.0" + } + }, + "node_modules/@material/tooltip": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-gidVGZOGmJUNDxm3ZorNZMAFmbeFmJ+6DH2F45hi1iU/GflfyvMfvbG2VvPFGYj84YAKHs799yAjidvk1nSZZg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/button": "15.0.0-canary.7971d6ad5.0", + "@material/dom": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/tokens": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-ztvglUBK0y4LDHD8xhvNGCpbsHYoAVtI06cJHu5G241WD5wAmseEnLMY+ty86FHMzs796PzhUqUmahEHeBNlEg==", + "dependencies": { + "@material/animation": "15.0.0-canary.7971d6ad5.0", + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/elevation": "15.0.0-canary.7971d6ad5.0", + "@material/ripple": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "@material/shape": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "@material/typography": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-aT8GyRfH0TJuF53HWKga+vuwJbJ/euN6T8CS/+RP5F/rjzWwxSd8RtyBmVUzBjVzOxr6Os+El0c3TFfEDxRdAg==", + "dependencies": { + "@material/base": "15.0.0-canary.7971d6ad5.0", + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/rtl": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "15.0.0-canary.7971d6ad5.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.7971d6ad5.0.tgz", + "integrity": "sha512-4J5qPXbCS3wMtGl0AJIj/M9rUxHR7fRX3IKtfOyvra10lZbr4qma+4g0+t+O9cPzcCBS1NwPkJ/E4t+ijEa6gA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.7971d6ad5.0", + "@material/theme": "15.0.0-canary.7971d6ad5.0", + "tslib": "^2.1.0" + } + }, "node_modules/@ngtools/webpack": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.0.4.tgz", @@ -18227,6 +19081,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, "node_modules/sass": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.0.tgz", diff --git a/package.json b/package.json index 92bcfa717..e0f70de86 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,12 @@ "private": true, "dependencies": { "@angular/animations": "~15.0.0", + "@angular/cdk": "^15.0.3", "@angular/common": "~15.0.0", "@angular/compiler": "~15.0.0", "@angular/core": "~15.0.0", "@angular/forms": "~15.0.0", + "@angular/material": "^15.0.3", "@angular/platform-browser": "~15.0.0", "@angular/platform-browser-dynamic": "~15.0.0", "@angular/router": "~15.0.0",