diff --git a/.eslintrc.json b/.eslintrc.json index 342a1af5..2c001bba 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -45,7 +45,10 @@ ], "rules": { "@angular-eslint/template/elements-content": "off", - "@angular-eslint/template/alt-text": "off" + "@angular-eslint/template/alt-text": "off", + "@angular-eslint/template/interactive-supports-focus": "warn", + "@angular-eslint/template/click-events-have-key-events": "warn", + "@angular-eslint/template/label-has-associated-control": "warn" } } ] diff --git a/.github/workflows/project-chartjs-check.yml b/.github/workflows/project-chartjs-check.yml index 57611749..8d3b9f29 100644 --- a/.github/workflows/project-chartjs-check.yml +++ b/.github/workflows/project-chartjs-check.yml @@ -4,11 +4,11 @@ on: push: branches: - main - - v4.* + - v5.* pull_request: branches: - main - - v4.* + - v5.* jobs: build: diff --git a/.github/workflows/project-icons-check.yml b/.github/workflows/project-icons-check.yml index 760c54f1..76572aac 100644 --- a/.github/workflows/project-icons-check.yml +++ b/.github/workflows/project-icons-check.yml @@ -4,11 +4,11 @@ on: push: branches: - main - - v4.* + - v5.* pull_request: branches: - main - - v4.* + - v5.* jobs: build: diff --git a/.github/workflows/project-lib-check.yml b/.github/workflows/project-lib-check.yml index 828fe3e5..5d9e6f00 100644 --- a/.github/workflows/project-lib-check.yml +++ b/.github/workflows/project-lib-check.yml @@ -4,11 +4,11 @@ on: push: branches: - main - - v4.* + - v5.* pull_request: branches: - main - - v4.* + - v5.* jobs: build: diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a3508c..8f4f341e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,49 @@ --- +#### `5.0.0` + +- chore(dependencies): update to `Angular 17.3` +- chore(dependencies): update to `CoreUI 5` +- refactor(sidebar): drop sidebar-toggler component, use directive instead, use control flow, use Input() transform +- refactor(widget): update to v5 +- fix(tooltip): update offset for v5 +- refactor(toast): use Input() transform +- feat(utilities): shadow-on-scroll directive +- refactor(tabs): use Input() transform +- refactor(table.type): Partial attributes +- feat: ThemeDirective +- feat(services): v5 color-mode, local-storage, in-memory-storage, script-injector +- refactor(progress): add progress-stacked component, update testing, rewrite with signals +- refactor(progress): add progress-bar props for simplified use with [value] +- fix(popover): update offset for v5 +- refactor(placeholder): use Input() transform +- refactor(offcanvas): use ThemeDirective composition for dark prop +- refactor(navbar): colorScheme prop replaced with ThemeDirective composition +- fix(row): row-cols-n for xs="n" +- refactor(form-check-input): use Input() transform +- refactor(dropdown): allow to select a dropdown-item with up/down arrows, testing update, use Input() transform +- refactor(dropdown): implement FocusableOption interface for items +- refactor(dropdown): use ThemeDirective composition for dark prop +- refactor(collapse): use Input() transform +- refactor(carousel): control flow, use Input() transform, ThemeDirective composition for dark prop +- refactor(card): use TextColorDirective composition +- refactor(button-close): deprecate white input prop, use ThemeDirective composition for dark prop +- refactor(breadcrumb): cleanups, add routeSnapshot.title as fallback value, use control flow, use Input() transform +- refactor(badge): update TextColors, use TextColorDirective composition +- chore(backdrop.service): cleanup +- refactor(avatar): update TextColors, use TextColorDirective composition, use control flow +- refactor(alert): use Input() transform, use control flow +- refactor(coreui.types): update to v5 +- refactor(accordion): use Input() transform +- refactor(chartjs): update to ChartJS 4.x, types cleanup, use afterRender for SSR +- refactor(icon): add afterNextRender for SSR, add aria-hidden attribute, improve testing +- feat(utilities): TextBgColor directive +- refactor(badge): improve background and text color handling with TextBgColor directive composition api +- refactor(card): improve background and text color handling with TextBgColor directive composition api + +--- + #### `4.7.16` - chore(dependencies): update diff --git a/CLI.md b/CLI.md index c7826f63..e16fd6be 100644 --- a/CLI.md +++ b/CLI.md @@ -1,6 +1,6 @@ -# @coreui/angular v4 +# @coreui/angular v5 -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.0.3. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.2.0. ## Development server diff --git a/LICENSE b/LICENSE index 027b8813..94e4f4d1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 creativeLabs Łukasz Holeczek +Copyright (c) 2024 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d9f34024..628d882d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@

CoreUI for Angular

