From 27b63fbe9d6479daa44a9ba151487b429e892c82 Mon Sep 17 00:00:00 2001 From: xidedix Date: Tue, 5 Mar 2024 20:13:23 +0100 Subject: [PATCH 01/84] chore: v5 initial pre-release --- .github/workflows/build-check.yml | 2 +- CHANGELOG.md | 6 + README.md | 23 +- angular.json | 8 +- package-lock.json | 743 ++++---- package.json | 49 +- src/app/app-routing.module.ts | 118 -- src/app/app.component.spec.ts | 14 +- src/app/app.component.ts | 14 +- src/app/app.config.ts | 34 + src/app/app.module.ts | 88 - src/app/app.routes.ts | 88 + .../default-header.component.html | 165 -- .../default-header.component.ts | 21 - .../default-layout.component.html | 49 - .../default-layout.component.scss | 7 - .../default-layout.component.ts | 15 - src/app/icons/icon-subset.ts | 25 +- src/app/icons/logo.ts | 24 + src/app/icons/signet.ts | 8 + .../default-layout/_nav.ts | 126 +- .../default-footer.component.html | 4 +- .../default-footer.component.scss | 0 .../default-footer.component.spec.ts | 4 +- .../default-footer.component.ts | 7 +- .../default-header.component.html | 208 ++ .../default-header.component.scss | 0 .../default-header.component.spec.ts | 18 +- .../default-header.component.ts | 139 ++ .../default-layout.component.html | 43 + .../default-layout.component.scss | 24 + .../default-layout.component.ts | 59 + .../default-layout/index.ts | 0 src/app/{containers => layout}/index.ts | 0 .../base/accordion/accordions.component.html | 42 +- .../base/accordion/accordions.component.scss | 19 +- .../accordion/accordions.component.spec.ts | 8 +- .../base/accordion/accordions.component.ts | 12 +- src/app/views/base/base-routing.module.ts | 146 -- src/app/views/base/base.module.ts | 105 -- .../breadcrumbs/breadcrumbs.component.html | 175 +- .../breadcrumbs/breadcrumbs.component.spec.ts | 8 +- .../base/breadcrumbs/breadcrumbs.component.ts | 17 +- src/app/views/base/cards/cards.component.html | 315 ++-- .../views/base/cards/cards.component.spec.ts | 8 +- src/app/views/base/cards/cards.component.ts | 37 +- .../base/carousels/carousels.component.html | 368 ++-- .../carousels/carousels.component.spec.ts | 8 +- .../base/carousels/carousels.component.ts | 23 +- .../base/collapses/collapses.component.html | 9 +- .../collapses/collapses.component.spec.ts | 8 +- .../base/collapses/collapses.component.ts | 10 +- .../list-groups/list-groups.component.html | 198 +- .../list-groups/list-groups.component.spec.ts | 8 +- .../base/list-groups/list-groups.component.ts | 34 +- src/app/views/base/navs/navs.component.html | 178 +- .../views/base/navs/navs.component.spec.ts | 8 +- src/app/views/base/navs/navs.component.ts | 11 +- .../paginations/paginations.component.html | 87 +- .../paginations/paginations.component.spec.ts | 8 +- .../base/paginations/paginations.component.ts | 11 +- .../placeholders/placeholders.component.html | 21 +- .../placeholders.component.spec.ts | 8 +- .../placeholders/placeholders.component.ts | 11 +- .../base/popovers/popovers.component.html | 16 +- .../base/popovers/popovers.component.spec.ts | 8 +- .../views/base/popovers/popovers.component.ts | 10 +- .../base/progress/progress.component.html | 140 +- .../base/progress/progress.component.scss | 0 .../base/progress/progress.component.spec.ts | 8 +- .../views/base/progress/progress.component.ts | 19 +- src/app/views/base/routes.ts | 124 ++ .../base/spinners/spinners.component.html | 15 +- .../base/spinners/spinners.component.spec.ts | 8 +- .../views/base/spinners/spinners.component.ts | 10 +- .../views/base/tables/tables.component.html | 33 +- .../base/tables/tables.component.spec.ts | 8 +- src/app/views/base/tables/tables.component.ts | 10 +- src/app/views/base/tabs/tabs.component.html | 51 +- .../views/base/tabs/tabs.component.spec.ts | 8 +- src/app/views/base/tabs/tabs.component.ts | 27 +- .../base/tooltips/tooltips.component.html | 13 +- .../base/tooltips/tooltips.component.spec.ts | 8 +- .../views/base/tooltips/tooltips.component.ts | 11 +- .../button-groups.component.html | 53 +- .../button-groups.component.spec.ts | 8 +- .../button-groups/button-groups.component.ts | 13 +- .../views/buttons/buttons-routing.module.ts | 51 - src/app/views/buttons/buttons.module.ts | 55 - .../buttons/buttons/buttons.component.html | 209 ++- .../buttons/buttons/buttons.component.scss | 0 .../buttons/buttons/buttons.component.spec.ts | 8 +- .../buttons/buttons/buttons.component.ts | 12 +- .../dropdowns/dropdowns.component.html | 141 +- .../dropdowns/dropdowns.component.spec.ts | 8 +- .../buttons/dropdowns/dropdowns.component.ts | 61 + src/app/views/buttons/routes.ts | 39 + src/app/views/charts/charts-routing.module.ts | 21 - src/app/views/charts/charts.component.html | 145 +- src/app/views/charts/charts.component.spec.ts | 8 +- src/app/views/charts/charts.component.ts | 32 +- src/app/views/charts/charts.module.ts | 24 - src/app/views/charts/routes.ts | 13 + .../views/dashboard/dashboard-charts-data.ts | 20 +- .../dashboard/dashboard-routing.module.ts | 21 - .../views/dashboard/dashboard.component.html | 313 ++-- .../views/dashboard/dashboard.component.ts | 75 +- src/app/views/dashboard/dashboard.module.ts | 48 - src/app/views/dashboard/routes.ts | 12 + .../checks-radios.component.html | 19 +- .../checks-radios.component.spec.ts | 8 +- .../checks-radios/checks-radios.component.ts | 14 +- .../floating-labels.component.html | 15 +- .../floating-labels.component.spec.ts | 8 +- .../floating-labels.component.ts | 12 +- .../form-controls.component.html | 11 +- .../form-controls.component.spec.ts | 8 +- .../form-controls/form-controls.component.ts | 12 +- src/app/views/forms/forms-routing.module.ts | 90 - src/app/views/forms/forms.module.ts | 59 - .../input-groups/input-groups.component.html | 83 +- .../input-groups.component.spec.ts | 8 +- .../input-groups/input-groups.component.ts | 12 +- .../views/forms/layout/layout.component.html | 36 +- .../forms/layout/layout.component.spec.ts | 8 +- .../views/forms/layout/layout.component.ts | 11 +- .../views/forms/ranges/ranges.component.html | 11 +- .../forms/ranges/ranges.component.spec.ts | 8 +- .../views/forms/ranges/ranges.component.ts | 10 +- src/app/views/forms/routes.ts | 73 + .../views/forms/select/select.component.html | 11 +- .../forms/select/select.component.spec.ts | 8 +- .../views/forms/select/select.component.ts | 11 +- .../validation/validation.component.html | 19 +- .../validation/validation.component.spec.ts | 8 +- .../forms/validation/validation.component.ts | 11 +- .../views/icons/coreui-icons.component.html | 26 +- src/app/views/icons/coreui-icons.component.ts | 14 +- src/app/views/icons/icons-routing.module.ts | 48 - src/app/views/icons/icons.module.ts | 25 - src/app/views/icons/routes.ts | 38 + .../alerts/alerts.component.html | 81 +- .../alerts/alerts.component.scss | 3 + .../alerts/alerts.component.spec.ts | 8 +- .../notifications/alerts/alerts.component.ts | 22 +- .../badges/badges.component.html | 23 +- .../badges/badges.component.scss | 10 + .../badges/badges.component.spec.ts | 8 +- .../notifications/badges/badges.component.ts | 10 +- .../modals/modals.component.html | 51 +- .../modals/modals.component.spec.ts | 8 +- .../notifications/modals/modals.component.ts | 27 +- .../notifications-routing.module.ts | 58 - .../notifications/notifications.module.ts | 64 - src/app/views/notifications/routes.ts | 45 + .../toast-simple/toast.component.html | 10 +- .../toast-simple/toast.component.spec.ts | 7 +- .../toasters/toast-simple/toast.component.ts | 12 +- .../toasters/toasters.component.html | 170 +- .../toasters/toasters.component.spec.ts | 8 +- .../toasters/toasters.component.ts | 37 +- .../views/pages/login/login.component.html | 10 +- .../views/pages/login/login.component.spec.ts | 7 +- src/app/views/pages/login/login.component.ts | 11 +- .../pages/page404/page404.component.html | 4 +- .../pages/page404/page404.component.spec.ts | 7 +- .../views/pages/page404/page404.component.ts | 10 +- .../pages/page500/page500.component.html | 4 +- .../pages/page500/page500.component.spec.ts | 7 +- .../views/pages/page500/page500.component.ts | 10 +- src/app/views/pages/pages-routing.module.ts | 44 - src/app/views/pages/pages.module.ts | 31 - .../pages/register/register.component.html | 4 +- .../pages/register/register.component.spec.ts | 7 +- .../pages/register/register.component.ts | 10 +- src/app/views/pages/routes.ts | 32 + src/app/views/theme/colors.component.html | 68 +- src/app/views/theme/colors.component.ts | 17 +- src/app/views/theme/routes.ts | 32 + src/app/views/theme/theme-routing.module.ts | 41 - src/app/views/theme/theme.module.ts | 31 - src/app/views/theme/typography.component.html | 300 +-- src/app/views/theme/typography.component.ts | 10 +- src/app/views/widgets/routes.ts | 11 + .../widgets-brand.component.html | 44 +- .../widgets-brand.component.spec.ts | 7 +- .../widgets-brand/widgets-brand.component.ts | 19 +- .../widgets-dropdown.component.html | 70 +- .../widgets-dropdown.component.spec.ts | 8 +- .../widgets-dropdown.component.ts | 23 +- .../widgets-e/widgets-e.component.html | 20 +- .../widgets-e/widgets-e.component.spec.ts | 7 +- .../widgets/widgets-e/widgets-e.component.ts | 14 +- .../views/widgets/widgets-routing.module.ts | 21 - src/app/views/widgets/widgets.module.ts | 52 - .../widgets/widgets/widgets.component.html | 156 +- .../widgets/widgets/widgets.component.spec.ts | 8 +- .../widgets/widgets/widgets.component.ts | 16 +- src/assets/brand/coreui-angular-white.svg | 41 + src/assets/brand/coreui-angular.svg | 41 + .../{img => }/brand/coreui-base-white.svg | 0 src/assets/{img => }/brand/coreui-base.svg | 0 .../{img => }/brand/coreui-signet-white.svg | 0 src/assets/{img => }/brand/coreui-signet.svg | 0 src/assets/{img => images}/avatars/1.jpg | Bin src/assets/{img => images}/avatars/2.jpg | Bin src/assets/{img => images}/avatars/3.jpg | Bin src/assets/{img => images}/avatars/4.jpg | Bin src/assets/{img => images}/avatars/5.jpg | Bin src/assets/{img => images}/avatars/6.jpg | Bin src/assets/{img => images}/avatars/7.jpg | Bin src/assets/{img => images}/avatars/8.jpg | Bin src/assets/{img => images}/avatars/9.jpg | Bin src/assets/images/react.jpg | Bin 0 -> 199537 bytes src/assets/images/vue.jpg | Bin 0 -> 170599 bytes src/assets/img/brand/coreui-angular.svg | 39 - .../docs-callout.component.spec.ts | 5 +- .../docs-callout/docs-callout.component.ts | 10 +- src/components/docs-components.module.ts | 33 - .../docs-example/docs-example.component.html | 36 +- .../docs-example/docs-example.component.scss | 3 + .../docs-example/docs-example.component.ts | 22 +- .../docs-link/docs-link.component.html | 2 +- .../docs-link/docs-link.component.spec.ts | 4 +- .../docs-link/docs-link.component.ts | 7 +- src/components/public-api.ts | 1 - src/index.html | 2 +- src/main.ts | 9 +- src/scss/_charts.scss | 2 +- src/scss/_custom.scss | 15 + src/scss/_examples.scss | 47 +- src/scss/_fixes.scss | 8 - src/scss/_layout.scss | 7 - src/scss/_scrollbar.scss | 22 +- src/scss/_theme.scss | 64 + src/scss/_variables.scss | 1667 +---------------- src/scss/styles.scss | 18 +- tsconfig.spec.json | 5 +- 238 files changed, 4427 insertions(+), 6204 deletions(-) delete mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.config.ts delete mode 100644 src/app/app.module.ts create mode 100644 src/app/app.routes.ts delete mode 100644 src/app/containers/default-layout/default-header/default-header.component.html delete mode 100644 src/app/containers/default-layout/default-header/default-header.component.ts delete mode 100644 src/app/containers/default-layout/default-layout.component.html delete mode 100644 src/app/containers/default-layout/default-layout.component.scss delete mode 100644 src/app/containers/default-layout/default-layout.component.ts create mode 100644 src/app/icons/logo.ts create mode 100644 src/app/icons/signet.ts rename src/app/{containers => layout}/default-layout/_nav.ts (57%) rename src/app/{containers => layout}/default-layout/default-footer/default-footer.component.html (59%) rename src/app/{containers => layout}/default-layout/default-footer/default-footer.component.scss (100%) rename src/app/{containers => layout}/default-layout/default-footer/default-footer.component.spec.ts (92%) rename src/app/{containers => layout}/default-layout/default-footer/default-footer.component.ts (56%) create mode 100644 src/app/layout/default-layout/default-header/default-header.component.html rename src/app/{containers => layout}/default-layout/default-header/default-header.component.scss (100%) rename src/app/{containers => layout}/default-layout/default-header/default-header.component.spec.ts (68%) create mode 100644 src/app/layout/default-layout/default-header/default-header.component.ts create mode 100644 src/app/layout/default-layout/default-layout.component.html create mode 100644 src/app/layout/default-layout/default-layout.component.scss create mode 100644 src/app/layout/default-layout/default-layout.component.ts rename src/app/{containers => layout}/default-layout/index.ts (100%) rename src/app/{containers => layout}/index.ts (100%) delete mode 100644 src/app/views/base/base-routing.module.ts delete mode 100644 src/app/views/base/base.module.ts delete mode 100644 src/app/views/base/progress/progress.component.scss create mode 100644 src/app/views/base/routes.ts delete mode 100644 src/app/views/buttons/buttons-routing.module.ts delete mode 100644 src/app/views/buttons/buttons.module.ts delete mode 100644 src/app/views/buttons/buttons/buttons.component.scss create mode 100644 src/app/views/buttons/routes.ts delete mode 100644 src/app/views/charts/charts-routing.module.ts delete mode 100644 src/app/views/charts/charts.module.ts create mode 100644 src/app/views/charts/routes.ts delete mode 100644 src/app/views/dashboard/dashboard-routing.module.ts delete mode 100644 src/app/views/dashboard/dashboard.module.ts create mode 100644 src/app/views/dashboard/routes.ts delete mode 100644 src/app/views/forms/forms-routing.module.ts delete mode 100644 src/app/views/forms/forms.module.ts create mode 100644 src/app/views/forms/routes.ts delete mode 100644 src/app/views/icons/icons-routing.module.ts delete mode 100644 src/app/views/icons/icons.module.ts create mode 100644 src/app/views/icons/routes.ts delete mode 100644 src/app/views/notifications/notifications-routing.module.ts delete mode 100644 src/app/views/notifications/notifications.module.ts create mode 100644 src/app/views/notifications/routes.ts delete mode 100644 src/app/views/pages/pages-routing.module.ts delete mode 100644 src/app/views/pages/pages.module.ts create mode 100644 src/app/views/pages/routes.ts create mode 100644 src/app/views/theme/routes.ts delete mode 100644 src/app/views/theme/theme-routing.module.ts delete mode 100644 src/app/views/theme/theme.module.ts create mode 100644 src/app/views/widgets/routes.ts delete mode 100644 src/app/views/widgets/widgets-routing.module.ts delete mode 100644 src/app/views/widgets/widgets.module.ts create mode 100644 src/assets/brand/coreui-angular-white.svg create mode 100644 src/assets/brand/coreui-angular.svg rename src/assets/{img => }/brand/coreui-base-white.svg (100%) rename src/assets/{img => }/brand/coreui-base.svg (100%) rename src/assets/{img => }/brand/coreui-signet-white.svg (100%) rename src/assets/{img => }/brand/coreui-signet.svg (100%) rename src/assets/{img => images}/avatars/1.jpg (100%) rename src/assets/{img => images}/avatars/2.jpg (100%) rename src/assets/{img => images}/avatars/3.jpg (100%) rename src/assets/{img => images}/avatars/4.jpg (100%) rename src/assets/{img => images}/avatars/5.jpg (100%) rename src/assets/{img => images}/avatars/6.jpg (100%) rename src/assets/{img => images}/avatars/7.jpg (100%) rename src/assets/{img => images}/avatars/8.jpg (100%) rename src/assets/{img => images}/avatars/9.jpg (100%) create mode 100755 src/assets/images/react.jpg create mode 100755 src/assets/images/vue.jpg delete mode 100644 src/assets/img/brand/coreui-angular.svg delete mode 100644 src/components/docs-components.module.ts delete mode 100644 src/scss/_layout.scss create mode 100644 src/scss/_theme.scss diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index b85c737c5..4712360b2 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -7,7 +7,7 @@ on: pull_request: branches: - main - - v4 + - v5.* schedule: - # build runs every weekday at 4:15AM UTC - cron: '15 4 * * *' diff --git a/CHANGELOG.md b/CHANGELOG.md index eec5d9aad..258cc6739 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ --- +#### `5.0.0-next.23` + +CoreUI v5 for Angular 17 pre-release + +--- + #### `4.7.15` - chore: move to `application` builder diff --git a/README.md b/README.md index 57f58379b..100b35a81 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ CoreUI is meant to be the UX game changer. Pure & transparent code is devoid of redundant components, so the app is light enough to offer ultimate user experience. This means mobile devices also, where the navigation is just as easy and intuitive as on a desktop or laptop. The CoreUI Layout API lets you customize your project for almost any device – be it Mobile, Web or WebApp – CoreUI covers them all! - [CoreUI Angular Admin Dashboard Template & UI Components Library](https://coreui.io/angular) -- [CoreUI Angular Demo](https://coreui.io/angular/demo/4.3/free/) +- [CoreUI Angular Demo](https://coreui.io/angular/demo/5.0/free/) - [CoreUI Angular Docs](https://coreui.io/angular/docs/) ## Table of Contents @@ -45,14 +45,23 @@ CoreUI is meant to be the UX game changer. Pure & transparent code is devoid of ## CoreUI Pro -**Only customers with [Enterpise Membership Plan](https://coreui.io/pro/#buy) have access to private GitHub CoreUI Pro repository.** - * 💪 [CoreUI Pro Angular Admin Template](https://coreui.io/product/angular-dashboard-template/) * 💪 [CoreUI Pro Bootstrap Admin Template](https://coreui.io/product/bootstrap-dashboard-template/) * 💪 [CoreUI Pro React Admin Template](https://coreui.io/product/react-dashboard-template/) * 💪 [CoreUI Pro Next.js Admin Template](https://coreui.io/product/next-js-dashboard-template/) * 💪 [CoreUI Pro Vue Admin Template](https://coreui.io/product/vue-dashboard-template/) +## CoreUI PRO Angular Admin Templates + +| Default Theme | Light Theme | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [![CoreUI PRO Angular Admin Template](https://coreui.io/images/templates/coreui_pro_default_light_dark.webp)](https://coreui.io/product/angular-dashboard-template/?theme=default) | [![CoreUI PRO Angular Admin Template](https://coreui.io/images/templates/coreui_pro_light_light_dark.webp)](https://coreui.io/product/angular-dashboard-template/?theme=light) | + +| Modern Theme | Bright Theme | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [![CoreUI PRO Angular Admin Template](https://coreui.io/images/templates/coreui_pro_default_v3_light_dark.webp)](https://coreui.io/product/angular-dashboard-template/?theme=default-v3) | [![CoreUI PRO React Admin Template](https://coreui.io/images/templates/coreui_pro_light_v3_light_dark.webp)](https://coreui.io/product/angular-dashboard-template/?theme=light) | + + ## Quick Start - [Download the latest release](https://github.com/coreui/coreui-free-angular-admin-template/) @@ -105,10 +114,10 @@ Within the download you'll find the following directories and files, logically g coreui-free-angular-admin-template ├── src/ # project root │ ├── app/ # main app directory -| │ ├── containers/ # layout containers -| | │ └── default-layout/ # layout containers -| | | └── _nav.js # sidebar navigation config | │ ├── icons/ # icons set for the app +| │ ├── layout/ # layout +| | │ └── default-layout/ # layout components +| | | └── _nav.js # sidebar navigation config | │ └── views/ # application views │ ├── assets/ # images, icons, etc. │ ├── components/ # components for demo only @@ -215,7 +224,7 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and License -copyright 2017-2024 creativeLabs Łukasz Holeczek. +copyright 2024 creativeLabs Łukasz Holeczek. Code released under [the MIT license](https://github.com/coreui/coreui-free-react-admin-template/blob/master/LICENSE). diff --git a/angular.json b/angular.json index faeaf306f..7f0c1f4ce 100644 --- a/angular.json +++ b/angular.json @@ -40,17 +40,15 @@ "src/scss/styles.scss" ], "scripts": [], - "allowedCommonJsDependencies": [ - "chart.js" - ] + "allowedCommonJsDependencies": [] }, "configurations": { "production": { "budgets": [ { "type": "initial", - "maximumWarning": "1500kb", - "maximumError": "6mb" + "maximumWarning": "6mb", + "maximumError": "7mb" }, { "type": "anyComponentStyle", diff --git a/package-lock.json b/package-lock.json index 4b33ce036..02b495339 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,32 +1,32 @@ { "name": "coreui-free-angular-admin-template", - "version": "4.7.15", + "version": "5.0.0-next.23", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coreui-free-angular-admin-template", - "version": "4.7.15", + "version": "5.0.0-next.23", "license": "MIT", "dependencies": { - "@angular/animations": "^17.2.1", - "@angular/cdk": "^17.2.0", - "@angular/common": "^17.2.1", - "@angular/compiler": "^17.2.1", - "@angular/core": "^17.2.1", - "@angular/forms": "^17.2.1", - "@angular/language-service": "^17.2.1", - "@angular/platform-browser": "^17.2.1", - "@angular/platform-browser-dynamic": "^17.2.1", - "@angular/router": "^17.2.1", - "@coreui/angular": "~4.7.15", - "@coreui/angular-chartjs": "~4.7.14", - "@coreui/chartjs": "^3.1.2", - "@coreui/coreui": "~4.2.6", + "@angular/animations": "^17.2.3", + "@angular/cdk": "^17.2.1", + "@angular/common": "^17.2.3", + "@angular/compiler": "^17.2.3", + "@angular/core": "^17.2.3", + "@angular/forms": "^17.2.3", + "@angular/language-service": "^17.2.3", + "@angular/platform-browser": "^17.2.3", + "@angular/platform-browser-dynamic": "^17.2.3", + "@angular/router": "^17.2.3", + "@coreui/angular": "~5.0.0-0", + "@coreui/angular-chartjs": "~5.0.0-0", + "@coreui/chartjs": "~4.0.0-0", + "@coreui/coreui": "~5.0.0-0", "@coreui/icons": "^3.0.1", - "@coreui/icons-angular": "~4.7.14", + "@coreui/icons-angular": "~5.0.0-0", "@coreui/utils": "^2.0.2", - "chart.js": "^3.9.1", + "chart.js": "^4.4.2", "lodash-es": "^4.17.21", "ngx-scrollbar": "^13.0.3", "rxjs": "~7.8.1", @@ -34,15 +34,15 @@ "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.0", - "@angular/cli": "^17.2.0", - "@angular/compiler-cli": "^17.2.1", - "@angular/localize": "^17.2.1", + "@angular-devkit/build-angular": "^17.2.2", + "@angular/cli": "^17.2.2", + "@angular/compiler-cli": "^17.2.3", + "@angular/localize": "^17.2.3", "@types/jasmine": "^5.1.4", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.18", + "@types/node": "^20.11.24", "jasmine-core": "^5.1.2", - "karma": "^6.4.2", + "karma": "^6.4.3", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", @@ -68,12 +68,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1702.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1702.0.tgz", - "integrity": "sha512-+HkOYhdq8ez2+yqpxaQ6XtQevOYJNaDpM4oDmZ2lIpiIusFNsmpY2b9iL5PZGb4EfUgN8KsY3n9Q9fmRlRB9eA==", + "version": "0.1702.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1702.2.tgz", + "integrity": "sha512-qBvif8/NquFUqVQgs4U+8wXh/rQZv+YlYwg6eDZly1bIaTd/k9spko/seTtNT1OpK/Be+GLo5IbiQ7i2SON3iQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.0", + "@angular-devkit/core": "17.2.2", "rxjs": "7.8.1" }, "engines": { @@ -83,15 +83,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.2.0.tgz", - "integrity": "sha512-zO2YKcRRL3Ck3KZ3Ir/lWlciYIguJd3W9iYICKkeK4whi94y3NhrCy0Iualoo2WP7hE043uKQ0SwtVABft0SgA==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.2.2.tgz", + "integrity": "sha512-K55xBiWBfxD4wmxLR2viOPbBryOk6YaZeNr72IMkp1yIrIy1BES6LDJi7R9fDW7+TprqZdM4B91Tkc+BCwYQzQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1702.0", - "@angular-devkit/build-webpack": "0.1702.0", - "@angular-devkit/core": "17.2.0", + "@angular-devkit/architect": "0.1702.2", + "@angular-devkit/build-webpack": "0.1702.2", + "@angular-devkit/core": "17.2.2", "@babel/core": "7.23.9", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -102,7 +102,7 @@ "@babel/preset-env": "7.23.9", "@babel/runtime": "7.23.9", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.2.0", + "@ngtools/webpack": "17.2.2", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.17", @@ -212,12 +212,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1702.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1702.0.tgz", - "integrity": "sha512-HrJ01MXlXNCeJeohIOIjpulWktUUJQpq01OWX4UazLnN0DAHKIFCwiKZZio5rYIFFUjdKI0+cCGxFbkzetRjWg==", + "version": "0.1702.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1702.2.tgz", + "integrity": "sha512-+c7rHD2Se1VD9i9uPEYHqhq8hTnsUAn5LfeJCLS8g7FU8T42tDSC/k1qWxHp7d99kf7ecg2BvYcZDlYaBUnl3A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.0", + "@angular-devkit/architect": "0.1702.2", "rxjs": "7.8.1" }, "engines": { @@ -231,9 +231,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.2.0.tgz", - "integrity": "sha512-GIOYHChtDqSOvSiEefJ6hAledEl55J5Pxw8JuKXrM4IJBbviI3c40FAc0Lu5NCj2lYoELOhrLy/UP36sLy+DGA==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.2.2.tgz", + "integrity": "sha512-bKMi6bBkEeN4a3qTxCykhrAvE0ESHhKO38Qh1bN/8QSyvKVAEyVAVls5W9IN5GKRHvXgEn9aw+DSzRnPpy9nyw==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -258,12 +258,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.2.0.tgz", - "integrity": "sha512-gGyUVYRKTeRODW9S0MohfBlryoUHrbxqN27olhktrM/fZavyUVnZpyfb8okp6tTUz9HWmGac8ULE6IU+YW16gw==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.2.2.tgz", + "integrity": "sha512-t6dBhHvto9BEIo+Kew0+YyIS3TV1SEd4MActUk+zF4NNQyJ8wRUHL+8glUKB6ZWPyCTYSinJ+QKn/3yytELTHg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.0", + "@angular-devkit/core": "17.2.2", "jsonc-parser": "3.2.1", "magic-string": "0.30.7", "ora": "5.4.1", @@ -276,9 +276,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.1.tgz", - "integrity": "sha512-JCccG8EPM04OtN+Wayi79QnbkCYpKY69okWjEM7cPq8fbjIQE/ZAWxnzYMR/Xq3prwUtlH7LMyB5YdYCc6Ea1A==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.3.tgz", + "integrity": "sha512-eQcN6hC/dXISEYC/TjRuQJgfdZieBROBlXrS+BxRbsy9T4/QeKxChC3yiNxTmdxl5mvjLKvQTXHR8X0AWc07/Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -286,13 +286,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.1" + "@angular/core": "17.2.3" } }, "node_modules/@angular/cdk": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.2.0.tgz", - "integrity": "sha512-++qEQHzfUvccDw4IFimG9Ig7b4i9d64POUZ8H5cSflTiR3mBVZOlIhnRE/3PifYukoSetrkyedR8BDS6nwGxJQ==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.2.1.tgz", + "integrity": "sha512-9cWV9MyWnpImns/WQApgoQBKblXA9Zx2CpCkDNipRgx9RyvGrvCLjpEfwQI4HjpPAQDI1trsbeJKihzgz4tFgw==", "dependencies": { "tslib": "^2.3.0" }, @@ -306,15 +306,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.2.0.tgz", - "integrity": "sha512-JSfNQB76qrc8QNPLUvvqR10T4+WUrfz+ogmOliO+jAdhbpfZQ4tIt0WwUYvo+0foM8x7hTe3Wdhg8zWwteBnuw==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.2.2.tgz", + "integrity": "sha512-cGGOnOTjU1bHBAU+5LMR1vfjUSmIY204pUcRAHu6xq1Qp8jm0Wf1lYOG1KrzpDezKa8d0WZe6FIVlxsCZRRYSw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.0", - "@angular-devkit/core": "17.2.0", - "@angular-devkit/schematics": "17.2.0", - "@schematics/angular": "17.2.0", + "@angular-devkit/architect": "0.1702.2", + "@angular-devkit/core": "17.2.2", + "@angular-devkit/schematics": "17.2.2", + "@schematics/angular": "17.2.2", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -340,9 +340,9 @@ } }, "node_modules/@angular/common": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.2.1.tgz", - "integrity": "sha512-ZkQwvjJhnqKulJn3kwbnodYvQf8g8hy2FUMB2MRLXKgwLPv9iqF/KRgSwcNIZnq8hyvIr6FmAntMdyCOonykDQ==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.2.3.tgz", + "integrity": "sha512-XR3rWS4W7/+RknyJMUUo9E81mSeyUznpclqTZ+Hy7+i4Naeso0qcRaIyr6JJmB5UGvlnfT1MlH9Fj78Dc80NEw==", "dependencies": { "tslib": "^2.3.0" }, @@ -350,14 +350,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.1", + "@angular/core": "17.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.2.1.tgz", - "integrity": "sha512-jKk1ZQxZA/iGj0RsCa5rbd4gaygmfZcj7K1+VfGcY6NPyFkBGfFxIcA5fkZPOBvlNHjurXGuejA8NrsQ0kHbOw==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.2.3.tgz", + "integrity": "sha512-U2okLZ+4ipD5zTv32pMp+RsrM3kkP0XneSsIMPRpYZZfKgfnGLIwkRx6FoVoBwByugng6lBG/PiIe8DhRU/HFg==", "dependencies": { "tslib": "^2.3.0" }, @@ -365,7 +365,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.1" + "@angular/core": "17.2.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -374,9 +374,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.2.1.tgz", - "integrity": "sha512-7/1KgQOyjekVJxxLnGq+PcpbhIosK4yUaYDyUr33ehDYE5MoEGtyukNx6Sn/CPex4AcJ/978zKfSXHYY451S8w==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.2.3.tgz", + "integrity": "sha512-mATybangypneXwO270VQeIw3N0avzc2Lpvdb8nm9WZYj23AcTUzpUUKOn63HtJdwMT5J2GjkyZFSRXisiPmpkA==", "dev": true, "dependencies": { "@babel/core": "7.23.9", @@ -397,14 +397,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.1", + "@angular/compiler": "17.2.3", "typescript": ">=5.2 <5.4" } }, "node_modules/@angular/core": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.2.1.tgz", - "integrity": "sha512-gfWeskXA8RA0D3WOPBV5wT8RpqtqFhB8OCR8diGfLojqbMrmZXEvxALBHKAgfarWcR1rnRgmjCQKejWLWCLmmg==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.2.3.tgz", + "integrity": "sha512-DU+RdUB4E4I489R2P2hOrgkCDJNXlVaTzYixpgeDnuldCIYM0MatEzjor9DYNL3EDCayHF+M4HlVOcn6T/IVPQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -417,9 +417,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.2.1.tgz", - "integrity": "sha512-ACV2sxBOHfoHiVQFQfP5a7pXWSNPpnYbl8NKjuZzHDWueQ/IInAk6ycUEsycTh8mTm0+bBAUMw8uXTCRItML9A==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.2.3.tgz", + "integrity": "sha512-v+/6pimht808F5XpmVTNV4/109s+A7m3nadQP97qvIDsrtwrPPZR7cST+DRioG2C41VwtjXM0HVbIon/3ydo6A==", "dependencies": { "tslib": "^2.3.0" }, @@ -427,24 +427,24 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.1", - "@angular/core": "17.2.1", - "@angular/platform-browser": "17.2.1", + "@angular/common": "17.2.3", + "@angular/core": "17.2.3", + "@angular/platform-browser": "17.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.2.1.tgz", - "integrity": "sha512-Nj+T5NQ99QszTlgJM5xjzf5Bqzi2tFJ3VBCOjCcX9A7K+m2trZAbq0i2nMSPoxkQexZnaQvHMnsMhqPBShDUnA==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.2.3.tgz", + "integrity": "sha512-H4LUs2Ftdlk1iqHqC7jRcbHmnNRy53OUlBYNkjRkTsthOI4WqsiSqAp5Frrni3erBqpZ2ik86cbMEyEXcfjRhw==", "engines": { "node": "^18.13.0 || >=20.9.0" } }, "node_modules/@angular/localize": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.2.1.tgz", - "integrity": "sha512-6aIaGin816vJayFbYBVF0cT8cnmsKeB6PQuIrQ0FX8pO4gSFNtR5ycH2VeD+x8aqvJ8+3njbEldOCB633dHvew==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.2.3.tgz", + "integrity": "sha512-RCReeQabENpWNzhF/jZMhiMCbGt78lb5mgiMNvbGet62IHR62q3Qu1bXprjJvgGIHsxQlM4pkGgMGTZ/8/my4A==", "dev": true, "dependencies": { "@babel/core": "7.23.9", @@ -461,14 +461,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.1", - "@angular/compiler-cli": "17.2.1" + "@angular/compiler": "17.2.3", + "@angular/compiler-cli": "17.2.3" } }, "node_modules/@angular/platform-browser": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.2.1.tgz", - "integrity": "sha512-on+fTZiDTBJmRQbQe6GOClqaUFe4GJdLS1EbmI+6/8Ntv4QW2PowWnaxajoqTj2Zrh22J9DSNy7RWcrQDdyU3g==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.2.3.tgz", + "integrity": "sha512-bFi+H8avyCjwSBy+zpOKmqx852MRH8fkuZa4XgwKCPJRay8BfSCjHdtIo3eokUNPMu9JsyXM7HYKIfzLu5y6LA==", "dependencies": { "tslib": "^2.3.0" }, @@ -476,9 +476,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.2.1", - "@angular/common": "17.2.1", - "@angular/core": "17.2.1" + "@angular/animations": "17.2.3", + "@angular/common": "17.2.3", + "@angular/core": "17.2.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -487,9 +487,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.2.1.tgz", - "integrity": "sha512-J8mpB/LDMnPez1Xtaq/j4JEp7E1m7vVMfzJQvKPt1vZmp5EEzyo++u9k5yYKnGpfWTudBXHRIjK2mCjo7wNajg==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.2.3.tgz", + "integrity": "sha512-K8CsHbmG2nvV1jrNN9PYxyA0zJNoIWp+qf2udvPhG8rJ+Pyw61qmptrarpQUUkr8ONOtjwtOsnKa9/w+15nExw==", "dependencies": { "tslib": "^2.3.0" }, @@ -497,16 +497,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.1", - "@angular/compiler": "17.2.1", - "@angular/core": "17.2.1", - "@angular/platform-browser": "17.2.1" + "@angular/common": "17.2.3", + "@angular/compiler": "17.2.3", + "@angular/core": "17.2.3", + "@angular/platform-browser": "17.2.3" } }, "node_modules/@angular/router": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.2.1.tgz", - "integrity": "sha512-sJFraoPTHV09jZQV3XcFHRJsY7EAuXcBn5k+7GGye60YgTXAjL3OC++Cuv4AScFYRp+IqbrE3I0tflsRtQzemw==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.2.3.tgz", + "integrity": "sha512-8UPjMzI98xZ6cDNm0MzHd9hFq6aOQJGmgxKDUPIG2h74glRwwbiewpo5hPo2EGIF8BLvQmmAm9ytr5zesHu0cg==", "dependencies": { "tslib": "^2.3.0" }, @@ -514,9 +514,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.1", - "@angular/core": "17.2.1", - "@angular/platform-browser": "17.2.1", + "@angular/common": "17.2.3", + "@angular/core": "17.2.3", + "@angular/platform-browser": "17.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -652,9 +652,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", - "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", + "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -815,9 +815,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -935,14 +935,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -963,9 +963,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1740,14 +1740,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.23.3" }, @@ -2206,23 +2206,23 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -2231,8 +2231,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2241,9 +2241,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -2264,9 +2264,9 @@ } }, "node_modules/@coreui/angular": { - "version": "4.7.15", - "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-4.7.15.tgz", - "integrity": "sha512-taTKV2aQ2XeSX9YCLF9/NCQosaSEHnsFM87LfegbTWYJUfl7FzZEnhDa4HBpQZBaXGw/J8aK4WVx2rjS5UOfjg==", + "version": "5.0.0-next.23", + "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-5.0.0-next.23.tgz", + "integrity": "sha512-vwRVri6SgnFK1qM3txKsjUFRH1GNKKSNupWJF3pUBiZNqhtCDxtP8Zz9ey4jAA2HwOxORhdQACUjWki/SeV8GQ==", "dependencies": { "@popperjs/core": "~2.11.6", "tslib": "^2.3.0" @@ -2276,14 +2276,17 @@ "@angular/cdk": "^17.0.0", "@angular/common": "^17.0.0", "@angular/core": "^17.0.0", + "@angular/forms": "^17.0.0", "@angular/router": "^17.0.0", + "@coreui/coreui": "~5.0.0-0 || ~5.0.0", + "@coreui/icons-angular": "~4.7.3 || ^5.0.0-0 || ~5.0.0", "rxjs": "^7.8.1" } }, "node_modules/@coreui/angular-chartjs": { - "version": "4.7.14", - "resolved": "https://registry.npmjs.org/@coreui/angular-chartjs/-/angular-chartjs-4.7.14.tgz", - "integrity": "sha512-4Zpse0F9OCqMPzTJWx6l0lJ35WJAjU7k4mGXFcpQ/Gz15hS0/BOIUpmaZnkjUyYf8VRVeX8eKu8lSfHKIRTWCA==", + "version": "5.0.0-next.23", + "resolved": "https://registry.npmjs.org/@coreui/angular-chartjs/-/angular-chartjs-5.0.0-next.23.tgz", + "integrity": "sha512-u07CgqRSBWaf2CUAxYChlppQL2eIahLi6JG0JrjpBqnaRQnbAtsI9oONbb7fp9tGAX3a+OSryEHAig9gatJZjw==", "dependencies": { "lodash-es": "^4.17.21", "tslib": "^2.3.0" @@ -2292,28 +2295,31 @@ "@angular/cdk": "^17.0.0", "@angular/common": "^17.0.0", "@angular/core": "^17.0.0", - "@coreui/chartjs": "^3.0.0", - "chart.js": "^3.9.1" + "@coreui/chartjs": "^4.0.0-0 || ^4.0.0", + "chart.js": "^4.4.1" } }, "node_modules/@coreui/chartjs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-3.1.2.tgz", - "integrity": "sha512-d3MGk3KZNAt29VRKP/XYiGmT56KTqtuOhLEg5HNwb7P7ZmEgOJoHxFHVCVE4I36hfgQCjZZVknsuk2ZTfF/2fw==", + "version": "4.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-4.0.0-rc.0.tgz", + "integrity": "sha512-UTcb6Yf5XVQoj/cC2Lu3OSJUIUg4niYOnMbketeXf1xxEGV8V+sebWwmQ7eoNRjEiq/z5bkW5zasZGW43UsrFA==", "dependencies": { - "@coreui/coreui": "^4.2.6", - "chart.js": "^3.9.1" + "@coreui/coreui": "^5.0.0-rc.0", + "chart.js": "^4.4.0" } }, "node_modules/@coreui/coreui": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-4.2.6.tgz", - "integrity": "sha512-h9j1BVnaDi9vSr1t0H8NL3hlDD4lU9kIdGLXn7g9k5iaFq5EDlRDcSBDer6lR2O4sIEl7W7YqTlevLxFC+1cIA==", - "dependencies": { - "postcss-combine-duplicated-selectors": "^10.0.3" - }, + "version": "5.0.0-rc-2", + "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-5.0.0-rc-2.tgz", + "integrity": "sha512-rkkLHrAevhm9L7AJVQ7UFJRamdPNKq085P+P0WCwrxZYV+eHkhjUESSVZd3ayMBaNiKHgZtgv1Hs9uytgYSuRA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/coreui" + } + ], "peerDependencies": { - "@popperjs/core": "^2.11.6" + "@popperjs/core": "^2.11.8" } }, "node_modules/@coreui/icons": { @@ -2322,9 +2328,9 @@ "integrity": "sha512-u9UKEcRMyY9pa4jUoLij8pAR03g5g6TLWV33/Mx2ix8sffyi0eO4fLV8DSTQljDCw938zt7KYog5cVKEAJUxxg==" }, "node_modules/@coreui/icons-angular": { - "version": "4.7.14", - "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-4.7.14.tgz", - "integrity": "sha512-6SCU53Tw+nm0yOYzwV7gyzP+5I1EFzGPqQvejN2PzfQsmQ9kvvkVz1+MrXDt9W0jPgNuVvaKEX9wtRsjULAFkw==", + "version": "5.0.0-next.23", + "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-5.0.0-next.23.tgz", + "integrity": "sha512-xPM3MxCjuVolN3EOM7bq7i3cO7wnhDriZ0dzb7GHPTa/ntCdLbmOuS/sA9paBQobdEPR2c5txQP0sZyP9vI9iw==", "dependencies": { "tslib": "^2.3.0" }, @@ -2718,9 +2724,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, "engines": { "node": ">=14" @@ -2848,14 +2854,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -2871,9 +2877,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2896,15 +2902,20 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -2924,9 +2935,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.2.0.tgz", - "integrity": "sha512-3VilWAMylVpOqffhnLdc/UeElUWhBbG5j2XzxYWfQXb8OcVYoKNYPmJLc1vemoaYkkbaUX3zc5AEAN93Hk/q/g==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.2.2.tgz", + "integrity": "sha512-HgvClGO6WVq4VA5d0ZvlDG5hrj8lQzRH99Gt87URm7G8E5XkatysdOsMqUQsJz+OwFWhP4PvTRWVblpBDiDl/A==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3248,9 +3259,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.11.0.tgz", - "integrity": "sha512-BV+u2QSfK3i1o6FucqJh5IK9cjAU6icjFFhvknzFgu472jzl0bBojfDAkJLBEsHFMo+YZg6rthBvBBt8z12IBQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", "cpu": [ "arm" ], @@ -3261,9 +3272,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.11.0.tgz", - "integrity": "sha512-0ij3iw7sT5jbcdXofWO2NqDNjSVVsf6itcAkV2I6Xsq4+6wjW1A8rViVB67TfBEan7PV2kbLzT8rhOVWLI2YXw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", "cpu": [ "arm64" ], @@ -3274,9 +3285,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.11.0.tgz", - "integrity": "sha512-yPLs6RbbBMupArf6qv1UDk6dzZvlH66z6NLYEwqTU0VHtss1wkI4UYeeMS7TVj5QRVvaNAWYKP0TD/MOeZ76Zg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", "cpu": [ "arm64" ], @@ -3287,9 +3298,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.11.0.tgz", - "integrity": "sha512-OvqIgwaGAwnASzXaZEeoJY3RltOFg+WUbdkdfoluh2iqatd090UeOG3A/h0wNZmE93dDew9tAtXgm3/+U/B6bw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", "cpu": [ "x64" ], @@ -3300,9 +3311,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.11.0.tgz", - "integrity": "sha512-X17s4hZK3QbRmdAuLd2EE+qwwxL8JxyVupEqAkxKPa/IgX49ZO+vf0ka69gIKsaYeo6c1CuwY3k8trfDtZ9dFg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", "cpu": [ "arm" ], @@ -3313,9 +3324,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.11.0.tgz", - "integrity": "sha512-673Lu9EJwxVB9NfYeA4AdNu0FOHz7g9t6N1DmT7bZPn1u6bTF+oZjj+fuxUcrfxWXE0r2jxl5QYMa9cUOj9NFg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", "cpu": [ "arm64" ], @@ -3326,9 +3337,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.11.0.tgz", - "integrity": "sha512-yFW2msTAQNpPJaMmh2NpRalr1KXI7ZUjlN6dY/FhWlOclMrZezm5GIhy3cP4Ts2rIAC+IPLAjNibjp1BsxCVGg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", "cpu": [ "arm64" ], @@ -3339,9 +3350,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.11.0.tgz", - "integrity": "sha512-kKT9XIuhbvYgiA3cPAGntvrBgzhWkGpBMzuk1V12Xuoqg7CI41chye4HU0vLJnGf9MiZzfNh4I7StPeOzOWJfA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", "cpu": [ "riscv64" ], @@ -3352,9 +3363,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.11.0.tgz", - "integrity": "sha512-6q4ESWlyTO+erp1PSCmASac+ixaDv11dBk1fqyIuvIUc/CmRAX2Zk+2qK1FGo5q7kyDcjHCFVwgGFCGIZGVwCA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", "cpu": [ "x64" ], @@ -3365,9 +3376,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.11.0.tgz", - "integrity": "sha512-vIAQUmXeMLmaDN78HSE4Kh6xqof2e3TJUKr+LPqXWU4NYNON0MDN9h2+t4KHrPAQNmU3w1GxBQ/n01PaWFwa5w==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", "cpu": [ "x64" ], @@ -3378,9 +3389,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.11.0.tgz", - "integrity": "sha512-LVXo9dDTGPr0nezMdqa1hK4JeoMZ02nstUxGYY/sMIDtTYlli1ZxTXBYAz3vzuuvKO4X6NBETciIh7N9+abT1g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", "cpu": [ "arm64" ], @@ -3391,9 +3402,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.11.0.tgz", - "integrity": "sha512-xZVt6K70Gr3I7nUhug2dN6VRR1ibot3rXqXS3wo+8JP64t7djc3lBFyqO4GiVrhNaAIhUCJtwQ/20dr0h0thmQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", "cpu": [ "ia32" ], @@ -3404,9 +3415,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.11.0.tgz", - "integrity": "sha512-f3I7h9oTg79UitEco9/2bzwdciYkWr8pITs3meSDSlr1TdvQ7IxkQaaYN2YqZXX5uZhiYL+VuYDmHwNzhx+HOg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", "cpu": [ "x64" ], @@ -3417,13 +3428,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.0.tgz", - "integrity": "sha512-k5SisAPTRXxP2WVjWHgQl2sQkaAkUiOZJrHhTmUghTowULN2eIiW+1SSdNBFCbv+qkl276NfavOi22j+C7uaKQ==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.2.tgz", + "integrity": "sha512-Q3VAQ/S4gj8D1JPWgWG4enDdDZUu8mUXWVRG1rOi4sHgOF5zgPieQFp3LXqMUgOncmzbXrctkbO6NKc4N2FAag==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.0", - "@angular-devkit/schematics": "17.2.0", + "@angular-devkit/core": "17.2.2", + "@angular-devkit/schematics": "17.2.2", "jsonc-parser": "3.2.1" }, "engines": { @@ -3433,12 +3444,12 @@ } }, "node_modules/@sigstore/bundle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.1.tgz", - "integrity": "sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -3454,23 +3465,23 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz", + "integrity": "sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.2.tgz", - "integrity": "sha512-mAifqvvGOCkb5BJ5d/SRrVP5+kKCGxtcHuti6lgqZalIfNxikxlJMMptOqFp9+xV5LAnJMSaMWtzvcgNZ3PlPA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", + "@sigstore/bundle": "^2.2.0", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/protobuf-specs": "^0.3.0", "make-fetch-happen": "^13.0.0" }, "engines": { @@ -3478,12 +3489,12 @@ } }, "node_modules/@sigstore/tuf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.0.tgz", - "integrity": "sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.1.tgz", + "integrity": "sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/protobuf-specs": "^0.3.0", "tuf-js": "^2.2.0" }, "engines": { @@ -3491,14 +3502,14 @@ } }, "node_modules/@sigstore/verify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.0.0.tgz", - "integrity": "sha512-sRU6nblDBQ4pVTWni019Kij+XQj4RP75WXN5z3qHk81dt/L8A7r3v8RgRInTup4/Jf90WNods9CcbnWj7zJ26w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.0.tgz", + "integrity": "sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", + "@sigstore/bundle": "^2.2.0", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -3651,9 +3662,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3749,9 +3760,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.18.tgz", - "integrity": "sha512-ABT5VWnnYneSBcNWYSCuR05M826RoMyMSGiFivXGx6ZUIsXb9vn4643IEwkg2zbEOSgAiSogtapN2fgc4mAPlw==", + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -3767,9 +3778,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", "dev": true }, "node_modules/@types/range-parser": { @@ -4706,9 +4717,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", "dev": true, "funding": [ { @@ -4746,9 +4757,15 @@ "dev": true }, "node_modules/chart.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", - "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", + "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } }, "node_modules/chokidar": { "version": "3.6.0", @@ -5406,6 +5423,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -5630,9 +5648,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.670", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.670.tgz", - "integrity": "sha512-hcijYOWjOtjKrKPtNA6tuLlA/bTLO3heFG8pQA6mLpq7dRydSWicXova5lyxDzp1iVJaYhK7J2OQlGE52KYn7A==", + "version": "1.4.692", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", + "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==", "dev": true }, "node_modules/emoji-regex": { @@ -5713,9 +5731,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", + "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6001,14 +6019,14 @@ "dev": true }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -6042,30 +6060,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -6108,21 +6102,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -6312,9 +6291,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -6627,9 +6606,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -6726,9 +6705,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -6824,9 +6803,9 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.1.tgz", - "integrity": "sha512-My1KCEPs6A0hb4qCVzYp8iEvA8j8YqcvXLZZH8C9OFuTYpYjHE7N2dtG3mRl1HMD4+VGXpF3XcDVcxGBT7yDZQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -7415,9 +7394,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -7587,9 +7566,9 @@ ] }, "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -7611,7 +7590,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.4.1", + "socket.io": "^4.7.2", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -7745,15 +7724,12 @@ } }, "node_modules/karma/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/karma/node_modules/wrap-ansi": { @@ -8556,6 +8532,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -9397,7 +9374,8 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "4.0.1", @@ -9519,6 +9497,7 @@ "version": "8.4.35", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -9542,20 +9521,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-combine-duplicated-selectors": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-10.0.3.tgz", - "integrity": "sha512-IP0BmwFloCskv7DV7xqvzDXqMHpwdczJa6ZvIW8abgHdcIHs9mCJX2ltFhu3EwA51ozp13DByng30+Ke+eIExA==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/postcss-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.0.tgz", @@ -9650,6 +9615,7 @@ "version": "6.0.15", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10163,9 +10129,9 @@ } }, "node_modules/rollup": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.11.0.tgz", - "integrity": "sha512-2xIbaXDXjf3u2tajvA5xROpib7eegJ9Y/uPlSFhXLNpK9ampCczXAhLEb5yLzJyG3LAdI1NWtNjDXiLyniNdjQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -10178,19 +10144,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.11.0", - "@rollup/rollup-android-arm64": "4.11.0", - "@rollup/rollup-darwin-arm64": "4.11.0", - "@rollup/rollup-darwin-x64": "4.11.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.11.0", - "@rollup/rollup-linux-arm64-gnu": "4.11.0", - "@rollup/rollup-linux-arm64-musl": "4.11.0", - "@rollup/rollup-linux-riscv64-gnu": "4.11.0", - "@rollup/rollup-linux-x64-gnu": "4.11.0", - "@rollup/rollup-linux-x64-musl": "4.11.0", - "@rollup/rollup-win32-arm64-msvc": "4.11.0", - "@rollup/rollup-win32-ia32-msvc": "4.11.0", - "@rollup/rollup-win32-x64-msvc": "4.11.0", + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", "fsevents": "~2.3.2" } }, @@ -10620,12 +10586,12 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" @@ -10644,17 +10610,17 @@ "dev": true }, "node_modules/sigstore": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.1.tgz", - "integrity": "sha512-OBBSKvmjr4DCyUb+IC2p7wooOCsCNwaqvCilTJVNPo0y8lJl+LsCrfz4LtMwnw3Gn+8frt816wi1+DWZTUCpBQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", + "@sigstore/bundle": "^2.2.0", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.2", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^1.0.0" + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -10701,11 +10667,12 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", "dev": true, "dependencies": { + "debug": "~4.3.4", "ws": "~8.11.0" } }, @@ -10734,9 +10701,9 @@ } }, "node_modules/socks": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", - "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -10774,6 +10741,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11514,7 +11482,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", diff --git a/package.json b/package.json index 2c0ac0e72..fdb36c0b1 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { "name": "coreui-free-angular-admin-template", - "version": "4.7.15", + "version": "5.0.0-next.23", "copyright": "Copyright 2024 creativeLabs Łukasz Holeczek", "license": "MIT", "author": "The CoreUI Team (https://github.com/orgs/coreui/people) and contributors", "homepage": "https://coreui.io/angular", "config": { - "coreui_library_short_version": "4.7", + "theme": "default", + "coreui_library_short_version": "5.0", "coreui_library_docs_url": "https://coreui.io/angular/docs/" }, "scripts": { @@ -18,24 +19,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "^17.2.1", - "@angular/cdk": "^17.2.0", - "@angular/common": "^17.2.1", - "@angular/compiler": "^17.2.1", - "@angular/core": "^17.2.1", - "@angular/forms": "^17.2.1", - "@angular/language-service": "^17.2.1", - "@angular/platform-browser": "^17.2.1", - "@angular/platform-browser-dynamic": "^17.2.1", - "@angular/router": "^17.2.1", - "@coreui/angular": "~4.7.15", - "@coreui/angular-chartjs": "~4.7.14", - "@coreui/chartjs": "^3.1.2", - "@coreui/coreui": "~4.2.6", + "@angular/animations": "^17.2.3", + "@angular/cdk": "^17.2.1", + "@angular/common": "^17.2.3", + "@angular/compiler": "^17.2.3", + "@angular/core": "^17.2.3", + "@angular/forms": "^17.2.3", + "@angular/language-service": "^17.2.3", + "@angular/platform-browser": "^17.2.3", + "@angular/platform-browser-dynamic": "^17.2.3", + "@angular/router": "^17.2.3", + "@coreui/angular": "~5.0.0-0", + "@coreui/angular-chartjs": "~5.0.0-0", + "@coreui/chartjs": "~4.0.0-0", + "@coreui/coreui": "~5.0.0-0", "@coreui/icons": "^3.0.1", - "@coreui/icons-angular": "~4.7.14", + "@coreui/icons-angular": "~5.0.0-0", "@coreui/utils": "^2.0.2", - "chart.js": "^3.9.1", + "chart.js": "^4.4.2", "lodash-es": "^4.17.21", "ngx-scrollbar": "^13.0.3", "rxjs": "~7.8.1", @@ -43,15 +44,15 @@ "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.0", - "@angular/cli": "^17.2.0", - "@angular/compiler-cli": "^17.2.1", - "@angular/localize": "^17.2.1", + "@angular-devkit/build-angular": "^17.2.2", + "@angular/cli": "^17.2.2", + "@angular/compiler-cli": "^17.2.3", + "@angular/localize": "^17.2.3", "@types/jasmine": "^5.1.4", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.18", + "@types/node": "^20.11.24", "jasmine-core": "^5.1.2", - "karma": "^6.4.2", + "karma": "^6.4.3", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts deleted file mode 100644 index 6c80c5cff..000000000 --- a/src/app/app-routing.module.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { DefaultLayoutComponent } from './containers'; -import { Page404Component } from './views/pages/page404/page404.component'; -import { Page500Component } from './views/pages/page500/page500.component'; -import { LoginComponent } from './views/pages/login/login.component'; -import { RegisterComponent } from './views/pages/register/register.component'; - -const routes: Routes = [ - { - path: '', - redirectTo: 'dashboard', - pathMatch: 'full' - }, - { - path: '', - component: DefaultLayoutComponent, - data: { - title: 'Home' - }, - children: [ - { - path: 'dashboard', - loadChildren: () => - import('./views/dashboard/dashboard.module').then((m) => m.DashboardModule) - }, - { - path: 'theme', - loadChildren: () => - import('./views/theme/theme.module').then((m) => m.ThemeModule) - }, - { - path: 'base', - loadChildren: () => - import('./views/base/base.module').then((m) => m.BaseModule) - }, - { - path: 'buttons', - loadChildren: () => - import('./views/buttons/buttons.module').then((m) => m.ButtonsModule) - }, - { - path: 'forms', - loadChildren: () => - import('./views/forms/forms.module').then((m) => m.CoreUIFormsModule) - }, - { - path: 'charts', - loadChildren: () => - import('./views/charts/charts.module').then((m) => m.ChartsModule) - }, - { - path: 'icons', - loadChildren: () => - import('./views/icons/icons.module').then((m) => m.IconsModule) - }, - { - path: 'notifications', - loadChildren: () => - import('./views/notifications/notifications.module').then((m) => m.NotificationsModule) - }, - { - path: 'widgets', - loadChildren: () => - import('./views/widgets/widgets.module').then((m) => m.WidgetsModule) - }, - { - path: 'pages', - loadChildren: () => - import('./views/pages/pages.module').then((m) => m.PagesModule) - }, - ] - }, - { - path: '404', - component: Page404Component, - data: { - title: 'Page 404' - } - }, - { - path: '500', - component: Page500Component, - data: { - title: 'Page 500' - } - }, - { - path: 'login', - component: LoginComponent, - data: { - title: 'Login Page' - } - }, - { - path: 'register', - component: RegisterComponent, - data: { - title: 'Register Page' - } - }, - {path: '**', redirectTo: 'dashboard'} -]; - -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { - scrollPositionRestoration: 'top', - anchorScrolling: 'enabled', - initialNavigation: 'enabledBlocking' - // relativeLinkResolution: 'legacy' - }) - ], - exports: [RouterModule] -}) -export class AppRoutingModule { -} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 35cd3ceb1..8274fbf2b 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -5,13 +5,11 @@ import { AppComponent } from './app.component'; describe('AppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ + imports: [ + RouterTestingModule, AppComponent - ], - }).compileComponents(); + ], +}).compileComponents(); }); it('should create the app', () => { @@ -20,9 +18,9 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'CoreUI Free Angular Admin Template'`, () => { + it(`should have as title 'CoreUI Angular Admin Template'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('CoreUI Free Angular Admin Template'); + expect(app.title).toEqual('CoreUI Angular Admin Template'); }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8e27c6a27..0b3327528 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,25 +1,27 @@ import { Component, OnInit } from '@angular/core'; -import { Router, NavigationEnd } from '@angular/router'; +import { NavigationEnd, Router, RouterOutlet } from '@angular/router'; +import { Title } from '@angular/platform-browser'; import { IconSetService } from '@coreui/icons-angular'; import { iconSubset } from './icons/icon-subset'; -import { Title } from '@angular/platform-browser'; @Component({ selector: 'app-root', - template: '', + template: '', + standalone: true, + imports: [RouterOutlet] }) export class AppComponent implements OnInit { - title = 'CoreUI Free Angular Admin Template'; + title = 'CoreUI Angular Admin Template'; constructor( private router: Router, private titleService: Title, private iconSetService: IconSetService ) { - titleService.setTitle(this.title); + this.titleService.setTitle(this.title); // iconSet singleton - iconSetService.icons = { ...iconSubset }; + this.iconSetService.icons = { ...iconSubset }; } ngOnInit(): void { diff --git a/src/app/app.config.ts b/src/app/app.config.ts new file mode 100644 index 000000000..0b96c6d8f --- /dev/null +++ b/src/app/app.config.ts @@ -0,0 +1,34 @@ +import { ApplicationConfig, importProvidersFrom } from '@angular/core'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { + provideRouter, + withEnabledBlockingInitialNavigation, + withHashLocation, + withInMemoryScrolling, + withRouterConfig, + withViewTransitions +} from '@angular/router'; + +import { DropdownModule, SidebarModule } from '@coreui/angular'; +import { IconSetService } from '@coreui/icons-angular'; +import { routes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideRouter(routes, + withRouterConfig({ + onSameUrlNavigation: 'reload' + }), + withInMemoryScrolling({ + scrollPositionRestoration: 'top', + anchorScrolling: 'enabled' + }), + withEnabledBlockingInitialNavigation(), + withViewTransitions(), + withHashLocation() + ), + importProvidersFrom(SidebarModule, DropdownModule), + IconSetService, + provideAnimations() + ] +}; diff --git a/src/app/app.module.ts b/src/app/app.module.ts deleted file mode 100644 index 8b0660039..000000000 --- a/src/app/app.module.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { NgModule } from '@angular/core'; -import { HashLocationStrategy, LocationStrategy, PathLocationStrategy } from '@angular/common'; -import { BrowserModule, Title } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { NgScrollbarModule } from 'ngx-scrollbar'; - -// Import routing module -import { AppRoutingModule } from './app-routing.module'; - -// Import app component -import { AppComponent } from './app.component'; - -// Import containers -import { DefaultFooterComponent, DefaultHeaderComponent, DefaultLayoutComponent } from './containers'; - -import { - AvatarModule, - BadgeModule, - BreadcrumbModule, - ButtonGroupModule, - ButtonModule, - CardModule, - DropdownModule, - FooterModule, - FormModule, - GridModule, - HeaderModule, - ListGroupModule, - NavModule, - ProgressModule, - SharedModule, - SidebarModule, - TabsModule, - UtilitiesModule -} from '@coreui/angular'; - -import { IconModule, IconSetService } from '@coreui/icons-angular'; - -const APP_CONTAINERS = [ - DefaultFooterComponent, - DefaultHeaderComponent, - DefaultLayoutComponent -]; - -@NgModule({ - declarations: [AppComponent, ...APP_CONTAINERS], - imports: [ - BrowserModule, - BrowserAnimationsModule, - AppRoutingModule, - AvatarModule, - BreadcrumbModule, - FooterModule, - DropdownModule, - GridModule, - HeaderModule, - SidebarModule, - IconModule, - NavModule, - ButtonModule, - FormModule, - UtilitiesModule, - ButtonGroupModule, - ReactiveFormsModule, - SidebarModule, - SharedModule, - TabsModule, - ListGroupModule, - ProgressModule, - BadgeModule, - ListGroupModule, - CardModule, - NgScrollbarModule - ], - providers: [ - { - provide: LocationStrategy, - useClass: HashLocationStrategy - }, - IconSetService, - Title - ], - bootstrap: [AppComponent] -}) -export class AppModule { -} diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts new file mode 100644 index 000000000..4727d0198 --- /dev/null +++ b/src/app/app.routes.ts @@ -0,0 +1,88 @@ +import { Routes } from '@angular/router'; +import { DefaultLayoutComponent } from './layout'; + +export const routes: Routes = [ + { + path: '', + redirectTo: 'dashboard', + pathMatch: 'full' + }, + { + path: '', + component: DefaultLayoutComponent, + data: { + title: 'Home' + }, + children: [ + { + path: 'dashboard', + loadChildren: () => import('./views/dashboard/routes').then((m) => m.routes) + }, + { + path: 'theme', + loadChildren: () => import('./views/theme/routes').then((m) => m.routes) + }, + { + path: 'base', + loadChildren: () => import('./views/base/routes').then((m) => m.routes) + }, + { + path: 'buttons', + loadChildren: () => import('./views/buttons/routes').then((m) => m.routes) + }, + { + path: 'forms', + loadChildren: () => import('./views/forms/routes').then((m) => m.routes) + }, + { + path: 'icons', + loadChildren: () => import('./views/icons/routes').then((m) => m.routes) + }, + { + path: 'notifications', + loadChildren: () => import('./views/notifications/routes').then((m) => m.routes) + }, + { + path: 'widgets', + loadChildren: () => import('./views/widgets/routes').then((m) => m.routes) + }, + { + path: 'charts', + loadChildren: () => import('./views/charts/routes').then((m) => m.routes) + }, + { + path: 'pages', + loadChildren: () => import('./views/pages/routes').then((m) => m.routes) + } + ] + }, + { + path: '404', + loadComponent: () => import('./views/pages/page404/page404.component').then(m => m.Page404Component), + data: { + title: 'Page 404' + } + }, + { + path: '500', + loadComponent: () => import('./views/pages/page500/page500.component').then(m => m.Page500Component), + data: { + title: 'Page 500' + } + }, + { + path: 'login', + loadComponent: () => import('./views/pages/login/login.component').then(m => m.LoginComponent), + data: { + title: 'Login Page' + } + }, + { + path: 'register', + loadComponent: () => import('./views/pages/register/register.component').then(m => m.RegisterComponent), + data: { + title: 'Register Page' + } + }, + { path: '**', redirectTo: 'dashboard' } +]; diff --git a/src/app/containers/default-layout/default-header/default-header.component.html b/src/app/containers/default-layout/default-header/default-header.component.html deleted file mode 100644 index 221f8c2f2..000000000 --- a/src/app/containers/default-layout/default-header/default-header.component.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - Dashboard - - - - Users - - - - Settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/containers/default-layout/default-header/default-header.component.ts b/src/app/containers/default-layout/default-header/default-header.component.ts deleted file mode 100644 index 5e9e6defc..000000000 --- a/src/app/containers/default-layout/default-header/default-header.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; - -import { ClassToggleService, HeaderComponent } from '@coreui/angular'; - -@Component({ - selector: 'app-default-header', - templateUrl: './default-header.component.html', -}) -export class DefaultHeaderComponent extends HeaderComponent { - - @Input() sidebarId: string = "sidebar"; - - public newMessages = new Array(4) - public newTasks = new Array(5) - public newNotifications = new Array(5) - - constructor(private classToggler: ClassToggleService) { - super(); - } -} diff --git a/src/app/containers/default-layout/default-layout.component.html b/src/app/containers/default-layout/default-layout.component.html deleted file mode 100644 index 2a2aa717e..000000000 --- a/src/app/containers/default-layout/default-layout.component.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - -
- - - -
- - - -
- - -
diff --git a/src/app/containers/default-layout/default-layout.component.scss b/src/app/containers/default-layout/default-layout.component.scss deleted file mode 100644 index 4ca8e9e30..000000000 --- a/src/app/containers/default-layout/default-layout.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -:host { - ng-scrollbar { - --scrollbar-thumb-color: var(--cui-border-color, #999); - --scrollbar-track-color: var(--cui-body-color, #fff); - --scrollbar-hover-size: calc(var(--scrollbar-size) * 1.5); - } -} diff --git a/src/app/containers/default-layout/default-layout.component.ts b/src/app/containers/default-layout/default-layout.component.ts deleted file mode 100644 index f0c0f902b..000000000 --- a/src/app/containers/default-layout/default-layout.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component } from '@angular/core'; - -import { navItems } from './_nav'; - -@Component({ - selector: 'app-dashboard', - templateUrl: './default-layout.component.html', - styleUrls: ['./default-layout.component.scss'], -}) -export class DefaultLayoutComponent { - - public navItems = navItems; - - constructor() {} -} diff --git a/src/app/icons/icon-subset.ts b/src/app/icons/icon-subset.ts index 04d235682..fda755c0e 100644 --- a/src/app/icons/icon-subset.ts +++ b/src/app/icons/icon-subset.ts @@ -16,6 +16,7 @@ import { cifIn, cifPl, cifUs, + cilAccountLogout, cilAlignCenter, cilAlignLeft, cilAlignRight, @@ -37,6 +38,7 @@ import { cilCloudDownload, cilCode, cilCommentSquare, + cilContrast, cilCreditCard, cilCursor, cilDescription, @@ -45,12 +47,14 @@ import { cilEnvelopeClosed, cilEnvelopeOpen, cilFile, + cilGrid, cilHome, cilInbox, cilIndentDecrease, cilIndentIncrease, cilItalic, cilJustifyCenter, + cilLanguage, cilLayers, cilList, cilListNumbered, @@ -59,6 +63,7 @@ import { cilMagnifyingGlass, cilMap, cilMediaPlay, + cilMediaRecord, cilMenu, cilMoon, cilNotes, @@ -91,6 +96,9 @@ import { cilUserUnfollow } from '@coreui/icons'; +import { signet } from './signet'; +import { logo } from './logo'; + export const iconSubset = { cibCcAmex, cibCcApplePay, @@ -109,6 +117,7 @@ export const iconSubset = { cifIn, cifPl, cifUs, + cilAccountLogout, cilAlignCenter, cilAlignLeft, cilAlignRight, @@ -130,6 +139,7 @@ export const iconSubset = { cilCloudDownload, cilCode, cilCommentSquare, + cilContrast, cilCreditCard, cilCursor, cilDescription, @@ -138,12 +148,14 @@ export const iconSubset = { cilEnvelopeClosed, cilEnvelopeOpen, cilFile, + cilGrid, cilHome, cilInbox, cilIndentDecrease, cilIndentIncrease, cilItalic, cilJustifyCenter, + cilLanguage, cilLayers, cilList, cilListNumbered, @@ -152,6 +164,7 @@ export const iconSubset = { cilMagnifyingGlass, cilMap, cilMediaPlay, + cilMediaRecord, cilMenu, cilMoon, cilNotes, @@ -181,7 +194,9 @@ export const iconSubset = { cilUser, cilUserFemale, cilUserFollow, - cilUserUnfollow + cilUserUnfollow, + logo, + signet }; export enum IconSubset { @@ -202,6 +217,7 @@ export enum IconSubset { cifIn = 'cifIn', cifPl = 'cifPl', cifUs = 'cifUs', + cilAccountLogout = 'cilAccountLogout', cilAlignCenter = 'cilAlignCenter', cilAlignLeft = 'cilAlignLeft', cilAlignRight = 'cilAlignRight', @@ -223,6 +239,7 @@ export enum IconSubset { cilCloudDownload = 'cilCloudDownload', cilCode = 'cilCode', cilCommentSquare = 'cilCommentSquare', + cilContrast = 'cilContrastś', cilCreditCard = 'cilCreditCard', cilCursor = 'cilCursor', cilDescription = 'cilDescription', @@ -231,12 +248,14 @@ export enum IconSubset { cilEnvelopeClosed = 'cilEnvelopeClosed', cilEnvelopeOpen = 'cilEnvelopeOpen', cilFile = 'cilFile', + cilGrid = 'cilGrid', cilHome = 'cilHome', cilInbox = 'cilInbox', cilIndentDecrease = 'cilIndentDecrease', cilIndentIncrease = 'cilIndentIncrease', cilItalic = 'cilItalic', cilJustifyCenter = 'cilJustifyCenter', + cilLanguage = 'cilLanguage', cilLayers = 'cilLayers', cilList = 'cilList', cilListNumbered = 'cilListNumbered', @@ -245,6 +264,7 @@ export enum IconSubset { cilMagnifyingGlass = 'cilMagnifyingGlass', cilMap = 'cilMap', cilMediaPlay = 'cilMediaPlay', + cilMediaRecord = 'cilMediaRecord', cilMenu = 'cilMenu', cilMoon = 'cilMoon', cilNotes = 'cilNotes', @@ -275,4 +295,7 @@ export enum IconSubset { cilUserFemale = 'cilUserFemale', cilUserFollow = 'cilUserFollow', cilUserUnfollow = 'cilUserUnfollow', + logo = 'logo', + signet = 'signet' } + diff --git a/src/app/icons/logo.ts b/src/app/icons/logo.ts new file mode 100644 index 000000000..86e46d09d --- /dev/null +++ b/src/app/icons/logo.ts @@ -0,0 +1,24 @@ +export const logo = [ + '685 116', + ` + + + + + + + + + + + + + + + + + + + + ` +]; diff --git a/src/app/icons/signet.ts b/src/app/icons/signet.ts new file mode 100644 index 000000000..44fba260a --- /dev/null +++ b/src/app/icons/signet.ts @@ -0,0 +1,8 @@ +export const signet = [ + '102 115', + ` + + + `, +] + diff --git a/src/app/containers/default-layout/_nav.ts b/src/app/layout/default-layout/_nav.ts similarity index 57% rename from src/app/containers/default-layout/_nav.ts rename to src/app/layout/default-layout/_nav.ts index 4655db360..3f76f7268 100644 --- a/src/app/containers/default-layout/_nav.ts +++ b/src/app/layout/default-layout/_nav.ts @@ -22,7 +22,7 @@ export const navItems: INavData[] = [ { name: 'Typography', url: '/theme/typography', - linkProps: { fragment: 'someAnchor' }, + linkProps: { fragment: 'headings' }, iconComponent: { name: 'cil-pencil' } }, { @@ -36,63 +36,78 @@ export const navItems: INavData[] = [ children: [ { name: 'Accordion', - url: '/base/accordion' + url: '/base/accordion', + icon: 'nav-icon-bullet' }, { name: 'Breadcrumbs', - url: '/base/breadcrumbs' + url: '/base/breadcrumbs', + icon: 'nav-icon-bullet' }, { name: 'Cards', - url: '/base/cards' + url: '/base/cards', + icon: 'nav-icon-bullet' }, { name: 'Carousel', - url: '/base/carousel' + url: '/base/carousel', + icon: 'nav-icon-bullet' }, { name: 'Collapse', - url: '/base/collapse' + url: '/base/collapse', + icon: 'nav-icon-bullet' }, { name: 'List Group', - url: '/base/list-group' + url: '/base/list-group', + icon: 'nav-icon-bullet' }, { name: 'Navs & Tabs', - url: '/base/navs' + url: '/base/navs', + icon: 'nav-icon-bullet' }, { name: 'Pagination', - url: '/base/pagination' + url: '/base/pagination', + icon: 'nav-icon-bullet' }, { name: 'Placeholder', - url: '/base/placeholder' + url: '/base/placeholder', + icon: 'nav-icon-bullet' }, { name: 'Popovers', - url: '/base/popovers' + url: '/base/popovers', + icon: 'nav-icon-bullet' }, { name: 'Progress', - url: '/base/progress' + url: '/base/progress', + icon: 'nav-icon-bullet' }, { name: 'Spinners', - url: '/base/spinners' + url: '/base/spinners', + icon: 'nav-icon-bullet' }, { name: 'Tables', - url: '/base/tables' + url: '/base/tables', + icon: 'nav-icon-bullet' }, { name: 'Tabs', - url: '/base/tabs' + url: '/base/tabs', + icon: 'nav-icon-bullet' }, { name: 'Tooltips', - url: '/base/tooltips' + url: '/base/tooltips', + icon: 'nav-icon-bullet' } ] }, @@ -103,15 +118,18 @@ export const navItems: INavData[] = [ children: [ { name: 'Buttons', - url: '/buttons/buttons' + url: '/buttons/buttons', + icon: 'nav-icon-bullet' }, { name: 'Button groups', - url: '/buttons/button-groups' + url: '/buttons/button-groups', + icon: 'nav-icon-bullet' }, { name: 'Dropdowns', - url: '/buttons/dropdowns' + url: '/buttons/dropdowns', + icon: 'nav-icon-bullet' } ] }, @@ -122,42 +140,50 @@ export const navItems: INavData[] = [ children: [ { name: 'Form Control', - url: '/forms/form-control' + url: '/forms/form-control', + icon: 'nav-icon-bullet' }, { name: 'Select', - url: '/forms/select' + url: '/forms/select', + icon: 'nav-icon-bullet' }, { name: 'Checks & Radios', - url: '/forms/checks-radios' + url: '/forms/checks-radios', + icon: 'nav-icon-bullet' }, { name: 'Range', - url: '/forms/range' + url: '/forms/range', + icon: 'nav-icon-bullet' }, { name: 'Input Group', - url: '/forms/input-group' + url: '/forms/input-group', + icon: 'nav-icon-bullet' }, { name: 'Floating Labels', - url: '/forms/floating-labels' + url: '/forms/floating-labels', + icon: 'nav-icon-bullet' }, { name: 'Layout', - url: '/forms/layout' + url: '/forms/layout', + icon: 'nav-icon-bullet' }, { name: 'Validation', - url: '/forms/validation' + url: '/forms/validation', + icon: 'nav-icon-bullet' } ] }, { name: 'Charts', - url: '/charts', - iconComponent: { name: 'cil-chart-pie' } + iconComponent: { name: 'cil-chart-pie' }, + url: '/charts' }, { name: 'Icons', @@ -167,6 +193,7 @@ export const navItems: INavData[] = [ { name: 'CoreUI Free', url: '/icons/coreui-icons', + icon: 'nav-icon-bullet', badge: { color: 'success', text: 'FREE' @@ -174,11 +201,13 @@ export const navItems: INavData[] = [ }, { name: 'CoreUI Flags', - url: '/icons/flags' + url: '/icons/flags', + icon: 'nav-icon-bullet' }, { name: 'CoreUI Brands', - url: '/icons/brands' + url: '/icons/brands', + icon: 'nav-icon-bullet' } ] }, @@ -189,19 +218,23 @@ export const navItems: INavData[] = [ children: [ { name: 'Alerts', - url: '/notifications/alerts' + url: '/notifications/alerts', + icon: 'nav-icon-bullet' }, { name: 'Badges', - url: '/notifications/badges' + url: '/notifications/badges', + icon: 'nav-icon-bullet' }, { name: 'Modal', - url: '/notifications/modal' + url: '/notifications/modal', + icon: 'nav-icon-bullet' }, { name: 'Toast', - url: '/notifications/toasts' + url: '/notifications/toasts', + icon: 'nav-icon-bullet' } ] }, @@ -225,38 +258,35 @@ export const navItems: INavData[] = [ children: [ { name: 'Login', - url: '/login' + url: '/login', + icon: 'nav-icon-bullet' }, { name: 'Register', - url: '/register' + url: '/register', + icon: 'nav-icon-bullet' }, { name: 'Error 404', - url: '/404' + url: '/404', + icon: 'nav-icon-bullet' }, { name: 'Error 500', - url: '/500' + url: '/500', + icon: 'nav-icon-bullet' } ] }, { title: true, name: 'Links', - class: 'py-0' + class: 'mt-auto' }, { name: 'Docs', - url: 'https://coreui.io/angular/docs/templates/installation', + url: 'https://coreui.io/angular/docs/', iconComponent: { name: 'cil-description' }, - attributes: { target: '_blank', class: '-text-dark' }, - class: 'mt-auto' - }, - { - name: 'Try CoreUI PRO', - url: 'https://coreui.io/product/angular-dashboard-template/', - iconComponent: { name: 'cil-layers' }, attributes: { target: '_blank' } } ]; diff --git a/src/app/containers/default-layout/default-footer/default-footer.component.html b/src/app/layout/default-layout/default-footer/default-footer.component.html similarity index 59% rename from src/app/containers/default-layout/default-footer/default-footer.component.html rename to src/app/layout/default-layout/default-footer/default-footer.component.html index 256ce8ffc..4a4f3f617 100644 --- a/src/app/containers/default-layout/default-footer/default-footer.component.html +++ b/src/app/layout/default-layout/default-footer/default-footer.component.html @@ -1,11 +1,11 @@
- CoreUI + CoreUI © 2024 creativeLabs
diff --git a/src/app/containers/default-layout/default-footer/default-footer.component.scss b/src/app/layout/default-layout/default-footer/default-footer.component.scss similarity index 100% rename from src/app/containers/default-layout/default-footer/default-footer.component.scss rename to src/app/layout/default-layout/default-footer/default-footer.component.scss diff --git a/src/app/containers/default-layout/default-footer/default-footer.component.spec.ts b/src/app/layout/default-layout/default-footer/default-footer.component.spec.ts similarity index 92% rename from src/app/containers/default-layout/default-footer/default-footer.component.spec.ts rename to src/app/layout/default-layout/default-footer/default-footer.component.spec.ts index c287eb6a4..baa929001 100644 --- a/src/app/containers/default-layout/default-footer/default-footer.component.spec.ts +++ b/src/app/layout/default-layout/default-footer/default-footer.component.spec.ts @@ -8,8 +8,8 @@ describe('DefaultFooterComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ DefaultFooterComponent ] - }) + imports: [DefaultFooterComponent] +}) .compileComponents(); }); diff --git a/src/app/containers/default-layout/default-footer/default-footer.component.ts b/src/app/layout/default-layout/default-footer/default-footer.component.ts similarity index 56% rename from src/app/containers/default-layout/default-footer/default-footer.component.ts rename to src/app/layout/default-layout/default-footer/default-footer.component.ts index 2002f42e4..8795dc035 100644 --- a/src/app/containers/default-layout/default-footer/default-footer.component.ts +++ b/src/app/layout/default-layout/default-footer/default-footer.component.ts @@ -2,9 +2,10 @@ import { Component } from '@angular/core'; import { FooterComponent } from '@coreui/angular'; @Component({ - selector: 'app-default-footer', - templateUrl: './default-footer.component.html', - styleUrls: ['./default-footer.component.scss'], + selector: 'app-default-footer', + templateUrl: './default-footer.component.html', + styleUrls: ['./default-footer.component.scss'], + standalone: true, }) export class DefaultFooterComponent extends FooterComponent { constructor() { diff --git a/src/app/layout/default-layout/default-header/default-header.component.html b/src/app/layout/default-layout/default-header/default-header.component.html new file mode 100644 index 000000000..f814bca61 --- /dev/null +++ b/src/app/layout/default-layout/default-header/default-header.component.html @@ -0,0 +1,208 @@ + + + + + + + Dashboard + + + Users + + + Settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
diff --git a/src/app/containers/default-layout/default-header/default-header.component.scss b/src/app/layout/default-layout/default-header/default-header.component.scss similarity index 100% rename from src/app/containers/default-layout/default-header/default-header.component.scss rename to src/app/layout/default-layout/default-header/default-header.component.scss diff --git a/src/app/containers/default-layout/default-header/default-header.component.spec.ts b/src/app/layout/default-layout/default-header/default-header.component.spec.ts similarity index 68% rename from src/app/containers/default-layout/default-header/default-header.component.spec.ts rename to src/app/layout/default-layout/default-header/default-header.component.spec.ts index ad6662e0b..b21f2f62b 100644 --- a/src/app/containers/default-layout/default-header/default-header.component.spec.ts +++ b/src/app/layout/default-layout/default-header/default-header.component.spec.ts @@ -1,18 +1,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; import { AvatarModule, BadgeModule, BreadcrumbModule, + ButtonGroupModule, DropdownModule, GridModule, HeaderModule, - NavModule, SidebarModule + NavModule, + ProgressModule, + SidebarModule } from '@coreui/angular'; -import { IconSetService } from '@coreui/icons-angular'; +import { IconModule, IconSetService } from '@coreui/icons-angular'; import { iconSubset } from '../../../icons/icon-subset'; import { DefaultHeaderComponent } from './default-header.component'; -import { RouterTestingModule } from '@angular/router/testing'; describe('DefaultHeaderComponent', () => { let component: DefaultHeaderComponent; @@ -21,10 +24,9 @@ describe('DefaultHeaderComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [DefaultHeaderComponent], - imports: [GridModule, HeaderModule, NavModule, BadgeModule, AvatarModule, DropdownModule, BreadcrumbModule, RouterTestingModule, SidebarModule], - providers: [IconSetService] - }) + imports: [GridModule, HeaderModule, IconModule, NavModule, BadgeModule, AvatarModule, DropdownModule, BreadcrumbModule, RouterTestingModule, SidebarModule, ProgressModule, ButtonGroupModule, ReactiveFormsModule, DefaultHeaderComponent], + providers: [IconSetService] +}) .compileComponents(); }); diff --git a/src/app/layout/default-layout/default-header/default-header.component.ts b/src/app/layout/default-layout/default-header/default-header.component.ts new file mode 100644 index 000000000..ac548f603 --- /dev/null +++ b/src/app/layout/default-layout/default-header/default-header.component.ts @@ -0,0 +1,139 @@ +import { Component, DestroyRef, inject, Input } from '@angular/core'; +import { + AvatarComponent, + BadgeComponent, + BreadcrumbRouterComponent, + ColorModeService, + ContainerComponent, + DropdownComponent, + DropdownDividerDirective, + DropdownHeaderDirective, + DropdownItemDirective, + DropdownMenuDirective, + DropdownToggleDirective, + HeaderComponent, + HeaderNavComponent, + HeaderTogglerDirective, + NavItemComponent, + NavLinkDirective, + ProgressBarDirective, + ProgressComponent, + SidebarToggleDirective, + TextColorDirective, + ThemeDirective +} from '@coreui/angular'; +import { NgStyle, NgTemplateOutlet } from '@angular/common'; +import { ActivatedRoute, RouterLink, RouterLinkActive } from '@angular/router'; +import { IconDirective } from '@coreui/icons-angular'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { delay, filter, map, tap } from 'rxjs/operators'; + +@Component({ + selector: 'app-default-header', + templateUrl: './default-header.component.html', + standalone: true, + imports: [ContainerComponent, HeaderTogglerDirective, SidebarToggleDirective, IconDirective, HeaderNavComponent, NavItemComponent, NavLinkDirective, RouterLink, RouterLinkActive, NgTemplateOutlet, BreadcrumbRouterComponent, ThemeDirective, DropdownComponent, DropdownToggleDirective, TextColorDirective, AvatarComponent, DropdownMenuDirective, DropdownHeaderDirective, DropdownItemDirective, BadgeComponent, DropdownDividerDirective, ProgressBarDirective, ProgressComponent, NgStyle] +}) +export class DefaultHeaderComponent extends HeaderComponent { + + readonly #activatedRoute: ActivatedRoute = inject(ActivatedRoute); + readonly #colorModeService = inject(ColorModeService); + readonly colorMode = this.#colorModeService.colorMode; + readonly #destroyRef: DestroyRef = inject(DestroyRef); + + constructor() { + super(); + this.#colorModeService.localStorageItemName.set('coreui-free-angular-admin-template-theme-default'); + this.#colorModeService.eventName.set('ColorSchemeChange'); + + this.#activatedRoute.queryParams + .pipe( + delay(1), + map(params => params['theme']?.match(/^[A-Za-z0-9\s]+/)?.[0]), + filter(theme => ['dark', 'light', 'auto'].includes(theme)), + tap(theme => { + this.colorMode.set(theme); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + } + + @Input() sidebarId: string = 'sidebar1'; + + public newMessages = [ + { + id: 0, + from: 'Jessica Williams', + avatar: '7.jpg', + status: 'success', + title: 'Urgent: System Maintenance Tonight', + time: 'Just now', + link: 'apps/email/inbox/message', + message: 'Attention team, we\'ll be conducting critical system maintenance tonight from 10 PM to 2 AM. Plan accordingly...' + }, + { + id: 1, + from: 'Richard Johnson', + avatar: '6.jpg', + status: 'warning', + title: 'Project Update: Milestone Achieved', + time: '5 minutes ago', + link: 'apps/email/inbox/message', + message: 'Kudos on hitting sales targets last quarter! Let\'s keep the momentum. New goals, new victories ahead...' + }, + { + id: 2, + from: 'Angela Rodriguez', + avatar: '5.jpg', + status: 'danger', + title: 'Social Media Campaign Launch', + time: '1:52 PM', + link: 'apps/email/inbox/message', + message: 'Exciting news! Our new social media campaign goes live tomorrow. Brace yourselves for engagement...' + }, + { + id: 3, + from: 'Jane Lewis', + avatar: '4.jpg', + status: 'info', + title: 'Inventory Checkpoint', + time: '4:03 AM', + link: 'apps/email/inbox/message', + message: 'Team, it\'s time for our monthly inventory check. Accurate counts ensure smooth operations. Let\'s nail it...' + }, + { + id: 3, + from: 'Ryan Miller', + avatar: '4.jpg', + status: 'info', + title: 'Customer Feedback Results', + time: '3 days ago', + link: 'apps/email/inbox/message', + message: 'Our latest customer feedback is in. Let\'s analyze and discuss improvements for an even better service...' + } + ]; + + public newNotifications = [ + { id: 0, title: 'New user registered', icon: 'cilUserFollow', color: 'success' }, + { id: 1, title: 'User deleted', icon: 'cilUserUnfollow', color: 'danger' }, + { id: 2, title: 'Sales report is ready', icon: 'cilChartPie', color: 'info' }, + { id: 3, title: 'New client', icon: 'cilBasket', color: 'primary' }, + { id: 4, title: 'Server overloaded', icon: 'cilSpeedometer', color: 'warning' } + ]; + + public newStatus = [ + { id: 0, title: 'CPU Usage', value: 25, color: 'info', details: '348 Processes. 1/4 Cores.' }, + { id: 1, title: 'Memory Usage', value: 70, color: 'warning', details: '11444GB/16384MB' }, + { id: 2, title: 'SSD 1 Usage', value: 90, color: 'danger', details: '243GB/256GB' } + ]; + + public newTasks = [ + { id: 0, title: 'Upgrade NPM', value: 0, color: 'info' }, + { id: 1, title: 'ReactJS Version', value: 25, color: 'danger' }, + { id: 2, title: 'VueJS Version', value: 50, color: 'warning' }, + { id: 3, title: 'Add new layouts', value: 75, color: 'info' }, + { id: 4, title: 'Angular Version', value: 100, color: 'success' } + ]; + +} diff --git a/src/app/layout/default-layout/default-layout.component.html b/src/app/layout/default-layout/default-layout.component.html new file mode 100644 index 000000000..4f74f7a70 --- /dev/null +++ b/src/app/layout/default-layout/default-layout.component.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + @if (!sidebar1.narrow) { + + + + } + + + +
+ + + +
+ + + +
+ + +
diff --git a/src/app/layout/default-layout/default-layout.component.scss b/src/app/layout/default-layout/default-layout.component.scss new file mode 100644 index 000000000..e7f3a7857 --- /dev/null +++ b/src/app/layout/default-layout/default-layout.component.scss @@ -0,0 +1,24 @@ +:host { + .ng-scrollbar { + --scrollbar-padding: 1px; + --scrollbar-size: 5px; + --scrollbar-thumb-color: var(--cui-gray-500, #999); + --scrollbar-thumb-hover-color: var(--cui-gray-400, #999); + --scrollbar-hover-size: calc(var(--scrollbar-size) * 1.5); + } +} + +// ng-scrollbar css variables +//.cui-scrollbar { +// --scrollbar-border-radius: 7px; +// --scrollbar-padding: 1px; +// --scrollbar-viewport-margin: 0; +// --scrollbar-track-color: transparent; +// --scrollbar-wrapper-color: transparent; +// --scrollbar-thumb-color: rgba(0, 0, 0, 0.2); +// --scrollbar-thumb-hover-color: var(--scrollbar-thumb-color); +// --scrollbar-size: 5px; +// --scrollbar-hover-size: var(--scrollbar-size); +// --scrollbar-thumb-transition: height ease-out 150ms, width ease-out 150ms; +// --scrollbar-track-transition: height ease-out 150ms, width ease-out 150ms; +//} diff --git a/src/app/layout/default-layout/default-layout.component.ts b/src/app/layout/default-layout/default-layout.component.ts new file mode 100644 index 000000000..03a3699b9 --- /dev/null +++ b/src/app/layout/default-layout/default-layout.component.ts @@ -0,0 +1,59 @@ +import { Component } from '@angular/core'; +import { RouterLink, RouterOutlet } from '@angular/router'; +import { NgScrollbar } from 'ngx-scrollbar'; + +import { IconDirective } from '@coreui/icons-angular'; +import { + ContainerComponent, + ShadowOnScrollDirective, + SidebarBrandComponent, + SidebarComponent, + SidebarFooterComponent, + SidebarHeaderComponent, + SidebarNavComponent, + SidebarToggleDirective, + SidebarTogglerDirective +} from '@coreui/angular'; + +import { DefaultFooterComponent, DefaultHeaderComponent } from './'; +import { navItems } from './_nav'; + +function isOverflown(element: HTMLElement) { + return ( + element.scrollHeight > element.clientHeight || + element.scrollWidth > element.clientWidth + ); +} + +@Component({ + selector: 'app-dashboard', + templateUrl: './default-layout.component.html', + styleUrls: ['./default-layout.component.scss'], + standalone: true, + imports: [ + SidebarComponent, + SidebarHeaderComponent, + SidebarBrandComponent, + RouterLink, + IconDirective, + NgScrollbar, + SidebarNavComponent, + SidebarFooterComponent, + SidebarToggleDirective, + SidebarTogglerDirective, + DefaultHeaderComponent, + ShadowOnScrollDirective, + ContainerComponent, + RouterOutlet, + DefaultFooterComponent + ] +}) +export class DefaultLayoutComponent { + public navItems = navItems; + + onScrollbarUpdate($event: any) { + // if ($event.verticalUsed) { + // console.log('verticalUsed', $event.verticalUsed); + // } + } +} diff --git a/src/app/containers/default-layout/index.ts b/src/app/layout/default-layout/index.ts similarity index 100% rename from src/app/containers/default-layout/index.ts rename to src/app/layout/default-layout/index.ts diff --git a/src/app/containers/index.ts b/src/app/layout/index.ts similarity index 100% rename from src/app/containers/index.ts rename to src/app/layout/index.ts diff --git a/src/app/views/base/accordion/accordions.component.html b/src/app/views/base/accordion/accordions.component.html index e5eb1262d..e27353d86 100644 --- a/src/app/views/base/accordion/accordions.component.html +++ b/src/app/views/base/accordion/accordions.component.html @@ -1,18 +1,15 @@ - - - Angular Accordion -

+

Click the accordions below to expand/collapse the accordion content.

- + -
+
@@ -64,8 +61,10 @@ Angular Accordion flush -

- Click the accordions below to expand/collapse the accordion content. +

+ Add flush to remove the default background-color, some + borders, and some rounded corners to render accordions edge-to-edge with their parent + container.

@@ -102,17 +101,24 @@ Angular Accordion alwaysOpen +

+ Add alwaysOpen property to make accordion items stay open when another + item is opened. +

- - - - Custom Accordion item #{{i}} - - - {{i}}. - - - + + @for(item of items; track item; let i = $index;) { + + + Custom Accordion item #{{ i }} + + + {{ i }}. + + + + } +
diff --git a/src/app/views/base/accordion/accordions.component.scss b/src/app/views/base/accordion/accordions.component.scss index 9a3e48faa..0991fbe16 100644 --- a/src/app/views/base/accordion/accordions.component.scss +++ b/src/app/views/base/accordion/accordions.component.scss @@ -1,6 +1,17 @@ -:host ::ng-deep .accordion-custom { - .accordion-button { - background-color: var(--cui-dark); - color: var(--cui-white); +:host ::ng-deep { + .accordion-custom { + .accordion-button { + background-color: var(--cui-dark); + color: var(--cui-white); + } + + .accordion-button::after { + --cui-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgba%28255, 255, 255, 0.87%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --cui-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgba%28255, 255, 255, 0.87%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + } } } + + + + diff --git a/src/app/views/base/accordion/accordions.component.spec.ts b/src/app/views/base/accordion/accordions.component.spec.ts index a71201ce5..808df4c42 100644 --- a/src/app/views/base/accordion/accordions.component.spec.ts +++ b/src/app/views/base/accordion/accordions.component.spec.ts @@ -5,7 +5,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { AccordionModule, CardModule, GridModule } from '@coreui/angular'; import { IconSetService } from '@coreui/icons-angular'; import { iconSubset } from '../../../icons/icon-subset'; -import { DocsComponentsModule } from '../../../../components'; import { AccordionsComponent } from './accordions.component'; describe('AccordionsComponent', () => { @@ -15,10 +14,9 @@ describe('AccordionsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AccordionsComponent], - imports: [AccordionModule, NoopAnimationsModule, CardModule, GridModule, DocsComponentsModule, RouterTestingModule], - providers: [IconSetService] - }) + imports: [AccordionModule, NoopAnimationsModule, CardModule, GridModule, RouterTestingModule, AccordionsComponent], + providers: [IconSetService] +}) .compileComponents(); }); diff --git a/src/app/views/base/accordion/accordions.component.ts b/src/app/views/base/accordion/accordions.component.ts index d9199d5d8..3a5ddcf73 100644 --- a/src/app/views/base/accordion/accordions.component.ts +++ b/src/app/views/base/accordion/accordions.component.ts @@ -1,10 +1,14 @@ import { Component } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; +import { RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, AccordionComponent, AccordionItemComponent, TemplateIdDirective, AccordionButtonDirective, BgColorDirective } from '@coreui/angular'; +import { DocsExampleComponent } from '@docs-components/public-api'; @Component({ - selector: 'app-accordions', - templateUrl: './accordions.component.html', - styleUrls: ['./accordions.component.scss'] + selector: 'app-accordions', + templateUrl: './accordions.component.html', + styleUrls: ['./accordions.component.scss'], + standalone: true, + imports: [RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, DocsExampleComponent, AccordionComponent, AccordionItemComponent, TemplateIdDirective, AccordionButtonDirective, BgColorDirective] }) export class AccordionsComponent { @@ -14,7 +18,7 @@ export class AccordionsComponent { private sanitizer: DomSanitizer ) { } - getAccordionBodyText(value: string) { + getAccordionBodyText(value: string|number) { const textSample = ` This is the #${value} item accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to diff --git a/src/app/views/base/base-routing.module.ts b/src/app/views/base/base-routing.module.ts deleted file mode 100644 index d8e68c66f..000000000 --- a/src/app/views/base/base-routing.module.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AccordionsComponent } from './accordion/accordions.component'; -import { BreadcrumbsComponent } from './breadcrumbs/breadcrumbs.component'; -import { CardsComponent } from './cards/cards.component'; -import { CarouselsComponent } from './carousels/carousels.component'; -import { CollapsesComponent } from './collapses/collapses.component'; -import { ListGroupsComponent } from './list-groups/list-groups.component'; -import { NavsComponent } from './navs/navs.component'; -import { PaginationsComponent } from './paginations/paginations.component'; -import { PopoversComponent } from './popovers/popovers.component'; -import { ProgressComponent } from './progress/progress.component'; -import { SpinnersComponent } from './spinners/spinners.component'; -import { TablesComponent } from './tables/tables.component'; -import { TooltipsComponent } from './tooltips/tooltips.component'; -import { TabsComponent } from './tabs/tabs.component'; -import { PlaceholdersComponent } from './placeholders/placeholders.component'; - -const routes: Routes = [ - { - path: '', - data: { - title: 'Base', - }, - children: [ - { - path: '', - pathMatch: 'full', - redirectTo: 'cards', - }, - { - path: 'accordion', - component: AccordionsComponent, - data: { - title: 'Accordion', - }, - }, - { - path: 'breadcrumbs', - component: BreadcrumbsComponent, - data: { - title: 'Breadcrumbs', - }, - }, - { - path: 'cards', - component: CardsComponent, - data: { - title: 'Cards', - }, - }, - { - path: 'carousel', - component: CarouselsComponent, - data: { - title: 'Carousel', - }, - }, - { - path: 'collapse', - component: CollapsesComponent, - data: { - title: 'Collapse', - }, - }, - { - path: 'list-group', - component: ListGroupsComponent, - data: { - title: 'List Group', - }, - }, - { - path: 'navs', - component: NavsComponent, - data: { - title: 'Navs & Tabs', - }, - }, - { - path: 'pagination', - component: PaginationsComponent, - data: { - title: 'Pagination', - }, - }, - { - path: 'placeholder', - component: PlaceholdersComponent, - data: { - title: 'Placeholder', - }, - }, - { - path: 'popovers', - component: PopoversComponent, - data: { - title: 'Popovers', - }, - }, - { - path: 'progress', - component: ProgressComponent, - data: { - title: 'Progress', - }, - }, - { - path: 'spinners', - component: SpinnersComponent, - data: { - title: 'Spinners', - }, - }, - { - path: 'tables', - component: TablesComponent, - data: { - title: 'Tables', - }, - }, - { - path: 'tabs', - component: TabsComponent, - data: { - title: 'Tabs', - }, - }, - { - path: 'tooltips', - component: TooltipsComponent, - data: { - title: 'Tooltips', - }, - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class BaseRoutingModule {} - diff --git a/src/app/views/base/base.module.ts b/src/app/views/base/base.module.ts deleted file mode 100644 index d750dbbe6..000000000 --- a/src/app/views/base/base.module.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; - -// CoreUI Modules -import { - AccordionModule, - BadgeModule, - BreadcrumbModule, - ButtonModule, - CardModule, - CarouselModule, - CollapseModule, - DropdownModule, - FormModule, - GridModule, - ListGroupModule, - NavModule, - PaginationModule, - PlaceholderModule, - PopoverModule, - ProgressModule, - SharedModule, - SpinnerModule, - TableModule, - TabsModule, - TooltipModule, - UtilitiesModule -} from '@coreui/angular'; - -import { IconModule } from '@coreui/icons-angular'; - -// utils -import { DocsComponentsModule } from '@docs-components/docs-components.module'; - -// views -import { AccordionsComponent } from './accordion/accordions.component'; -import { BreadcrumbsComponent } from './breadcrumbs/breadcrumbs.component'; -import { CardsComponent } from './cards/cards.component'; -import { CarouselsComponent } from './carousels/carousels.component'; -import { CollapsesComponent } from './collapses/collapses.component'; -import { ListGroupsComponent } from './list-groups/list-groups.component'; -import { NavsComponent } from './navs/navs.component'; -import { PaginationsComponent } from './paginations/paginations.component'; -import { PlaceholdersComponent } from './placeholders/placeholders.component'; -import { PopoversComponent } from './popovers/popovers.component'; -import { ProgressComponent } from './progress/progress.component'; -import { SpinnersComponent } from './spinners/spinners.component'; -import { TablesComponent } from './tables/tables.component'; -import { TooltipsComponent } from './tooltips/tooltips.component'; -import { TabsComponent } from './tabs/tabs.component'; - -// Components Routing -import { BaseRoutingModule } from './base-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - BaseRoutingModule, - AccordionModule, - BadgeModule, - BreadcrumbModule, - ButtonModule, - CardModule, - CollapseModule, - GridModule, - UtilitiesModule, - SharedModule, - ListGroupModule, - IconModule, - ListGroupModule, - PlaceholderModule, - ProgressModule, - SpinnerModule, - TabsModule, - NavModule, - TooltipModule, - CarouselModule, - FormModule, - ReactiveFormsModule, - DropdownModule, - PaginationModule, - PopoverModule, - TableModule, - DocsComponentsModule, - ], - declarations: [ - AccordionsComponent, - BreadcrumbsComponent, - CardsComponent, - CarouselsComponent, - CollapsesComponent, - ListGroupsComponent, - NavsComponent, - PaginationsComponent, - PopoversComponent, - ProgressComponent, - SpinnersComponent, - TablesComponent, - TooltipsComponent, - TabsComponent, - PlaceholdersComponent, - ], -}) -export class BaseModule {} diff --git a/src/app/views/base/breadcrumbs/breadcrumbs.component.html b/src/app/views/base/breadcrumbs/breadcrumbs.component.html index 3055af9ce..af6174f43 100644 --- a/src/app/views/base/breadcrumbs/breadcrumbs.component.html +++ b/src/app/views/base/breadcrumbs/breadcrumbs.component.html @@ -1,95 +1,90 @@ -
- - - - - - - - Angular Breadcrumbs - - -

- The breadcrumb navigation provides links back to each previous page the user navigated - through and shows the current location in a website or an application. You don’t have - to add separators, because they automatically added in CSS through - - ::before - - and - - content - - . -

- - - - {{item.label}} + + + + + Angular Breadcrumbs + + +

+ The breadcrumb navigation provides links back to each previous page the user navigated + through and shows the current location in a website or an application. You don’t have + to add separators, because they automatically added in CSS through + + ::before + + and + + content + + . +

+ + + @for (item of items; track item; let i = $index, isLast = $last) { + + {{ item.label }} - -
- - - {{item.label}} + } + +
+ + @for (item of items.slice(0, 1); track item; let i = $index, isLast = $last) { + + {{ item.label }} - - - - {{item.label}} + } + + + @for (item of items.slice(0, 2); track item; let i = $index, isLast = $last) { + + {{ item.label }} - - - - {{item.label}} + } + + + @for (item of items.slice(0, 3); track item; let i = $index, isLast = $last) { + + {{ item.label }} - - - - {{item.label}} + } + + + @for (item of items.slice(0, 4); track item; let i = $index, isLast = $last) { + + {{ item.label }} - -
- - - Home - - - Library - - - Data - - - Bootstrap - - -
-
-
-
- - - - Angular Breadcrumbs router - - - - - - - - - -
-
+ } + +
+ + + Home + + + Library + + + Data + + + Bootstrap + + +
+
+
+
+ + + + Angular Breadcrumbs router + + + + + + + + + +
diff --git a/src/app/views/base/breadcrumbs/breadcrumbs.component.spec.ts b/src/app/views/base/breadcrumbs/breadcrumbs.component.spec.ts index 0fd8a0de3..075c043bf 100644 --- a/src/app/views/base/breadcrumbs/breadcrumbs.component.spec.ts +++ b/src/app/views/base/breadcrumbs/breadcrumbs.component.spec.ts @@ -4,7 +4,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { BreadcrumbModule, CardModule, GridModule } from '@coreui/angular'; import { IconSetService } from '@coreui/icons-angular'; import { iconSubset } from '../../../icons/icon-subset'; -import { DocsComponentsModule } from '../../../../components'; import { BreadcrumbsComponent } from './breadcrumbs.component'; describe('BreadcrumbsComponent', () => { @@ -14,10 +13,9 @@ describe('BreadcrumbsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BreadcrumbsComponent], - imports: [CardModule, GridModule, BreadcrumbModule, RouterTestingModule, DocsComponentsModule], - providers: [IconSetService] - }).compileComponents(); + imports: [CardModule, GridModule, BreadcrumbModule, RouterTestingModule, BreadcrumbsComponent], + providers: [IconSetService] +}).compileComponents(); })); beforeEach(() => { diff --git a/src/app/views/base/breadcrumbs/breadcrumbs.component.ts b/src/app/views/base/breadcrumbs/breadcrumbs.component.ts index 53e0b924c..e7479e6f5 100644 --- a/src/app/views/base/breadcrumbs/breadcrumbs.component.ts +++ b/src/app/views/base/breadcrumbs/breadcrumbs.component.ts @@ -1,8 +1,23 @@ import { Component, OnInit } from '@angular/core'; +import { NgClass } from '@angular/common'; +import { DocsExampleComponent } from '@docs-components/public-api'; +import { + BreadcrumbComponent, + BreadcrumbItemComponent, + BreadcrumbRouterComponent, + CardBodyComponent, + CardComponent, + CardHeaderComponent, + ColComponent, + RowComponent, + TextColorDirective +} from '@coreui/angular'; @Component({ templateUrl: './breadcrumbs.component.html', - styleUrls: ['./breadcrumbs.component.scss'] + styleUrls: ['./breadcrumbs.component.scss'], + standalone: true, + imports: [RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, DocsExampleComponent, BreadcrumbComponent, BreadcrumbItemComponent, NgClass, BreadcrumbRouterComponent] }) export class BreadcrumbsComponent implements OnInit { public items = []; diff --git a/src/app/views/base/cards/cards.component.html b/src/app/views/base/cards/cards.component.html index e5189ded3..3845afb1b 100644 --- a/src/app/views/base/cards/cards.component.html +++ b/src/app/views/base/cards/cards.component.html @@ -1,14 +1,11 @@ - - - Angular Card -

+

Cards are built with as little markup and styles as possible but still manage to deliver a bunch of control and customization. Built with flexbox, they offer easy alignment and mix well with other CoreUI @@ -20,14 +17,14 @@ as needed. They have no fixed width to start, so they'll fill the full width of its parent.

-

+

Below is an example of a basic card with mixed content and a fixed width. Cards have no fixed width to start, so they'll naturally fill the full width of its parent element.

- +
Card title

@@ -46,7 +43,7 @@

Card title
Angular Card Body -

+

The main block of a card is the <c-card-body>. Use it whenever you need a padded section within a card.

@@ -64,14 +61,14 @@
Card title
Angular Card Titles, text, and links -

+

Card titles are managed by cCardTitle directive for <h*>. Identically, links are attached and collected next to each other by cCardLink directive for <a> tag. Subtitles are handled by cCardSubtitle directive.

-

+

Store cCardTitle and the cCardSubtitle items in a <c-card-body>. The card title, and subtitle are arranged properly. @@ -80,15 +77,15 @@

Card title
Card title
-
+
Card subtitle

Some quick example text to build on the card title and make up the bulk of the card content.

- Card link - Another link + Card link + Another link
@@ -101,7 +98,7 @@
Angular Card Images -

+

cCardImg="top" places a picture to the top of the card. With cCardText, text can be added to the card. Text within cCardText can additionally be styled with the @@ -109,7 +106,7 @@

- +

Some quick example text to build on the card @@ -127,7 +124,7 @@

Angular Card list groups -

+

Create lists of content in a card with a flush list group.

@@ -172,14 +169,14 @@
Angular Card kitchen sink -

+

Combine and match many content types to build the card you need, or throw everything in there. Shown below are image styles, blocks, text styles, and a list group—all wrapped in a fixed-width card.

- +
Card title

@@ -193,8 +190,8 @@

Card title
  • Vestibulum at eros
  • - Card link - Another link + Card link + Another link
    @@ -207,32 +204,32 @@
    Card title
    Card Header and footer - + -

    +

    Add an optional header and/or footer within a card.

    - - - Header + + + Featured - +
    -

    +

    Card headers can be styled by adding ex. "h5".

    - - + +
    Header
    - +
    @@ -241,7 +238,7 @@
    Header
    - + Quote
    @@ -260,15 +257,14 @@
    Header
    - + Header - + - 2 days ago - + + 2 days ago + @@ -282,61 +278,58 @@
    Header
    Angular Card Sizing -

    +

    Cards assume no specific width to start, so they'll be 100% wide unless otherwise stated. You can adjust this as required with custom CSS, grid classes, grid Sass mixins, or services.

    Using grid markup

    -

    +

    Using the grid, wrap cards in columns and rows as needed.

    - - + + - + - + - + - +

    Using utilities

    -

    - Use some of - available sizing utilities - to rapidly set a card width. +

    + Use some of available sizing utilities to rapidly set a + card width.

    - - + + - + - + - + Using custom CSS -

    +

    Use custom CSS in your stylesheets or as inline styles to set a width.

    - + - + @@ -349,7 +342,7 @@

    Using utilities

    Card Text alignment -

    +

    You can instantly change the text arrangement of any card—in its whole or specific parts—with Using utilities

    classes.

    - + - + - + - + - + - + - + @@ -391,59 +384,59 @@

    Using utilities

    Card Navigation -

    +

    Add some navigation to a <c-card-header> with our <c-nav> component.

    - + -
    + Active - Link + Link - + Disabled - +
    - + - + Active - Link + Link - + Disabled - + @@ -458,7 +451,7 @@

    Using utilities

    Card Image caps -

    +

    Similar to headers and footers, cards can include top and bottom "image caps"—images at the top or bottom of a card.

    @@ -466,7 +459,7 @@

    Using utilities

    - +
    Card title

    @@ -474,7 +467,7 @@

    Card title
    additional content. This content is a little bit longer.

    - Last updated 3 mins ago + Last updated 3 mins ago

    @@ -488,10 +481,10 @@
    Card title
    additional content. This content is a little bit longer.

    - Last updated 3 mins ago + Last updated 3 mins ago

    - +
    @@ -505,58 +498,62 @@
    Card title
    Card Styles -

    +

    Cards include various options for customizing their backgrounds, borders, and color.

    Background and color

    -

    +

    Use color property to change the appearance of a card.

    - + - - - Header - -
    {{item.color}} card title
    -

    - Some quick example text to build on the card title and make up the bulk of - the card's content. -

    - -
    -
    -
    + @for (item of colors; track item; let i = $index) { + + + Header + +
    {{ item.color }} card title
    +

    + Some quick example text to build on the card title and make up the bulk of + the card's content. +

    + +
    +
    +
    + }

    Border

    -

    +

    Use border utilities to change just the border-color of a card. Note that you can set textColor property on the <c-card> or a subset of the card's contents as shown below.

    - - - - - Header - -
    {{item.color}} card title
    -

    - Some quick example text to build on the card title and make up the bulk of - the card's content. -

    - -
    -
    -
    + + + @for (item of colors; track item; let i = $index) { + + + Header + +
    {{ item.color }} card title
    +

    + Some quick example text to build on the card title and make up the bulk of + the card's content. +

    + +
    +
    +
    + }

    Top border

    -

    +

    Use border utilities to change just the border-color of a card. Note that you can set textColor property on the <c-card> or a subset of the @@ -564,11 +561,12 @@

    Top border

    - - + @for (item of colors; track item; let i = $index) { + + Header -
    {{item.color}} card title
    +
    {{ item.color }} card title

    Some quick example text to build on the card title and make up the bulk of the card's content. @@ -577,19 +575,19 @@

    {{item.color}} card title
    + }
    - Card Card groups -

    +

    Use card groups to render cards as a single, attached element with equal width and height columns. Card groups start off stacked and use display: flex; to become attached with uniform dimensions starting at the sm breakpoint. @@ -597,7 +595,7 @@

    {{item.color}} card title
    - +
    Card title

    @@ -605,12 +603,12 @@

    Card title
    additional content. This content is a little bit longer.

    - Last updated 3 mins ago + Last updated 3 mins ago

    - +
    Card title

    @@ -618,12 +616,12 @@

    Card title
    content.

    - Last updated 3 mins ago + Last updated 3 mins ago

    - +
    Card title

    @@ -632,19 +630,19 @@

    Card title
    that equal height action.

    - Last updated 3 mins ago + Last updated 3 mins ago

    -

    +

    When using card groups with footers, their content will automatically line up.

    - +
    Card title

    @@ -653,11 +651,11 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -666,11 +664,11 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -680,7 +678,7 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    @@ -694,7 +692,7 @@
    Card title
    Card Grid cards -

    +

    Use the c-row component and set xs|sm|md|lg|xl|xxl property to control how many grid columns (wrapped around your cards) you show per row. For example xs="1" laying out the cards on one column, and md="1" splitting @@ -704,7 +702,7 @@

    Card title
    - +
    Card title

    @@ -713,13 +711,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -728,13 +726,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -743,13 +741,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -758,20 +756,20 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    -

    +

    Change it to md="3" and you'll see the fourth card wraps.

    - +
    Card title

    @@ -780,13 +778,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -795,13 +793,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -810,13 +808,13 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    - +
    Card title

    @@ -825,7 +823,7 @@

    Card title

    - Last updated 3 mins ago + Last updated 3 mins ago
    @@ -836,6 +834,9 @@
    Card title
    + + + Card title

    + + +
    Special title treatment
    +

    + With supporting text below as a natural lead-in to additional content. +

    + +
    diff --git a/src/app/views/base/cards/cards.component.spec.ts b/src/app/views/base/cards/cards.component.spec.ts index b470b8ff9..8e15759bb 100644 --- a/src/app/views/base/cards/cards.component.spec.ts +++ b/src/app/views/base/cards/cards.component.spec.ts @@ -4,7 +4,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { ButtonModule, CardModule, GridModule, ListGroupModule, NavModule, UtilitiesModule } from '@coreui/angular'; import { IconSetService } from '@coreui/icons-angular'; import { iconSubset } from '../../../icons/icon-subset'; -import { DocsComponentsModule } from '../../../../components'; import { CardsComponent } from './cards.component'; describe('CardsComponent', () => { @@ -14,10 +13,9 @@ describe('CardsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [CardsComponent], - imports: [CardModule, NavModule, GridModule, ListGroupModule, UtilitiesModule, ButtonModule, DocsComponentsModule, RouterTestingModule], - providers: [IconSetService] - }) + imports: [CardModule, NavModule, GridModule, ListGroupModule, UtilitiesModule, ButtonModule, RouterTestingModule, CardsComponent], + providers: [IconSetService] +}) .compileComponents(); }); diff --git a/src/app/views/base/cards/cards.component.ts b/src/app/views/base/cards/cards.component.ts index c87528826..b22518859 100644 --- a/src/app/views/base/cards/cards.component.ts +++ b/src/app/views/base/cards/cards.component.ts @@ -1,13 +1,46 @@ import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { NgTemplateOutlet } from '@angular/common'; +import { DocsExampleComponent } from '@docs-components/public-api'; +import { + BorderDirective, + ButtonDirective, + CardBodyComponent, + CardComponent, + CardFooterComponent, + CardGroupComponent, + CardHeaderComponent, + CardImgDirective, + CardLinkDirective, + CardSubtitleDirective, + CardTextDirective, + CardTitleDirective, + ColComponent, + GutterDirective, + ListGroupDirective, + ListGroupItemDirective, + NavComponent, + NavItemComponent, + NavLinkDirective, + RowComponent, + TextColorDirective +} from '@coreui/angular'; + +type CardColor = { + color: string + textColor?: string +} @Component({ selector: 'app-cards', templateUrl: './cards.component.html', - styleUrls: ['./cards.component.scss'] + styleUrls: ['./cards.component.scss'], + standalone: true, + imports: [RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, DocsExampleComponent, NgTemplateOutlet, CardTitleDirective, CardTextDirective, ButtonDirective, CardSubtitleDirective, CardLinkDirective, RouterLink, ListGroupDirective, ListGroupItemDirective, CardFooterComponent, NavComponent, NavItemComponent, NavLinkDirective, BorderDirective, CardGroupComponent, GutterDirective, CardImgDirective] }) export class CardsComponent { - colors = [ + colors: CardColor[] = [ { color: 'primary', textColor: 'primary' }, { color: 'secondary', textColor: 'secondary' }, { color: 'success', textColor: 'success' }, diff --git a/src/app/views/base/carousels/carousels.component.html b/src/app/views/base/carousels/carousels.component.html index b83792789..a6e71f0c8 100644 --- a/src/app/views/base/carousels/carousels.component.html +++ b/src/app/views/base/carousels/carousels.component.html @@ -1,19 +1,16 @@ -
    - - - - - - - - Angular Carousel Slide only - - -

    Here’s a carousel with slides

    - - - - + + + + + Angular Carousel Slide only + + +

    Here’s a carousel with slides

    + + + + @for (slide of slides[0]; track slide.src) { + {{slide.title}} - - - -
    -
    -
    - - - - Angular Carousel with controls - - -

    - Adding in the previous and next controls with c-carousel-controls component. -

    - - - - + } + + + +
    +
    +
    + + + + Angular Carousel with controls + + +

    + Adding in the previous and next controls with c-carousel-controls component. +

    + + + + @for (slide of slides[0]; track slide.src) { + {{slide.title}} - - - - - -
    -
    -
    - - - - Angular Carousel with custom controls - - -

    - Adding in the previous and next controls with custom content of c-carousel-controls component. - - - - - {{slide.title}} - - - - - Previous - - - - Next - - - - - - - - - - Angular Carousel with indicators - - -

    - You can attach the indicators to the carousel, lengthwise the controls, too. -

    - - - - - + } + + + + + +
    +
    +
    + + + + Angular Carousel with custom controls + + +

    + Adding in the previous and next controls with custom content of c-carousel-controls component. +

    + + + + @for (slide of slides[0]; track slide.src) { + {{slide.title}} - - - -
    -
    -
    - - - - Carousel with captions, controls and indicators - - -

    - You can add captions to slides with the <c-carousel-caption> element - within any <c-carousel-item>. They can be immediately hidden on - smaller viewports, as shown below, with optional display - utilities. - We hide them with .d-none and draw them back on medium-sized devices with - .d-md-block. -

    - - - - - + } + + + + Previous + + + + Next + + + +
    +
    +
    + + + + Angular Carousel with indicators + + +

    + You can attach the indicators to the carousel, lengthwise the controls, too. +

    + + + + + @for (slide of slides[0]; track slide.src) { + + {{slide.title}} + + } + + + +
    +
    +
    + + + + Carousel with captions, controls and indicators + + +

    + You can add captions to slides with the <c-carousel-caption> element + within any <c-carousel-item>. They can be immediately hidden on + smaller viewports, as shown below, with optional display + utilities. + We hide them with .d-none and draw them back on medium-sized devices with + .d-md-block. +

    + + + + + @for (slide of slides[1]; track slide.src) { + {{slide.title}} -

    {{slide.title}}

    -

    {{slide.subtitle}}

    +

    {{ slide.title }}

    +

    {{ slide.subtitle }}

    -
    - - -
    -
    -
    -
    -
    - - - - Angular Carousel Crossfade - - -

    - Add transition="crossfade" to your carousel to animate slides - with a fade transition instead of a slide. -

    - - - - + } + + + + + +
    +
    +
    + + + + Angular Carousel Crossfade + + +

    + Add transition="crossfade" to your carousel to animate slides + with a fade transition instead of a slide. +

    + + + + @for (slide of slides[0]; track slide.src) { + {{slide.title}}{{slide.title}}
    loading="lazy" /> -

    {{slide.title}}

    -

    {{slide.subtitle}}

    +

    {{ slide.title }}

    +

    {{ slide.subtitle }}

    - - - - - -
    - - - - - - Angular Carousel Dark variant - - -

    - Add dark property to the c-carousel for darker controls, - indicators, and captions. Controls have been inverted from their default white fill - with the filter CSS property. Captions and controls have additional Sass - variables that customize the color and background-color. -

    - - - - - + } + + + + + +
    +
    +
    + + + + Angular Carousel Dark variant + + +

    + Add dark property to the c-carousel for darker controls, + indicators, and captions. Controls have been inverted from their default white fill + with the filter CSS property. Captions and controls have additional Sass + variables that customize the color and background-color. +

    + + + + + @for (slide of slides[2]; track slide.src) { + {{slide.title}}{{slide.title}}
    loading="lazy" /> -

    {{slide.title}}

    -

    {{slide.subtitle}}

    +

    {{ slide.title }}

    +

    {{ slide.subtitle }}

    - - - - - -
    -
    -
    -
    - + } + + + + + + + + + diff --git a/src/app/views/base/carousels/carousels.component.spec.ts b/src/app/views/base/carousels/carousels.component.spec.ts index 2b184e24d..3af68d27f 100644 --- a/src/app/views/base/carousels/carousels.component.spec.ts +++ b/src/app/views/base/carousels/carousels.component.spec.ts @@ -6,7 +6,6 @@ import { CardModule, CarouselModule, GridModule } from '@coreui/angular'; import { IconModule } from '@coreui/icons-angular'; import { IconSetService } from '@coreui/icons-angular'; import { iconSubset } from '../../../icons/icon-subset'; -import { DocsComponentsModule } from '../../../../components'; import { CarouselsComponent } from './carousels.component'; describe('CarouselsComponent', () => { @@ -16,10 +15,9 @@ describe('CarouselsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ CarouselsComponent ], - imports: [CarouselModule, NoopAnimationsModule, CardModule, GridModule, IconModule, DocsComponentsModule, RouterTestingModule], - providers: [IconSetService] - }) + imports: [CarouselModule, NoopAnimationsModule, CardModule, GridModule, IconModule, RouterTestingModule, CarouselsComponent], + providers: [IconSetService] +}) .compileComponents(); })); diff --git a/src/app/views/base/carousels/carousels.component.ts b/src/app/views/base/carousels/carousels.component.ts index 5faa9636a..f0b7957c4 100644 --- a/src/app/views/base/carousels/carousels.component.ts +++ b/src/app/views/base/carousels/carousels.component.ts @@ -1,29 +1,34 @@ import { Component } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; +import { IconDirective } from '@coreui/icons-angular'; +import { DocsExampleComponent } from '@docs-components/public-api'; +import { RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, ThemeDirective, CarouselComponent, CarouselInnerComponent, CarouselItemComponent, CarouselControlComponent, CarouselIndicatorsComponent, CarouselCaptionComponent } from '@coreui/angular'; @Component({ - selector: 'app-carousels', - templateUrl: './carousels.component.html', - styleUrls: ['./carousels.component.scss'] + selector: 'app-carousels', + templateUrl: './carousels.component.html', + styleUrls: ['./carousels.component.scss'], + standalone: true, + imports: [RowComponent, ColComponent, TextColorDirective, CardComponent, CardHeaderComponent, CardBodyComponent, DocsExampleComponent, ThemeDirective, CarouselComponent, CarouselInnerComponent, CarouselItemComponent, CarouselControlComponent, IconDirective, CarouselIndicatorsComponent, CarouselCaptionComponent] }) export class CarouselsComponent { - imageSrc = [ - 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_1607923e7e2%20text%20%7B%20fill%3A%23555%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1607923e7e2%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22285.9296875%22%20y%3D%22217.75625%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', - 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa20%20text%20%7B%20fill%3A%23444%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa20%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23666%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22247.3203125%22%20y%3D%22218.3%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', - 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa21%20text%20%7B%20fill%3A%23333%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa21%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23555%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22277%22%20y%3D%22218.3%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', + readonly imageSrc: string[] = [ + 'assets/images/angular.jpg', + 'assets/images/react.jpg', + 'assets/images/vue.jpg', 'https://picsum.photos/id/1/800/400', 'https://picsum.photos/id/1026/800/400', 'https://picsum.photos/id/1031/800/400' ]; - slidesLight = [ + readonly slidesLight: string[] = [ 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_1607923e7e2%20text%20%7B%20fill%3A%23AAA%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1607923e7e2%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23F5F5F5%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22285.9296875%22%20y%3D%22217.75625%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa20%20text%20%7B%20fill%3A%23BBB%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa20%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23EEE%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22247.3203125%22%20y%3D%22218.3%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E', 'data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_15ba800aa21%20text%20%7B%20fill%3A%23999%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_15ba800aa21%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23E5E5E5%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22277%22%20y%3D%22218.3%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E' ]; - slides: any[] = []; + readonly slides: any[][] = []; constructor( private domSanitizer: DomSanitizer diff --git a/src/app/views/base/collapses/collapses.component.html b/src/app/views/base/collapses/collapses.component.html index 694cdc77e..d2495a840 100644 --- a/src/app/views/base/collapses/collapses.component.html +++ b/src/app/views/base/collapses/collapses.component.html @@ -1,14 +1,11 @@ - - - Angular Collapse -

    You can use a link or a button component.

    +

    You can use a link or a button component.

    Link - - - - + @for (item of sampleList; track item; let first = $first) { + + }
    @@ -75,31 +66,19 @@ Angular List Group Links and buttons -

    +

    Use <a>s or <button>s to create actionable list group items with hover, disabled, and active - states by adding component="a|button". We + states with a or button. We separate these pseudo-classes to ensure list groups made of non-interactive elements (like <li> or <div>) don't provide a click or tap affordance.

    @@ -111,18 +90,16 @@ Angular List Group Flush -

    +

    Add flush boolean property to remove some borders and rounded corners to render list group items edge-to-edge in a parent container (e.g., cards).

    -