- Angular Components Library built on top of Bootstrap 5 and TypeScript. + Angular Components Library built on top of Bootstrap 5.3 and TypeScript.
Explore CoreUI for Angular docs »
@@ -35,12 +35,22 @@ [npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red [npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular [npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^17.2.0-lightgrey.svg?style=flat-square&logo=angular +[angular-badge]: https://img.shields.io/badge/angular-^17.3.0-lightgrey.svg?style=flat-square&logo=angular ## Table of contents - [Status](#status) +- [Table of contents](#table-of-contents) - [Quick start](#quick-start) + - [Prerequisites](#prerequisites) + - [Node.js](#nodejs) + - [Angular CLI](#angular-cli) + - [Installation](#installation) + - [CoreUI CSS files](#coreui-css-files) + - [Installation](#installation-1) + - [Basic usage](#basic-usage) + - [Bootstrap CSS files](#bootstrap-css-files) + - [Installation (optional)](#installation-optional) - [Templates](#templates) - [Bugs and feature requests](#bugs-and-feature-requests) - [Documentation](#documentation) @@ -209,4 +219,4 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2023 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2024 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/package-lock.json b/package-lock.json index 9e613341..e06b4cf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,48 +1,48 @@ { "name": "coreui-angular-dev", - "version": "4.7.16", + "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coreui-angular-dev", - "version": "4.7.16", + "version": "5.0.0", "license": "MIT", "dependencies": { - "@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/localize": "^17.2.3", - "@angular/platform-browser": "^17.2.3", - "@angular/platform-browser-dynamic": "^17.2.3", - "@angular/router": "^17.2.3", - "@coreui/chartjs": "^3.1.2", + "@angular/animations": "^17.3.1", + "@angular/cdk": "^17.3.1", + "@angular/common": "^17.3.1", + "@angular/compiler": "^17.3.1", + "@angular/core": "^17.3.1", + "@angular/forms": "^17.3.1", + "@angular/localize": "^17.3.1", + "@angular/platform-browser": "^17.3.1", + "@angular/platform-browser-dynamic": "^17.3.1", + "@angular/router": "^17.3.1", + "@coreui/chartjs": "^4.0.0-0 || ^4.0.0", + "@coreui/icons": "^3.0.1", "@popperjs/core": "~2.11.8", - "chart.js": "^3.9.1", + "chart.js": "^4.4.2", "lodash-es": "^4.17.21", "rxjs": "~7.8.1", - "tslib": "^2.3.0", + "tslib": "^2.6.2", "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.2", - "@angular-eslint/builder": "^17.2.1", - "@angular-eslint/eslint-plugin": "^17.2.1", - "@angular-eslint/eslint-plugin-template": "^17.2.1", - "@angular-eslint/schematics": "^17.2.1", - "@angular-eslint/template-parser": "^17.2.1", - "@angular/cli": "^17.2.2", - "@angular/compiler-cli": "^17.2.3", - "@angular/language-service": "^17.2.3", - "@coreui/icons": "^3.0.1", + "@angular-devkit/build-angular": "^17.3.2", + "@angular-eslint/builder": "^17.3.0", + "@angular-eslint/eslint-plugin": "^17.3.0", + "@angular-eslint/eslint-plugin-template": "^17.3.0", + "@angular-eslint/schematics": "^17.3.0", + "@angular-eslint/template-parser": "^17.3.0", + "@angular/cli": "^17.3.2", + "@angular/compiler-cli": "^17.3.1", + "@angular/language-service": "^17.3.1", "@types/jasmine": "^5.1.4", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.24", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@types/node": "^20.11.30", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", "eslint": "^8.57.0", "jasmine-core": "^5.1.2", "karma": "^6.4.3", @@ -50,7 +50,7 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "ng-packagr": "^17.2.1", + "ng-packagr": "^17.3.0", "prettier": "^3.2.5", "typescript": "~5.3.3" }, @@ -69,24 +69,24 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/architect": { - "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==", + "version": "0.1703.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.2.tgz", + "integrity": "sha512-fT5gSzwDHOyGv8zF97t8rjeoYSGSxXjWWstl3rN1nXdO0qgJ5m6Sv0fupON+HltdXDCBLRH+2khNpqx/Fh0Qww==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", + "@angular-devkit/core": "17.3.2", "rxjs": "7.8.1" }, "engines": { @@ -96,71 +96,71 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.2.2.tgz", - "integrity": "sha512-K55xBiWBfxD4wmxLR2viOPbBryOk6YaZeNr72IMkp1yIrIy1BES6LDJi7R9fDW7+TprqZdM4B91Tkc+BCwYQzQ==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.2.tgz", + "integrity": "sha512-muPCUyL0uHvRkLH4NLWiccER6P2vCm/Q5DDvqyN4XOzzY3tAHHLrKrpvY87sgd2oNJ6Ci8x7GPNcfzR5KELCnw==", "dev": true, "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1702.2", - "@angular-devkit/build-webpack": "0.1702.2", - "@angular-devkit/core": "17.2.2", - "@babel/core": "7.23.9", + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.2", + "@angular-devkit/build-webpack": "0.1703.2", + "@angular-devkit/core": "17.3.2", + "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-transform-async-generator-functions": "7.23.9", "@babel/plugin-transform-async-to-generator": "7.23.3", - "@babel/plugin-transform-runtime": "7.23.9", - "@babel/preset-env": "7.23.9", - "@babel/runtime": "7.23.9", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.2.2", + "@ngtools/webpack": "17.3.2", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.17", + "autoprefixer": "10.4.18", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", + "critters": "0.0.22", "css-loader": "6.10.0", - "esbuild-wasm": "0.20.0", + "esbuild-wasm": "0.20.1", "fast-glob": "3.3.2", "http-proxy-middleware": "2.0.6", - "https-proxy-agent": "7.0.2", - "inquirer": "9.2.14", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", "jsonc-parser": "3.2.1", "karma-source-map-support": "1.4.0", "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.7", - "mini-css-extract-plugin": "2.8.0", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", "mrmime": "2.0.0", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.1", - "piscina": "4.3.1", + "piscina": "4.4.0", "postcss": "8.4.35", - "postcss-loader": "8.1.0", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.70.0", - "sass-loader": "14.1.0", + "sass": "1.71.1", + "sass-loader": "14.1.1", "semver": "7.6.0", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.27.0", + "terser": "5.29.1", "tree-kill": "1.2.2", "tslib": "2.6.2", - "undici": "6.6.2", - "vite": "5.0.12", + "undici": "6.7.1", + "vite": "5.1.5", "watchpack": "2.4.0", - "webpack": "5.90.1", - "webpack-dev-middleware": "6.1.1", + "webpack": "5.90.3", + "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" @@ -171,7 +171,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.20.0" + "esbuild": "0.20.1" }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", @@ -186,7 +186,7 @@ "ng-packagr": "^17.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.4" + "typescript": ">=5.2 <5.5" }, "peerDependenciesMeta": { "@angular/localize": { @@ -225,12 +225,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1702.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1702.2.tgz", - "integrity": "sha512-+c7rHD2Se1VD9i9uPEYHqhq8hTnsUAn5LfeJCLS8g7FU8T42tDSC/k1qWxHp7d99kf7ecg2BvYcZDlYaBUnl3A==", + "version": "0.1703.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.2.tgz", + "integrity": "sha512-w7rVFQcZK4iTCd/MLfQWIkDkwBOfAs++txNQyS9qYID8KvLs1V+oWYd2qDBRelRv1u3YtaCIS1pQx3GFKBC3OA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.2", + "@angular-devkit/architect": "0.1703.2", "rxjs": "7.8.1" }, "engines": { @@ -244,9 +244,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.2.2.tgz", - "integrity": "sha512-bKMi6bBkEeN4a3qTxCykhrAvE0ESHhKO38Qh1bN/8QSyvKVAEyVAVls5W9IN5GKRHvXgEn9aw+DSzRnPpy9nyw==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.2.tgz", + "integrity": "sha512-1vxKo9+pdSwTOwqPDSYQh84gZYmCJo6OgR5+AZoGLGMZSeqvi9RG5RiUcOMLQYOnuYv0arlhlWxz0ZjyR8ApKw==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -271,14 +271,14 @@ } }, "node_modules/@angular-devkit/schematics": { - "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==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.2.tgz", + "integrity": "sha512-AYO6oc6QpFGigc1KiDzEVT1CeLnwvnIedU5Q/U3JDZ/Yqmvgc09D64g9XXER2kg6tV7iEgLxiYnonIAQOHq7eA==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", + "@angular-devkit/core": "17.3.2", "jsonc-parser": "3.2.1", - "magic-string": "0.30.7", + "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -289,13 +289,13 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.1.tgz", - "integrity": "sha512-O30eaR0wCPiP+zKWvXj2JM8hVq30Wok2rp7zJMFm3PurjF9nWIIyexXkE5fa538DYZYxu8N3gQRqhpv5jvTXCg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.3.0.tgz", + "integrity": "sha512-JXSZE7+KA3UGU6jwc0v9lwOIMptosrvLIOXGlXqrhHWEXfkfu3ENPq1Lm3K8jLndQ57XueEhC+Nab/AuUiWA/Q==", "dev": true, "dependencies": { - "@nx/devkit": "17.2.8", - "nx": "17.2.8" + "@nx/devkit": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -303,19 +303,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.1.tgz", - "integrity": "sha512-puC0itsZv2QlrDOCcWtq1KZH+DvfrpV+mV78HHhi6+h25R5iIhr8ARKcl3EQxFjvrFq34jhG8pSupxKvFbHVfA==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", + "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.1.tgz", - "integrity": "sha512-9yA81BHpsaCUKRBtHGN3ieAy8HpIoffzPQMu34lYqZFT4yGHGhYmhQjNSQGBRbV2LD9dVv2U35rMHNmUcozXpw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", + "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", "dev": true, "dependencies": { - "@angular-eslint/utils": "17.2.1", - "@typescript-eslint/utils": "6.19.0" + "@angular-eslint/utils": "17.3.0", + "@typescript-eslint/utils": "7.2.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -323,15 +323,15 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.1.tgz", - "integrity": "sha512-hl1hcHtcm90wyVL1OQGTz16oA0KHon+FFb3Qg0fLXObaXxA495Ecefd9ub5Xxg4JEOPRDi29bF1Y3YKpwflgeg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", + "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.1", - "@angular-eslint/utils": "17.2.1", - "@typescript-eslint/type-utils": "6.19.0", - "@typescript-eslint/utils": "6.19.0", + "@angular-eslint/bundled-angular-compiler": "17.3.0", + "@angular-eslint/utils": "17.3.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" }, @@ -341,30 +341,30 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.1.tgz", - "integrity": "sha512-7ldtIePI4ZTp/TBpeOZkzfv30HSAn//4TgtFuqvojudI8n8batV5FqQ0VNm1e0zitl75t8Zwtr0KYT4I6vh59g==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", + "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.2.1", - "@angular-eslint/eslint-plugin-template": "17.2.1", - "@nx/devkit": "17.2.8", - "ignore": "5.3.0", - "nx": "17.2.8", + "@angular-eslint/eslint-plugin": "17.3.0", + "@angular-eslint/eslint-plugin-template": "17.3.0", + "@nx/devkit": "^17.2.8 || ^18.0.0", + "ignore": "5.3.1", + "nx": "^17.2.8 || ^18.0.0", "strip-json-comments": "3.1.1", - "tmp": "0.2.1" + "tmp": "0.2.3" }, "peerDependencies": { "@angular/cli": ">= 17.0.0 < 18.0.0" } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.1.tgz", - "integrity": "sha512-WPQYFvRju0tCDXQ/pwrzC911pE07JvpeDgcN2elhzV6lxDHJEZpA5O9pnW9qgNA6J6XM9Q7dBkJ22ztAzC4WFw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.3.0.tgz", + "integrity": "sha512-m+UzAnWgtjeS0x6skSmR0eXltD/p7HZA+c8pPyAkiHQzkxE7ohhfyZc03yWGuYJvWQUqQAKKdO/nQop14TP0bg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.1", + "@angular-eslint/bundled-angular-compiler": "17.3.0", "eslint-scope": "^8.0.0" }, "peerDependencies": { @@ -373,13 +373,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.1.tgz", - "integrity": "sha512-qQYTBXy90dWM7fhhpa5i9lTtqqhJisvRa+naCrQx9kBgR458JScLdkVIdcZ9D/rPiDCmKiVUfgcDISnjUeqTqg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", + "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.2.1", - "@typescript-eslint/utils": "6.19.0" + "@angular-eslint/bundled-angular-compiler": "17.3.0", + "@typescript-eslint/utils": "7.2.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -387,9 +387,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.3.tgz", - "integrity": "sha512-eQcN6hC/dXISEYC/TjRuQJgfdZieBROBlXrS+BxRbsy9T4/QeKxChC3yiNxTmdxl5mvjLKvQTXHR8X0AWc07/Q==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.1.tgz", + "integrity": "sha512-2TZ0M5J0IizhHpb404DeqArlv8Ki9BFz5ZUuET2uFROpKW8IMDCht8fSrn/DKHpjB9lvzPUhNFaRxNWEY6klnA==", "dependencies": { "tslib": "^2.3.0" }, @@ -397,13 +397,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3" + "@angular/core": "17.3.1" } }, "node_modules/@angular/cdk": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.2.1.tgz", - "integrity": "sha512-9cWV9MyWnpImns/WQApgoQBKblXA9Zx2CpCkDNipRgx9RyvGrvCLjpEfwQI4HjpPAQDI1trsbeJKihzgz4tFgw==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.1.tgz", + "integrity": "sha512-pHSN+KlCmdo2u9jY7Yxsry/ZK+EcjOYGzdwxXxcKragMzm7etY3BJiTl4N+qZRuV6cJlMj2PRkij8ABi/HQdEA==", "dependencies": { "tslib": "^2.3.0" }, @@ -417,19 +417,19 @@ } }, "node_modules/@angular/cli": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.2.2.tgz", - "integrity": "sha512-cGGOnOTjU1bHBAU+5LMR1vfjUSmIY204pUcRAHu6xq1Qp8jm0Wf1lYOG1KrzpDezKa8d0WZe6FIVlxsCZRRYSw==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.2.tgz", + "integrity": "sha512-g6r4XZyGnh9P6GmWgaFh8RmR4L6UdQ408e3SpG3rjncuPRD57Ur8806GfCLPt6HIA9TARiKmaJ0EJ3RsIjag0g==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.2", - "@angular-devkit/core": "17.2.2", - "@angular-devkit/schematics": "17.2.2", - "@schematics/angular": "17.2.2", + "@angular-devkit/architect": "0.1703.2", + "@angular-devkit/core": "17.3.2", + "@angular-devkit/schematics": "17.3.2", + "@schematics/angular": "17.3.2", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "9.2.14", + "ini": "4.1.2", + "inquirer": "9.2.15", "jsonc-parser": "3.2.1", "npm-package-arg": "11.0.1", "npm-pick-manifest": "9.0.0", @@ -451,9 +451,9 @@ } }, "node_modules/@angular/common": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.2.3.tgz", - "integrity": "sha512-XR3rWS4W7/+RknyJMUUo9E81mSeyUznpclqTZ+Hy7+i4Naeso0qcRaIyr6JJmB5UGvlnfT1MlH9Fj78Dc80NEw==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.1.tgz", + "integrity": "sha512-HyUTJ4RxhE3bOmFRV6Fv2y01ixbrUb8Hd4MxPm8REbNMGKsWCfXhR3FfxFL18Sc03SAF+o0Md0wwekjFKTNKfQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -461,14 +461,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3", + "@angular/core": "17.3.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.2.3.tgz", - "integrity": "sha512-U2okLZ+4ipD5zTv32pMp+RsrM3kkP0XneSsIMPRpYZZfKgfnGLIwkRx6FoVoBwByugng6lBG/PiIe8DhRU/HFg==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.1.tgz", + "integrity": "sha512-8qqlWPGZEyD2FY5losOW3Aocro+lFysPDzsf0LHgQUM6Ub1b+pq4jUOjH6w0vzaxG3TfxkgzOQ9aNdWtSV67Rg==", "dependencies": { "tslib": "^2.3.0" }, @@ -476,7 +476,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3" + "@angular/core": "17.3.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -485,9 +485,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.2.3.tgz", - "integrity": "sha512-mATybangypneXwO270VQeIw3N0avzc2Lpvdb8nm9WZYj23AcTUzpUUKOn63HtJdwMT5J2GjkyZFSRXisiPmpkA==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.1.tgz", + "integrity": "sha512-xLV9KU+zOpe57/2rQ59ku21EaStNpLSlR9+qkDYf8JR09fB+W9vY3UYbpi5RjHxAFIZBM5D9SFQjjll8rch26g==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -507,14 +507,56 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.3", - "typescript": ">=5.2 <5.4" + "@angular/compiler": "17.3.1", + "typescript": ">=5.2 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@angular/core": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.2.3.tgz", - "integrity": "sha512-DU+RdUB4E4I489R2P2hOrgkCDJNXlVaTzYixpgeDnuldCIYM0MatEzjor9DYNL3EDCayHF+M4HlVOcn6T/IVPQ==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.1.tgz", + "integrity": "sha512-Qf3/sgkXS1LHwOTtqAVYprySrn0YpPIZqerPc0tK+hyQfwAz5BQlpcBhbH8RWKlfCY8eO0cqo/j0+e8DQOgYfg==", "dependencies": { "tslib": "^2.3.0" }, @@ -527,9 +569,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.2.3.tgz", - "integrity": "sha512-v+/6pimht808F5XpmVTNV4/109s+A7m3nadQP97qvIDsrtwrPPZR7cST+DRioG2C41VwtjXM0HVbIon/3ydo6A==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.1.tgz", + "integrity": "sha512-HndsO90k67sFHzd+sII+rhAUksffBvquFuAUCc6QR9WVjILxVg2fY7oBidgS1gKNqu0mptPG0GvuORnaW/0gSg==", "dependencies": { "tslib": "^2.3.0" }, @@ -537,25 +579,25 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3", + "@angular/common": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.2.3.tgz", - "integrity": "sha512-H4LUs2Ftdlk1iqHqC7jRcbHmnNRy53OUlBYNkjRkTsthOI4WqsiSqAp5Frrni3erBqpZ2ik86cbMEyEXcfjRhw==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.1.tgz", + "integrity": "sha512-awC+KHwIRXZ7biQz0Q7q+UZuuyeWHcxjxyQtvv0n1jwwyRpUo8WAXcduKRxl/wMOrxfZkB/tpGcd1/Eeql9CCw==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0" } }, "node_modules/@angular/localize": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.2.3.tgz", - "integrity": "sha512-RCReeQabENpWNzhF/jZMhiMCbGt78lb5mgiMNvbGet62IHR62q3Qu1bXprjJvgGIHsxQlM4pkGgMGTZ/8/my4A==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.1.tgz", + "integrity": "sha512-ma8PD+DWv68OKgvbmxw7rVohT5HvIYgbmPnVg8lyEz/YkUa9lua0zzrgA+3HUComqv16oVrIaQr00oWxn/9lXQ==", "dependencies": { "@babel/core": "7.23.9", "@types/babel__core": "7.20.5", @@ -571,14 +613,56 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.3", - "@angular/compiler-cli": "17.2.3" + "@angular/compiler": "17.3.1", + "@angular/compiler-cli": "17.3.1" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@angular/platform-browser": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.2.3.tgz", - "integrity": "sha512-bFi+H8avyCjwSBy+zpOKmqx852MRH8fkuZa4XgwKCPJRay8BfSCjHdtIo3eokUNPMu9JsyXM7HYKIfzLu5y6LA==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.1.tgz", + "integrity": "sha512-8ABAL8PElSGzkIparVwifsU0NSu0DdqnWYw9YvLhhZQ6lOuWbG+dTUo/DXzmWhA6ezQWJGNakEZPJJytFIIy+A==", "dependencies": { "tslib": "^2.3.0" }, @@ -586,9 +670,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.2.3", - "@angular/common": "17.2.3", - "@angular/core": "17.2.3" + "@angular/animations": "17.3.1", + "@angular/common": "17.3.1", + "@angular/core": "17.3.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -597,9 +681,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "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==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.1.tgz", + "integrity": "sha512-ACW/npNaDxUNQtEomjjv/KIBY8jHEinePff5qosnAxLE0IpA4qE9eDp36zG35xoJqrPJPYjXbZCBRqqrzM7U7Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -607,16 +691,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/compiler": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3" + "@angular/common": "17.3.1", + "@angular/compiler": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1" } }, "node_modules/@angular/router": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.2.3.tgz", - "integrity": "sha512-8UPjMzI98xZ6cDNm0MzHd9hFq6aOQJGmgxKDUPIG2h74glRwwbiewpo5hPo2EGIF8BLvQmmAm9ytr5zesHu0cg==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.1.tgz", + "integrity": "sha512-H6H7lY9i5Ppu0SFwwpeWqJbCFw8cILOj8Rd1+AGoCN5m3ivPtjD2Ltz62PI2zZkqx+WhQdk19l61Wm3oRqg70A==", "dependencies": { "tslib": "^2.3.0" }, @@ -624,47 +708,47 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3", + "@angular/common": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -754,9 +838,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -764,7 +848,7 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -812,9 +896,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -871,11 +955,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -938,13 +1022,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -989,9 +1073,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } @@ -1027,12 +1111,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -1040,22 +1124,23 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1064,12 +1149,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1079,14 +1164,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1096,13 +1181,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1187,12 +1272,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1202,12 +1287,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1359,12 +1444,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1409,12 +1494,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1424,12 +1509,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1439,13 +1524,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1455,13 +1540,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1472,17 +1557,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1494,13 +1579,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1510,12 +1595,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1525,13 +1610,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1541,12 +1626,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1556,12 +1641,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1572,13 +1657,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1588,12 +1673,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1604,12 +1689,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1620,14 +1705,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1637,12 +1722,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1653,12 +1738,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1668,12 +1753,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1684,12 +1769,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1699,13 +1784,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1715,13 +1800,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1732,14 +1817,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -1750,13 +1835,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1782,12 +1867,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1797,12 +1882,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1813,12 +1898,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1829,16 +1914,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "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==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "dependencies": { - "@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" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1848,13 +1932,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1864,12 +1948,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1880,12 +1964,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1897,12 +1981,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1912,13 +1996,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1928,14 +2012,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1946,12 +2030,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1961,12 +2045,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1977,12 +2061,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1992,13 +2076,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", @@ -2021,12 +2105,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2036,12 +2120,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -2052,12 +2136,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2067,12 +2151,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2082,12 +2166,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2097,12 +2181,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2112,13 +2196,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2128,13 +2212,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2144,13 +2228,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2160,14 +2244,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -2220,7 +2304,7 @@ "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", @@ -2283,9 +2367,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2308,17 +2392,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@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.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -2327,6 +2411,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", @@ -2350,30 +2448,32 @@ } }, "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.3.2", - "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-4.3.2.tgz", - "integrity": "sha512-SKGY6E6v7QGq0P3YTnZQRSrU8t0euLQ3UV/FH5j0JmHYBBu7Mv0Hd9g8AESnj8xrCelKZ5bdZKZhmKaIdG5clw==", - "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": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@coreui/icons/-/icons-3.0.1.tgz", - "integrity": "sha512-u9UKEcRMyY9pa4jUoLij8pAR03g5g6TLWV33/Mx2ix8sffyi0eO4fLV8DSTQljDCw938zt7KYog5cVKEAJUxxg==", - "dev": true + "integrity": "sha512-u9UKEcRMyY9pa4jUoLij8pAR03g5g6TLWV33/Mx2ix8sffyi0eO4fLV8DSTQljDCw938zt7KYog5cVKEAJUxxg==" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", @@ -2385,9 +2485,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", - "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", "cpu": [ "ppc64" ], @@ -2401,9 +2501,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", - "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", "cpu": [ "arm" ], @@ -2417,9 +2517,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", - "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", "cpu": [ "arm64" ], @@ -2433,9 +2533,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", - "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", "cpu": [ "x64" ], @@ -2449,9 +2549,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", - "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", "cpu": [ "arm64" ], @@ -2465,9 +2565,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", - "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", "cpu": [ "x64" ], @@ -2481,9 +2581,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", - "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", "cpu": [ "arm64" ], @@ -2497,9 +2597,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", - "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", "cpu": [ "x64" ], @@ -2513,9 +2613,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", - "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", "cpu": [ "arm" ], @@ -2529,9 +2629,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", - "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", "cpu": [ "arm64" ], @@ -2545,9 +2645,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", - "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", "cpu": [ "ia32" ], @@ -2561,9 +2661,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", - "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", "cpu": [ "loong64" ], @@ -2577,9 +2677,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", - "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", "cpu": [ "mips64el" ], @@ -2593,9 +2693,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", - "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", "cpu": [ "ppc64" ], @@ -2609,9 +2709,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", - "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", "cpu": [ "riscv64" ], @@ -2625,9 +2725,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", - "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", "cpu": [ "s390x" ], @@ -2641,9 +2741,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", - "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", "cpu": [ "x64" ], @@ -2657,9 +2757,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", - "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", "cpu": [ "x64" ], @@ -2673,9 +2773,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", - "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", "cpu": [ "x64" ], @@ -2689,9 +2789,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", - "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", "cpu": [ "x64" ], @@ -2705,9 +2805,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", - "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", "cpu": [ "arm64" ], @@ -2721,9 +2821,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", - "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", "cpu": [ "ia32" ], @@ -2737,9 +2837,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", - "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", "cpu": [ "x64" ], @@ -2897,15 +2997,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "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" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -3124,13 +3215,13 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -3147,28 +3238,33 @@ "@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", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@ljharb/through": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", - "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" } }, "node_modules/@ngtools/webpack": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.2.2.tgz", - "integrity": "sha512-HgvClGO6WVq4VA5d0ZvlDG5hrj8lQzRH99Gt87URm7G8E5XkatysdOsMqUQsJz+OwFWhP4PvTRWVblpBDiDl/A==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.2.tgz", + "integrity": "sha512-E8zejFF4aJ8l2XcF+GgnE/1IqsZepnPT1xzulLB4LXtjVuXLFLoF9xkHQwxs7cJWWZsxd/SlNsCIcn/ezrYBcQ==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3177,7 +3273,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", - "typescript": ">=5.2 <5.4", + "typescript": ">=5.2 <5.5", "webpack": "^5.54.0" } }, @@ -3444,21 +3540,21 @@ } }, "node_modules/@nrwl/devkit": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.2.8.tgz", - "integrity": "sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.1.3.tgz", + "integrity": "sha512-qIP/RrOfPBqSPgMHKe13/YXnOxasL64Pv+i/aDdY/Fk5zvQIxe+qOizSus7przTwdpu6Jm+JWrYXrwIj4Tmy6g==", "dev": true, "dependencies": { - "@nx/devkit": "17.2.8" + "@nx/devkit": "18.1.3" } }, "node_modules/@nrwl/tao": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.2.8.tgz", - "integrity": "sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.1.3.tgz", + "integrity": "sha512-cRs5kDRhiYVZ9SLQ2ol+2+zltgPemDtsHKz2h2whazHF+d39zsPLYbFm1ZJuDKpZp6TJJercqSH1UQCdOXEkdQ==", "dev": true, "dependencies": { - "nx": "17.2.8", + "nx": "18.1.3", "tslib": "^2.3.0" }, "bin": { @@ -3466,60 +3562,28 @@ } }, "node_modules/@nx/devkit": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.2.8.tgz", - "integrity": "sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.1.3.tgz", + "integrity": "sha512-/LA1VTcSOHun06bsLFREFsy3K2XvRIZKPhUgXbrPAjwVZzH91a+9jUYoCwrxXrp21c2Ndh6y3zq3qPfjJr7DzQ==", "dev": true, "dependencies": { - "@nrwl/devkit": "17.2.8", + "@nrwl/devkit": "18.1.3", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", - "semver": "7.5.3", + "semver": "^7.5.3", "tmp": "~0.2.1", - "tslib": "^2.3.0" + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" }, "peerDependencies": { "nx": ">= 16 <= 18" } }, - "node_modules/@nx/devkit/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/devkit/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@nx/nx-darwin-arm64": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz", - "integrity": "sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.1.3.tgz", + "integrity": "sha512-h3/1ywpLa56RwBnz8Lr9yyUvPvfGvKFxIo8LNptc8fMoONuuIOeZTAmaBxKBOaKtL7g64/LKDs0Ts+mSXzmbqA==", "cpu": [ "arm64" ], @@ -3533,9 +3597,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz", - "integrity": "sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.1.3.tgz", + "integrity": "sha512-6LHe7MYrKlztLlKhYfGV3CtFPhEqcc2ZgwGVWYiAmS/glcN+Wai7RFQX/cZiJ+TbDRFzvETPPGNRP/aSAOkRnQ==", "cpu": [ "x64" ], @@ -3549,9 +3613,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz", - "integrity": "sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.1.3.tgz", + "integrity": "sha512-ppSkJJVKnfDWYJBKqjEM/p4qdMZsZVV++dkFN/n50p6uwHstv0Kth7dNdsu3ZyPqmg6+IYUZql7JSTeNqKne5A==", "cpu": [ "x64" ], @@ -3565,9 +3629,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz", - "integrity": "sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.1.3.tgz", + "integrity": "sha512-1vflQE4gscHq2GJeu2L48Z8rQFcdu+gcprG1cMEf3CIDxh/nJei66bdVJYYYxPNi6rYaeONPJgBjbIih8ce8nQ==", "cpu": [ "arm" ], @@ -3581,9 +3645,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz", - "integrity": "sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.1.3.tgz", + "integrity": "sha512-7B5YXjDzzFdEMUzhFifXgsg741Afp3v7vNdPL2joQ7xrERKYEge7eXCjp5/GYhl9J4y5BmdeV2Joqr4WQ6R7Pg==", "cpu": [ "arm64" ], @@ -3597,9 +3661,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz", - "integrity": "sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.1.3.tgz", + "integrity": "sha512-OaAVjUli44JUTlGPmtxZDO2U88yK6/cwt1LTbTHGeabupbXR295RDn1TkR1/1oNo8grRaOi/V9DWEg9RRmGvOw==", "cpu": [ "arm64" ], @@ -3613,9 +3677,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz", - "integrity": "sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.1.3.tgz", + "integrity": "sha512-qDinHpGZ9FhoOtdfO23pwN7pBCu25ElJ1InLCeCarl9CQYS1CDZNimrcSOFl20DAZqINQamPqBFJ7nKeDRBy7g==", "cpu": [ "x64" ], @@ -3629,9 +3693,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz", - "integrity": "sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.1.3.tgz", + "integrity": "sha512-E28Q0v9N7LrV+0uu4ytrcCHfF1MPYwNL2NLZN3yCPgulGHe3NwCuMnbC974+uOZ+MTqua7KnVOQ5VYA5sL1LIw==", "cpu": [ "x64" ], @@ -3645,9 +3709,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz", - "integrity": "sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.1.3.tgz", + "integrity": "sha512-EYHPIcanVn6ZWkELnW4wW+gl8Itulmpi7f7s83CFrYxRW0U8SAG2sW4JrlvZgrK2CMyluiCGqZGHDUJZST4CVA==", "cpu": [ "arm64" ], @@ -3661,9 +3725,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz", - "integrity": "sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.1.3.tgz", + "integrity": "sha512-1tBViAG9VQ3arKoKFOrkBzYUAGgGsVqYbifng+stb5TPWOj0jjhQpwbsk0u3ROmEBw9crWRwzRt1qh/ZE7SfQQ==", "cpu": [ "x64" ], @@ -3775,9 +3839,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", "cpu": [ "arm" ], @@ -3788,9 +3852,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", "cpu": [ "arm64" ], @@ -3801,9 +3865,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", "cpu": [ "arm64" ], @@ -3814,9 +3878,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", "cpu": [ "x64" ], @@ -3827,9 +3891,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", "cpu": [ "arm" ], @@ -3840,9 +3904,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", "cpu": [ "arm64" ], @@ -3853,9 +3917,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", "cpu": [ "arm64" ], @@ -3866,9 +3930,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", "cpu": [ "riscv64" ], @@ -3879,9 +3943,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", "cpu": [ "x64" ], @@ -3892,9 +3956,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", "cpu": [ "x64" ], @@ -3905,9 +3969,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", "cpu": [ "arm64" ], @@ -3918,9 +3982,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", "cpu": [ "ia32" ], @@ -3931,9 +3995,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "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==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", "cpu": [ "x64" ], @@ -3944,9 +4008,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.12.0.tgz", - "integrity": "sha512-sqy3+YvV/uWX6bPZOR5PlEdH6xyMPXoelllRQ/uZ13tzy9f4pXZTbajnoWN8IHHXwTNKPiLzsePLiDEVmkxMNw==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.13.0.tgz", + "integrity": "sha512-oFX11wzU7RTaiW06WBtRpzIVN/oaG0I3XkevNO0brBklYnY9zpLhTfksN4b+TdBt6CfXV/KdVhdWLbb0fQIR7A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3963,13 +4027,13 @@ } }, "node_modules/@schematics/angular": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.2.tgz", - "integrity": "sha512-Q3VAQ/S4gj8D1JPWgWG4enDdDZUu8mUXWVRG1rOi4sHgOF5zgPieQFp3LXqMUgOncmzbXrctkbO6NKc4N2FAag==", + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.2.tgz", + "integrity": "sha512-zPINvow0Qo6ionnDl25ZzSSLDyDxBjqRPEJWGHU70expbjXK4A2caQT9P/8ImhapbJAXJCfxg4GF9z1d/sWe4w==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", - "@angular-devkit/schematics": "17.2.2", + "@angular-devkit/core": "17.3.2", + "@angular-devkit/schematics": "17.3.2", "jsonc-parser": "3.2.1" }, "engines": { @@ -3991,9 +4055,9 @@ } }, "node_modules/@sigstore/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.0.0.tgz", - "integrity": "sha512-dW2qjbWLRKGu6MIDUTBuJwXCnR8zivcSpf5inUzk7y84zqy/dji0/uahppoIgMoKeR+6pUZucrwHfkQQtiG9Rw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4024,9 +4088,9 @@ } }, "node_modules/@sigstore/tuf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.1.tgz", - "integrity": "sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.3.0", @@ -4037,13 +4101,13 @@ } }, "node_modules/@sigstore/verify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.0.tgz", - "integrity": "sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", + "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", "dev": true, "dependencies": { "@sigstore/bundle": "^2.2.0", - "@sigstore/core": "^1.0.0", + "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { @@ -4175,9 +4239,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "version": "8.56.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", + "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4252,9 +4316,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", "dev": true }, "node_modules/@types/lodash-es": { @@ -4273,9 +4337,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4291,9 +4355,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true }, "node_modules/@types/range-parser": { @@ -4369,16 +4433,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", + "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/type-utils": "7.4.0", + "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -4387,15 +4451,15 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4404,25 +4468,25 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", + "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/utils": "7.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4431,51 +4495,51 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", + "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", "semver": "^7.5.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", + "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4484,16 +4548,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", + "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4501,13 +4565,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", - "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -4519,7 +4583,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4528,9 +4592,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4541,13 +4605,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4569,12 +4633,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/types": "7.2.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4586,12 +4650,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", + "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4599,13 +4663,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", + "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4614,7 +4678,7 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4627,17 +4691,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", - "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", "semver": "^7.5.4" }, "engines": { @@ -4648,17 +4712,17 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4669,9 +4733,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4682,13 +4746,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4710,12 +4774,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/types": "7.2.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4727,16 +4791,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", + "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/types": "7.4.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -4762,9 +4826,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -4784,9 +4848,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -4807,15 +4871,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -4843,28 +4907,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -4872,24 +4936,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -4898,12 +4962,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -5229,9 +5293,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -5248,8 +5312,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -5266,12 +5330,12 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5319,13 +5383,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -5354,6 +5418,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", @@ -5366,6 +5446,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5417,11 +5513,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -5693,9 +5792,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001593", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", - "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "funding": [ { "type": "opencollective", @@ -5731,9 +5830,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", @@ -6178,12 +6283,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "dependencies": { - "browserslist": "^4.22.3" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -6254,9 +6359,9 @@ } }, "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -6265,7 +6370,7 @@ "domhandler": "^5.0.2", "htmlparser2": "^8.0.2", "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "postcss-media-query-parser": "^0.2.3" } }, "node_modules/critters/node_modules/ansi-styles": { @@ -6419,6 +6524,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" }, @@ -6747,9 +6853,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", - "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==" + "version": "1.4.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz", + "integrity": "sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6837,9 +6943,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6938,15 +7044,15 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", "dev": true }, "node_modules/esbuild": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", - "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6957,35 +7063,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.0", - "@esbuild/android-arm": "0.20.0", - "@esbuild/android-arm64": "0.20.0", - "@esbuild/android-x64": "0.20.0", - "@esbuild/darwin-arm64": "0.20.0", - "@esbuild/darwin-x64": "0.20.0", - "@esbuild/freebsd-arm64": "0.20.0", - "@esbuild/freebsd-x64": "0.20.0", - "@esbuild/linux-arm": "0.20.0", - "@esbuild/linux-arm64": "0.20.0", - "@esbuild/linux-ia32": "0.20.0", - "@esbuild/linux-loong64": "0.20.0", - "@esbuild/linux-mips64el": "0.20.0", - "@esbuild/linux-ppc64": "0.20.0", - "@esbuild/linux-riscv64": "0.20.0", - "@esbuild/linux-s390x": "0.20.0", - "@esbuild/linux-x64": "0.20.0", - "@esbuild/netbsd-x64": "0.20.0", - "@esbuild/openbsd-x64": "0.20.0", - "@esbuild/sunos-x64": "0.20.0", - "@esbuild/win32-arm64": "0.20.0", - "@esbuild/win32-ia32": "0.20.0", - "@esbuild/win32-x64": "0.20.0" + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" } }, "node_modules/esbuild-wasm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.0.tgz", - "integrity": "sha512-Lc9KeQCg1Zf8kCtfDXgy29rx0x8dOuhDWbkP76Wc64q7ctOOc1Zv1C39AxiE+y4N6ONyXtJk4HKpM7jlU7/jSA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7072,9 +7178,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.0.tgz", - "integrity": "sha512-zj3Byw6jX4TcFCJmxOzLt6iol5FAr9xQyZZSQjEzW2UiCJXLwXdRIKCYVFftnpZckaC9Ps9xlC7jB8tSeWWOaw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -7491,9 +7597,9 @@ "dev": true }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -7501,7 +7607,7 @@ "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -7533,9 +7639,9 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "engines": { "node": ">= 0.6" @@ -7831,9 +7937,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -8207,9 +8313,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -8417,9 +8523,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -8483,9 +8589,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -8582,9 +8688,9 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8600,9 +8706,9 @@ } }, "node_modules/inquirer": { - "version": "9.2.14", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.14.tgz", - "integrity": "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ==", + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", "dev": true, "dependencies": { "@ljharb/through": "^2.3.12", @@ -9959,9 +10065,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -10123,9 +10229,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz", - "integrity": "sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -10411,6 +10517,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -10476,9 +10583,9 @@ "dev": true }, "node_modules/ng-packagr": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.2.1.tgz", - "integrity": "sha512-Y0qukNaNkDfDp2gyJQ76pG4tKmENDNXiUacSvxmXZF5sCPM4DWS+SL5cZTqNFur70eocRTrWqtOoARSIPA1WMg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.3.0.tgz", + "integrity": "sha512-kMSqxeDgv88SWCoapWNRRN1UdBgwu9/Pw/j7u2WFGmzrIWUFivNWBBSSL94kMxr2La+Z9wMwiL8EwKNvmCpg2A==", "dev": true, "dependencies": { "@rollup/plugin-json": "^6.0.1", @@ -10518,7 +10625,7 @@ "@angular/compiler-cli": "^17.0.0 || ^17.2.0-next.0 || ^17.3.0-next.0", "tailwindcss": "^2.0.0 || ^3.0.0", "tslib": "^2.3.0", - "typescript": ">=5.2 <5.4" + "typescript": ">=5.2 <5.5" }, "peerDependenciesMeta": { "tailwindcss": { @@ -10564,15 +10671,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ng-packagr/node_modules/piscina": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", - "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", - "dev": true, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, "node_modules/ng-packagr/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10626,9 +10724,9 @@ } }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -10883,17 +10981,17 @@ } }, "node_modules/nx": { - "version": "17.2.8", - "resolved": "https://registry.npmjs.org/nx/-/nx-17.2.8.tgz", - "integrity": "sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-18.1.3.tgz", + "integrity": "sha512-Ade/BZxK8kf98pBPHVJXRkxRTpBYJceL1YD9LBMP5TwmsVdG5ZbmmpTkCBorCGmCZ8L5WZN3gwoikvPKGs8q5w==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "17.2.8", + "@nrwl/tao": "18.1.3", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", - "axios": "^1.5.1", + "axios": "^1.6.0", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -10904,17 +11002,17 @@ "figures": "3.2.0", "flat": "^5.0.2", "fs-extra": "^11.1.0", - "glob": "7.1.4", "ignore": "^5.0.4", "jest-diff": "^29.4.1", "js-yaml": "4.1.0", "jsonc-parser": "3.2.0", "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", + "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", "open": "^8.4.0", - "semver": "7.5.3", + "ora": "5.3.0", + "semver": "^7.5.3", "string-width": "^4.2.3", "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", @@ -10929,19 +11027,19 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "17.2.8", - "@nx/nx-darwin-x64": "17.2.8", - "@nx/nx-freebsd-x64": "17.2.8", - "@nx/nx-linux-arm-gnueabihf": "17.2.8", - "@nx/nx-linux-arm64-gnu": "17.2.8", - "@nx/nx-linux-arm64-musl": "17.2.8", - "@nx/nx-linux-x64-gnu": "17.2.8", - "@nx/nx-linux-x64-musl": "17.2.8", - "@nx/nx-win32-arm64-msvc": "17.2.8", - "@nx/nx-win32-x64-msvc": "17.2.8" - }, - "peerDependencies": { - "@swc-node/register": "^1.6.7", + "@nx/nx-darwin-arm64": "18.1.3", + "@nx/nx-darwin-x64": "18.1.3", + "@nx/nx-freebsd-x64": "18.1.3", + "@nx/nx-linux-arm-gnueabihf": "18.1.3", + "@nx/nx-linux-arm64-gnu": "18.1.3", + "@nx/nx-linux-arm64-musl": "18.1.3", + "@nx/nx-linux-x64-gnu": "18.1.3", + "@nx/nx-linux-x64-musl": "18.1.3", + "@nx/nx-win32-arm64-msvc": "18.1.3", + "@nx/nx-win32-x64-msvc": "18.1.3" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", "@swc/core": "^1.3.85" }, "peerDependenciesMeta": { @@ -10974,16 +11072,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/nx/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/nx/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -11018,23 +11106,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/nx/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/nx/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11062,43 +11133,26 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, - "node_modules/nx/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { "node": ">=10" - } - }, - "node_modules/nx/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nx/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nx/node_modules/supports-color": { @@ -11113,12 +11167,6 @@ "node": ">=8" } }, - "node_modules/nx/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11628,9 +11676,9 @@ } }, "node_modules/piscina": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.3.1.tgz", - "integrity": "sha512-MBj0QYm3hJQ/C/wIXTN1OCYC8uQ4BBJ4LVele2P4ZwVQAH04vkk8E1SpDbuemLAL1dZorbuOob9rYqJeWCcCRg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", "dev": true, "optionalDependencies": { "nice-napi": "^1.0.2" @@ -11737,6 +11785,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", @@ -11760,24 +11809,10 @@ "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", - "integrity": "sha512-AbperNcX3rlob7Ay7A/HQcrofug1caABBkopoFeOQMspZBqcqj6giYn1Bwey/0uiOPAcR+NQD0I2HC7rXzk91w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "dependencies": { "cosmiconfig": "^9.0.0", @@ -11805,6 +11840,12 @@ } } }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -11865,9 +11906,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11906,18 +11948,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -12413,9 +12443,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -12428,19 +12458,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@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", + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", "fsevents": "~2.3.2" } }, @@ -12510,9 +12540,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -12527,9 +12557,9 @@ } }, "node_modules/sass-loader": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.0.tgz", - "integrity": "sha512-LS2mLeFWA+orYxHNu+O18Xe4jR0kyamNOOUsE3NyBP4DvIL+8stHpNX0arYTItdPe80kluIiJ7Wfe/9iHSRO0Q==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -12801,17 +12831,17 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12926,9 +12956,9 @@ } }, "node_modules/socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -13015,9 +13045,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13358,9 +13389,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -13442,9 +13473,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13603,15 +13634,12 @@ "dev": true }, "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/to-fast-properties": { @@ -13652,9 +13680,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { "node": ">=16" @@ -13775,13 +13803,10 @@ } }, "node_modules/undici": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.6.2.tgz", - "integrity": "sha512-vSqvUE5skSxQJ5sztTZ/CdeJb1Wq0Hf44hlYMciqHghvz+K88U0l7D6u1VsndoFgskDcnU+nG3gYmMzJVzd9Qg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", + "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { "node": ">=18.0" } @@ -13915,7 +13940,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", @@ -13967,13 +13993,13 @@ } }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.32", + "postcss": "^8.4.35", "rollup": "^4.2.0" }, "bin": { @@ -14468,9 +14494,9 @@ } }, "node_modules/webpack": { - "version": "5.90.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", - "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -14515,9 +14541,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -14602,9 +14628,9 @@ } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", diff --git a/package.json b/package.json index bacfe97a..d8a5cd29 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "coreui-angular-dev", - "version": "4.7.16", + "version": "5.0.0", "description": "CoreUI Components Library for Angular", - "copyright": "Copyright 2023 creativeLabs Łukasz Holeczek", + "copyright": "Copyright 2024 creativeLabs Łukasz Holeczek", "license": "MIT", "author": "The CoreUI Team (https://github.com/orgs/coreui/people)", "scripts": { @@ -12,7 +12,7 @@ "test:lib:dev": "ng test coreui-angular", "test:lib:prod": "ng test coreui-angular --karma-config=projects/coreui-angular/karma.conf.github.js", "prepublish:lib": "ng build coreui-icons-angular && ng lint coreui-angular && ng test coreui-angular --watch=false && ng build coreui-angular", - "publish:lib": "cd dist/coreui-angular/ && npm publish --tag ng-v17 --dry-run", + "publish:lib": "cd dist/coreui-angular/ && npm publish --tag next --dry-run", "lint:lib": "ng lint coreui-angular", "link:lib": "cd dist/coreui-angular/ && npm link", "chartjs": "ng", @@ -21,7 +21,7 @@ "test:chartjs:dev": "ng test coreui-angular-chartjs", "test:chartjs:prod": "ng test coreui-angular-chartjs --karma-config=projects/coreui-angular-chartjs/karma.conf.github.js", "prepublish:chartjs": "ng lint coreui-angular-chartjs && ng test coreui-angular-chartjs --watch=false && ng build coreui-angular-chartjs", - "publish:chartjs": "cd dist/coreui-angular-chartjs/ && npm publish --tag ng-v17 --dry-run", + "publish:chartjs": "cd dist/coreui-angular-chartjs/ && npm publish --tag next --dry-run", "lint:chartjs": "ng lint coreui-angular-chartjs", "link:chartjs": "cd dist/coreui-angular-chartjs/ && npm link", "icons": "ng", @@ -30,46 +30,46 @@ "test:icons:dev": "ng test coreui-icons-angular", "test:icons:prod": "ng test coreui-icons-angular --karma-config=projects/coreui-icons-angular/karma.conf.github.js", "prepublish:icons": "ng lint coreui-icons-angular && ng test coreui-icons-angular --watch=false && ng build coreui-icons-angular", - "publish:icons": "cd dist/coreui-icons-angular/ && npm publish --tag ng-v17 --dry-run", + "publish:icons": "cd dist/coreui-icons-angular/ && npm publish --tag next --dry-run", "lint:icons": "ng lint coreui-icons-angular", "link:icons": "cd dist/coreui-icons-angular/ && npm link" }, "private": true, "dependencies": { - "@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/localize": "^17.2.3", - "@angular/platform-browser": "^17.2.3", - "@angular/platform-browser-dynamic": "^17.2.3", - "@angular/router": "^17.2.3", - "@coreui/chartjs": "^3.1.2", + "@angular/animations": "^17.3.1", + "@angular/cdk": "^17.3.1", + "@angular/common": "^17.3.1", + "@angular/compiler": "^17.3.1", + "@angular/core": "^17.3.1", + "@angular/forms": "^17.3.1", + "@angular/localize": "^17.3.1", + "@angular/platform-browser": "^17.3.1", + "@angular/platform-browser-dynamic": "^17.3.1", + "@angular/router": "^17.3.1", + "@coreui/chartjs": "^4.0.0-0 || ^4.0.0", + "@coreui/icons": "^3.0.1", "@popperjs/core": "~2.11.8", - "chart.js": "^3.9.1", + "chart.js": "^4.4.2", "lodash-es": "^4.17.21", "rxjs": "~7.8.1", - "tslib": "^2.3.0", + "tslib": "^2.6.2", "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.2", - "@angular-eslint/builder": "^17.2.1", - "@angular-eslint/eslint-plugin": "^17.2.1", - "@angular-eslint/eslint-plugin-template": "^17.2.1", - "@angular-eslint/schematics": "^17.2.1", - "@angular-eslint/template-parser": "^17.2.1", - "@angular/cli": "^17.2.2", - "@angular/compiler-cli": "^17.2.3", - "@angular/language-service": "^17.2.3", - "@coreui/icons": "^3.0.1", + "@angular-devkit/build-angular": "^17.3.2", + "@angular-eslint/builder": "^17.3.0", + "@angular-eslint/eslint-plugin": "^17.3.0", + "@angular-eslint/eslint-plugin-template": "^17.3.0", + "@angular-eslint/schematics": "^17.3.0", + "@angular-eslint/template-parser": "^17.3.0", + "@angular/cli": "^17.3.2", + "@angular/compiler-cli": "^17.3.1", + "@angular/language-service": "^17.3.1", "@types/jasmine": "^5.1.4", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.24", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@types/node": "^20.11.30", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", "eslint": "^8.57.0", "jasmine-core": "^5.1.2", "karma": "^6.4.3", @@ -77,7 +77,7 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "ng-packagr": "^17.2.1", + "ng-packagr": "^17.3.0", "prettier": "^3.2.5", "typescript": "~5.3.3" }, @@ -102,7 +102,7 @@ "url": "git+https://github.com/coreui/coreui-angular.git" }, "config": { - "version_short": "4.7" + "version_short": "5.0" }, "engines": { "node": "^18.13.0 || ^20.9.0", diff --git a/projects/coreui-angular-chartjs/LICENSE b/projects/coreui-angular-chartjs/LICENSE index 027b8813..94e4f4d1 100644 --- a/projects/coreui-angular-chartjs/LICENSE +++ b/projects/coreui-angular-chartjs/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 creativeLabs Łukasz Holeczek +Copyright (c) 2024 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/coreui-angular-chartjs/README.md b/projects/coreui-angular-chartjs/README.md index 518c6b6d..a060506b 100644 --- a/projects/coreui-angular-chartjs/README.md +++ b/projects/coreui-angular-chartjs/README.md @@ -8,7 +8,7 @@

-

CoreUI Angular wrapper for Chart.js

+

CoreUI Angular wrapper for Chart.js v4

Explore @coreui/angular-chartjs docs & examples » @@ -33,24 +33,35 @@ [npm-badge-next]: https://img.shields.io/npm/v/@coreui/angular-chartjs/next?style=flat-square&color=red [npm]: https://www.npmjs.com/package/@coreui/angular-chartjs [npm-download]: https://img.shields.io/npm/dm/@coreui/angular-chartjs.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^17.2.0-lightgrey.svg?style=flat-square&logo=angular +[angular-badge]: https://img.shields.io/badge/angular-^17.3.0-lightgrey.svg?style=flat-square&logo=angular ##### install: ```bash -npm install chart.js -npm install @coreui/chartjs@3 -npm install @coreui/angular-chartjs +npm install chart.js@4 +npm install @coreui/chartjs@4 +npm install @coreui/angular-chartjs@5 ```` ##### import: ```ts +// ng modules import { ChartjsModule } from '@coreui/angular-chartjs'; @NgModule({ - imports: [ - ChartjsModule, + imports: [ + ChartjsModule, +... +``` +```ts +// standalone components + import { ChartjsComponent } from '@coreui/angular-chartjs'; + +@Component({ + standalone: true, + imports: [ + ChartjsComponent, ... ``` @@ -171,4 +182,4 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2023 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2024 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/projects/coreui-angular-chartjs/package.json b/projects/coreui-angular-chartjs/package.json index f9d5fb79..66a3b0de 100644 --- a/projects/coreui-angular-chartjs/package.json +++ b/projects/coreui-angular-chartjs/package.json @@ -1,8 +1,8 @@ { "name": "@coreui/angular-chartjs", - "version": "4.7.16", + "version": "5.0.0", "description": "Angular wrapper component for Chart.js", - "copyright": "Copyright 2023 creativeLabs Łukasz Holeczek", + "copyright": "Copyright 2024 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -25,11 +25,9 @@ "url": "https://github.com/coreui/coreui-angular/issues" }, "peerDependencies": { - "@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" + "@angular/core": "^17.3.0", + "@coreui/chartjs": "^4.0.0-0 || ^4.0.0", + "chart.js": "^4.4.2" }, "dependencies": { "lodash-es": "^4.17.21", diff --git a/projects/coreui-angular-chartjs/src/index.ts b/projects/coreui-angular-chartjs/src/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/projects/coreui-angular-chartjs/src/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.html b/projects/coreui-angular-chartjs/src/lib/chartjs.component.html index 5d2120a8..2d010fac 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.html +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.html @@ -7,5 +7,6 @@ role="img" style="display: none;" > - + + diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts index d4653bc4..2c94c915 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { ChartjsComponent } from './chartjs.component'; -import { Chart, ChartData, registerables } from 'chart.js'; +import { Chart, registerables } from 'chart.js'; describe('ChartjsComponent', () => { let component: ChartjsComponent; @@ -16,7 +16,7 @@ describe('ChartjsComponent', () => { const labels = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; - const data: ChartData = { + const data = { labels: labels, datasets: [{ data: [65, 59, 84, 84, 51, 55, 40], diff --git a/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts b/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts index 6ccfb4d2..74bb9324 100644 --- a/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts +++ b/projects/coreui-angular-chartjs/src/lib/chartjs.component.ts @@ -22,16 +22,8 @@ import { import merge from 'lodash-es/merge'; -import { - Chart as ChartJS, - ChartConfiguration, - ChartData, - ChartOptions, - ChartType, - InteractionItem, - Plugin, - registerables -} from 'chart.js'; +import type { ChartConfiguration, ChartData, ChartOptions, ChartType, InteractionItem, Plugin } from 'chart.js'; +import { Chart as ChartJS, registerables } from 'chart.js'; import { customTooltips as cuiCustomTooltips } from '@coreui/chartjs'; ChartJS.register(...registerables); @@ -62,6 +54,11 @@ export class ChartjsComponent implements AfterViewInit, OnDestroy, OnChanges { */ @Input() data?: ChartData; + /** + * A fallback when the canvas cannot be rendered. Can be used for accessible chart descriptions. + */ + // @Input() fallbackContent?: TemplateRef; + /** * Height attribute applied to the rendered canvas. * @type number | undefined diff --git a/projects/coreui-angular/CLI.md b/projects/coreui-angular/CLI.md new file mode 100644 index 00000000..e16fd6be --- /dev/null +++ b/projects/coreui-angular/CLI.md @@ -0,0 +1,27 @@ +# @coreui/angular v5 + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.2.0. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/projects/coreui-angular/LICENSE b/projects/coreui-angular/LICENSE index 027b8813..94e4f4d1 100644 --- a/projects/coreui-angular/LICENSE +++ b/projects/coreui-angular/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 creativeLabs Łukasz Holeczek +Copyright (c) 2024 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/coreui-angular/README.md b/projects/coreui-angular/README.md index d9f34024..49315ea8 100644 --- a/projects/coreui-angular/README.md +++ b/projects/coreui-angular/README.md @@ -35,12 +35,22 @@ [npm-coreui-angular-badge-next]: https://img.shields.io/npm/v/@coreui/angular/next?style=flat-square&color=red [npm-coreui-angular]: https://www.npmjs.com/package/@coreui/angular [npm-coreui-angular-download]: https://img.shields.io/npm/dm/@coreui/angular.svg?style=flat-square -[angular-badge]: https://img.shields.io/badge/angular-^17.2.0-lightgrey.svg?style=flat-square&logo=angular +[angular-badge]: https://img.shields.io/badge/angular-^17.3.0-lightgrey.svg?style=flat-square&logo=angular ## Table of contents - [Status](#status) +- [Table of contents](#table-of-contents) - [Quick start](#quick-start) + - [Prerequisites](#prerequisites) + - [Node.js](#nodejs) + - [Angular CLI](#angular-cli) + - [Installation](#installation) + - [CoreUI CSS files](#coreui-css-files) + - [Installation](#installation-1) + - [Basic usage](#basic-usage) + - [Bootstrap CSS files](#bootstrap-css-files) + - [Installation (optional)](#installation-optional) - [Templates](#templates) - [Bugs and feature requests](#bugs-and-feature-requests) - [Documentation](#documentation) @@ -209,4 +219,4 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2023 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2024 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/projects/coreui-angular/package.json b/projects/coreui-angular/package.json index b558a026..3a4e1884 100644 --- a/projects/coreui-angular/package.json +++ b/projects/coreui-angular/package.json @@ -1,8 +1,8 @@ { "name": "@coreui/angular", - "version": "4.7.16", - "description": "CoreUI for Angular UI components library", - "copyright": "Copyright 2023 creativeLabs Łukasz Holeczek", + "version": "5.0.0", + "description": "CoreUI Components Library for Angular", + "copyright": "Copyright 2024 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -18,16 +18,18 @@ } ], "dependencies": { - "@popperjs/core": "~2.11.6", + "@popperjs/core": "~2.11.8", "tslib": "^2.3.0" }, "sideEffects": false, "peerDependencies": { - "@angular/animations": "^17.0.0", - "@angular/cdk": "^17.0.0", - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/router": "^17.0.0", + "@angular/animations": "^17.3.0", + "@angular/cdk": "^17.3.0", + "@angular/common": "^17.3.0", + "@angular/core": "^17.3.0", + "@angular/router": "^17.3.0", + "@coreui/coreui": "~5.0.0-0 || ~5.0.0", + "@coreui/icons-angular": "~5.0.0-0 || ~5.0.0", "rxjs": "^7.8.1" }, "repository": { @@ -47,7 +49,5 @@ "component", "components" ], - "eslintConfig": { - - } + "eslintConfig": {} } diff --git a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html index b03adadc..d8248775 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html +++ b/projects/coreui-angular/src/lib/accordion/accordion-item/accordion-item.component.html @@ -1,9 +1,9 @@

- +
- +
@@ -16,7 +16,7 @@ - + @@ -28,5 +28,5 @@ - + diff --git a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts index 85ca0ca2..a30c7df5 100644 --- a/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts +++ b/projects/coreui-angular/src/lib/accordion/accordion/accordion.component.ts @@ -1,11 +1,10 @@ -import { Component, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Component, HostBinding, inject, Input } from '@angular/core'; import { AccordionService } from '../accordion.service'; @Component({ selector: 'c-accordion', - template: ``, + template: '', styleUrls: ['./accordion.component.scss'], exportAs: 'cAccordionItem', providers: [AccordionService], @@ -13,35 +12,33 @@ import { AccordionService } from '../accordion.service'; }) export class AccordionComponent { - static ngAcceptInputType_alwaysOpen: BooleanInput; + #accordionService = inject(AccordionService); /** * Removes the default background-color, some borders, and some rounded corners to render accordions edge-to-edge with their parent container. * @type boolean */ - @Input() flush?: boolean; + @Input({ transform: booleanAttribute }) flush: boolean = false; + /** * Make accordion items stay open when another item is opened * @type boolean */ - @Input() + @Input({ transform: booleanAttribute }) set alwaysOpen(value: boolean) { - this.accordionService.alwaysOpen = coerceBooleanProperty(value); + this.#accordionService.alwaysOpen = value; } + get alwaysOpen(): boolean { - return this.accordionService.alwaysOpen; + return this.#accordionService.alwaysOpen; } @HostBinding('class') get hostClasses(): any { return { accordion: true, - 'accordion-flush': !!this.flush + 'accordion-flush': this.flush }; } - constructor( - private accordionService: AccordionService - ) {} - } diff --git a/projects/coreui-angular/src/lib/alert/alert.component.html b/projects/coreui-angular/src/lib/alert/alert.component.html index 824532aa..efee673a 100644 --- a/projects/coreui-angular/src/lib/alert/alert.component.html +++ b/projects/coreui-angular/src/lib/alert/alert.component.html @@ -4,7 +4,6 @@ } } - diff --git a/projects/coreui-angular/src/lib/alert/alert.component.ts b/projects/coreui-angular/src/lib/alert/alert.component.ts index c7d9f024..4da6bc7b 100644 --- a/projects/coreui-angular/src/lib/alert/alert.component.ts +++ b/projects/coreui-angular/src/lib/alert/alert.component.ts @@ -1,5 +1,6 @@ import { AfterContentInit, + booleanAttribute, Component, ContentChildren, EventEmitter, @@ -11,7 +12,6 @@ import { } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { Colors } from '../coreui.types'; import { TemplateIdDirective } from '../shared'; @@ -48,10 +48,6 @@ type AnimateType = ('hide' | 'show'); }) export class AlertComponent implements AfterContentInit { - static ngAcceptInputType_dismissible: BooleanInput; - static ngAcceptInputType_fade: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - hide!: boolean; /** * Sets the color context of the component to one of CoreUI’s themed colors. @@ -79,54 +75,37 @@ export class AlertComponent implements AfterContentInit { templates: any = {}; @ContentChildren(TemplateIdDirective, { descendants: true }) contentTemplates!: QueryList; - private _dismissible = false; - /** * Optionally adds a close button to alert and allow it to self dismiss. * @type boolean + * @default false */ - @Input() - get dismissible(): boolean { - return this._dismissible; - } - - set dismissible(value: boolean) { - this._dismissible = coerceBooleanProperty(value); - } - - private _fade = false; + @Input({ transform: booleanAttribute }) dismissible: boolean = false; /** * Adds animation for dismissible alert. * @type boolean */ - @Input() - get fade(): boolean { - return this._fade; - } - - set fade(value: boolean) { - this._fade = coerceBooleanProperty(value); - } - - private _visible = true; - - get visible() { - return this._visible; - } + @Input({ transform: booleanAttribute }) fade: boolean = false; /** * Toggle the visibility of alert component. * @type boolean */ - @Input() + @Input({ transform: booleanAttribute }) set visible(value: boolean) { - if (this._visible !== value) { - this._visible = coerceBooleanProperty(value); + if (this.#visible !== value) { + this.#visible = value; this.visibleChange.emit(value); } }; + get visible() { + return this.#visible; + } + + #visible: boolean = true; + @HostBinding('@.disabled') get animationDisabled(): boolean { return !this.fade; diff --git a/projects/coreui-angular/src/lib/avatar/avatar.component.ts b/projects/coreui-angular/src/lib/avatar/avatar.component.ts index 782a6cd8..5a95f487 100644 --- a/projects/coreui-angular/src/lib/avatar/avatar.component.ts +++ b/projects/coreui-angular/src/lib/avatar/avatar.component.ts @@ -2,6 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; import { NgClass, NgTemplateOutlet } from '@angular/common'; import { Colors, Shapes, Sizes, TextColors } from '../coreui.types'; +import { TextColorDirective } from '../utilities'; @Component({ selector: 'c-avatar', @@ -10,7 +11,10 @@ import { Colors, Shapes, Sizes, TextColors } from '../coreui.types'; imports: [ NgTemplateOutlet, NgClass - ] + ], + hostDirectives: [{ + directive: TextColorDirective, inputs: ['cTextColor: textColor'] + }] }) export class AvatarComponent { /** @@ -38,10 +42,11 @@ export class AvatarComponent { * @type Colors */ @Input() status?: Colors; + /** * Sets the text color of the component to one of CoreUI’s themed colors. - * - * @values 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'white' | 'muted' | string + * via TextColorDirective + * @type TextColors */ @Input() textColor?: TextColors; @@ -60,8 +65,7 @@ export class AvatarComponent { avatar: true, [`avatar-${this.size}`]: !!this.size, [`bg-${this.color}`]: !!this.color, - [`${this.shape}`]: !!this.shape, - [`text-${this.textColor}`]: !!this.textColor + [`${this.shape}`]: !!this.shape }; } } diff --git a/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts b/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts index 8720b6b5..38b5b82f 100644 --- a/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts +++ b/projects/coreui-angular/src/lib/backdrop/backdrop.service.ts @@ -20,7 +20,6 @@ export class BackdropService { get #scrollbarWidth() { // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes const documentWidth = this.#document.documentElement.clientWidth; - // const scrollbarWidth = Math.abs((window?.innerWidth ?? documentWidth) - documentWidth); const scrollbarWidth = Math.abs((this.#document.defaultView?.innerWidth ?? documentWidth) - documentWidth); return `${scrollbarWidth}px`; } diff --git a/projects/coreui-angular/src/lib/badge/badge.component.ts b/projects/coreui-angular/src/lib/badge/badge.component.ts index 16c3c6c8..da4831f0 100644 --- a/projects/coreui-angular/src/lib/badge/badge.component.ts +++ b/projects/coreui-angular/src/lib/badge/badge.component.ts @@ -1,10 +1,15 @@ import { Component, HostBinding, Input } from '@angular/core'; -import { BadgePositions, Colors, Shapes } from '../coreui.types'; +import { BadgePositions, Colors, Shapes, TextColors } from '../coreui.types'; +import { TextBgColorDirective, TextColorDirective } from '../utilities'; @Component({ selector: 'c-badge', - template: '', - standalone: true + template: '', + standalone: true, + hostDirectives: [ + { directive: TextColorDirective, inputs: ['cTextColor: textColor'] }, + { directive: TextBgColorDirective, inputs: ['cTextBgColor: textBgColor'] } + ] }) export class BadgeComponent { /** @@ -26,13 +31,21 @@ export class BadgeComponent { * Size the component small. */ @Input() size?: 'sm'; + /** * Sets the text color of the component to one of CoreUI’s themed colors. + * via TextColorDirective * @type TextColors */ - @Input() textColor?: string; + @Input() textColor?: TextColors; - constructor() {} + /** + * Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility. + * via TextBgColorDirective + * @type Colors + * @since 5.0.0 + */ + @Input() textBgColor?: Colors; @HostBinding('class') get hostClasses(): any { @@ -48,7 +61,6 @@ export class BadgeComponent { return Object.assign({ badge: true, [`bg-${this.color}`]: !!this.color, - [`text-${this.textColor}`]: !!this.textColor, [`badge-${this.size}`]: !!this.size, [`${this.shape}`]: !!this.shape }, !!this.position ? positionClasses : {} diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts index 4f8492e0..03ba3cac 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.ts @@ -1,4 +1,4 @@ -import { Component, HostBinding, Input } from '@angular/core'; +import { booleanAttribute, Component, HostBinding, Input } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { RouterModule } from '@angular/router'; @@ -18,7 +18,7 @@ export class BreadcrumbItemComponent { * Toggle the active state for the component. [docs] * @type boolean */ - @Input() active?: boolean; + @Input({ transform: booleanAttribute }) active?: boolean; /** * The `url` prop for the inner `[routerLink]` directive. [docs] * @type string diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts index 44ea11d3..420d6982 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.ts @@ -11,15 +11,10 @@ import { IBreadcrumbItem } from '../breadcrumb-item/breadcrumb-item'; export class BreadcrumbRouterService { public outlet = 'primary'; - breadcrumbs$: Observable; - private breadcrumbsBehaviorSubject: BehaviorSubject; + readonly #breadcrumbsBehaviorSubject: BehaviorSubject = new BehaviorSubject(new Array()); + readonly breadcrumbs$: Observable = this.#breadcrumbsBehaviorSubject.asObservable(); constructor(private router: Router, private route: ActivatedRoute) { - this.breadcrumbsBehaviorSubject = new BehaviorSubject( - new Array() - ); - - this.breadcrumbs$ = this.breadcrumbsBehaviorSubject.asObservable(); this.router.events .pipe( @@ -39,7 +34,7 @@ export class BreadcrumbRouterService { const routeSnapshot = childRoute.snapshot; url += '/' + routeSnapshot.url.map((segment) => segment.path).join('/'); breadcrumbs.push({ - label: childRoute.snapshot.data['title'] || '', + label: routeSnapshot.data['title'] ?? routeSnapshot.title ?? '', url, queryParams: routeSnapshot.queryParams }); @@ -48,9 +43,8 @@ export class BreadcrumbRouterService { }); } while (currentRoute); - this.breadcrumbsBehaviorSubject.next(Object.assign([], breadcrumbs)); + this.#breadcrumbsBehaviorSubject.next(Object.assign([], breadcrumbs)); - // console.log('breadcrumbs', breadcrumbs); return breadcrumbs; }); } diff --git a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts index eeb6bbd9..ee6b5161 100644 --- a/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts +++ b/projects/coreui-angular/src/lib/breadcrumb/breadcrumb/breadcrumb.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-breadcrumb', - template: '', + template: '', standalone: true }) export class BreadcrumbComponent { @@ -26,9 +26,6 @@ export class BreadcrumbComponent { get hostClasses() { return { breadcrumb: true - } + }; } - - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts index ef3dfa6a..567bb72d 100644 --- a/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts +++ b/projects/coreui-angular/src/lib/button-group/button-group/button-group.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-button-group', - template: ``, + template: '', standalone: true }) export class ButtonGroupComponent { @@ -30,11 +30,8 @@ export class ButtonGroupComponent { return { 'btn-group': !this.vertical, 'btn-group-vertical': this.vertical, - [`btn-group-${this.size}`]: !!this.size, + [`btn-group-${this.size}`]: !!this.size }; } - - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts index b20d2d39..3f287b37 100644 --- a/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts +++ b/projects/coreui-angular/src/lib/button-group/button-toolbar/button-toolbar.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-button-toolbar', - template: ``, + template: '', standalone: true }) export class ButtonToolbarComponent { @@ -17,10 +17,7 @@ export class ButtonToolbarComponent { @HostBinding('class') get hostClasses(): any { return { - 'btn-toolbar': true, + 'btn-toolbar': true }; } - - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/button/button-close.directive.ts b/projects/coreui-angular/src/lib/button/button-close.directive.ts index fcd4d9a4..41c8f4ec 100644 --- a/projects/coreui-angular/src/lib/button/button-close.directive.ts +++ b/projects/coreui-angular/src/lib/button/button-close.directive.ts @@ -1,15 +1,20 @@ import { booleanAttribute, Directive, HostBinding, Input } from '@angular/core'; +import { ThemeDirective } from '../shared/theme.directive'; import { ButtonDirective } from './button.directive'; @Directive({ selector: '[cButtonClose]', - standalone: true + standalone: true, + hostDirectives: [ + { directive: ThemeDirective, inputs: ['dark'] } + ] }) export class ButtonCloseDirective extends ButtonDirective { /** * Change the default color to white. * @type boolean + * @deprecated 5.0.0. Use `cButtonClose.dark` instead. */ @Input({ transform: booleanAttribute }) white: string | boolean = false; diff --git a/projects/coreui-angular/src/lib/callout/callout.component.ts b/projects/coreui-angular/src/lib/callout/callout.component.ts index d11cfa67..3e76488d 100644 --- a/projects/coreui-angular/src/lib/callout/callout.component.ts +++ b/projects/coreui-angular/src/lib/callout/callout.component.ts @@ -3,7 +3,7 @@ import { Colors } from '../coreui.types'; @Component({ selector: 'c-callout, [cCallout]', - template: ``, + template: '', styleUrls: ['./callout.component.scss'], standalone: true }) @@ -17,13 +17,10 @@ export class CalloutComponent { @HostBinding('class') get hostClasses(): any { - return { callout: true, [`callout-${this.color}`]: !!this.color }; } - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/card/card-body.component.ts b/projects/coreui-angular/src/lib/card/card-body.component.ts index 66b985e0..0c172774 100644 --- a/projects/coreui-angular/src/lib/card/card-body.component.ts +++ b/projects/coreui-angular/src/lib/card/card-body.component.ts @@ -2,7 +2,7 @@ import {Component, HostBinding} from '@angular/core'; @Component({ selector: 'c-card-body, [c-card-body]', - template: '', + template: '', standalone: true }) export class CardBodyComponent { diff --git a/projects/coreui-angular/src/lib/card/card-footer.component.ts b/projects/coreui-angular/src/lib/card/card-footer.component.ts index 2449ce1f..5febb400 100644 --- a/projects/coreui-angular/src/lib/card/card-footer.component.ts +++ b/projects/coreui-angular/src/lib/card/card-footer.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-card-footer, [c-card-footer]', - template: '', + template: '', standalone: true }) export class CardFooterComponent { diff --git a/projects/coreui-angular/src/lib/card/card-group.component.ts b/projects/coreui-angular/src/lib/card/card-group.component.ts index 87a98254..69cf8c02 100644 --- a/projects/coreui-angular/src/lib/card/card-group.component.ts +++ b/projects/coreui-angular/src/lib/card/card-group.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-card-group, [c-card-group]', - template: '', + template: '', standalone: true }) export class CardGroupComponent { diff --git a/projects/coreui-angular/src/lib/card/card-header-actions.component.ts b/projects/coreui-angular/src/lib/card/card-header-actions.component.ts index caaaaeec..b4d5b71b 100644 --- a/projects/coreui-angular/src/lib/card/card-header-actions.component.ts +++ b/projects/coreui-angular/src/lib/card/card-header-actions.component.ts @@ -2,7 +2,7 @@ import {Component, HostBinding} from '@angular/core'; @Component({ selector: 'c-card-header-actions, [c-card-header-actions]', - template: '', + template: '', standalone: true }) export class CardHeaderActionsComponent { diff --git a/projects/coreui-angular/src/lib/card/card-header.component.ts b/projects/coreui-angular/src/lib/card/card-header.component.ts index 49b827f1..e4343bc0 100644 --- a/projects/coreui-angular/src/lib/card/card-header.component.ts +++ b/projects/coreui-angular/src/lib/card/card-header.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-card-header, [c-card-header]', - template: '', + template: '', standalone: true }) export class CardHeaderComponent { diff --git a/projects/coreui-angular/src/lib/card/card-img-overlay/card-img-overlay.component.ts b/projects/coreui-angular/src/lib/card/card-img-overlay/card-img-overlay.component.ts index 3237c3f5..37fb17a8 100644 --- a/projects/coreui-angular/src/lib/card/card-img-overlay/card-img-overlay.component.ts +++ b/projects/coreui-angular/src/lib/card/card-img-overlay/card-img-overlay.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-card-img-overlay', - template: ``, + template: '', styleUrls: ['./card-img-overlay.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/card/card.component.ts b/projects/coreui-angular/src/lib/card/card.component.ts index 4eb900b3..e6e10716 100644 --- a/projects/coreui-angular/src/lib/card/card.component.ts +++ b/projects/coreui-angular/src/lib/card/card.component.ts @@ -1,10 +1,15 @@ import { Component, HostBinding, Input } from '@angular/core'; import { Colors, TextColors } from '../coreui.types'; +import { TextBgColorDirective, TextColorDirective } from '../utilities'; @Component({ selector: 'c-card, [c-card]', - template: ``, - standalone: true + template: '', + standalone: true, + hostDirectives: [ + { directive: TextColorDirective, inputs: ['cTextColor: textColor'] }, + { directive: TextBgColorDirective, inputs: ['cTextBgColor: textBgColor'] } + ] }) export class CardComponent { @@ -13,21 +18,27 @@ export class CardComponent { * @type Colors */ @Input() color?: Colors; + /** * Sets the text color context of the component to one of CoreUI’s themed colors. + * via TextColorDirective * @type TextColors */ @Input() textColor?: TextColors; + /** + * Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility. + * via TextBgColorDirective + * @type Colors + * @since 5.0.0 + */ + @Input() textBgColor?: Colors; + @HostBinding('class') get hostClasses(): any { return { card: true, - [`bg-${this.color}`]: !!this.color, - [`text-${this.textColor}`]: !!this.textColor, + [`bg-${this.color}`]: !!this.color }; } - - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-caption/carousel-caption.component.ts b/projects/coreui-angular/src/lib/carousel/carousel-caption/carousel-caption.component.ts index 66e83d58..c24f4999 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-caption/carousel-caption.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-caption/carousel-caption.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-carousel-caption', - template: ``, + template: '', styleUrls: ['./carousel-caption.component.scss'], standalone: true }) @@ -10,6 +10,4 @@ export class CarouselCaptionComponent { @HostBinding('class.carousel-caption') carouselCaptionClass = true; - constructor() { } - } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.html b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.html index 45aa2d98..8c7c8c56 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.html +++ b/projects/coreui-angular/src/lib/carousel/carousel-indicators/carousel-indicators.component.html @@ -5,7 +5,7 @@ type="button" (click)="onClick(i)" [class]="{ active: active === i }" - [attr.aria-current]="active === i" - > + [attr.aria-current]="active === i"> + } diff --git a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html index 7ded7181..cb03d32e 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html +++ b/projects/coreui-angular/src/lib/carousel/carousel-inner/carousel-inner.component.html @@ -1,7 +1,7 @@
- +
- + diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html index bd1063ba..50df8e42 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.html @@ -1,4 +1,3 @@ @if (active) { } - diff --git a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts index bf29221c..44b1499e 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel-item/carousel-item.component.ts @@ -1,5 +1,12 @@ -import { AfterViewInit, ChangeDetectorRef, Component, HostBinding, Input, OnDestroy } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + AfterViewInit, + booleanAttribute, + ChangeDetectorRef, + Component, + HostBinding, + Input, + OnDestroy +} from '@angular/core'; import { Subscription } from 'rxjs'; import { CarouselService } from '../carousel.service'; @@ -12,17 +19,15 @@ import { CarouselService } from '../carousel.service'; }) export class CarouselItemComponent implements OnDestroy, AfterViewInit { - static ngAcceptInputType_active: BooleanInput; - index?: number; private carouselIndexSubscription?: Subscription; /** * @ignore */ - @Input() + @Input({ transform: booleanAttribute }) set active(value) { - this._active = coerceBooleanProperty(value); + this._active = value; this.changeDetectorRef.markForCheck(); } diff --git a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts index 94bf252f..e5160bf7 100644 --- a/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts +++ b/projects/coreui-angular/src/lib/carousel/carousel/carousel.component.ts @@ -19,19 +19,34 @@ import { filter, finalize, withLatestFrom, zipWith } from 'rxjs/operators'; import { IntersectionService } from '../../services'; import { IListenersConfig, ListenersService } from '../../services'; +import { Triggers } from '../../coreui.types'; +import { ThemeDirective } from '../../shared/theme.directive'; import { CarouselState } from '../carousel-state'; import { CarouselService } from '../carousel.service'; import { CarouselConfig } from '../carousel.config'; -import { Triggers } from '../../coreui.types'; @Component({ selector: 'c-carousel', - template: '', + template: '', styleUrls: ['./carousel.component.scss'], providers: [CarouselService, CarouselState, CarouselConfig, ListenersService], - standalone: true + standalone: true, + hostDirectives: [ + { directive: ThemeDirective, inputs: ['dark'] } + ] }) export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { + constructor( + @Inject(CarouselConfig) private config: CarouselConfig, + private hostElement: ElementRef, + private carouselService: CarouselService, + private carouselState: CarouselState, + private intersectionService: IntersectionService, + private listenersService: ListenersService + ) { + Object.assign(this, config); + } + /** * Index of the active item. * @type number @@ -42,11 +57,6 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { * @type boolean */ @Input() animate: boolean = true; - /** - * Add darker controls, indicators, and captions. - * @type boolean - */ - @Input() dark?: boolean; /** * Carousel direction. [docs] * @type {'next' | 'prev'} @@ -92,7 +102,6 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { return { carousel: true, slide: true, - 'carousel-dark': !!this.dark, 'carousel-fade': this.transition === 'crossfade' }; } @@ -102,17 +111,6 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { private swipeSubscription?: Subscription; readonly #destroyRef = inject(DestroyRef); - constructor( - @Inject(CarouselConfig) private config: CarouselConfig, - private hostElement: ElementRef, - private carouselService: CarouselService, - private carouselState: CarouselState, - private intersectionService: IntersectionService, - private listenersService: ListenersService - ) { - Object.assign(this, config); - } - ngOnInit(): void { this.carouselStateSubscribe(); } @@ -190,6 +188,7 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { } private intersectionServiceSubscribe(): void { + this.intersectionService.createIntersectionObserver(this.hostElement); this.intersectionService.intersecting$ .pipe( filter(next => next.hostElement === this.hostElement), @@ -202,7 +201,6 @@ export class CarouselComponent implements OnInit, OnDestroy, AfterContentInit { this.visible = next.isIntersecting; next.isIntersecting ? this.setTimer() : this.resetTimer(); }); - this.intersectionService.createIntersectionObserver(this.hostElement); } private swipeSubscribe(subscribe: boolean = true): void { diff --git a/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts b/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts index cc45eeeb..6ade22ce 100644 --- a/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts +++ b/projects/coreui-angular/src/lib/collapse/collapse.directive.spec.ts @@ -8,7 +8,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; class MockElementRef extends ElementRef {} @Component({ - template: `
` + template: '
' }) class TestComponent {} diff --git a/projects/coreui-angular/src/lib/collapse/collapse.directive.ts b/projects/coreui-angular/src/lib/collapse/collapse.directive.ts index 54ec3c74..876ecd4f 100644 --- a/projects/coreui-angular/src/lib/collapse/collapse.directive.ts +++ b/projects/coreui-angular/src/lib/collapse/collapse.directive.ts @@ -1,5 +1,6 @@ import { AfterViewInit, + booleanAttribute, Directive, DoCheck, ElementRef, @@ -14,8 +15,6 @@ import { } from '@angular/core'; import { AnimationBuilder, AnimationPlayer, useAnimation } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; - import { collapseAnimation, collapseHorizontalAnimation, @@ -32,65 +31,40 @@ import { }) export class CollapseDirective implements OnChanges, OnDestroy, DoCheck, AfterViewInit { - static ngAcceptInputType_horizontal: BooleanInput; - static ngAcceptInputType_navbar: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - /** * @ignore */ - @Input() - set animate(value: boolean) { - this._animate = value; - } - - get animate(): boolean { - return this._animate; - } - - private _animate = true; + @Input({ transform: booleanAttribute }) animate: boolean = true; /** * Set horizontal collapsing to transition the width instead of height. + * @type boolean + * @default false */ - @Input() - set horizontal(value: boolean) { - this._horizontal = coerceBooleanProperty(value); - } - - get horizontal(): boolean { - return this._horizontal; - } - - private _horizontal: boolean = false; + @Input({ transform: booleanAttribute }) horizontal: boolean = false; /** * Toggle the visibility of collapsible element. + * @type boolean + * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set visible(value) { - this._visible = coerceBooleanProperty(value); + this._visible = value; } get visible(): boolean { return this._visible; } - private _visible = false; + private _visible: boolean = false; /** * Add `navbar` prop for grouping and hiding navbar contents by a parent breakpoint. + * @type boolean + * @default false */ - @Input() - set navbar(value: boolean) { - this._navbar = coerceBooleanProperty(value); - }; - - get navbar() { - return this._navbar; - } - - private _navbar = false; + @Input({ transform: booleanAttribute }) navbar: boolean = false; /** * @ignore diff --git a/projects/coreui-angular/src/lib/coreui.types.ts b/projects/coreui-angular/src/lib/coreui.types.ts index af22f41a..71b37fb8 100644 --- a/projects/coreui-angular/src/lib/coreui.types.ts +++ b/projects/coreui-angular/src/lib/coreui.types.ts @@ -1,5 +1,7 @@ import { IsActiveMatchOptions } from '@angular/router'; +export type NgCssClass = string | string[] | Set | { [klass: string]: any }; + export enum BreakpointInfix { xs = 'xs', sm = 'sm', @@ -24,10 +26,19 @@ export type Colors = | 'info' | 'dark' | 'light' + | 'primary-gradient' + | 'secondary-gradient' + | 'success-gradient' + | 'danger-gradient' + | 'warning-gradient' + | 'info-gradient' + | 'dark-gradient' + | 'light-gradient' | string; -export type ColorsGradient = - | `${Colors}-gradient`; +// export type ColorsGradient = +// | Colors +// | `${Colors}-gradient`; export type BackgroundColors = Colors | 'body' | 'white' | 'transparent'; @@ -35,17 +46,22 @@ export type Directions = 'down' | 'up' | 'start' | 'end' | ''; export type TextColors = | Colors + | 'primary-emphasis' + | 'secondary-emphasis' + | 'success-emphasis' + | 'danger-emphasis' + | 'warning-emphasis' + | 'info-emphasis' + | 'light-emphasis' | 'body' - | 'white' - | 'muted' + | 'body-emphasis' + | 'body-secondary' + | 'body-tertiary' + | 'black' | 'black-50' + | 'white' | 'white-50' - | 'high-emphasis' - | 'medium-emphasis' - | 'disabled' - | 'high-emphasis-inverse' - | 'medium-emphasis-inverse' - | 'disabled-inverse'; + | string; export type Alignment = | 'baseline' diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts index efecbdb3..f756e760 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.spec.ts @@ -1,11 +1,23 @@ +import { ElementRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { DropdownService } from '../dropdown.service'; import { DropdownItemDirective } from './dropdown-item.directive'; +class MockElementRef extends ElementRef {} + describe('DropdownItemDirective', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [{ provide: ElementRef, useClass: MockElementRef }] + }); + }); + it('should create an instance', () => { - const dropdownService = new DropdownService(); - const directive = new DropdownItemDirective(dropdownService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const dropdownService = new DropdownService(); + const directive = new DropdownItemDirective(dropdownService); + expect(directive).toBeTruthy(); + }); }); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts index 1861605c..96c908b0 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-item/dropdown-item.directive.ts @@ -1,4 +1,5 @@ -import { Directive, HostBinding, HostListener, Input, Optional } from '@angular/core'; +import { Directive, ElementRef, HostBinding, HostListener, inject, Input, Optional } from '@angular/core'; +import { FocusableOption, FocusOrigin } from '@angular/cdk/a11y'; import { DropdownService } from '../dropdown.service'; import { DropdownComponent } from '../dropdown/dropdown.component'; @@ -7,7 +8,7 @@ import { DropdownComponent } from '../dropdown/dropdown.component'; exportAs: 'cDropdownItem', standalone: true }) -export class DropdownItemDirective { +export class DropdownItemDirective implements FocusableOption { /** * Set active state to a dropdown-item. * @type boolean @@ -27,12 +28,22 @@ export class DropdownItemDirective { */ @Input() disabled?: boolean; + #elementRef: ElementRef = inject(ElementRef); + constructor( private dropdownService: DropdownService, @Optional() public dropdown?: DropdownComponent ) { } + focus(origin?: FocusOrigin | undefined): void { + this.#elementRef?.nativeElement?.focus(); + } + + getLabel?(): string { + return this.#elementRef?.nativeElement?.textContent.trim(); + } + @HostBinding('attr.aria-current') get ariaCurrent(): string | null { return this.active ? 'true' : null; @@ -52,9 +63,11 @@ export class DropdownItemDirective { set tabIndex(value: string | number | null) { this._tabIndex = value; } + get tabIndex() { return this.disabled ? '-1' : this._tabIndex; } + private _tabIndex: string | number | null = null; @HostBinding('attr.aria-disabled') diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts index d89e9253..3d9a84af 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.spec.ts @@ -1,12 +1,23 @@ -import { ElementRef } from '@angular/core'; +import { ElementRef, Renderer2 } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { DropdownService } from '../dropdown.service'; import { DropdownMenuDirective } from './dropdown-menu.directive'; +class MockElementRef extends ElementRef {} + describe('DropdownMenuDirective', () => { - let elementRef: ElementRef; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2, DropdownService] + }); + }); + it('should create an instance', () => { - const dropdownService = new DropdownService(); - const directive = new DropdownMenuDirective(elementRef, dropdownService); - expect(directive).toBeTruthy(); + TestBed.runInInjectionContext(() => { + const directive = new DropdownMenuDirective(); + expect(directive).toBeTruthy(); + }); + }); }); diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts index 99103ed1..3014add7 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown-menu/dropdown-menu.directive.ts @@ -1,18 +1,37 @@ -import { booleanAttribute, Directive, ElementRef, HostBinding, Input, OnDestroy, OnInit } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { + AfterContentInit, + ContentChildren, + DestroyRef, + Directive, + ElementRef, + forwardRef, + HostBinding, + HostListener, + inject, + Input, + OnInit, + QueryList +} from '@angular/core'; +import { FocusKeyManager } from '@angular/cdk/a11y'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { tap } from 'rxjs/operators'; + +import { ThemeDirective } from '../../shared/theme.directive'; import { DropdownService } from '../dropdown.service'; +import { DropdownItemDirective } from '../dropdown-item/dropdown-item.directive'; @Directive({ selector: '[cDropdownMenu]', exportAs: 'cDropdownMenu', - standalone: true + standalone: true, + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }] }) -export class DropdownMenuDirective implements OnInit, OnDestroy { +export class DropdownMenuDirective implements OnInit, AfterContentInit { - constructor( - public elementRef: ElementRef, - private dropdownService: DropdownService - ) {} + readonly #destroyRef: DestroyRef = inject(DestroyRef); + public readonly elementRef: ElementRef = inject(ElementRef); + readonly #dropdownService: DropdownService = inject(DropdownService); + #focusKeyManager!: FocusKeyManager; /** * Set alignment of dropdown menu. @@ -22,55 +41,81 @@ export class DropdownMenuDirective implements OnInit, OnDestroy { /** * Toggle the visibility of dropdown menu component. - */ - @Input() visible = false; - - /** - * Sets a darker color scheme to match a dark navbar. * @type boolean */ - @Input({ transform: booleanAttribute }) dark: string | boolean = false; - - private dropdownStateSubscription!: Subscription; + @Input() visible: boolean = false; - @HostBinding('class') - get hostClasses(): any { + @HostBinding('class') get hostClasses(): any { return { - 'dropdown-menu': true, - 'dropdown-menu-dark': this.dark, - [`dropdown-menu-${this.alignment}`]: !!this.alignment, - show: this.visible + 'dropdown-menu': true, [`dropdown-menu-${this.alignment}`]: !!this.alignment, show: this.visible }; } - @HostBinding('style') - get hostStyles() { + @HostBinding('style') get hostStyles() { // workaround for popper position calculate (see also: dropdown.component) return { - visibility: this.visible ? null : '', - display: this.visible ? null : '' + visibility: this.visible ? null : '', display: this.visible ? null : '' }; } - ngOnInit(): void { - this.dropdownStateSubscribe(); + @HostListener('keydown', ['$event']) onKeyDown($event: KeyboardEvent): void { + if (!this.visible) { + return; + } + if (['Space', 'ArrowDown'].includes($event.code)) { + $event.preventDefault(); + } + this.#focusKeyManager.onKeydown($event); } - ngOnDestroy(): void { - this.dropdownStateSubscribe(false); + @HostListener('keyup', ['$event']) onKeyUp($event: KeyboardEvent): void { + if (!this.visible) { + return; + } + if (['Tab'].includes($event.key)) { + if (this.#focusKeyManager.activeItem) { + $event.shiftKey ? this.#focusKeyManager.setPreviousItemActive() : this.#focusKeyManager.setNextItemActive(); + } else { + this.#focusKeyManager.setFirstItemActive(); + } + } } - private dropdownStateSubscribe(subscribe: boolean = true): void { - if (subscribe) { - this.dropdownStateSubscription = - this.dropdownService.dropdownState$.subscribe((state) => { + @ContentChildren(forwardRef(() => DropdownItemDirective), { descendants: true }) dropdownItemsContent!: QueryList; + + ngAfterContentInit(): void { + this.focusKeyManagerInit(); + + this.dropdownItemsContent.changes + .pipe( + tap((change) => { + this.focusKeyManagerInit(); + }), + takeUntilDestroyed(this.#destroyRef) + ).subscribe(); + } + + ngOnInit(): void { + this.#dropdownService.dropdownState$ + .pipe( + tap((state) => { if ('visible' in state) { - this.visible = - state.visible === 'toggle' ? !this.visible : state.visible; + this.visible = state.visible === 'toggle' ? !this.visible : state.visible; + if (!this.visible) { + this.#focusKeyManager?.setActiveItem(-1); + } } - }); - } else { - this.dropdownStateSubscription?.unsubscribe(); - } + }), + takeUntilDestroyed(this.#destroyRef) + ).subscribe(); + } + + private focusKeyManagerInit(): void { + this.#focusKeyManager = new FocusKeyManager(this.dropdownItemsContent) + .withHomeAndEnd() + .withPageUpDown() + .withWrap() + .skipPredicate((dropdownItem) => (dropdownItem.disabled === true)); } + } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts b/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts index 828c38e9..3378607a 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown.service.ts @@ -12,9 +12,6 @@ export class DropdownService { private dropdownState = new BehaviorSubject({}); dropdownState$ = this.dropdownState.asObservable(); - constructor() { - } - toggle(state: IDropdownState): void { this.dropdownState.next(state); } diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss index 5b79151c..a6336a24 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss +++ b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.scss @@ -2,7 +2,6 @@ :host-context(.dropdown, .dropup):not(.btn-group) { display: block; - min-width: fit-content; } :host-context(.dropstart, .dropend):not(.btn-group) { diff --git a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts index 1f04c76a..3967ff9a 100644 --- a/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts +++ b/projects/coreui-angular/src/lib/dropdown/dropdown/dropdown.component.ts @@ -1,6 +1,7 @@ import { AfterContentInit, AfterViewInit, + booleanAttribute, ChangeDetectorRef, Component, ContentChild, @@ -22,12 +23,12 @@ import { SimpleChanges } from '@angular/core'; import { DOCUMENT } from '@angular/common'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; import { createPopper, Instance, Options, Placement } from '@popperjs/core'; +import { ThemeDirective } from '../../shared'; import { DropdownMenuDirective } from '../dropdown-menu/dropdown-menu.directive'; import { DropdownService } from '../dropdown.service'; @@ -42,9 +43,6 @@ export abstract class DropdownToken {} }) export class DropdownToggleDirective implements AfterViewInit { - static ngAcceptInputType_split: BooleanInput; - static ngAcceptInputType_popper: BooleanInput; - constructor( public elementRef: ElementRef, private dropdownService: DropdownService, @@ -63,7 +61,7 @@ export class DropdownToggleDirective implements AfterViewInit { * @type boolean * @default false */ - @Input() disabled?: boolean = false; + @Input({ transform: booleanAttribute }) disabled: boolean = false; /** * Enables pseudo element caret on toggler. @@ -74,17 +72,9 @@ export class DropdownToggleDirective implements AfterViewInit { /** * Create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` class for proper spacing around the dropdown caret. * @type boolean + * @default false */ - @Input() - set split(value: boolean) { - this._split = coerceBooleanProperty(value); - } - - get split(): boolean { - return this._split; - } - - private _split = false; + @Input({ transform: booleanAttribute }) split: boolean = false; @HostBinding('class') get hostClasses(): any { @@ -111,17 +101,15 @@ export class DropdownToggleDirective implements AfterViewInit { @Component({ selector: 'c-dropdown', - template: '', + template: '', styleUrls: ['./dropdown.component.scss'], exportAs: 'cDropdown', providers: [DropdownService], - standalone: true + standalone: true, + hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }] }) export class DropdownComponent implements AfterContentInit, OnChanges, OnDestroy, OnInit { - static ngAcceptInputType_dark: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - constructor( @Inject(DOCUMENT) private document: Document, private elementRef: ElementRef, @@ -141,22 +129,6 @@ export class DropdownComponent implements AfterContentInit, OnChanges, OnDestroy @Input() autoClose: boolean | 'inside' | 'outside' = true; - /** - * Sets a darker color scheme to match a dark navbar. - * @type boolean - * @default false - */ - @Input() - set dark(value: boolean) { - this._dark = coerceBooleanProperty(value); - }; - - get dark() { - return this._dark; - } - - private _dark = false; - /** * Sets a specified direction and location of the dropdown menu. * @type 'dropup' | 'dropend' | 'dropstart' @@ -174,16 +146,7 @@ export class DropdownComponent implements AfterContentInit, OnChanges, OnDestroy * @type boolean * @default true */ - @Input() - set popper(value: boolean) { - this._popper = coerceBooleanProperty(value); - } - - get popper(): boolean { - return this._popper; - } - - private _popper = true; + @Input({ transform: booleanAttribute }) popper: boolean = true; /** * Optional popper Options object, placement prop takes precedence over @@ -241,9 +204,9 @@ export class DropdownComponent implements AfterContentInit, OnChanges, OnDestroy * @type boolean * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set visible(value: boolean) { - const _value = coerceBooleanProperty(value); + const _value = value; if (_value !== this._visible) { this.activeTrap = _value; this._visible = _value; diff --git a/projects/coreui-angular/src/lib/footer/footer.component.ts b/projects/coreui-angular/src/lib/footer/footer.component.ts index 655c65f4..13c61fad 100644 --- a/projects/coreui-angular/src/lib/footer/footer.component.ts +++ b/projects/coreui-angular/src/lib/footer/footer.component.ts @@ -4,7 +4,7 @@ import { Positions } from '../coreui.types'; @Component({ selector: 'c-footer, [cFooter]', - template: ``, + template: '', standalone: true }) export class FooterComponent { @@ -25,7 +25,7 @@ export class FooterComponent { get getClasses(): any { return { footer: true, - [`footer-${this.position}`]: !!this.position, + [`footer-${this.position}`]: !!this.position }; } } diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts index d22c2a31..6bec2c96 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.spec.ts @@ -4,7 +4,7 @@ import { By } from '@angular/platform-browser'; import { FormCheckInputDirective } from './form-check-input.directive'; @Component({ - template: `` + template: '' }) class TestComponent {} diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts index da96032c..2f4bc2f8 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check-input.directive.ts @@ -1,5 +1,4 @@ -import { Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; @Directive({ selector: 'input[cFormCheckInput]', @@ -7,9 +6,6 @@ import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; }) export class FormCheckInputDirective { - static ngAcceptInputType_checked: BooleanInput; - static ngAcceptInputType_indeterminate: BooleanInput; - /** * Specifies the type of component. * @type {'checkbox' | 'radio'} @@ -21,10 +17,11 @@ export class FormCheckInputDirective { /** * Set component indeterminate state. * @type boolean + * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set indeterminate(value: boolean) { - const indeterminate = coerceBooleanProperty(value); + const indeterminate = value; if (this._indeterminate !== indeterminate) { this._indeterminate = indeterminate; const htmlInputElement = this.hostElement.nativeElement as HTMLInputElement; @@ -44,6 +41,7 @@ export class FormCheckInputDirective { /** * Set component validation state to valid. * @type boolean + * @default undefined */ @Input() valid?: boolean; @@ -56,9 +54,9 @@ export class FormCheckInputDirective { }; } - @Input() + @Input({ transform: booleanAttribute }) set checked(value: boolean) { - const checked = coerceBooleanProperty(value); + const checked = value; const htmlInputElement = this.hostElement?.nativeElement as HTMLInputElement; if (htmlInputElement) { this.renderer.setProperty(htmlInputElement, 'checked', checked); diff --git a/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts b/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts index 1aa5ff63..3616582a 100644 --- a/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts +++ b/projects/coreui-angular/src/lib/form/form-check/form-check.component.ts @@ -4,7 +4,7 @@ import { FormCheckLabelDirective } from './form-check-label.directive'; @Component({ selector: 'c-form-check', - template: '', + template: '', exportAs: 'cFormCheck', standalone: true }) diff --git a/projects/coreui-angular/src/lib/form/form-feedback/form-feedback.component.ts b/projects/coreui-angular/src/lib/form/form-feedback/form-feedback.component.ts index b26bd0bf..066358b3 100644 --- a/projects/coreui-angular/src/lib/form/form-feedback/form-feedback.component.ts +++ b/projects/coreui-angular/src/lib/form/form-feedback/form-feedback.component.ts @@ -2,7 +2,7 @@ import { booleanAttribute, Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-form-feedback', - template: '', + template: '', standalone: true }) export class FormFeedbackComponent { diff --git a/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts b/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts index 968e1024..019675c8 100644 --- a/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts +++ b/projects/coreui-angular/src/lib/form/input-group/input-group.component.ts @@ -1,12 +1,8 @@ -import { - Component, - HostBinding, - Input, -} from '@angular/core'; +import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-input-group', - template: ``, + template: '', standalone: true }) export class InputGroupComponent { @@ -19,10 +15,8 @@ export class InputGroupComponent { get hostClasses(): any { return { 'input-group': true, - [`input-group-${this.sizing}`]: !!this.sizing, + [`input-group-${this.sizing}`]: !!this.sizing }; } - constructor() {} - } diff --git a/projects/coreui-angular/src/lib/grid/col.component.ts b/projects/coreui-angular/src/lib/grid/col.component.ts index ff96c0dc..db790d75 100644 --- a/projects/coreui-angular/src/lib/grid/col.component.ts +++ b/projects/coreui-angular/src/lib/grid/col.component.ts @@ -4,7 +4,7 @@ import { ColDirective } from './col.directive'; @Component({ selector: 'c-col', - template: '', + template: '', styleUrls: ['./col.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/grid/container.component.ts b/projects/coreui-angular/src/lib/grid/container.component.ts index 1d9e02aa..8f7e3b64 100644 --- a/projects/coreui-angular/src/lib/grid/container.component.ts +++ b/projects/coreui-angular/src/lib/grid/container.component.ts @@ -5,7 +5,7 @@ import { Breakpoints } from '../coreui.types'; @Component({ selector: 'c-container, [cContainer]', - template: '', + template: '', styleUrls: ['./container.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/grid/row.component.ts b/projects/coreui-angular/src/lib/grid/row.component.ts index 3f450640..aa3f805d 100644 --- a/projects/coreui-angular/src/lib/grid/row.component.ts +++ b/projects/coreui-angular/src/lib/grid/row.component.ts @@ -4,7 +4,7 @@ import { RowDirective } from './row.directive'; @Component({ selector: 'c-row', - template: '', + template: '', standalone: true }) export class RowComponent extends RowDirective {} diff --git a/projects/coreui-angular/src/lib/grid/row.directive.ts b/projects/coreui-angular/src/lib/grid/row.directive.ts index 93eff879..d0fffaf4 100644 --- a/projects/coreui-angular/src/lib/grid/row.directive.ts +++ b/projects/coreui-angular/src/lib/grid/row.directive.ts @@ -46,15 +46,15 @@ export class RowDirective implements IRow { const classes: any = { row: true, - [`row-cols-${cols}`]: !!cols, + [`row-cols-${cols}`]: !!cols }; Object.keys(BreakpointInfix).forEach(breakpoint => { // @ts-ignore const value: any = this[breakpoint]; if ((typeof value === 'number') || (typeof value === 'string')) { - const infix: string = breakpoint === 'xs' ? '' : breakpoint; - classes[`row-cols-${infix}-${value}`] = !!value; + const infix: string = breakpoint === 'xs' ? '' : `-${breakpoint}`; + classes[`row-cols${infix}-${value}`] = !!value; } }); diff --git a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts index f50978f5..83f93d7f 100644 --- a/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts +++ b/projects/coreui-angular/src/lib/header/header-brand/header-brand.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-header-brand', - template: ``, + template: '', standalone: true }) export class HeaderBrandComponent { diff --git a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts index bbd60bd6..a407283a 100644 --- a/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts +++ b/projects/coreui-angular/src/lib/header/header-nav/header-nav.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-header-nav', - template: ``, + template: '', styleUrls: ['./header-nav.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts b/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts index df064205..74f129c3 100644 --- a/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts +++ b/projects/coreui-angular/src/lib/header/header-text/header-text.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-header-text, [cHeaderText]', - template: ``, + template: '', standalone: true }) export class HeaderTextComponent { diff --git a/projects/coreui-angular/src/lib/header/header/header.component.html b/projects/coreui-angular/src/lib/header/header/header.component.html index ade67cda..6da3408f 100644 --- a/projects/coreui-angular/src/lib/header/header/header.component.html +++ b/projects/coreui-angular/src/lib/header/header/header.component.html @@ -5,5 +5,3 @@ } @else { } - - diff --git a/projects/coreui-angular/src/lib/header/header/header.component.ts b/projects/coreui-angular/src/lib/header/header/header.component.ts index 09716701..712e1874 100644 --- a/projects/coreui-angular/src/lib/header/header/header.component.ts +++ b/projects/coreui-angular/src/lib/header/header/header.component.ts @@ -12,6 +12,7 @@ type Container = boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'fluid'; imports: [NgClass] }) export class HeaderComponent { + /** * Defines optional container wrapping children elements. */ diff --git a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts index 85a7df15..eeea917a 100644 --- a/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts +++ b/projects/coreui-angular/src/lib/list-group/list-group-item.directive.spec.ts @@ -6,7 +6,7 @@ import { By } from '@angular/platform-browser'; class MockElementRef extends ElementRef {} @Component({ - template: `
  • ` + template: '
  • ' }) class TestComponent {} diff --git a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts index 3ebea103..98d1adf6 100644 --- a/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-body/modal-body.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-modal-body', - template: '', + template: '', styleUrls: ['./modal-body.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts index 1a6ac176..7e170bf5 100644 --- a/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-content/modal-content.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-modal-content', - template: '', + template: '', standalone: true }) export class ModalContentComponent { diff --git a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts index 750e036e..68f8d938 100644 --- a/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-dialog/modal-dialog.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-modal-dialog', - template: '', + template: '', styleUrls: ['./modal-dialog.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts index 82cb7600..eca43fba 100644 --- a/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-footer/modal-footer.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-modal-footer', - template: '', + template: '', standalone: true }) export class ModalFooterComponent { diff --git a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts index c3e1eca0..15ff2149 100644 --- a/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal-header/modal-header.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-modal-header', - template: ``, + template: '', standalone: true }) export class ModalHeaderComponent { diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.html b/projects/coreui-angular/src/lib/modal/modal/modal.component.html index a110c003..194fe867 100644 --- a/projects/coreui-angular/src/lib/modal/modal/modal.component.html +++ b/projects/coreui-angular/src/lib/modal/modal/modal.component.html @@ -5,7 +5,7 @@ [size]="size">
    - +
    diff --git a/projects/coreui-angular/src/lib/modal/modal/modal.component.ts b/projects/coreui-angular/src/lib/modal/modal/modal.component.ts index 106bacf8..4ef8e491 100644 --- a/projects/coreui-angular/src/lib/modal/modal/modal.component.ts +++ b/projects/coreui-angular/src/lib/modal/modal/modal.component.ts @@ -89,7 +89,7 @@ export class ModalComponent implements OnInit, OnDestroy, AfterViewInit { * @type boolean * @default true */ - @Input({ transform: booleanAttribute }) keyboard = true; + @Input({ transform: booleanAttribute }) keyboard: boolean = true; @Input() id?: string; /** * Size the component small, large, or extra large. @@ -104,8 +104,7 @@ export class ModalComponent implements OnInit, OnDestroy, AfterViewInit { * @type string * @default 'dialog' */ - @Input() @HostBinding('attr.role') role = 'dialog'; - + @Input() @HostBinding('attr.role') role: string = 'dialog'; /** * Set aria-modal html attr for modal. [docs] * @type boolean diff --git a/projects/coreui-angular/src/lib/nav/nav-item.component.ts b/projects/coreui-angular/src/lib/nav/nav-item.component.ts index 20c2f5c3..7e5bb287 100644 --- a/projects/coreui-angular/src/lib/nav/nav-item.component.ts +++ b/projects/coreui-angular/src/lib/nav/nav-item.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-nav-item', - template: ``, + template: '', styleUrls: ['./nav-item.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/nav/nav.component.scss b/projects/coreui-angular/src/lib/nav/nav.component.scss index 47e7d7d1..4961e30a 100644 --- a/projects/coreui-angular/src/lib/nav/nav.component.scss +++ b/projects/coreui-angular/src/lib/nav/nav.component.scss @@ -1,3 +1,10 @@ :host .nav-link:focus { outline: 0; } + +// todo: temp fix for nav-underline-border +:host.nav-underline-border { + column-gap: 0; +} + + diff --git a/projects/coreui-angular/src/lib/nav/nav.component.ts b/projects/coreui-angular/src/lib/nav/nav.component.ts index 8b161d79..9d096dc7 100644 --- a/projects/coreui-angular/src/lib/nav/nav.component.ts +++ b/projects/coreui-angular/src/lib/nav/nav.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-nav', - template: ``, + template: '', styleUrls: ['./nav.component.scss'], standalone: true }) @@ -14,9 +14,9 @@ export class NavComponent { @Input() layout?: 'fill' | 'justified'; /** * Set the nav variant to tabs or pills. - * @type {'tabs' | 'pills' | 'underline'} + * @type 'tabs' | 'pills' | 'underline' | 'underline-border' */ - @Input() variant?: '' | 'tabs' | 'pills' ; + @Input() variant?: '' | 'tabs' | 'pills' | 'underline' | 'underline-border'; @HostBinding('class') get hostClasses(): any { diff --git a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts index dc43eb94..34a26a5e 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-nav/navbar-nav.component.ts @@ -2,7 +2,7 @@ import { booleanAttribute, Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'c-navbar-nav', - template: '', + template: '', standalone: true }) export class NavbarNavComponent { diff --git a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts index 939818dc..4fd5baa1 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar-text/navbar-text.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-navbar-text', - template: '', + template: '', standalone: true }) export class NavbarTextComponent { diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.html b/projects/coreui-angular/src/lib/navbar/navbar.component.html index 66e9e109..002456d8 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.component.html +++ b/projects/coreui-angular/src/lib/navbar/navbar.component.html @@ -1,11 +1,11 @@ - +
    - +
    - + diff --git a/projects/coreui-angular/src/lib/navbar/navbar.component.ts b/projects/coreui-angular/src/lib/navbar/navbar.component.ts index bb5a7a7e..89b26597 100644 --- a/projects/coreui-angular/src/lib/navbar/navbar.component.ts +++ b/projects/coreui-angular/src/lib/navbar/navbar.component.ts @@ -4,6 +4,7 @@ import { BreakpointObserver } from '@angular/cdk/layout'; import { CollapseDirective } from '../collapse'; import { Colors } from '../coreui.types'; +import { ThemeDirective } from '../shared'; // todo: fix container prop issue not rendering children // todo: workaround - use component directly in template @@ -12,7 +13,10 @@ import { Colors } from '../coreui.types'; selector: 'c-navbar', templateUrl: './navbar.component.html', standalone: true, - imports: [NgClass, NgTemplateOutlet] + imports: [NgClass, NgTemplateOutlet], + hostDirectives: [ + { directive: ThemeDirective, inputs: ['colorScheme'] } + ] }) export class NavbarComponent implements AfterContentInit { /** @@ -20,10 +24,6 @@ export class NavbarComponent implements AfterContentInit { * @type Colors */ @Input() color?: Colors; - /** - * Sets if the color of text should be colored for a light or dark dark background. - */ - @Input() colorScheme?: 'dark' | 'light' = 'light'; /** * Defines optional container wrapping children elements. */ @@ -52,8 +52,6 @@ export class NavbarComponent implements AfterContentInit { const expandClassSuffix: string = this.expand === true ? '' : `-${this.expand}`; return { navbar: true, - 'navbar-light': this.colorScheme === 'light', - 'navbar-dark': this.colorScheme === 'dark', [`navbar-expand${expandClassSuffix}`]: !!this.expand, [`bg-${this.color}`]: !!this.color, [`${this.placement}`]: !!this.placement diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts index 8b519d9e..3965cced 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-body/offcanvas-body.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-offcanvas-body', - template: ``, + template: '', styleUrls: ['./offcanvas-body.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts index d7ef7e18..83257bc5 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas-header/offcanvas-header.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-offcanvas-header', - template: ``, + template: '', standalone: true }) export class OffcanvasHeaderComponent { @@ -10,7 +10,7 @@ export class OffcanvasHeaderComponent { @HostBinding('class') get hostClasses(): any { return { - 'offcanvas-header': true, + 'offcanvas-header': true }; } diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html index fd9b2771..58481089 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.html @@ -1,4 +1,4 @@
    - +
    diff --git a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts index 3982d30a..404e8d1b 100644 --- a/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts +++ b/projects/coreui-angular/src/lib/offcanvas/offcanvas/offcanvas.component.ts @@ -24,6 +24,7 @@ import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; import { BackdropService } from '../../backdrop/backdrop.service'; +import { ThemeDirective } from '../../shared'; import { OffcanvasService } from '../offcanvas.service'; let nextId = 0; @@ -52,6 +53,9 @@ let nextId = 0; exportAs: 'cOffcanvas', standalone: true, imports: [A11yModule], + hostDirectives: [ + { directive: ThemeDirective, inputs: ['dark'] } + ], // eslint-disable-next-line @angular-eslint/no-host-metadata-property host: { ngSkipHydration: 'true' } }) diff --git a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts index 0e7cb472..c4496d03 100644 --- a/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts +++ b/projects/coreui-angular/src/lib/pagination/page-item/page-item.component.ts @@ -3,7 +3,7 @@ import { PageItemDirective } from './page-item.directive'; @Component({ selector: 'c-page-item', - template: ``, + template: '', styleUrls: ['./page-item.component.scss'], standalone: true }) diff --git a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html index 24e870d8..337c1837 100644 --- a/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html +++ b/projects/coreui-angular/src/lib/pagination/pagination/pagination.component.html @@ -1,3 +1,3 @@
      - +
    diff --git a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts index dc705169..740459c0 100644 --- a/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts +++ b/projects/coreui-angular/src/lib/placeholder/placeholder.directive.ts @@ -1,5 +1,4 @@ -import { Directive, HostBinding, Input } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, Directive, HostBinding, Input } from '@angular/core'; @Directive({ selector: '[cPlaceholder]', @@ -8,26 +7,15 @@ import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; }) export class PlaceholderDirective { - static ngAcceptInputType_visible: BooleanInput; - - constructor() { } - /** * placeholder toggler * @type boolean * @default false */ - @Input('cPlaceholder') - set visible(value: boolean) { - this._visible = coerceBooleanProperty(value); - } - get visible() { - return this._visible; - } - private _visible: boolean = false; + @Input({ alias: 'cPlaceholder', transform: booleanAttribute }) visible: boolean = false; /** - * Size the placeholder extra small, small, large. + * Size the placeholder xs, small, large. */ @Input('cPlaceholderSize') size?: 'xs' | 'sm' | 'lg'; diff --git a/projects/coreui-angular/src/lib/popover/popover.directive.ts b/projects/coreui-angular/src/lib/popover/popover.directive.ts index 3e4c407d..1d06f02d 100644 --- a/projects/coreui-angular/src/lib/popover/popover.directive.ts +++ b/projects/coreui-angular/src/lib/popover/popover.directive.ts @@ -92,7 +92,7 @@ export class PopoverDirective implements OnChanges, OnDestroy, OnInit, AfterView { name: 'offset', options: { - offset: [0, 8] + offset: [0, 9] } } ] diff --git a/projects/coreui-angular/src/lib/popover/popover/popover.component.html b/projects/coreui-angular/src/lib/popover/popover/popover.component.html index 8a24a3a9..a4d3f643 100644 --- a/projects/coreui-angular/src/lib/popover/popover/popover.component.html +++ b/projects/coreui-angular/src/lib/popover/popover/popover.component.html @@ -1,4 +1,4 @@
    - + diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts index d7fef619..3f7de97d 100644 --- a/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts +++ b/projects/coreui-angular/src/lib/progress/progress-bar.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; describe('ProgressBarComponent', () => { let component: ProgressBarComponent; @@ -8,18 +9,59 @@ describe('ProgressBarComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ProgressBarComponent] - }) - .compileComponents(); - })); + imports: [ProgressBarComponent, ProgressBarDirective] + }).compileComponents(); - beforeEach(() => { fixture = TestBed.createComponent(ProgressBarComponent); + component = fixture.componentInstance; + fixture.debugElement.injector.get(ProgressBarDirective).value = 42; + fixture.debugElement.injector.get(ProgressBarDirective).color = 'success'; + fixture.debugElement.injector.get(ProgressBarDirective).variant = 'striped'; + fixture.debugElement.injector.get(ProgressBarDirective).animated = true; fixture.detectChanges(); - }); + })); it('should create', () => { - expect(component).toBeTruthy(); + expect(component).toBeDefined(); + }); + + it('should have css class="progress-bar"', () => { + expect(fixture.nativeElement.classList.contains('progress-bar')).toBeTruthy(); + expect(fixture.nativeElement.classList.contains('bg-success')).toBeTruthy(); + expect(fixture.nativeElement.classList.contains('progress-bar-striped')).toBeTruthy(); + expect(fixture.nativeElement.classList.contains('progress-bar-animated')).toBeTruthy(); + }); + + it('should have style width %', () => { + expect(fixture.nativeElement.style.width).toBe('42%'); + }); + + it('should have aria-* attributes', () => { + expect(fixture.nativeElement.getAttribute('aria-valuenow')).toBe('42'); + expect(fixture.nativeElement.getAttribute('aria-valuemin')).toBe('0'); + expect(fixture.nativeElement.getAttribute('aria-valuemax')).toBe('100'); + expect(fixture.nativeElement.getAttribute('role')).toBe('progressbar'); + }); + + it('should not have aria-* attributes', () => { + fixture.debugElement.injector.get(ProgressBarDirective).value = undefined; + fixture.detectChanges(); + expect(fixture.nativeElement.getAttribute('aria-valuenow')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemin')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemax')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('role')).toBeFalsy(); + expect(fixture.nativeElement.style.width).toBeFalsy(); + }); + + it('should not have aria-* attributes', () => { + fixture.debugElement.injector.get(ProgressBarDirective).value = undefined; + fixture.debugElement.injector.get(ProgressBarDirective).width = 84; + fixture.detectChanges(); + expect(fixture.nativeElement.getAttribute('aria-valuenow')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemin')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('aria-valuemax')).toBeFalsy(); + expect(fixture.nativeElement.getAttribute('role')).toBeFalsy(); + expect(fixture.nativeElement.style.width).toBe('84%'); }); }); diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.component.ts b/projects/coreui-angular/src/lib/progress/progress-bar.component.ts index 1d4eefba..0e7820ff 100644 --- a/projects/coreui-angular/src/lib/progress/progress-bar.component.ts +++ b/projects/coreui-angular/src/lib/progress/progress-bar.component.ts @@ -1,112 +1,30 @@ -import { - booleanAttribute, - Component, - ElementRef, - HostBinding, - Input, - numberAttribute, - OnChanges, - OnInit, - Renderer2, - SimpleChanges -} from '@angular/core'; -import { Colors } from '../coreui.types'; +import { ChangeDetectionStrategy, Component, HostBinding, inject } from '@angular/core'; +import { ProgressBarDirective } from './progress-bar.directive'; @Component({ selector: 'c-progress-bar', - template: '', - standalone: true + template: '', + standalone: true, + hostDirectives: [{ + directive: ProgressBarDirective, + inputs: ['animated', 'color', 'max', 'role', 'stacked', 'value', 'variant', 'width'] + }], + changeDetection: ChangeDetectionStrategy.OnPush }) -export class ProgressBarComponent implements OnInit, OnChanges { +export class ProgressBarComponent { - /** - * Use to animate the stripes right to left via CSS3 animations. - * @type boolean - */ - @Input({ transform: booleanAttribute }) animated: string | boolean = false; - - /** - * Sets the color context of the component to one of CoreUI’s themed colors. - * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light' - */ - @Input() color?: Colors; - // TODO: check if this is necessary. - @Input({ transform: numberAttribute }) precision: string | number = 0; - /** - * The percent to progress the ProgressBar. - * @type number - */ - @Input({ transform: numberAttribute }) value: string | number = 0; - - /** - * Set the progress bar variant to optional striped. - * @values 'striped' - */ - @Input() variant?: 'striped'; - - /** - * Set default html role attribute. - * @type string - */ - @Input() - @HostBinding('attr.role') role = 'progressbar'; - private state = { - percent: 0, - min: 0, - max: 100 - }; - - constructor( - private renderer: Renderer2, - private hostElement: ElementRef - ) { } - - get min(): number { - return this.state.min; - } - - @Input() - set min(value: number) { - this.state.min = isNaN(value) ? 0 : value; - } - - get max(): number { - return this.state.max; - } - - @Input() - set max(value: number) { - this.state.max = isNaN(value) || value <= 0 || value === this.min ? 100 : value; - } + readonly #progressBarDirective: ProgressBarDirective | null = inject(ProgressBarDirective, { optional: true }); @HostBinding('class') - get hostClasses(): any { + get hostClasses(): Record { + const animated = this.#progressBarDirective?.animated; + const color = this.#progressBarDirective?.color; + const variant = this.#progressBarDirective?.variant; return { 'progress-bar': true, - 'progress-bar-animated': this.animated, - [`progress-bar-${this.variant}`]: !!this.variant, - [`bg-${this.color}`]: !!this.color + 'progress-bar-animated': !!animated, + [`progress-bar-${variant}`]: !!variant, + [`bg-${color}`]: !!color }; } - - ngOnInit(): void { - this.setValues(); - } - - setPercent(): void { - this.state.percent = +((this.value / (this.max - this.min)) * 100).toFixed(this.precision); - } - - setValues(): void { - this.setPercent(); - const host: HTMLElement = this.hostElement.nativeElement; - this.renderer.setStyle(host, 'width', `${this.state.percent}%`); - this.renderer.setAttribute(host, 'aria-valuenow', String(this.value)); - this.renderer.setAttribute(host, 'aria-valuemin', String(this.min)); - this.renderer.setAttribute(host, 'aria-valuemax', String(this.max)); - } - - public ngOnChanges(changes: SimpleChanges): void { - this.setValues(); - } } diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts b/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts new file mode 100644 index 00000000..b50ef6db --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-bar.directive.spec.ts @@ -0,0 +1,33 @@ +import { ElementRef, Renderer2 } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { ProgressBarDirective } from './progress-bar.directive'; + +class MockElementRef extends ElementRef {} + +describe('ProgressBarDirective', () => { + let directive: ProgressBarDirective; + + beforeEach(() => { + + TestBed.configureTestingModule({ + providers: [ + Renderer2, + { provide: ElementRef, useClass: MockElementRef } + ] + }); + + TestBed.runInInjectionContext(() => { + directive = new ProgressBarDirective(); + }); + }); + + it('should create an instance', () => { + expect(directive).toBeDefined(); + }); + + it('should have percent value', () => { + directive.value = 42; + expect(directive.percent()).toBe(42); + }); + +}); diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts b/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts new file mode 100644 index 00000000..50b4e23e --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-bar.directive.ts @@ -0,0 +1,122 @@ +import { + booleanAttribute, + computed, + Directive, + effect, + EffectRef, + ElementRef, + inject, + Input, + numberAttribute, + Renderer2, + signal, + WritableSignal +} from '@angular/core'; +import { Colors } from '../coreui.types'; +import { IProgressBar } from './progress.type'; + +@Directive({ + selector: '[cProgressBar]', + standalone: true +}) +export class ProgressBarDirective implements IProgressBar { + + constructor() {} + + readonly #renderer = inject(Renderer2); + readonly #hostElement = inject(ElementRef); + + readonly #max = signal(100); + readonly #min = 0; + readonly #value: WritableSignal = signal(undefined); + readonly #width: WritableSignal = signal(undefined); + + readonly percent = computed(() => { + return +((((this.#value() ?? this.#width() ?? 0) - this.#min) / (this.#max() - this.#min)) * 100).toFixed(this.precision); + }); + + readonly #valuesEffect: EffectRef = effect(() => { + const host: HTMLElement = this.#hostElement.nativeElement; + if (this.#value() === undefined || this.#width()) { + for (let name of ['aria-valuenow', 'aria-valuemax', 'aria-valuemin', 'role']) { + this.#renderer.removeAttribute(host, name); + } + } else { + this.#renderer.setAttribute(host, 'aria-valuenow', String(this.#value())); + this.#renderer.setAttribute(host, 'aria-valuemin', String(this.#min)); + this.#renderer.setAttribute(host, 'aria-valuemax', String(this.#max())); + this.#renderer.setAttribute(host, 'role', this.role); + } + const tagName = host.tagName; + if (this.percent() && ((this.stacked && tagName === 'C-PROGRESS') || (!this.stacked && tagName !== 'C-PROGRESS'))) { + this.#renderer.setStyle(host, 'width', `${this.percent()}%`); + } else { + this.#renderer.removeStyle(host, 'width'); + } + }); + + /** + * Use to animate the stripes right to left via CSS3 animations. + * @type boolean + */ + @Input({ transform: booleanAttribute }) animated?: boolean; + + /** + * Sets the color context of the component to one of CoreUI’s themed colors. + * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light' + */ + @Input() color?: Colors; + + // TODO: check if this is necessary. + @Input({ transform: numberAttribute }) precision: number = 0; + + /** + * The percent value the ProgressBar. + * @type number + * @default 0 + */ + @Input({ transform: numberAttribute }) + set value(value: number | undefined) { + this.#value.set(value); + } + + get value() { + return this.#value(); + } + + @Input({ transform: numberAttribute }) + set width(value: number | undefined) { + this.#width.set(value); + } + + /** + * Set the progress bar variant to optional striped. + * @values 'striped' + * @default undefined + */ + @Input() variant?: 'striped'; + + /** + * The max value of the ProgressBar. + * @type number + * @default 100 + */ + @Input({ transform: numberAttribute }) + set max(max: number) { + this.#max.set(isNaN(max) || max <= 0 ? 100 : max); + } + + /** + * Stacked ProgressBars. + * @type boolean + * @default false + */ + @Input({ transform: booleanAttribute }) stacked?: boolean = false; + + /** + * Set default html role attribute. + * @type string + */ + @Input() role: string = 'progressbar'; + +} diff --git a/projects/coreui-angular/src/lib/progress/progress-bar.ts b/projects/coreui-angular/src/lib/progress/progress-bar.ts deleted file mode 100644 index d5416b29..00000000 --- a/projects/coreui-angular/src/lib/progress/progress-bar.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface IStackedBar { - value: number; - color?: string; - label?: string; - animated?: boolean; - striped?: boolean; - precision?: number; - min?: number; - max?: number; -} diff --git a/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts new file mode 100644 index 00000000..6fb1ee7e --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-stacked.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProgressStackedComponent } from './progress-stacked.component'; + +describe('ProgressStackedComponent', () => { + let component: ProgressStackedComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProgressStackedComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProgressStackedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeDefined(); + expect(component.stacked).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts b/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts new file mode 100644 index 00000000..e2895cc9 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress-stacked.component.ts @@ -0,0 +1,16 @@ +import { ChangeDetectionStrategy, Component, HostBinding, Input } from '@angular/core'; +import { IProgressBarStacked } from './progress.type'; + +@Component({ + selector: 'c-progress-stacked', + standalone: true, + template: '', + styles: `:host { display: flex }`, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProgressStackedComponent implements IProgressBarStacked { + + @Input() + @HostBinding('class.progress-stacked') stacked = true; + +} diff --git a/projects/coreui-angular/src/lib/progress/progress.component.html b/projects/coreui-angular/src/lib/progress/progress.component.html new file mode 100644 index 00000000..e07f417e --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.component.html @@ -0,0 +1,16 @@ +@if (contentProgressBars.length) { + +} @else if (pbd?.stacked) { + + + +} @else { + + + +} + + + + + diff --git a/projects/coreui-angular/src/lib/progress/progress.component.scss b/projects/coreui-angular/src/lib/progress/progress.component.scss new file mode 100644 index 00000000..381bd487 --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.component.scss @@ -0,0 +1,5 @@ +:host-context(.progress-stacked) { + &.progress { + transition: var(--cui-progress-bar-transition) + } +} diff --git a/projects/coreui-angular/src/lib/progress/progress.component.spec.ts b/projects/coreui-angular/src/lib/progress/progress.component.spec.ts index 861fb081..2a4c9f2d 100644 --- a/projects/coreui-angular/src/lib/progress/progress.component.spec.ts +++ b/projects/coreui-angular/src/lib/progress/progress.component.spec.ts @@ -1,25 +1,57 @@ +import { Component, DebugNode } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ProgressComponent } from './progress.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressStackedComponent } from './progress-stacked.component'; + +@Component({ + template: ` + `, + selector: 'c-test', + imports: [ + ProgressComponent, + ProgressStackedComponent + ], + standalone: true +}) +export class TestComponent {} describe('ProgressComponent', () => { - let component: ProgressComponent; - let fixture: ComponentFixture; + let component: TestComponent; + let progress: DebugNode | undefined; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ProgressComponent] - }) - .compileComponents(); - })); + imports: [TestComponent, ProgressComponent, ProgressBarDirective] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); - beforeEach(() => { - fixture = TestBed.createComponent(ProgressComponent); component = fixture.componentInstance; + progress = fixture.debugElement.childNodes.find(v => ProgressComponent); + // let x= fixture.debugElement.queryAll(By.directive(ProgressBarDirective)) + // console.log(x) fixture.detectChanges(); - }); + })); it('should create', () => { - expect(component).toBeTruthy(); + expect(component).toBeDefined(); + expect(progress).toBeDefined(); + }); + + it('should have css class="progress"', () => { + expect(progress?.nativeNode.classList.contains('progress')).toBeTruthy(); + }); + + it('should have style width %', () => { + expect(progress?.nativeNode.style.width).toBe(''); + }); + + it('should have aria-* attributes', () => { + expect(progress?.nativeNode.getAttribute('aria-valuenow')).toBe('42'); + expect(progress?.nativeNode.getAttribute('aria-valuemin')).toBe('0'); + expect(progress?.nativeNode.getAttribute('aria-valuemax')).toBe('100'); }); }); diff --git a/projects/coreui-angular/src/lib/progress/progress.component.ts b/projects/coreui-angular/src/lib/progress/progress.component.ts index 4c302146..c26d988e 100644 --- a/projects/coreui-angular/src/lib/progress/progress.component.ts +++ b/projects/coreui-angular/src/lib/progress/progress.component.ts @@ -1,32 +1,65 @@ -import { booleanAttribute, Component, HostBinding, Input, numberAttribute } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + ContentChildren, + ElementRef, + HostBinding, + inject, + Input, + numberAttribute, + QueryList +} from '@angular/core'; +import { IProgress } from './progress.type'; +import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressStackedComponent } from './progress-stacked.component'; @Component({ selector: 'c-progress', - template: '', - standalone: true + templateUrl: './progress.component.html', + imports: [ProgressBarComponent, NgTemplateOutlet], + standalone: true, + styleUrl: './progress.component.scss', + hostDirectives: [{ + directive: ProgressBarDirective, + inputs: ['animated', 'color', 'max', 'role', 'value', 'variant'] + }], + changeDetection: ChangeDetectionStrategy.OnPush }) -export class ProgressComponent { +export class ProgressComponent implements IProgress { + protected readonly pbd: ProgressBarDirective | null = inject(ProgressBarDirective, { optional: true }); + readonly #stacked?: boolean = inject(ProgressStackedComponent, { optional: true })?.stacked; + readonly #elementRef = inject(ElementRef); + + constructor() { + if (this.pbd) { + this.pbd.stacked = this.#stacked; + } + } + + @ContentChildren(ProgressBarComponent) contentProgressBars!: QueryList; /** * Sets the height of the component. If you set that value the inner `` will automatically resize accordingly. * @type number */ - @Input({ transform: numberAttribute }) height: string | number = 0; + @Input({ transform: numberAttribute }) height: number = 0; /** * Displays thin progress. * @type boolean */ - @Input({ transform: booleanAttribute }) thin: string | boolean = false; + @Input({ transform: booleanAttribute }) thin: boolean = false; /** * Change the default color to white. * @type boolean */ - @Input({ transform: booleanAttribute }) white: string | boolean = false; + @Input({ transform: booleanAttribute }) white: boolean = false; - @HostBinding('class') - get hostClasses(): any { + @HostBinding('class') get hostClasses(): Record { return { progress: true, 'progress-thin': this.thin, @@ -34,8 +67,7 @@ export class ProgressComponent { }; } - @HostBinding('style.height') - get hostStyle(): any { - return !!this.height ? `${this.height}px` : ''; + @HostBinding('style.height') get hostStyle(): any { + return !!this.height ? `${this.height}px` : this.#elementRef?.nativeElement?.style?.height ?? undefined; } } diff --git a/projects/coreui-angular/src/lib/progress/progress.module.ts b/projects/coreui-angular/src/lib/progress/progress.module.ts index f4101373..5f91781f 100644 --- a/projects/coreui-angular/src/lib/progress/progress.module.ts +++ b/projects/coreui-angular/src/lib/progress/progress.module.ts @@ -1,15 +1,21 @@ import { NgModule } from '@angular/core'; import { ProgressComponent } from './progress.component'; import { ProgressBarComponent } from './progress-bar.component'; +import { ProgressBarDirective } from './progress-bar.directive'; +import { ProgressStackedComponent } from './progress-stacked.component'; @NgModule({ exports: [ ProgressComponent, - ProgressBarComponent + ProgressBarComponent, + ProgressBarDirective, + ProgressStackedComponent ], imports: [ ProgressComponent, - ProgressBarComponent + ProgressBarComponent, + ProgressBarDirective, + ProgressStackedComponent ] }) export class ProgressModule {} diff --git a/projects/coreui-angular/src/lib/progress/progress.type.ts b/projects/coreui-angular/src/lib/progress/progress.type.ts new file mode 100644 index 00000000..7fe7e28b --- /dev/null +++ b/projects/coreui-angular/src/lib/progress/progress.type.ts @@ -0,0 +1,21 @@ +import { Colors } from '../coreui.types'; + +export interface IProgress { + height: number; + thin: boolean; + white: boolean; +} + +export interface IProgressBar extends IProgressBarStacked { + animated?: boolean; + color?: Colors; + max?: number; + precision: number; + value?: number; + variant?: 'striped'; + width?: number; +} + +export interface IProgressBarStacked { + stacked?: boolean; +} diff --git a/projects/coreui-angular/src/lib/progress/public_api.ts b/projects/coreui-angular/src/lib/progress/public_api.ts index 6c97b9ed..3f4473bf 100644 --- a/projects/coreui-angular/src/lib/progress/public_api.ts +++ b/projects/coreui-angular/src/lib/progress/public_api.ts @@ -1,4 +1,6 @@ -export { IStackedBar } from './progress-bar'; +export { IProgress, IProgressBar, IProgressBarStacked } from './progress.type'; export { ProgressComponent } from './progress.component'; +export { ProgressStackedComponent } from './progress-stacked.component'; export { ProgressBarComponent } from './progress-bar.component'; +export { ProgressBarDirective } from './progress-bar.directive'; export { ProgressModule } from './progress.module'; diff --git a/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts b/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts new file mode 100644 index 00000000..6118fee6 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/color-mode.service.spec.ts @@ -0,0 +1,25 @@ +import { TestBed } from '@angular/core/testing'; +import { ColorModeService } from './color-mode.service'; + +describe('ColorModeService', () => { + + let service: ColorModeService; + + beforeEach(() => { + service = TestBed.inject(ColorModeService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should switch themes', () => { + expect(service.colorMode()).toBeUndefined(); + service.colorMode.set('light'); + expect(service.colorMode()).toBe('light'); + service.colorMode.set('dark'); + expect(service.colorMode()).toBe('dark'); + service.colorMode.set('auto'); + expect(service.colorMode()).toBe('auto'); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/color-mode.service.ts b/projects/coreui-angular/src/lib/services/color-mode.service.ts new file mode 100644 index 00000000..784d32e7 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/color-mode.service.ts @@ -0,0 +1,82 @@ +import { DOCUMENT } from '@angular/common'; +import { DestroyRef, effect, inject, Injectable, signal, WritableSignal } from '@angular/core'; +import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'; +import { tap } from 'rxjs/operators'; +import { LocalStorageService } from './local-storage.service'; + +export type ColorMode = 'light' | 'dark' | 'auto' | string | undefined; + +@Injectable({ + providedIn: 'root' +}) +export class ColorModeService { + + readonly #destroyRef: DestroyRef = inject(DestroyRef); + readonly #document: Document = inject(DOCUMENT); + readonly #localStorage: LocalStorageService = inject(LocalStorageService); + + readonly eventName = signal('ColorSchemeChange'); + readonly localStorageItemName: WritableSignal = signal(undefined); + readonly localStorageItemName$ = toObservable(this.localStorageItemName); + readonly colorMode: WritableSignal = signal(undefined); + + readonly colorModeEffect = effect(() => { + const colorMode = this.colorMode(); + if (colorMode) { + const localStorageItemName = this.localStorageItemName(); + localStorageItemName && this.setStoredTheme(localStorageItemName, colorMode); + this.#setTheme(colorMode); + } + }); + + constructor() { + this.localStorageItemName$ + .pipe( + tap(params => { + this.colorMode.set(this.getDefaultScheme(params)); + }), + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(); + } + + getStoredTheme(localStorageItemName: string) { + return this.#localStorage.getItem(localStorageItemName); + } + + setStoredTheme(localStorageItemName: string, colorMode: string) { + return this.#localStorage.setItem(localStorageItemName, colorMode); + } + + removeStoredTheme(localStorageItemName: string) { + this.#localStorage.removeItem(localStorageItemName); + } + + getDefaultScheme(localStorageItemName: string | undefined) { + if (this.#document.defaultView === undefined) { + return this.getDatasetTheme(); + } + + const storedTheme = localStorageItemName && this.getStoredTheme(localStorageItemName); + + return storedTheme ?? this.getDatasetTheme(); + }; + + getPrefersColorScheme() { + return this.#document.defaultView?.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : + this.#document.defaultView?.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : + undefined; + } + + getDatasetTheme(): ColorMode { + return (this.#document.documentElement.dataset['coreuiTheme']); + } + + #setTheme(colorMode: ColorMode) { + this.#document.documentElement.dataset['coreuiTheme'] = (colorMode === 'auto' ? this.getPrefersColorScheme() : colorMode); + + const event = new Event(this.eventName()); + this.#document.documentElement.dispatchEvent(event); + }; + +} diff --git a/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts b/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts new file mode 100644 index 00000000..dd5ce72b --- /dev/null +++ b/projects/coreui-angular/src/lib/services/in-memory-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { InMemoryStorageService } from './in-memory-storage.service'; + +describe('InMemoryStorageService', () => { + let service: InMemoryStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(InMemoryStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts b/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts new file mode 100644 index 00000000..8cae6813 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/in-memory-storage.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class InMemoryStorageService implements Storage { + + #storage = new Map(); + + constructor() { } + + public setItem(key: string, data: any): void { + this.#storage.set(key, JSON.stringify(data)); + } + + public getItem(key: string): any { + return this.#storage.has(key) ? JSON.parse(this.#storage.get(key) ?? 'null') : undefined; + } + + public removeItem(key: string): void { + this.#storage.delete(key); + } + + public clear() { + this.#storage.clear(); + } + + public get length() { + return this.#storage.size; + } + + public key(index: number) { + return Array.from(this.#storage.keys())[index]; + } +} diff --git a/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts b/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts new file mode 100644 index 00000000..ba1dbd43 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/local-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { LocalStorageService } from './local-storage.service'; + +describe('LocalStorageService', () => { + let service: LocalStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(LocalStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/local-storage.service.ts b/projects/coreui-angular/src/lib/services/local-storage.service.ts new file mode 100644 index 00000000..e533fe34 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/local-storage.service.ts @@ -0,0 +1,45 @@ +import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { Inject, Injectable, PLATFORM_ID } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { InMemoryStorageService } from './in-memory-storage.service'; + +@Injectable({ + providedIn: 'root' +}) +export class LocalStorageService { + + constructor( + @Inject(PLATFORM_ID) private platformId: Object, + @Inject(DOCUMENT) private document: Document + ) { + this.#localStorage = + isPlatformBrowser(this.platformId) && this.document.defaultView + ? this.document.defaultView?.localStorage + : new InMemoryStorageService(); + } + + #localStorage: Storage; + readonly #data$ = new BehaviorSubject<{ key: string; data: any } | null>(null); + public readonly data$ = this.#data$.asObservable(); + + public setItem(key: string, data: any): void { + this.#localStorage.setItem(key, JSON.stringify(data)); + this.#data$.next({ key, data }); + } + + public getItem(key: string): any { + const data = JSON.parse(this.#localStorage.getItem(key) ?? 'null'); + this.#data$.next({ key, data }); + return data; + } + + public removeItem(key: string): void { + this.#localStorage.removeItem(key); + this.#data$.next({ key, data: null }); + } + + public clear() { + this.#localStorage.clear(); + this.#data$.next(null); + } +} diff --git a/projects/coreui-angular/src/lib/services/public_api.ts b/projects/coreui-angular/src/lib/services/public_api.ts index 6ef462e5..c0c5bdfc 100644 --- a/projects/coreui-angular/src/lib/services/public_api.ts +++ b/projects/coreui-angular/src/lib/services/public_api.ts @@ -1,3 +1,6 @@ export { IntersectionService, IIntersectionObserverInit } from './intersection.service'; export { ListenersService, IListenersConfig } from './listeners.service'; export { ClassToggleService } from './class-toggle.service'; +export { LocalStorageService } from './local-storage.service'; +export { InMemoryStorageService } from './in-memory-storage.service'; +export { ColorModeService, ColorMode } from './color-mode.service'; diff --git a/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts b/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts new file mode 100644 index 00000000..9d02052a --- /dev/null +++ b/projects/coreui-angular/src/lib/services/script-injector.service.spec.ts @@ -0,0 +1,19 @@ +import { TestBed } from '@angular/core/testing'; +import { Renderer2 } from '@angular/core'; + +import { ScriptInjectorService } from './script-injector.service'; + +describe('ScriptInjectorService', () => { + let service: ScriptInjectorService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [Renderer2] + }); + service = TestBed.inject(ScriptInjectorService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/services/script-injector.service.ts b/projects/coreui-angular/src/lib/services/script-injector.service.ts new file mode 100644 index 00000000..7e1a6982 --- /dev/null +++ b/projects/coreui-angular/src/lib/services/script-injector.service.ts @@ -0,0 +1,69 @@ +import { DOCUMENT } from '@angular/common'; +import { inject, Injectable, Renderer2 } from '@angular/core'; + +export type ReferrerPolicy = + '' + | 'no-referrer' + | 'no-referrer-when-downgrade' + | 'origin' + | 'origin-when-cross-origin' + | 'same-origin' + | 'strict-origin' + | 'strict-origin-when-cross-origin' + | 'unsafe-url'; + +export interface IScriptAttributes { + async?: boolean; + blocking?: 'render'; + crossorigin?: 'anonymous' | 'use-credentials'; + defer?: boolean; + fetchpriority?: 'auto' | 'high' | 'low'; + importmap?: string; + integrity?: string; + nomodule?: boolean; + nonce?: string; + referrerpolicy?: ReferrerPolicy; + src: string; + type?: string; +} + +export interface IScriptConfig { + attributes?: IScriptAttributes; + loaded?: boolean; + elementName?: string; +} + +@Injectable({ + providedIn: 'root' +}) +export class ScriptInjectorService { + + document: Document = inject(DOCUMENT); + renderer: Renderer2 = inject(Renderer2); + + #scriptStore = new Map(); + + constructor() { } + + public injectScript(src: string, scriptConfig: IScriptConfig = { elementName: 'head' }) { + if (this.#scriptStore.has(src) && this.#scriptStore.get(src)?.loaded) { + return; + } + const scriptAttributes: IScriptAttributes = { ...scriptConfig?.attributes, src }; + this.loadScript(src, scriptConfig = { ...scriptConfig, attributes: scriptAttributes }).then(); + } + + loadScript(src: string, scriptConfig: IScriptConfig) { + return new Promise((resolve, reject) => { + const scriptElement = this.renderer.createElement('script'); + this.renderer.setAttribute(scriptElement, 'type', 'text/javascript'); + this.renderer.setAttribute(scriptElement, 'src', src); + scriptElement.onload = () => { + this.#scriptStore.set(src, { ...scriptConfig, loaded: true }); + resolve({ src: src, loaded: true }); + }; + scriptElement.onerror = (error: any) => reject({ src: src, loaded: false, error }); + this.renderer.appendChild(this.document.querySelector(scriptConfig.elementName ?? 'head'), scriptElement); + }); + } +} diff --git a/projects/coreui-angular/src/lib/shared/public_api.ts b/projects/coreui-angular/src/lib/shared/public_api.ts index a2450d0e..289e27db 100644 --- a/projects/coreui-angular/src/lib/shared/public_api.ts +++ b/projects/coreui-angular/src/lib/shared/public_api.ts @@ -1,3 +1,4 @@ export { SharedModule } from './shared.module'; export { HtmlAttributesDirective } from './html-attr.directive'; export { TemplateIdDirective } from './template-id.directive'; +export { ThemeDirective } from './theme.directive'; diff --git a/projects/coreui-angular/src/lib/shared/shared.module.ts b/projects/coreui-angular/src/lib/shared/shared.module.ts index f9616e59..772b7a33 100644 --- a/projects/coreui-angular/src/lib/shared/shared.module.ts +++ b/projects/coreui-angular/src/lib/shared/shared.module.ts @@ -2,16 +2,11 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { HtmlAttributesDirective } from './html-attr.directive'; import { TemplateIdDirective } from './template-id.directive'; +import { ThemeDirective } from './theme.directive'; @NgModule({ - imports: [ - HtmlAttributesDirective, - TemplateIdDirective - ], - exports: [ - HtmlAttributesDirective, - TemplateIdDirective - ], + imports: [HtmlAttributesDirective, TemplateIdDirective, ThemeDirective], + exports: [HtmlAttributesDirective, TemplateIdDirective, ThemeDirective] }) export class SharedModule { diff --git a/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts b/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts new file mode 100644 index 00000000..1f844651 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/theme.directive.spec.ts @@ -0,0 +1,21 @@ +import { ElementRef, Renderer2 } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { ThemeDirective } from './theme.directive'; + +class MockElementRef extends ElementRef {} + +describe('ThemeDirective', () => { + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [{ provide: ElementRef, useClass: MockElementRef }, Renderer2] + }); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new ThemeDirective(); + expect(directive).toBeTruthy(); + }); + }); +}); diff --git a/projects/coreui-angular/src/lib/shared/theme.directive.ts b/projects/coreui-angular/src/lib/shared/theme.directive.ts new file mode 100644 index 00000000..65f95c61 --- /dev/null +++ b/projects/coreui-angular/src/lib/shared/theme.directive.ts @@ -0,0 +1,39 @@ +import { booleanAttribute, Directive, ElementRef, inject, Input, Renderer2 } from '@angular/core'; + +@Directive({ + selector: '[cTheme]', + standalone: true +}) +export class ThemeDirective { + + readonly #hostElement = inject(ElementRef); + readonly #renderer = inject(Renderer2); + + /** + * Add dark theme attribute. + * @type 'dark' | 'light' | undefined + */ + @Input() set colorScheme(scheme: 'dark' | 'light' | undefined) { + !!scheme ? this.setTheme(scheme) : this.unsetTheme(); + }; + + /** + * Add dark theme attribute. + * @type boolean + */ + @Input({ transform: booleanAttribute }) + set dark(darkTheme: boolean) { + darkTheme ? this.setTheme('dark') : this.unsetTheme(); + }; + + setTheme(theme?: string): void { + if (theme) { + this.#renderer.setAttribute(this.#hostElement.nativeElement, 'data-coreui-theme', theme); + } + } + + unsetTheme(): void { + this.#renderer.removeAttribute(this.#hostElement.nativeElement, 'data-coreui-theme'); + } + +} diff --git a/projects/coreui-angular/src/lib/sidebar/public_api.ts b/projects/coreui-angular/src/lib/sidebar/public_api.ts index f8048ac1..8dd56985 100644 --- a/projects/coreui-angular/src/lib/sidebar/public_api.ts +++ b/projects/coreui-angular/src/lib/sidebar/public_api.ts @@ -2,7 +2,7 @@ export { SidebarComponent } from './sidebar/sidebar.component'; export { SidebarService } from './sidebar.service'; export { SidebarBrandComponent } from './sidebar-brand/sidebar-brand.component'; export { SidebarToggleDirective } from './sidebar-toggle/sidebar-toggle.directive'; -export { SidebarTogglerComponent } from './sidebar-toggler/sidebar-toggler.component'; +export { SidebarTogglerDirective } from './sidebar-toggler/sidebar-toggler.directive'; export { SidebarHeaderComponent } from './sidebar-header/sidebar-header.component'; export { SidebarFooterComponent } from './sidebar-footer/sidebar-footer.component'; diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html index a800f6e5..fe47ff8f 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-brand/sidebar-brand.component.html @@ -1,12 +1,10 @@ @if (brandImg) { @if (brandFull) { - + } @if (brandNarrow) { - + } } @else { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts index 799ba4c8..d4b79964 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-footer/sidebar-footer.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-sidebar-footer', - template: ``, + template: '', standalone: true }) export class SidebarFooterComponent { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts index 438cd9f6..8ab4cb46 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-header/sidebar-header.component.ts @@ -2,7 +2,7 @@ import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'c-sidebar-header', - template: ``, + template: '', standalone: true }) export class SidebarHeaderComponent { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html index 0191c78c..1967df91 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-group.component.html @@ -12,6 +12,7 @@ (@openClose.done)="onAnimationDone($event)" (@openClose.start)="onAnimationStart($event)" [@openClose]="open ? 'open' : 'closed'" + [compact]="compact" [dropdownMode]="dropdownMode" [groupItems]="true" [navItems]="navItems" @@ -19,8 +20,11 @@ /> + @if (item?.icon) { - + + + } @if (item?.iconComponent) { + @if (helper.hasIcon(item)) { } diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html index 43f3da10..921d6f39 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.html @@ -1,8 +1,6 @@ @switch (linkType) { @case ('disabled') { - + @if (item.badge) { @@ -11,11 +9,7 @@ } @case ('external') { - + @if (item.badge) { @@ -24,20 +18,20 @@ } @default { - @@ -48,16 +42,18 @@ } } - + @if (item?.icon) { - + + + } @if (item?.iconComponent) { } @if (!item?.icon && !item?.iconComponent) { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts index 149c3f7e..d1d66c32 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav-link.component.ts @@ -1,8 +1,9 @@ -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { NgClass, NgTemplateOutlet } from '@angular/common'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { NavigationEnd, Router, RouterModule } from '@angular/router'; import { Observable, Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; +import { IconDirective } from '@coreui/icons-angular'; // import {SidebarService} from '../sidebar.service'; import { HtmlAttributesDirective } from '../../shared'; @@ -11,7 +12,6 @@ import { INavData } from './sidebar-nav'; import { SidebarNavLinkPipe } from './sidebar-nav-link.pipe'; import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; -import { IconDirective } from '@coreui/icons-angular'; @Component({ selector: 'c-sidebar-nav-link-content', @@ -40,12 +40,12 @@ export class SidebarNavLinkContentComponent { RouterModule, HtmlAttributesDirective, IconDirective, - NgClass, - NgTemplateOutlet, SidebarNavLinkContentComponent, SidebarNavLinkPipe, SidebarNavBadgePipe, - SidebarNavIconPipe + SidebarNavIconPipe, + NgTemplateOutlet, + NgClass ] }) export class SidebarNavLinkComponent implements OnInit, OnDestroy { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html index 1f282c13..c3976dc0 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.html @@ -8,6 +8,7 @@ [ngClass]="item | cSidebarNavItemClass" [routerLinkActiveOptions]="{exact: true}" routerLinkActive="show" + [compact]="compact" /> } @case ('divider') { diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts index d5b14c28..b0681dec 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-nav/sidebar-nav.component.ts @@ -1,6 +1,7 @@ import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations'; import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common'; import { + booleanAttribute, Component, ElementRef, forwardRef, @@ -80,6 +81,7 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy { @Input() item: any; @Input() dropdownMode: 'path' | 'none' | 'close' = 'path'; @Input() show?: boolean; + @Input({ transform: booleanAttribute }) compact?: boolean; @HostBinding('class') get hostClasses(): any { @@ -204,21 +206,22 @@ export class SidebarNavComponent implements OnChanges { @Input() navItems?: INavData[] = []; @Input() dropdownMode: 'path' | 'none' | 'close' = 'path'; - @Input() groupItems?: boolean; - @Input() compact?: boolean; + @Input({ transform: booleanAttribute }) groupItems?: boolean; + @Input({ transform: booleanAttribute }) compact?: boolean; @HostBinding('class') get hostClasses(): any { return { 'sidebar-nav': !this.groupItems, - compact: !this.groupItems && !!this.compact + 'nav-group-items': this.groupItems, + compact: this.groupItems && this.compact }; } - @HostBinding('class.nav-group-items') - get sidebarNavGroupItemsClass(): boolean { - return !!this.groupItems; - } + // @HostBinding('class.nav-group-items') + // get sidebarNavGroupItemsClass(): boolean { + // return !!this.groupItems; + // } @HostBinding('attr.role') role = 'nav'; diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts deleted file mode 100644 index ef5da2c8..00000000 --- a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, HostBinding, Input } from '@angular/core'; - -@Component({ - selector: 'c-sidebar-toggler', - template: ``, - standalone: true -}) -export class SidebarTogglerComponent { - - @HostBinding('attr.role') - @Input() role = 'button'; - - @HostBinding('class.sidebar-toggler') sidebarTogglerClass = true; - -} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts new file mode 100644 index 00000000..4c8c1c6f --- /dev/null +++ b/projects/coreui-angular/src/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.ts @@ -0,0 +1,25 @@ +import { Directive, HostBinding, Input } from '@angular/core'; +import { SidebarToggleDirective } from '../sidebar-toggle/sidebar-toggle.directive'; + +@Directive({ + selector: '[cSidebarToggler]', + standalone: true, + hostDirectives: [{ directive: SidebarToggleDirective, inputs: ['cSidebarToggle: cSidebarToggler', 'toggle'] }] +}) +export class SidebarTogglerDirective { + + @HostBinding('attr.role') + @Input() role = 'button'; + + @HostBinding('class.sidebar-toggler') sidebarTogglerClass = true; + + @HostBinding('style') + get getStyles(): any { + return { + appearance: 'button', + 'align-items': 'flex-start', + cursor: 'pointer' + }; + } + +} diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts b/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts index 1f88b8cf..1cf1d4d1 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar.module.ts @@ -4,7 +4,7 @@ import { SidebarComponent } from './sidebar/sidebar.component'; import { SidebarService } from './sidebar.service'; import { SidebarBrandComponent } from './sidebar-brand/sidebar-brand.component'; import { SidebarToggleDirective } from './sidebar-toggle/sidebar-toggle.directive'; -import { SidebarTogglerComponent } from './sidebar-toggler/sidebar-toggler.component'; +import { SidebarTogglerDirective } from './sidebar-toggler/sidebar-toggler.directive'; import { SidebarHeaderComponent } from './sidebar-header/sidebar-header.component'; import { SidebarFooterComponent } from './sidebar-footer/sidebar-footer.component'; import { SidebarNavGroupService } from './sidebar-nav/sidebar-nav-group.service'; @@ -42,12 +42,12 @@ import { SidebarNavLinkPipe, SidebarNavTitleComponent, SidebarToggleDirective, - SidebarTogglerComponent + SidebarTogglerDirective ], exports: [ SidebarComponent, SidebarToggleDirective, - SidebarTogglerComponent, + SidebarTogglerDirective, SidebarBrandComponent, SidebarNavComponent, SidebarHeaderComponent, diff --git a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts index ed3456c0..a4473256 100644 --- a/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts +++ b/projects/coreui-angular/src/lib/sidebar/sidebar/sidebar.component.ts @@ -1,4 +1,5 @@ import { + booleanAttribute, Component, EventEmitter, HostBinding, @@ -12,7 +13,6 @@ import { SimpleChanges } from '@angular/core'; import { DOCUMENT } from '@angular/common'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout'; import { Subscription } from 'rxjs'; @@ -22,18 +22,11 @@ import { SidebarBackdropService } from '../sidebar-backdrop/sidebar-backdrop.ser @Component({ selector: 'c-sidebar', exportAs: 'cSidebar', - template: '', + template: '', standalone: true }) export class SidebarComponent implements OnChanges, OnDestroy, OnInit { - static ngAcceptInputType_narrow: BooleanInput; - static ngAcceptInputType_overlaid: BooleanInput; - static ngAcceptInputType_unfoldable: BooleanInput; - static ngAcceptInputType_visible: BooleanInput; - - #narrow = false; - #overlaid = false; - #unfoldable = false; + #visible = false; #onMobile = false; #layoutChangeSubscription!: Subscription; @@ -66,28 +59,16 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { /** * Make sidebar narrow. [docs] * @type boolean + * @default false */ - @Input() - set narrow(value: boolean) { - this.#narrow = coerceBooleanProperty(value); - } - - get narrow() { - return this.#narrow; - } + @Input({ transform: booleanAttribute }) narrow: boolean = false; /** * Set sidebar to overlaid variant. * @type boolean + * @default false */ - @Input() - set overlaid(value: boolean) { - this.#overlaid = coerceBooleanProperty(value); - } - - get overlaid() { - return this.#overlaid; - } + @Input({ transform: booleanAttribute }) overlaid: boolean = false; /** * Components placement, there’s no default placement. [docs] @@ -108,22 +89,19 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { /** * Expand narrowed sidebar on hover. [docs] + * @type boolean + * @default false */ - @Input() - set unfoldable(value: boolean) { - this.#unfoldable = coerceBooleanProperty(value); - } - - get unfoldable() { - return this.#unfoldable; - } + @Input({ transform: booleanAttribute }) unfoldable: boolean = false; /** * Toggle the visibility of sidebar component. [docs] + * @type boolean + * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set visible(value: boolean) { - const visible = coerceBooleanProperty(value); + const visible = value; if (this.#visible !== visible) { this.#visible = visible; this.visibleChange.emit(this.#visible); @@ -192,8 +170,11 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { 'sidebar-narrow': this.narrow && !this.unfoldable, 'sidebar-narrow-unfoldable': this.unfoldable, 'sidebar-overlaid': this.overlaid, + [`sidebar-${this.placement}`]: !!this.placement, + [`sidebar-${this.colorScheme}`]: !!this.colorScheme, [`sidebar-${this.size}`]: !!this.size, - show: visible && this.#onMobile, + show: visible, + // show: visible && this.#onMobile, //todo: check hide: !visible }; } @@ -219,7 +200,7 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit { for (const propName in changes) { if (propList.includes(propName)) { if (changes[propName] && !changes[propName].firstChange) { - const value = coerceBooleanProperty(changes[propName].currentValue); + const value = booleanAttribute(changes[propName].currentValue); if (oldStateMap.get(propName) !== value) { newStateMap.set(propName, value); } diff --git a/projects/coreui-angular/src/lib/table/table.type.ts b/projects/coreui-angular/src/lib/table/table.type.ts index e7d014b8..60d5ae5f 100644 --- a/projects/coreui-angular/src/lib/table/table.type.ts +++ b/projects/coreui-angular/src/lib/table/table.type.ts @@ -52,7 +52,8 @@ export interface ITable { * @type boolean */ striped?: boolean | string; - attributes?: { [key: string]: any }; + + attributes?: Partial; } export interface ITableElementProps { @@ -66,7 +67,9 @@ export interface ITableElementProps { * @type Colors */ color?: Colors; - _attributes?: { [key: string]: any }; + + /** @deprecated */ + _attributes?: Partial; } export interface ITableRowCellProps extends ITableElementProps { @@ -75,4 +78,7 @@ export interface ITableRowCellProps extends ITableElementProps { @type boolean */ active?: boolean; + + /** @deprecated */ + _attributes?: Partial | Partial; } diff --git a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts index 03f675fd..392fd23d 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content-ref.directive.ts @@ -1,14 +1,15 @@ import { + booleanAttribute, ChangeDetectorRef, Directive, HostBinding, HostListener, Input, + numberAttribute, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { Subscription } from 'rxjs'; import { TabService } from './tab.service'; @@ -26,7 +27,6 @@ export class TabContentRefDirective implements OnChanges, OnDestroy { this.subscribeTabService(); } - static ngAcceptInputType_disabled: BooleanInput; private tabServiceSubscription!: Subscription; /** @@ -38,10 +38,11 @@ export class TabContentRefDirective implements OnChanges, OnDestroy { /** * Set active state of tab content * @type boolean + * @default false */ - @Input() + @Input({ transform: booleanAttribute }) set active(value: boolean) { - const newValue = coerceBooleanProperty(value); + const newValue = value; if (this._active !== newValue) { this._active = newValue; this.changeDetectorRef.detectChanges(); @@ -58,9 +59,9 @@ export class TabContentRefDirective implements OnChanges, OnDestroy { * Set disabled state of tab content * @type boolean */ - @Input() + @Input({ transform: booleanAttribute }) set disabled(value: boolean) { - this._disabled = coerceBooleanProperty(value); + this._disabled = value; } get disabled(): boolean { @@ -73,7 +74,7 @@ export class TabContentRefDirective implements OnChanges, OnDestroy { * c-tab-pane index respectively * @type number */ - @Input() tabPaneIdx = -1; + @Input({ transform: numberAttribute }) tabPaneIdx = -1; @HostBinding('class') get hostClasses() { diff --git a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts index 33339f44..7fa9a803 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-content/tab-content.component.ts @@ -8,13 +8,13 @@ import { EventEmitter, HostBinding, Input, + numberAttribute, OnChanges, OnDestroy, Output, QueryList, SimpleChanges } from '@angular/core'; -import { coerceNumberProperty } from '@angular/cdk/coercion'; import { Subscription } from 'rxjs'; import { TabPaneComponent } from '../tab-pane/tab-pane.component'; @@ -22,7 +22,7 @@ import { TabService } from '../tab.service'; @Component({ selector: 'c-tab-content', - template: ``, + template: '', styleUrls: ['./tab-content.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cTabContent', @@ -34,9 +34,9 @@ export class TabContentComponent implements AfterContentChecked, AfterContentIni * Set active tabPane index * @type number */ - @Input() + @Input({ transform: numberAttribute }) set activeTabPaneIdx(value: number) { - const newValue = coerceNumberProperty(value); + const newValue = value; if (this._activeTabPaneIdx != newValue) { this._activeTabPaneIdx = newValue; this.activeTabPaneIdxChange.emit(newValue); @@ -44,9 +44,11 @@ export class TabContentComponent implements AfterContentChecked, AfterContentIni this.changeDetectorRef.detectChanges(); } }; + get activeTabPaneIdx() { return this._activeTabPaneIdx; } + private _activeTabPaneIdx = -1; /** @@ -76,7 +78,7 @@ export class TabContentComponent implements AfterContentChecked, AfterContentIni ngAfterContentChecked(): void { this.panes?.forEach((tabPane, index) => { tabPane.tabContent = this; - tabPane.tabPaneIdx = index; + tabPane.tabPaneIdx = index; }); this.refreshTabPaneActive(this.activeTabPaneIdx); this.tabService.setActiveTabIdx({ tabContent: this, activeIdx: this.activeTabPaneIdx }); diff --git a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts index 1c2347f8..37be5f5c 100644 --- a/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts +++ b/projects/coreui-angular/src/lib/tabs/tab-pane/tab-pane.component.ts @@ -1,5 +1,4 @@ -import { ChangeDetectorRef, Component, HostBinding, OnDestroy } from '@angular/core'; -import { coerceBooleanProperty } from '@angular/cdk/coercion'; +import { booleanAttribute, ChangeDetectorRef, Component, HostBinding, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; import { TabContentComponent } from '../tab-content/tab-content.component'; @@ -7,8 +6,7 @@ import { ITabContentState, TabService } from '../tab.service'; @Component({ selector: 'c-tab-pane', - template: ` - `, + template: '', styleUrls: ['./tab-pane.component.scss'], exportAs: 'cTabPane', standalone: true @@ -27,7 +25,7 @@ export class TabPaneComponent implements OnDestroy { private tabServiceSubscription!: Subscription; set active(value: boolean) { - const newValue = coerceBooleanProperty(value); + const newValue = booleanAttribute(value); if (this._active !== newValue) { this._active = newValue; this.changeDetectorRef.markForCheck(); diff --git a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts index f0e14083..bbb355cc 100644 --- a/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast-body/toast-body.component.ts @@ -3,7 +3,7 @@ import { ToastComponent } from '../toast/toast.component'; @Component({ selector: 'c-toast-body', - template: '', + template: '', styleUrls: ['./toast-body.component.scss'], exportAs: 'cToastBody', standalone: true diff --git a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts index 2cdf1bf0..9a429363 100644 --- a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts @@ -1,4 +1,5 @@ import { + booleanAttribute, ChangeDetectorRef, Component, ElementRef, @@ -6,6 +7,7 @@ import { HostBinding, HostListener, Input, + numberAttribute, OnDestroy, OnInit, Output, @@ -13,7 +15,6 @@ import { } from '@angular/core'; import { animate, state, style, transition, trigger } from '@angular/animations'; -import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; import { Colors } from '../../coreui.types'; import { ToasterService } from '../toaster/toaster.service'; @@ -23,7 +24,7 @@ type AnimateType = ('hide' | 'show'); @Component({ selector: 'c-toast', - template: '', + template: '', styleUrls: ['./toast.component.scss'], exportAs: 'cToast', standalone: true, @@ -51,8 +52,6 @@ type AnimateType = ('hide' | 'show'); }) export class ToastComponent implements OnInit, OnDestroy { - static ngAcceptInputType_visible: BooleanInput; - public dynamic!: boolean; public placement!: TToasterPlacement; @@ -79,7 +78,7 @@ export class ToastComponent implements OnInit, OnDestroy { * Delay hiding the toast (ms). * @type number */ - @Input() delay: number = 5000; + @Input({ transform: numberAttribute }) delay: number = 5000; /** * Apply fade transition to the toast. @@ -91,9 +90,9 @@ export class ToastComponent implements OnInit, OnDestroy { * Toggle the visibility of component. * @type boolean */ - @Input() + @Input({ transform: booleanAttribute }) set visible(value: boolean) { - const newValue = coerceBooleanProperty(value); + const newValue = value; if (this._visible !== newValue) { this._visible = newValue; newValue ? this.setTimer() : this.clearTimer(); @@ -111,7 +110,7 @@ export class ToastComponent implements OnInit, OnDestroy { /** * @ignore */ - @Input() index?: number; + @Input({ transform: numberAttribute }) index?: number; /** * Event emitted on visibility change. [docs] diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html index 30f07ef9..252bfa13 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html @@ -1,2 +1,2 @@ - - + + diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts index cb7bce5c..9fdc1c0f 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts +++ b/projects/coreui-angular/src/lib/tooltip/tooltip.directive.ts @@ -92,7 +92,7 @@ export class TooltipDirective implements OnChanges, OnDestroy, OnInit, AfterView { name: 'offset', options: { - offset: [0, 0] + offset: [0, 5] } } ] diff --git a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html index 0130d581..24e175d2 100644 --- a/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html +++ b/projects/coreui-angular/src/lib/tooltip/tooltip/tooltip.component.html @@ -1,6 +1,6 @@
    - +
    diff --git a/projects/coreui-angular/src/lib/utilities/public_api.ts b/projects/coreui-angular/src/lib/utilities/public_api.ts index 40efad68..a65cdb20 100644 --- a/projects/coreui-angular/src/lib/utilities/public_api.ts +++ b/projects/coreui-angular/src/lib/utilities/public_api.ts @@ -1,6 +1,8 @@ +export { AlignDirective } from './align.directive'; export { BgColorDirective } from './bg-color.directive'; export { BorderDirective } from './border.directive'; -export { TextColorDirective } from './text-color.directive'; export { RoundedDirective } from './rounded.directive'; -export { AlignDirective } from './align.directive'; +export { ShadowOnScrollDirective } from './shadow-on-scroll.directive'; +export { TextColorDirective } from './text-color.directive'; +export { TextBgColorDirective } from './text-bg-color.directive'; export { UtilitiesModule } from './utilities.module'; diff --git a/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts new file mode 100644 index 00000000..355ab52e --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.spec.ts @@ -0,0 +1,22 @@ +import { ElementRef } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { ShadowOnScrollDirective } from './shadow-on-scroll.directive'; + +class MockElementRef extends ElementRef {} + +describe('ShadowOnScrollDirective', () => { + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ShadowOnScrollDirective], + providers: [{ provide: ElementRef, useClass: MockElementRef }] + }); + }); + + it('should create an instance', () => { + TestBed.runInInjectionContext(() => { + const directive = new ShadowOnScrollDirective(); + expect(directive).toBeTruthy(); + }); + }); +}); diff --git a/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts new file mode 100644 index 00000000..08c46b4e --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/shadow-on-scroll.directive.ts @@ -0,0 +1,46 @@ +import { DOCUMENT } from '@angular/common'; +import { DestroyRef, Directive, effect, ElementRef, inject, Input, signal, WritableSignal } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { fromEvent, Subscription } from 'rxjs'; + +@Directive({ + selector: '[cShadowOnScroll]', + standalone: true +}) +export class ShadowOnScrollDirective { + + readonly #destroyRef: DestroyRef = inject(DestroyRef); + readonly #document: Document = inject(DOCUMENT); + readonly #elementRef: ElementRef = inject(ElementRef); + readonly #scrolled: WritableSignal = signal(false); + + readonly #scrollEffect = effect(() => { + this.#elementRef.nativeElement.classList.toggle(this.#shadowClass, this.#scrolled()); + }); + + #observable!: Subscription; + #shadowClass = 'shadow-sm'; + + constructor() { + this.#destroyRef.onDestroy(() => { + this.#scrollEffect?.destroy(); + }); + } + + @Input() + set cShadowOnScroll(value: 'sm' | 'lg' | 'none' | boolean) { + this.#scrolled.set(false); + if (value) { + this.#shadowClass = value === true ? 'shadow' : `shadow-${value}`; + this.#observable = fromEvent(this.#document, 'scroll') + .pipe( + takeUntilDestroyed(this.#destroyRef) + ) + .subscribe(scrolled => { + this.#scrolled.set(this.#document.documentElement.scrollTop > 0); + }); + } else { + this.#observable?.unsubscribe(); + } + }; +} diff --git a/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts new file mode 100644 index 00000000..bdde3ec7 --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.spec.ts @@ -0,0 +1,8 @@ +import { TextBgColorDirective } from './text-bg-color.directive'; + +describe('TextBgColorDirective', () => { + it('should create an instance', () => { + const directive = new TextBgColorDirective(); + expect(directive).toBeTruthy(); + }); +}); diff --git a/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts new file mode 100644 index 00000000..8a12f712 --- /dev/null +++ b/projects/coreui-angular/src/lib/utilities/text-bg-color.directive.ts @@ -0,0 +1,23 @@ +import { Directive, HostBinding, Input } from '@angular/core'; +import { Colors } from '../coreui.types'; + +@Directive({ + selector: '[cTextBgColor]', + standalone: true +}) +export class TextBgColorDirective { + + /** + * Set text-bg-color of element + * @type Colors + */ + @Input('cTextBgColor') textBgColor: Colors = ''; + + @HostBinding('class') + get hostClasses(): any { + const color = this.textBgColor; + return { + [`text-bg-${color}`]: !!color + }; + } +} diff --git a/projects/coreui-angular/src/lib/utilities/text-color.directive.ts b/projects/coreui-angular/src/lib/utilities/text-color.directive.ts index f9d3d0a6..6cade779 100644 --- a/projects/coreui-angular/src/lib/utilities/text-color.directive.ts +++ b/projects/coreui-angular/src/lib/utilities/text-color.directive.ts @@ -21,5 +21,4 @@ export class TextColorDirective { }; } - constructor() {} } diff --git a/projects/coreui-angular/src/lib/utilities/utilities.module.ts b/projects/coreui-angular/src/lib/utilities/utilities.module.ts index eafb2a13..a15e203d 100644 --- a/projects/coreui-angular/src/lib/utilities/utilities.module.ts +++ b/projects/coreui-angular/src/lib/utilities/utilities.module.ts @@ -1,24 +1,18 @@ import { NgModule } from '@angular/core'; -import { BgColorDirective } from './bg-color.directive'; -import { BorderDirective } from './border.directive'; -import { RoundedDirective } from './rounded.directive'; -import { TextColorDirective } from './text-color.directive'; -import { AlignDirective } from './align.directive'; + +import { + AlignDirective, + BgColorDirective, + BorderDirective, + RoundedDirective, + ShadowOnScrollDirective, + TextColorDirective, + TextBgColorDirective, +} from './public_api'; + +const UTILITY_DIRECTIVES = [AlignDirective, BgColorDirective, BorderDirective, RoundedDirective, ShadowOnScrollDirective, TextColorDirective, TextBgColorDirective]; @NgModule({ - imports: [ - BgColorDirective, - BorderDirective, - RoundedDirective, - TextColorDirective, - AlignDirective - ], - exports: [ - BgColorDirective, - BorderDirective, - RoundedDirective, - TextColorDirective, - AlignDirective - ] + imports: [...UTILITY_DIRECTIVES], exports: [...UTILITY_DIRECTIVES] }) export class UtilitiesModule {} diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts index 4db927f2..b8e1079d 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-a/widget-stat-a.component.ts @@ -38,7 +38,7 @@ export class WidgetStatAComponent implements AfterContentInit { return { 'card': true, [`bg-${this.color}`]: !!this.color, - 'text-high-emphasis-inverse': !!this.color + 'text-white': !!this.color }; } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html index 3ade50ab..9c98eb11 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.html @@ -7,7 +7,7 @@ } @if (text) { - + {{ text }} } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts index aa3bd9ab..33bb3c75 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-b/widget-stat-b.component.ts @@ -1,7 +1,7 @@ import { booleanAttribute, Component, HostBinding, Input } from '@angular/core'; import { NgClass } from '@angular/common'; -import { Colors } from '../../coreui.types'; +import { Colors, TextColors } from '../../coreui.types'; import { CardBodyComponent, CardComponent } from '../../card'; @Component({ @@ -26,7 +26,7 @@ export class WidgetStatBComponent extends CardComponent { * Sets the text-color context of the component to one of CoreUI’s themed colors. * @type Colors */ - @Input() override textColor?: Colors | 'white' | 'muted'; + @Input() override textColor?: TextColors; /** * Title of the widget to display * @type string @@ -55,7 +55,7 @@ export class WidgetStatBComponent extends CardComponent { 'card': true, [`bg-${this.color}`]: !!this.color, [`text-${this.textColor}`]: !!this.textColor, - 'text-high-emphasis-inverse': !!this.color + 'text-white': !!this.inverse }; } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts index 664101d7..5403eedb 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-c/widget-stat-c.component.ts @@ -45,7 +45,7 @@ export class WidgetStatCComponent extends CardComponent implements AfterContentI * Invert colors from their default dark shade. * @type boolean */ - @Input({ transform: booleanAttribute }) inverse: string | boolean = false; + @Input({ transform: booleanAttribute }) inverse: boolean = false; templates: any = {}; @ContentChildren(TemplateIdDirective, { descendants: true }) contentTemplates!: QueryList; @@ -53,24 +53,15 @@ export class WidgetStatCComponent extends CardComponent implements AfterContentI @HostBinding('class') get hostExtendedClass() { return { - 'high-emphasis-inverse': this.inverse - }; - } - - get iconClasses() { - return { - 'mb-4': !this.textColor, - 'text-end': true, - 'text-medium-emphasis': !this.inverse, - 'text-medium-emphasis-inverse': this.inverse, - [`text-${this.textColor}`]: !!this.textColor + 'text-white': this.inverse }; } get titleClasses() { return { - 'text-medium-emphasis': !this.inverse, - 'text-medium-emphasis-inverse': this.inverse, + 'text-body-secondary': !this.inverse, + 'text-white': this.inverse, + 'text-opacity-75': this.inverse, [`text-${this.textColor}`]: !!this.textColor }; } @@ -79,9 +70,16 @@ export class WidgetStatCComponent extends CardComponent implements AfterContentI return { 'fs-4': !this.textColor, 'fw-semibold': true, - 'text-high-emphasis': !this.inverse, - 'text-high-emphasis-inverse': this.inverse, - [`text-${this.textColor}`]: !!this.textColor + ...this.titleClasses, + 'text-opacity-75': false + }; + } + + get iconClasses() { + return { + 'mb-4': !this.textColor, + 'text-end': true, + ...this.titleClasses }; } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html index 0d3f3275..b33df1a2 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html +++ b/projects/coreui-angular/src/lib/widget/widget-stat-d/widget-stat-d.component.html @@ -8,7 +8,7 @@ }
    {{ item.value }}
    -
    {{ item.title }}
    +
    {{ item.title }}
    } diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts index 50672677..3d7cd98e 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-e/widget-stat-e.component.ts @@ -20,6 +20,7 @@ export class WidgetStatEComponent extends CardComponent { * @type string */ @Input() title?: string; + /** * Value for your widget to display * @type string | number @@ -28,7 +29,7 @@ export class WidgetStatEComponent extends CardComponent { get titleClasses() { return { - 'text-medium-emphasis': !this.textColor, + 'text-body-secondary': !this.textColor, 'small': true, 'text-uppercase': true, 'fw-semibold': true, diff --git a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts index 77990ae5..6dea287b 100644 --- a/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts +++ b/projects/coreui-angular/src/lib/widget/widget-stat-f/widget-stat-f.component.ts @@ -94,7 +94,7 @@ export class WidgetStatFComponent implements AfterContentInit { get titleClasses() { return { - 'text-medium-emphasis': !this.textColor, + 'text-body-secondary': !this.textColor, 'small': true, 'text-uppercase': true, 'fw-semibold': true, diff --git a/projects/coreui-angular/src/public-api.ts b/projects/coreui-angular/src/public-api.ts index 405dd473..34a8ada2 100644 --- a/projects/coreui-angular/src/public-api.ts +++ b/projects/coreui-angular/src/public-api.ts @@ -32,8 +32,8 @@ export * from './lib/placeholder'; export * from './lib/popover'; export * from './lib/progress'; export * from './lib/services'; -export * from './lib/spinner'; export * from './lib/sidebar'; +export * from './lib/spinner'; export * from './lib/table'; export * from './lib/tabs'; export * from './lib/toast'; diff --git a/projects/coreui-angular/src/test.ts b/projects/coreui-angular/src/test.ts index f17fa2d1..e163527b 100644 --- a/projects/coreui-angular/src/test.ts +++ b/projects/coreui-angular/src/test.ts @@ -3,10 +3,7 @@ import 'zone.js'; import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( diff --git a/projects/coreui-angular/tsconfig.lib.json b/projects/coreui-angular/tsconfig.lib.json index b77b13c0..31e1e6a1 100644 --- a/projects/coreui-angular/tsconfig.lib.json +++ b/projects/coreui-angular/tsconfig.lib.json @@ -11,5 +11,8 @@ "exclude": [ "src/test.ts", "**/*.spec.ts" - ] + ], + "angularCompilerOptions": { + "compilationMode": "partial" + } } diff --git a/projects/coreui-icons-angular/LICENSE b/projects/coreui-icons-angular/LICENSE index 027b8813..94e4f4d1 100644 --- a/projects/coreui-icons-angular/LICENSE +++ b/projects/coreui-icons-angular/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 creativeLabs Łukasz Holeczek +Copyright (c) 2024 creativeLabs Łukasz Holeczek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/coreui-icons-angular/README.md b/projects/coreui-icons-angular/README.md index c4d25560..73527c16 100644 --- a/projects/coreui-icons-angular/README.md +++ b/projects/coreui-icons-angular/README.md @@ -36,7 +36,7 @@ [coreui]: https://coreui.io/icons [coreui-angular-icons-npm]: https://www.npmjs.com/package/@coreui/icons-angular [npm-coreui-icons-angular-next]: https://img.shields.io/npm/v/@coreui/icons-angular/next.png?style=flat-square&color=red -[angular-badge]: https://img.shields.io/badge/angular-^17.2.0-lightgrey.svg?style=flat-square&logo=angular +[angular-badge]: https://img.shields.io/badge/angular-^17.3.0-lightgrey.svg?style=flat-square&logo=angular ## `cIcon` directive @@ -56,8 +56,8 @@ For directive description visit [https://coreui.io/angular/docs/](https://coreui ### Installation ```shell -npm install @coreui/icons -npm install @coreui/icons-angular +npm install @coreui/icons@3 +npm install @coreui/icons-angular@5 ``` ### Usage @@ -169,5 +169,5 @@ Thanks to all the backers and sponsors! Support this project by [becoming a back ## Copyright and license -Copyright 2023 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Copyright 2024 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-angular/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/projects/coreui-icons-angular/package.json b/projects/coreui-icons-angular/package.json index 273efd4e..e81bc662 100644 --- a/projects/coreui-icons-angular/package.json +++ b/projects/coreui-icons-angular/package.json @@ -1,8 +1,8 @@ { "name": "@coreui/icons-angular", - "version": "4.7.16", + "version": "5.0.0", "description": "CoreUI Icons Angular component and service", - "copyright": "Copyright 2023 creativeLabs Łukasz Holeczek", + "copyright": "Copyright 2024 creativeLabs Łukasz Holeczek", "license": "MIT", "homepage": "https://coreui.io/angular", "author": { @@ -25,10 +25,9 @@ "url": "https://github.com/coreui/coreui-angular/issues" }, "peerDependencies": { - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/platform-browser": "^17.0.0", - "@coreui/icons": "^2.1.0 || ^3.0.0" + "@angular/common": "^17.3.0", + "@angular/core": "^17.3.0", + "@angular/platform-browser": "^17.3.0" }, "dependencies": { "tslib": "^2.3.0" diff --git a/projects/coreui-icons-angular/src/index.ts b/projects/coreui-icons-angular/src/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/projects/coreui-icons-angular/src/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.component.svg b/projects/coreui-icons-angular/src/lib/icon/icon.component.svg index 36a7de4e..9a47fa04 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.component.svg +++ b/projects/coreui-icons-angular/src/lib/icon/icon.component.svg @@ -1,25 +1,30 @@ - - - - - - +@if (!use && !!code) { + +} @else if (use) { + +} diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.component.ts b/projects/coreui-icons-angular/src/lib/icon/icon.component.ts index c558c2ff..ba55bdeb 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.component.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.component.ts @@ -1,4 +1,4 @@ -import { NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { AfterViewInit, Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @@ -12,7 +12,7 @@ import { toCamelCase } from './icon.utils'; templateUrl: './icon.component.svg', styleUrls: ['./icon.component.scss'], standalone: true, - imports: [NgClass, NgIf, HtmlAttributesDirective], + imports: [NgClass, HtmlAttributesDirective], // eslint-disable-next-line @angular-eslint/no-host-metadata-property host: { ngSkipHydration: 'true' } }) diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts b/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts index 856c53eb..ad705357 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.directive.spec.ts @@ -53,4 +53,12 @@ describe('IconDirective', () => { expect(svgEl.nativeElement).toHaveClass('icon-lg'); expect(svgEl.nativeElement).toHaveClass('test'); }); + it('icon attributes should be applied', () => { + expect(svgEl.nativeElement.getAttribute('aria-hidden')).toBe('true'); + expect(svgEl.nativeElement.getAttribute('pointer-events')).toBe('none'); + expect(svgEl.nativeElement.getAttribute('role')).toBe('img'); + expect(svgEl.nativeElement.getAttribute('title')).toBe('Test'); + expect(svgEl.nativeElement.getAttribute('viewBox')).toBeDefined(); + expect(svgEl.nativeElement.getAttribute('xmlns')).toBe('http://www.w3.org/2000/svg'); + }); }); diff --git a/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts b/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts index 229e1de3..0b4635e5 100644 --- a/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts +++ b/projects/coreui-icons-angular/src/lib/icon/icon.directive.ts @@ -33,6 +33,8 @@ export class IconDirective implements IIcon { private _viewBox!: string; + @HostBinding('attr.aria-hidden') ariaHidden = true; + @HostBinding('attr.xmlns') @Input() xmlns = 'http://www.w3.org/2000/svg'; diff --git a/tsconfig.json b/tsconfig.json index f5c8e8f1..1d62e309 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,9 +18,10 @@ "forceConsistentCasingInFileNames": true, "strict": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": false, + "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, "esModuleInterop": true, "sourceMap": true, "declaration": false,