From 44f627499a73337b07671c7a7c0de36a51cc5731 Mon Sep 17 00:00:00 2001 From: Marcel Arndt Date: Thu, 5 Jun 2025 15:24:05 +0200 Subject: [PATCH] (web): dashboard enhancements --- service/app-hub/dashboard/.postcssrc.json | 5 + service/app-hub/dashboard/angular.json | 3 +- service/app-hub/dashboard/codegen.ts | 23 + service/app-hub/dashboard/package-lock.json | 5465 +++++++++++++---- service/app-hub/dashboard/package.json | 30 +- .../app-hub/dashboard/src/app/app.config.ts | 8 +- .../app-hub/dashboard/src/app/app.routes.ts | 12 + .../app-shell/app-shell.component.html | 16 +- .../app-shell/app-shell.component.scss | 17 +- .../components/avatar/avatar.component.ts | 3 +- .../gauge-chart/gauge-chart.component.ts | 94 + .../confirm-dialog.component.ts | 20 +- .../info-card/info-card.component.html | 36 + .../info-card/info-card.component.scss} | 0 .../info-card/info-card.component.spec.ts | 23 + .../info-card/info-card.component.ts | 107 + .../ms-authentication/auth.service.ts | 8 +- .../ngx-echarts/echarts.directive.ts | 35 +- .../components/ngx-echarts/walden.theme.json | 392 ++ .../ngx-echarts/westeros.theme.json | 168 + .../graphql/generated/generated.ts | 221 +- .../data-access/graphql/graphql/home.graphql | 17 + .../data-access/graphql/graphql/kpis.graphql | 34 + .../graphql/graphql/reports.graphql | 20 - .../data-access/graphql/graphql/tours.graphql | 14 + .../src/app/core/telemetry/instrument.ts | 66 + .../accounting-info-card.component.ts | 91 + .../accounting-item.component.ts | 47 +- .../accounting-lane-footer.component.ts | 19 +- .../accounting-lane-header.component.ts | 24 +- .../accounting-lane.component.html | 7 +- .../accounting-lane.component.ts | 41 +- ...ccounting-tour-cost-breakdown.component.ts | 106 + .../accounting-tour-ticket.component.ts | 1 - .../accounting-tour-view.component.ts | 31 +- .../dashboard-accounting.component.ts | 44 +- .../anomaly-list-item.component.css | 3 - .../anomaly-list-item.component.ts | 3 + .../anomaly-list/anomaly-list.component.css | 3 - .../anomaly-list/anomaly-list.component.scss} | 0 .../anomaly-list/anomaly-list.component.ts | 17 +- .../anomaly-solution-dialog.component.css | 3 - .../anomaly-solution-dialog.component.html | 4 +- .../anomaly-solution-dialog.component.scss | 9 + .../anomaly-solution-dialog.component.ts | 5 +- .../anomaly-tree/anomaly-tree.component.css | 3 - .../anomaly-tree/anomaly-tree.component.html | 2 +- .../anomaly-tree/anomaly-tree.component.scss | 0 .../anomaly-tree/anomaly-tree.component.ts | 5 +- .../control-center-dashboard.component.html | 8 +- .../control-center-dashboard.component.scss | 0 ...control-center-dashboard.component.spec.ts | 0 .../control-center-dashboard.component.ts | 0 .../dashboard-control-center.module.ts | 2 +- .../tours-per-time-kpi.component.html | 19 +- .../tour-view-dialog.component.css | 3 - .../tour-view-dialog.component.ts | 3 + .../src/app/pages/home/home.component.spec.ts | 23 + .../src/app/pages/home/home.component.ts | 217 + .../link-card/link-card.component.spec.ts | 23 + .../home/link-card/link-card.component.ts | 45 + .../trend-graph/trend-graph.component.spec.ts | 23 + .../home/trend-graph/trend-graph.component.ts | 257 + ...na-web-feature-dashboard-manager.module.ts | 6 +- .../average-revenue-summary.component.css | 3 - .../average-revenue-summary.component.ts | 5 +- .../breakeven-summary.component.css | 3 - .../breakeven-summary.component.html | 5 +- .../breakeven-summary.component.ts | 11 +- .../manager-info-card.component.html | 19 + .../manager-info-card.component.scss | 0 .../manager-info-card.component.spec.ts | 23 + .../manager-info-card.component.ts | 35 + .../metric-summary.component.html | 2 +- .../time-per-tour-summary.component.css | 3 - .../time-per-tour-summary.component.ts | 13 +- .../view-type-selector.component.html | 48 +- .../view-type-selector.component.ts | 22 +- .../manager/dayview/dayview.component.html | 124 +- .../manager/dayview/dayview.component.ts | 2 +- .../manager/manager-dashboard.service.ts | 36 +- .../manager-dashboard.component.html | 21 +- .../manager-dashboard.component.scss | 0 .../manager-dashboard.component.ts | 2 +- .../monthview/monthview.component.html | 108 +- .../manager/monthview/monthview.component.ts | 10 +- .../manager/overview/overview.component.html | 62 +- .../time-per-tour-by-car.component.html | 2 - .../time-per-tour-kpi.component.html | 5 +- .../dashboard/src/app/pages/manager/types.ts | 2 +- .../ticket-item/ticket-item.component.ts | 20 +- .../ticket-lane-footer.component.ts | 21 +- .../ticket-lane-header.component.ts | 6 +- .../ticket-lane/ticket-lane.component.html | 5 +- .../ticket-lane/ticket-lane.component.ts | 54 +- .../ticket-state-info-card.component.html | 19 + .../ticket-state-info-card.component.scss | 0 .../ticket-state-info-card.component.spec.ts | 23 + .../ticket-state-info-card.component.ts | 51 + .../ticket-view/ticket-overview.component.ts | 1 - .../ticket-td-uncertain.component.ts | 4 +- .../ticket-view/ticket-tours.component.ts | 3 +- .../ticket-user-action-required.component.ts | 65 +- .../ticket-view/ticket-view.component.html | 53 +- .../ticket-view/ticket-view.component.ts | 28 +- .../ticket-system/tickets-page.component.ts | 41 +- .../tickets-search-dialog.component.ts | 1 - .../pages/ticket-system/tickets.service.ts | 34 + .../environments/environment.development.ts | 4 +- service/app-hub/dashboard/src/m3-theme.scss | 344 +- service/app-hub/dashboard/src/main.ts | 1 + .../dashboard/src/style_theme-colors.scss | 137 + service/app-hub/dashboard/src/styles.scss | 17 +- .../dashboard/src/styles/material-theme.json | 419 ++ .../src/styles/open-colors-theme.scss | 135 + .../dashboard/src/styles/open-colors.scss | 399 ++ .../src/styles/tailwind-m3-theme/index.js | 51 + .../packages/tailwind-material-surface.js | 103 + .../packages/with-mode-aware-colors.js | 237 + .../tailwindThemeFromColor.js | 145 + .../styles/tailwind-m3-theme/util/kebabize.js | 10 + service/app-hub/dashboard/src/tailwind.css | 2 + service/app-hub/dashboard/tailwind.config.js | 9 +- 123 files changed, 8890 insertions(+), 2052 deletions(-) create mode 100644 service/app-hub/dashboard/.postcssrc.json create mode 100644 service/app-hub/dashboard/codegen.ts create mode 100644 service/app-hub/dashboard/src/app/core/components/charts/gauge-chart/gauge-chart.component.ts create mode 100644 service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.html rename service/app-hub/dashboard/src/app/{pages/control-center/control-center-dashboard/control-center-dashboard.component.scss => core/components/info-card/info-card.component.scss} (100%) create mode 100644 service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.ts create mode 100644 service/app-hub/dashboard/src/app/core/components/ngx-echarts/walden.theme.json create mode 100644 service/app-hub/dashboard/src/app/core/components/ngx-echarts/westeros.theme.json create mode 100644 service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/home.graphql delete mode 100644 service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/reports.graphql create mode 100644 service/app-hub/dashboard/src/app/core/telemetry/instrument.ts create mode 100644 service/app-hub/dashboard/src/app/pages/accounting/accounting-info-card/accounting-info-card.component.ts create mode 100644 service/app-hub/dashboard/src/app/pages/accounting/accounting-tour-view/accounting-tour-cost-breakdown.component.ts delete mode 100644 service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-list.component.css rename service/app-hub/dashboard/src/app/pages/{manager/manager-dashboard/manager-dashboard.component.css => control-center/anomaly-list/anomaly-list.component.scss} (100%) delete mode 100644 service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.css create mode 100644 service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.scss delete mode 100644 service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.css create mode 100644 service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.scss rename service/app-hub/dashboard/src/app/pages/control-center/{control-center-dashboard => }/control-center-dashboard.component.html (79%) create mode 100644 service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.scss rename service/app-hub/dashboard/src/app/pages/control-center/{control-center-dashboard => }/control-center-dashboard.component.spec.ts (100%) rename service/app-hub/dashboard/src/app/pages/control-center/{control-center-dashboard => }/control-center-dashboard.component.ts (100%) create mode 100644 service/app-hub/dashboard/src/app/pages/home/home.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/pages/home/home.component.ts create mode 100644 service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.ts create mode 100644 service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.ts create mode 100644 service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.html create mode 100644 service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.scss create mode 100644 service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.ts create mode 100644 service/app-hub/dashboard/src/app/pages/manager/manager-dashboard/manager-dashboard.component.scss create mode 100644 service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.html create mode 100644 service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.scss create mode 100644 service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.spec.ts create mode 100644 service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.ts create mode 100644 service/app-hub/dashboard/src/style_theme-colors.scss create mode 100644 service/app-hub/dashboard/src/styles/material-theme.json create mode 100644 service/app-hub/dashboard/src/styles/open-colors-theme.scss create mode 100644 service/app-hub/dashboard/src/styles/open-colors.scss create mode 100644 service/app-hub/dashboard/src/styles/tailwind-m3-theme/index.js create mode 100644 service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/tailwind-material-surface.js create mode 100644 service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/with-mode-aware-colors.js create mode 100644 service/app-hub/dashboard/src/styles/tailwind-m3-theme/tailwindThemeFromColor.js create mode 100644 service/app-hub/dashboard/src/styles/tailwind-m3-theme/util/kebabize.js create mode 100644 service/app-hub/dashboard/src/tailwind.css diff --git a/service/app-hub/dashboard/.postcssrc.json b/service/app-hub/dashboard/.postcssrc.json new file mode 100644 index 0000000..72f908d --- /dev/null +++ b/service/app-hub/dashboard/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} \ No newline at end of file diff --git a/service/app-hub/dashboard/angular.json b/service/app-hub/dashboard/angular.json index d7e2d48..fd9d60f 100644 --- a/service/app-hub/dashboard/angular.json +++ b/service/app-hub/dashboard/angular.json @@ -36,8 +36,9 @@ } ], "styles": [ - "@angular/material/prebuilt-themes/azure-blue.css", + "src/m3-theme.scss", "node_modules/@ngxpert/hot-toast/src/styles/styles.css", + "src/tailwind.css", "src/styles.scss" ], "scripts": [] diff --git a/service/app-hub/dashboard/codegen.ts b/service/app-hub/dashboard/codegen.ts new file mode 100644 index 0000000..57e0962 --- /dev/null +++ b/service/app-hub/dashboard/codegen.ts @@ -0,0 +1,23 @@ + +import type { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + overwrite: true, + schema: "/Users/d3r0/dev/repositories/active/avicenna/service/data-hub/data-connector/src/core/database/schema.gql", + documents: "./src/app/core/data-access/**/*.graphql", + generates: { + "./src/app/core/data-access/graphql/generated/generated.ts": { + plugins: [ + "typescript", + "typescript-operations", + "typescript-apollo-angular" + ], + config: { + addExplicitOverride: true, + withResultType: true + } + } + } +}; + +export default config; diff --git a/service/app-hub/dashboard/package-lock.json b/service/app-hub/dashboard/package-lock.json index 630907b..362526c 100644 --- a/service/app-hub/dashboard/package-lock.json +++ b/service/app-hub/dashboard/package-lock.json @@ -9,17 +9,17 @@ "version": "0.0.0", "dependencies": { "@angular/animations": "^19.2.6", - "@angular/cdk": "^18.1.1", + "@angular/cdk": "^19.2.9", "@angular/common": "^19.2.6", "@angular/compiler": "^19.2.6", "@angular/core": "^19.2.6", "@angular/forms": "^19.2.6", - "@angular/material": "^18.1.1", - "@angular/material-date-fns-adapter": "^18.1.1", + "@angular/material": "^19.2.9", + "@angular/material-date-fns-adapter": "^19.2.9", "@angular/platform-browser": "^19.2.6", "@angular/platform-browser-dynamic": "^19.2.6", "@angular/router": "^19.2.6", - "@apollo/client": "^3.0.0", + "@apollo/client": "^3.13.8", "@azure/msal-angular": "^3.0.22", "@azure/msal-browser": "^3.19.1", "@grafana/faro-web-sdk": "^1.15.0", @@ -31,16 +31,17 @@ "@opentelemetry/auto-instrumentations-web": "^0.45.1", "@opentelemetry/context-zone": "^1.30.1", "@opentelemetry/core": "^2.0.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.57.2", - "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", "@opentelemetry/instrumentation-document-load": "^0.44.1", + "@opentelemetry/propagator-b3": "^1.30.1", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-web": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.30.0", - "apollo-angular": "^7.0.2", + "@opentelemetry/semantic-conventions": "^1.34.0", + "apollo-angular": "^10.0.3", "date-fns": "^3.6.0", "echarts": "^5.5.1", - "graphql": "^16", + "graphql": "^16.11.0", "graphql-ws": "^5.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -51,6 +52,12 @@ "@angular/cli": "^19.2.7", "@angular/compiler-cli": "^19.2.6", "@angular/localize": "^19.2.6", + "@graphql-codegen/cli": "^5.0.5", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/typescript-apollo-angular": "^4.0.0", + "@graphql-codegen/typescript-operations": "^4.6.0", + "@material/material-color-utilities": "^0.3.0", + "@tailwindcss/postcss": "^4.1.4", "@types/jasmine": "~5.1.0", "autoprefixer": "^10.4.19", "jasmine-core": "~5.1.0", @@ -60,7 +67,7 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "postcss": "^8.4.39", - "tailwindcss": "^3.4.6", + "tailwindcss": "^4.1.4", "typescript": "~5.5.2" } }, @@ -757,18 +764,16 @@ } }, "node_modules/@angular/cdk": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.1.1.tgz", - "integrity": "sha512-IaDjvRUgAoKnEeafrnBX+hjTR+1M3O3fV3AybBCjN4NuiPtuyOJiTMg0cTv6RbluJ/SenbT4MQq3tMpOsa9i4w==", + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.9.tgz", + "integrity": "sha512-4If3BjWQPwW/xqRUCL7Mx0dHS0SuZY7Tq/Ocf7liwYTYCmSv8Ew7NqaiPA4RS3FnyUJcZW/UAd231uWI/ZHChg==", "dependencies": { + "parse5": "^7.1.2", "tslib": "^2.3.0" }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, "peerDependencies": { - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1015,81 +1020,32 @@ } }, "node_modules/@angular/material": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.1.1.tgz", - "integrity": "sha512-9JdUEUZheMMk+Tu8oDLRdI2eXOeI9d2BjEZYkoDif4iB7TCldmcKJyTYXs3kSZz6B53vup/vgKJUPBHLkIDD+A==", + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.9.tgz", + "integrity": "sha512-zkc49u6AIZ+aQe76MvOmoZ06c+/ZNpFeBS3dH65kCmnIpFhh8c+zLjxgwgBIlrvUmfjy6J1iJaG05hmkLzAggg==", "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/auto-init": "15.0.0-canary.7f224ddd4.0", - "@material/banner": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/card": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/chips": "15.0.0-canary.7f224ddd4.0", - "@material/circular-progress": "15.0.0-canary.7f224ddd4.0", - "@material/data-table": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dialog": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/drawer": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/fab": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/form-field": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/image-list": "15.0.0-canary.7f224ddd4.0", - "@material/layout-grid": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/linear-progress": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/radio": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/segmented-button": "15.0.0-canary.7f224ddd4.0", - "@material/select": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/slider": "15.0.0-canary.7f224ddd4.0", - "@material/snackbar": "15.0.0-canary.7f224ddd4.0", - "@material/switch": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "@material/tab-bar": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/tab-scroller": "15.0.0-canary.7f224ddd4.0", - "@material/textfield": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/tooltip": "15.0.0-canary.7f224ddd4.0", - "@material/top-app-bar": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.1.1", - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", - "@angular/forms": "^18.0.0 || ^19.0.0", - "@angular/platform-browser": "^18.0.0 || ^19.0.0", + "@angular/cdk": "19.2.9", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/forms": "^19.0.0 || ^20.0.0", + "@angular/platform-browser": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material-date-fns-adapter": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@angular/material-date-fns-adapter/-/material-date-fns-adapter-18.1.1.tgz", - "integrity": "sha512-T/l/179K/HhbcaOytL98L1jL3LpmvlIYUTxtYMsMPlztTL9YQPgASWKUHGoLUBWaxnJtYxAzrd011Oo2S5CpcA==", + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/material-date-fns-adapter/-/material-date-fns-adapter-19.2.9.tgz", + "integrity": "sha512-nIuP4HfC/eiJVeQ/Jzrk8YHREtcXTsYZON4YpwN5Pidr/qkR76EAiEi0VHTSMYPuaN4Y2X47/Ixs0TNELFOJ5A==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": "^18.0.0 || ^19.0.0", - "@angular/material": "18.1.1", - "date-fns": ">2.20.0 <4.0" + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/material": "19.2.9", + "date-fns": ">2.20.0 <5.0" } }, "node_modules/@angular/platform-browser": { @@ -1148,9 +1104,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.8.tgz", - "integrity": "sha512-UaaFEitRrPRWV836wY2L7bd3HRCfbMie1jlYMcmazFAK23MVhz/Uq7VG1nwbotPb5xzFsw5RF4Wnp2G3dWPM3g==", + "version": "3.13.8", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.13.8.tgz", + "integrity": "sha512-YM9lQpm0VfVco4DSyKooHS/fDTiKQcCHfxr7i3iL6a0kP/jNO5+4NFK6vtRDxaYisd5BrwOZHLJpPBnvRVpKPg==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -1161,7 +1117,6 @@ "optimism": "^0.18.0", "prop-types": "^15.7.2", "rehackt": "^0.1.0", - "response-iterator": "^0.2.6", "symbol-observable": "^4.0.0", "ts-invariant": "^0.10.3", "tslib": "^2.3.0", @@ -1169,9 +1124,9 @@ }, "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", - "graphql-ws": "^5.5.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "graphql-ws": "^5.5.5 || ^6.0.3", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "peerDependenciesMeta": { @@ -1189,6 +1144,39 @@ } } }, + "node_modules/@ardatan/relay-compiler": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.3.tgz", + "integrity": "sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/runtime": "^7.26.10", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@azure/msal-angular": { "version": "3.0.22", "resolved": "https://registry.npmjs.org/@azure/msal-angular/-/msal-angular-3.0.22.tgz", @@ -1684,6 +1672,43 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -1696,6 +1721,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", @@ -1726,6 +1778,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -1996,6 +2075,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", @@ -2343,6 +2438,40 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", @@ -2755,6 +2884,47 @@ "node": ">=14.17.0" } }, + "node_modules/@envelop/core": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.2.3.tgz", + "integrity": "sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ==", + "dev": true, + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", @@ -3155,6 +3325,12 @@ "node": ">=18" } }, + "node_modules/@fastify/busboy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", + "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==", + "dev": true + }, "node_modules/@grafana/faro-core": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@grafana/faro-core/-/faro-core-1.15.0.tgz", @@ -3226,6 +3402,1683 @@ "node": ">=18.0.0" } }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.57.2.tgz", + "integrity": "sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.57.2.tgz", + "integrity": "sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-transformer": "0.57.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@grafana/faro-web-tracing/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@graphql-codegen/add": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz", + "integrity": "sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/add/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/cli": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.5.tgz", + "integrity": "sha512-9p9SI5dPhJdyU+O6p1LUqi5ajDwpm6pUhutb1fBONd0GZltLFwkgWFiFtM6smxkYXlYVzw61p1kTtwqsuXO16w==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^4.6.0", + "@graphql-codegen/core": "^4.0.2", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "cosmiconfig": "^8.1.3", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.1.1", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@graphql-codegen/cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/cli/node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/@graphql-codegen/cli/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.8.0.tgz", + "integrity": "sha512-IVtTl7GsPMbQihk5+l5fDYksnPPOoC52sKxzquyIyuecZLEB7W3nNLV29r6+y+tjXTRPA774FR7CHGA2adzhjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^5.0.3", + "@graphql-codegen/gql-tag-operations": "4.0.17", + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/typed-document-node": "^5.1.1", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/typescript-operations": "^4.6.0", + "@graphql-codegen/visitor-plugin-common": "^5.8.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + } + }, + "node_modules/@graphql-codegen/client-preset/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", + "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/core/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.17.tgz", + "integrity": "sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.1.0.tgz", + "integrity": "sha512-Y7cwEAkprbTKzVIe436TIw4w03jorsMruvCvu0HJkavaKMQbWY+lQ1RIuROgszDbxAyM35twB5/sUvYG5oW+yg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz", + "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.1.1.tgz", + "integrity": "sha512-Bp/BrMZDKRwzuVeLv+pSljneqONM7gqu57ZaV34Jbncu2hZWMRDMfizTKghoEwwZbRCYYfJO9tA0sYVVIfI1kg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.1.6.tgz", + "integrity": "sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/schema-ast": "^4.0.2", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-apollo-angular/-/typescript-apollo-angular-4.0.0.tgz", + "integrity": "sha512-uZQGvZBXJrgJ+9KKeRrKcB8wHCsailJ1WaCizNLf2YsTBUELVX0SQRrSFptAul9qYzsS84LRs6ndJsmSUnER6w==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "2.13.1", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@ardatan/relay-compiler": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", + "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/generator": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/plugin-helpers": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", + "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz", + "integrity": "sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^2.7.2", + "@graphql-tools/optimize": "^1.3.0", + "@graphql-tools/relay-operation-optimizer": "^6.5.0", + "@graphql-tools/utils": "^8.8.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.14", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-codegen/plugin-helpers": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", + "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^8.8.0", + "change-case-all": "1.0.14", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-tools/utils": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", + "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/change-case-all": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", + "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-tools/optimize": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", + "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "6.5.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", + "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", + "dev": true, + "dependencies": { + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-apollo-angular/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.6.0.tgz", + "integrity": "sha512-/EltSdE/uPoEAblRTVLABVDhsrE//Kl3pCflyG1PWl4gWL9/OzQXYGjo6TF6bPMVn/QBWoO0FeboWf+bk84SXA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.8.0.tgz", + "integrity": "sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@graphql-hive/signal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz", + "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==", + "dev": true, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.20.tgz", + "integrity": "sha512-m5k9nXSyjq31yNsEqDXLyykEjjn3K3Mo73oOKI+Xjy8cpnsgbT4myeUJIYYQdLrp7fr9Y9p7ZgwT5YcnwmnAbA==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "@whatwg-node/fetch": "^0.10.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.15.tgz", + "integrity": "sha512-qlWUl6yi87FU5WvyJ0uD81R4Y30oQIuW3mJCjOrEvifyT+f/rEqSZFOhYrofYoZAoTcwqOhy6WgH+b9+AtRYjA==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.20.tgz", + "integrity": "sha512-GzIbjjWJIc04KWnEr8VKuPe0FA2vDTlkaeub5p4lLimljnJ6C0QSkOyCUnFmsB9jetQcHm0Wfmn/akMnFUG+wA==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.19", + "@graphql-tools/utils": "^10.8.6", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "10.2.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.17.tgz", + "integrity": "sha512-z+LpZrTQCEXA4fbdJcSsvhaMqT4xi/O8B0mP30ENGyTbSfa20QamOQx9jgCiw2ii/ucwxfGMhygwlpZG36EU4w==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.15", + "@graphql-tools/executor": "^1.4.7", + "@graphql-tools/schema": "^10.0.11", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "dset": "^3.1.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.4.7.tgz", + "integrity": "sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz", + "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==", + "dev": true, + "dependencies": { + "@envelop/core": "^5.2.3", + "@graphql-tools/utils": "^10.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.5.tgz", + "integrity": "sha512-gI/D9VUzI1Jt1G28GYpvm5ckupgJ5O8mi5Y657UyuUozX34ErfVdZ81g6oVcKFQZ60LhCzk7jJeykK48gaLhDw==", + "dev": true, + "dependencies": { + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.3", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.8.1", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/graphql-ws": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.4.tgz", + "integrity": "sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==", + "dev": true, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "graphql": "^15.10.1 || ^16", + "uWebSockets.js": "^20", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "uWebSockets.js": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz", + "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==", + "dev": true, + "dependencies": { + "@graphql-hive/signal": "^1.0.0", + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.4", + "@whatwg-node/promise-helpers": "^1.3.0", + "meros": "^1.2.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.17.tgz", + "integrity": "sha512-TvltY6eL4DY1Vt66Z8kt9jVmNcI+WkvVPQZrPbMCM3rv2Jw/sWvSwzUBezRuWX0sIckMifYVh23VPcGBUKX/wg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.24.tgz", + "integrity": "sha512-ypLC9N2bKNC0QNbrEBTbWKwbV607f7vK2rSGi9uFeGr8E29tWplo6or9V/+TM0ZfIkUsNp/4QX/zKTgo8SbwQg==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.19", + "@graphql-tools/utils": "^10.8.6", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.20.tgz", + "integrity": "sha512-Icch8bKZ1iP3zXCB9I0ded1hda9NPskSSalw7ZM21kXvLiOR5nZhdqPF65gCFkIKo+O4NR4Bp51MkKj+wl+vpg==", + "dev": true, + "dependencies": { + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/graphql-tag-pluck": "^8.3.19", + "@graphql-tools/utils": "^10.8.6", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.19.tgz", + "integrity": "sha512-kyEZL4rRJ5LelfCXL3GLgbMiu5Zd7memZaL8ZxPXGI7DA8On1e5IVBH3zZJwf7LzhjSVnPaHM7O/bRzGvTbXzQ==", + "dev": true, + "dependencies": { + "@graphql-tools/import": "7.0.18", + "@graphql-tools/utils": "^10.8.6", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.19.tgz", + "integrity": "sha512-LEw/6IYOUz48HjbWntZXDCzSXsOIM1AyWZrlLoJOrA8QAlhFd8h5Tny7opCypj8FO9VvpPFugWoNDh5InPOEQA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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/@graphql-tools/graphql-tag-pluck/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==", + "dev": true + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.18.tgz", + "integrity": "sha512-1tw1/1QLB0n5bPWfIrhCRnrHIlbMvbwuifDc98g4FPhJ7OXD+iUQe+IpmD5KHVwYWXWhZOuJuq45DfV/WLNq3A==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.18.tgz", + "integrity": "sha512-JjjIxxewgk8HeMR3npR3YbOkB7fxmdgmqB9kZLWdkRKBxrRXVzhryyq+mhmI0Evzt6pNoHIc3vqwmSctG2sddg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.0.tgz", + "integrity": "sha512-OGfOm09VyXdNGJS/rLqZ6ztCiG2g6AMxhwtET8GZXTbnjptFc17GtKwJ3Jv5w7mjJ8dn0BHydvIuEKEUK4ciYw==", + "dev": true, + "dependencies": { + "@graphql-tools/schema": "^10.0.23", + "@graphql-tools/utils": "^10.8.6", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/load/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.17.tgz", + "integrity": "sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==", + "dev": true, + "dependencies": { + "@graphql-tools/url-loader": "^8.0.15", + "@graphql-tools/utils": "^10.5.6", + "@types/js-yaml": "^4.0.0", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", + "js-yaml": "^4.0.0", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.19.tgz", + "integrity": "sha512-xnjLpfzw63yIX1bo+BVh4j1attSwqEkUbpJ+HAhdiSUa3FOQFfpWgijRju+3i87CwhjBANqdTZbcsqLT1hEXig==", + "dev": true, + "dependencies": { + "@ardatan/relay-compiler": "^12.0.3", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "8.0.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.31.tgz", + "integrity": "sha512-QGP3py6DAdKERHO5D38Oi+6j+v0O3rkBbnLpyOo87rmIRbwE6sOkL5JeHegHs7EEJ279fBX6lMt8ry0wBMGtyA==", + "dev": true, + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^2.0.1", + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/executor-legacy-ws": "^1.1.17", + "@graphql-tools/utils": "^10.8.6", + "@graphql-tools/wrap": "^10.0.16", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "dset": "^3.1.4", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "10.0.35", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.35.tgz", + "integrity": "sha512-qBga3wo7+GqY+ClGexiyRz9xgy1RWozZryTuGX8usGWPa4wKi/tJS4rKWQQesgB3Fh//SZUCRA5u2nwZaZQw1Q==", + "dev": true, + "dependencies": { + "@graphql-tools/delegate": "^10.2.17", + "@graphql-tools/schema": "^10.0.11", + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", @@ -3875,757 +5728,11 @@ "win32" ] }, - "node_modules/@material/animation": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-1GSJaPKef+7HRuV+HusVZHps64cmZuOItDbt40tjJVaikcaZvwmHlcTxRIqzcRoCdt5ZKHh3NoO7GB9Khg4Jnw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/auto-init": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-t7ZGpRJ3ec0QDUO0nJu/SMgLW7qcuG2KqIsEYD1Ej8qhI2xpdR2ydSDQOkVEitXmKoGol1oq4nYSBjTlB65GqA==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/banner": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-g9wBUZzYBizyBcBQXTIafnRUUPi7efU9gPJfzeGgkynXiccP/vh5XMmH+PBxl5v+4MlP/d4cZ2NUYoAN7UTqSA==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/base": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-I9KQOKXpLfJkP8MqZyr8wZIzdPHrwPjFvGd9zSK91/vPyE4hzHRJc/0njsh9g8Lm9PRYLbifXX+719uTbHxx+A==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BHB7iyHgRVH+JF16+iscR+Qaic+p7LU1FOLgP8KucRlpF9tTwIxQA6mJwGRi5gUtcG+vyCmzVS+hIQ6DqT/7BA==", - "dependencies": { - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/card": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kt7y9/IWOtJTr3Z/AoWJT3ZLN7CLlzXhx2udCLP9ootZU2bfGK0lzNwmo80bv/pJfrY9ihQKCtuGTtNxUy+vIw==", - "dependencies": { - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/checkbox": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-rURcrL5O1u6hzWR+dNgiQ/n89vk6tdmdP3mZgnxJx61q4I/k1yijKqNJSLrkXH7Rto3bM5NRKMOlgvMvVd7UMQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/chips": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AYAivV3GSk/T/nRIpH27sOHFPaSMrE3L0WYbnb5Wa93FgY8a0fbsFYtSH2QmtwnzXveg+B1zGTt7/xIIcynKdQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/circular-progress": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DJrqCKb+LuGtjNvKl8XigvyK02y36GRkfhMUYTcJEi3PrOE00bwXtyj7ilhzEVshQiXg6AHGWXtf5UqwNrx3Ow==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/progress-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/data-table": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-/2WZsuBIq9z9RWYF5Jo6b7P6u0fwit+29/mN7rmAZ6akqUR54nXyNfoSNiyydMkzPlZZsep5KrSHododDhBZbA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/linear-progress": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/select": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/density": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-o9EXmGKVpiQ6mHhyV3oDDzc78Ow3E7v8dlaOhgaDSXgmqaE8v5sIlLNa/LKSyUga83/fpGk3QViSGXotpQx0jA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dialog": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-u0XpTlv1JqWC/bQ3DavJ1JguofTelLT2wloj59l3/1b60jv42JQ6Am7jU3I8/SIUB1MKaW7dYocXjDWtWJakLA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dom": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-mQ1HT186GPQSkRg5S18i70typ5ZytfjL09R0gJ2Qg5/G+MLCGi7TAjZZSH65tuD/QGOjel4rDdWOTmYbPYV6HA==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/drawer": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-qyO0W0KBftfH8dlLR0gVAgv7ZHNvU8ae11Ao6zJif/YxcvK4+gph1z8AO4H410YmC2kZiwpSKyxM1iQCCzbb4g==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/elevation": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-tV6s4/pUBECedaI36Yj18KmRCk1vfue/JP/5yYRlFNnLMRVISePbZaKkn/BHXVf+26I3W879+XqIGlDVdmOoMA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/fab": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-4h76QrzfZTcPdd+awDPZ4Q0YdSqsXQnS540TPtyXUJ/5G99V6VwGpjMPIxAsW0y+pmI9UkLL/srrMaJec+7r4Q==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/feature-targeting": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SAjtxYh6YlKZriU83diDEQ7jNSP2MnxKsER0TvFeyG1vX/DWsUyYDOIJTOEa9K1N+fgJEBkNK8hY55QhQaspew==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/floating-label": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-0KMo5ijjYaEHPiZ2pCVIcbaTS2LycvH9zEhEMKwPPGssBCX7iz5ffYQFk7e5yrQand1r3jnQQgYfHAwtykArnQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/focus-ring": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Jmg1nltq4J6S6A10EGMZnvufrvU3YTi+8R8ZD9lkSbun0Fm2TVdICQt/Auyi6An9zP66oQN6c31eqO6KfIPsDg==", - "dependencies": { - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0" - } - }, - "node_modules/@material/form-field": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-fEPWgDQEPJ6WF7hNnIStxucHR9LE4DoDSMqCsGWS2Yu+NLZYLuCEecgR0UqQsl1EQdNRaFh8VH93KuxGd2hiPg==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/icon-button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DcK7IL4ICY/DW+48YQZZs9g0U1kRaW0Wb0BxhvppDMYziHo/CTpFdle4gjyuTyRxPOdHQz5a97ru48Z9O4muTw==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/image-list": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-voMjG2p80XbjL1B2lmF65zO5gEgJOVKClLdqh4wbYzYfwY/SR9c8eLvlYG7DLdFaFBl/7gGxD8TvvZ329HUFPw==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/layout-grid": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-veDABLxMn2RmvfnUO2RUmC1OFfWr4cU+MrxKPoDD2hl3l3eDYv5fxws6r5T1JoSyXoaN+oEZpheS0+M9Ure8Pg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/line-ripple": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-f60hVJhIU6I3/17Tqqzch1emUKEcfVVgHVqADbU14JD+oEIz429ZX9ksZ3VChoU3+eejFl+jVdZMLE/LrAuwpg==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/linear-progress": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-pRDEwPQielDiC9Sc5XhCXrGxP8wWOnAO8sQlMebfBYHYqy5hhiIzibezS8CSaW4MFQFyXmCmpmqWlbqGYRmiyg==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/progress-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/list": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Is0NV91sJlXF5pOebYAtWLF4wU2MJDbYqztML/zQNENkQxDOvEXu3nWNb3YScMIYJJXvARO0Liur5K4yPagS1Q==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/menu": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-D11QU1dXqLbh5X1zKlEhS3QWh0b5BPNXlafc5MXfkdJHhOiieb7LC9hMJhbrHtj24FadJ7evaFW/T2ugJbJNnQ==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/menu-surface": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-7RZHvw0gbwppaAJ/Oh5SWmfAKJ62aw1IMB3+3MRwsb5PLoV666wInYa+zJfE4i7qBeOn904xqT2Nko5hY0ssrg==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/notched-outline": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Yg2usuKB2DKlKIBISbie9BFsOVuffF71xjbxPbybvqemxqUBd+bD5/t6H1fLE+F8/NCu5JMigho4ewUU+0RCiw==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/progress-indicator": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UPbDjE5CqT+SqTs0mNFG6uFEw7wBlgYmh+noSkQ6ty/EURm8lF125dmi4dv4kW0+octonMXqkGtAoZwLIHKf/w==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/radio": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-wR1X0Sr0KmQLu6+YOFKAI84G3L6psqd7Kys5kfb8WKBM36zxO5HQXC5nJm/Y0rdn22ixzsIz2GBo0MNU4V4k1A==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/ripple": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-JqOsWM1f4aGdotP0rh1vZlPZTg6lZgh39FIYHFMfOwfhR+LAikUJ+37ciqZuewgzXB6iiRO6a8aUH6HR5SJYPg==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/rtl": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UVf14qAtmPiaaZjuJtmN36HETyoKWmsZM/qn1L5ciR2URb8O035dFWnz4ZWFMmAYBno/L7JiZaCkPurv2ZNrGA==", - "dependencies": { - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/segmented-button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LCnVRUSAhELTKI/9hSvyvIvQIpPpqF29BV+O9yM4WoNNmNWqTulvuiv7grHZl6Z+kJuxSg4BGbsPxxb9dXozPg==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/select": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-WioZtQEXRpglum0cMSzSqocnhsGRr+ZIhvKb3FlaNrTaK8H3Y4QA7rVjv3emRtrLOOjaT6/RiIaUMTo9AGzWQQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/shape": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8z8l1W3+cymObunJoRhwFPKZ+FyECfJ4MJykNiaZq7XJFZkV6xNmqAVrrbQj93FtLsECn9g4PjjIomguVn/OEw==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/slider": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-QU/WSaSWlLKQRqOhJrPgm29wqvvzRusMqwAcrCh1JTrCl+xwJ43q5WLDfjYhubeKtrEEgGu9tekkAiYfMG7EBw==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/snackbar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/switch": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-lEDJfRvkVyyeHWIBfoxYjJVl+WlEAE2kZ/+6OqB1FW0OV8ftTODZGhHRSzjVBA1/p4FPuhAtKtoK9jTpa4AZjA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-E1xGACImyCLurhnizyOTCgOiVezce4HlBFAI6YhJo/AyVwjN2Dtas4ZLQMvvWWqpyhITNkeYdOchwCC1mrz3AQ==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-bar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-p1Asb2NzrcECvAQU3b2SYrpyJGyJLQWR+nXTYzDKE8WOpLIRCXap2audNqD7fvN/A20UJ1J8U01ptrvCkwJ4eA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/tab-scroller": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-indicator": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-h9Td3MPqbs33spcPS7ecByRHraYgU4tNCZpZzZXw31RypjKvISDv/PS5wcA4RmWqNGih78T7xg4QIGsZg4Pk4w==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-scroller": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LFeYNjQpdXecwECd8UaqHYbhscDCwhGln5Yh+3ctvcEgvmDPNjhKn/DL3sWprWvG8NAhP6sHMrsGhQFVdCWtTg==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/textfield": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AExmFvgE5nNF0UA4l2cSzPghtxSUQeeoyRjFLHLy+oAaE4eKZFrSy0zEpqPeWPQpEMDZk+6Y+6T3cOFYBeSvsw==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/theme": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-hs45hJoE9yVnoVOcsN1jklyOa51U4lzWsEnQEuJTPOk2+0HqCQ0yv/q0InpSnm2i69fNSyZC60+8HADZGF8ugQ==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tokens": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-r9TDoicmcT7FhUXC4eYMFnt9TZsz0G8T3wXvkKncLppYvZ517gPyD/1+yhuGfGOxAzxTrM66S/oEc1fFE2q4hw==", - "dependencies": { - "@material/elevation": "15.0.0-canary.7f224ddd4.0" - } - }, - "node_modules/@material/tooltip": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8qNk3pmPLTnam3XYC1sZuplQXW9xLn4Z4MI3D+U17Q7pfNZfoOugGr+d2cLA9yWAEjVJYB0mj8Yu86+udo4N9w==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/top-app-bar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SARR5/ClYT4CLe9qAXakbr0i0cMY0V3V4pe3ElIJPfL2Z2c4wGR1mTR8m2LxU1MfGKK8aRoUdtfKaxWejp+eNA==", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/touch-target": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BJo/wFKHPYLGsRaIpd7vsQwKr02LtO2e89Psv0on/p0OephlNIgeB9dD9W+bQmaeZsZ6liKSKRl6wJWDiK71PA==", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/typography": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kBaZeCGD50iq1DeRRH5OM5Jl7Gdk+/NOfKArkY4ksBZvJiStJ7ACAhpvb8MEGm4s3jvDInQFLsDq3hL+SA79sQ==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "node_modules/@material/material-color-utilities": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.3.0.tgz", + "integrity": "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==", + "dev": true }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", @@ -5377,6 +6484,36 @@ "zone.js": "^0.11.4 || ^0.13.0 || ^0.14.0 || ^0.15.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-web/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-web/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@opentelemetry/context-zone": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-zone/-/context-zone-1.30.1.tgz", @@ -5416,53 +6553,145 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.57.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.57.2.tgz", - "integrity": "sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", + "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-exporter-base": "0.57.2", - "@opentelemetry/otlp-transformer": "0.57.2", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1" + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/api-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", + "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/semantic-conventions": "1.21.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", + "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "dependencies": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", + "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.8.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", + "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", + "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", + "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.57.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", - "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", + "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" @@ -5505,6 +6734,25 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/instrumentation-document-load/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/instrumentation-document-load/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", @@ -5513,6 +6761,17 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/instrumentation-document-load/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@opentelemetry/instrumentation-fetch": { "version": "0.57.2", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.57.2.tgz", @@ -5544,6 +6803,25 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/instrumentation-fetch/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", @@ -5552,6 +6830,17 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/instrumentation-fetch/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@opentelemetry/instrumentation-user-interaction": { "version": "0.44.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-user-interaction/-/instrumentation-user-interaction-0.44.1.tgz", @@ -5583,6 +6872,25 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/instrumentation-user-interaction/node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/instrumentation-user-interaction/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", @@ -5591,6 +6899,17 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/instrumentation-user-interaction/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@opentelemetry/instrumentation-xml-http-request": { "version": "0.57.2", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.57.2.tgz", @@ -5622,21 +6941,17 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { + "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/instrumentation": { "version": "0.57.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.57.2.tgz", - "integrity": "sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/otlp-transformer": "0.57.2" + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -5645,24 +6960,57 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-xml-http-request/node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", + "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", "engines": { "node": ">=14" } @@ -5709,6 +7057,42 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.1.tgz", + "integrity": "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==", + "dependencies": { + "@opentelemetry/core": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resources": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", @@ -5898,9 +7282,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz", - "integrity": "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==", + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.34.0.tgz", + "integrity": "sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==", "engines": { "node": ">=14" } @@ -5953,6 +7337,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -5973,6 +7358,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -5993,6 +7379,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6013,6 +7400,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6033,6 +7421,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6053,6 +7442,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6073,6 +7463,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6093,6 +7484,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6113,6 +7505,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6133,6 +7526,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6153,6 +7547,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6173,6 +7568,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6193,6 +7589,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -6285,6 +7682,12 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", + "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", + "dev": true + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", @@ -6699,6 +8102,268 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "dev": true, + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", + "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-x64": "4.1.4", + "@tailwindcss/oxide-freebsd-x64": "4.1.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-x64-musl": "4.1.4", + "@tailwindcss/oxide-wasm32-wasi": "4.1.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", + "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", + "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", + "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", + "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", + "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", + "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", + "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", + "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", + "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", + "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@emnapi/wasi-threads": "^1.0.1", + "@napi-rs/wasm-runtime": "^0.2.8", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", + "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", + "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.4.tgz", + "integrity": "sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.4", + "@tailwindcss/oxide": "4.1.4", + "postcss": "^8.4.41", + "tailwindcss": "4.1.4" + } + }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -6922,6 +8587,12 @@ "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", "dev": true }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -7180,6 +8851,59 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.6.tgz", + "integrity": "sha512-6uzhO2aQ757p3bSHcemA8C4pqEXuyBqyGAM7cYpO0c6/igRMV9As9XL0W12h5EPYMclgr7FgjmbVQBoWEdJ/yA==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.7.18", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.18.tgz", + "integrity": "sha512-IxKdVWfZYasGiyxBcsROxq6FmDQu3MNNiOYJ/yqLKhe+Qq27IIWsK7ItbjS2M9L5aM5JxjWkIS7JDh7wnsn+CQ==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.1", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.1.tgz", + "integrity": "sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==", + "dev": true, + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@wry/caches": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", @@ -7275,6 +8999,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-import-attributes": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", @@ -7319,6 +9052,19 @@ "node": ">= 14" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -7421,12 +9167,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -7453,9 +9193,9 @@ } }, "node_modules/apollo-angular": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/apollo-angular/-/apollo-angular-7.0.2.tgz", - "integrity": "sha512-OBj+KnVfGsJ1wdsOj5CENyjBnd85vseAlgqW1kG4tvgz0QPgPlUHx5KBKhwlf2hWZceNQQcXoWQmnXxzdZbWDg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/apollo-angular/-/apollo-angular-10.0.3.tgz", + "integrity": "sha512-gBNxKVraflbEG5tcFHEklCYjmer6vlOQ8sOw3EfD8SvIlYqTQ0DqES7oOau9lnHDgINnCtFYDZ3/c2SjLsXxVg==", "dependencies": { "tslib": "^2.6.2" }, @@ -7463,18 +9203,12 @@ "node": ">=16" }, "peerDependencies": { - "@angular/core": "^17.0.0 || ^18.0.0", - "@apollo/client": "^3.0.0", + "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@apollo/client": "^3.13.1", "graphql": "^15.0.0 || ^16.0.0", "rxjs": "^6.0.0 || ^7.0.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7487,6 +9221,42 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", @@ -7589,6 +9359,50 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dev": true, + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7790,6 +9604,15 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -8005,13 +9828,23 @@ "node": ">=6" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=6" } }, "node_modules/caniuse-lite": { @@ -8034,6 +9867,98 @@ } ] }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -8087,6 +10012,15 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -8273,21 +10207,21 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -8387,6 +10321,17 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8535,6 +10480,27 @@ } } }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8645,6 +10611,21 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true + }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", @@ -8663,6 +10644,12 @@ "node": ">=4.0" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -8679,6 +10666,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", @@ -8740,6 +10736,15 @@ "node": ">= 0.8" } }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -8750,12 +10755,20 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, - "optional": true, "engines": { "node": ">=8" } @@ -8772,17 +10785,26 @@ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/dns-packet": { "version": "5.6.1", @@ -8863,6 +10885,37 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -9015,7 +11068,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, "engines": { "node": ">=0.12" }, @@ -9175,6 +11227,15 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -9442,6 +11503,62 @@ "node": ">=0.8.0" } }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dev": true, + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true + }, + "node_modules/fbjs/node_modules/ua-parser-js": { + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/fdir": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", @@ -9456,6 +11573,44 @@ } } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -9596,6 +11751,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9835,13 +12002,104 @@ "dev": true }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, + "node_modules/graphql-config": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.4.tgz", + "integrity": "sha512-ObdBeL3ycddHrNbFvhGZ12pK8jUzWvvyN2A+6ij3XrtLH/KrkXt+BboEAEgXmeUrTcD5RjJnz8IZu3Cgc/oX/w==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "cosmiconfig": "^9.0.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/graphql-config/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/graphql-config/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graphql-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", + "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "cross-fetch": "^3.1.5" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, + "node_modules/graphql-sock": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graphql-sock/-/graphql-sock-1.0.1.tgz", + "integrity": "sha512-gSA0CXdNMvNlpEnH2GY1//SUY7laDsAn51sDm4yh6TTH5UkfbNINydyUAoMHHkAaCaOLNXELQmu3GVcSOw4twg==", + "dev": true, + "peer": true, + "bin": { + "semantic-to-nullable": "dist/cli/to-nullable.js", + "semantic-to-strict": "dist/cli/to-strict.js" + }, + "peerDependencies": { + "graphql": "15.x || 16.x || 17.x" + } + }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", @@ -9908,6 +12166,16 @@ "node": ">= 0.4" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -10269,13 +12537,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } @@ -10289,6 +12569,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10315,6 +12604,116 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -10337,6 +12736,19 @@ "node": ">= 10" } }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -10444,6 +12856,15 @@ "node": ">=8" } }, + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -10486,6 +12907,30 @@ "node": ">=0.10.0" } }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -10498,12 +12943,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -10552,6 +13015,15 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -10683,6 +13155,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10733,6 +13214,19 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11161,13 +13655,232 @@ } } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, "engines": { - "node": ">=10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lines-and-columns": { @@ -11314,6 +14027,17 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -11330,49 +14054,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -11514,6 +14195,24 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", + "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -11578,6 +14277,15 @@ "node": ">= 0.6" } }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -11639,6 +14347,23 @@ "node": ">= 8" } }, + "node_modules/meros": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", + "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", + "dev": true, + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -11999,17 +14724,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -12073,6 +14787,16 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", @@ -12080,6 +14804,46 @@ "dev": true, "optional": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12202,6 +14966,12 @@ "node": ">=18" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -12347,6 +15117,12 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12355,15 +15131,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -12490,37 +15257,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -12552,18 +15288,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -12648,6 +15372,15 @@ "node": ">= 4" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -12685,6 +15418,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12697,6 +15440,20 @@ "node": ">=6" } }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -12734,7 +15491,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, "dependencies": { "entities": "^4.4.0" }, @@ -12777,6 +15533,26 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -12809,6 +15585,27 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -12867,24 +15664,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/piscina": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", @@ -12937,89 +15716,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/postcss-loader": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", @@ -13116,29 +15812,10 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -13169,6 +15846,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -13332,15 +16018,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -13488,6 +16165,38 @@ } } }, + "node_modules/relay-runtime": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", + "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0", + "invariant": "^2.2.4" + } + }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -13519,6 +16228,12 @@ "node": ">=8.6.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -13592,14 +16307,6 @@ "node": ">=0.10.0" } }, - "node_modules/response-iterator": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", - "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -13722,6 +16429,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -13779,11 +16495,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/safevalues": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", - "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" - }, "node_modules/sass": { "version": "1.85.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", @@ -13915,6 +16626,12 @@ } } }, + "node_modules/scuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", + "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14011,6 +16728,17 @@ "node": ">= 0.8" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -14113,6 +16841,18 @@ "node": ">= 0.8" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14253,6 +16993,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", + "dev": true + }, "node_modules/sigstore": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", @@ -14308,6 +17054,16 @@ "npm": ">= 3.0.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/socket.io": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", @@ -14519,6 +17275,15 @@ "wbuf": "^1.7.3" } }, + "node_modules/sponge-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", + "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -14569,6 +17334,12 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true + }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -14668,72 +17439,6 @@ "node": ">=8" } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -14760,6 +17465,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swap-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", + "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -14768,55 +17482,44 @@ "node": ">=0.10" } }, - "node_modules/tailwindcss": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", - "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", + "node_modules/sync-fetch": { + "version": "0.6.0-2", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0-2.tgz", + "integrity": "sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==", "dev": true, "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/sync-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">=10.13.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -14977,27 +17680,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -15010,12 +17692,27 @@ "tslib": "^2" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/tinyglobby": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", @@ -15032,6 +17729,15 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -15065,6 +17771,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/tree-dump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", @@ -15090,12 +17802,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", @@ -15107,6 +17813,12 @@ "node": ">=8" } }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "dev": true + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -15216,6 +17928,15 @@ "node": "*" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -15306,6 +18027,30 @@ "node": ">= 4.0.0" } }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -15345,6 +18090,30 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15516,11 +18285,26 @@ "dev": true, "optional": true }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/web-vitals": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", @@ -15770,6 +18554,25 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -15782,6 +18585,12 @@ "which": "bin/which" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -15962,6 +18771,12 @@ "node": ">= 14" } }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/service/app-hub/dashboard/package.json b/service/app-hub/dashboard/package.json index 4e97923..8a3e191 100644 --- a/service/app-hub/dashboard/package.json +++ b/service/app-hub/dashboard/package.json @@ -6,22 +6,23 @@ "start": "ng serve", "build": "ng build -c production", "watch": "ng build --watch --configuration development", - "test": "ng test" + "test": "ng test", + "gql-generate": "graphql-codegen --config codegen.ts" }, "private": true, "dependencies": { "@angular/animations": "^19.2.6", - "@angular/cdk": "^18.1.1", + "@angular/cdk": "^19.2.9", "@angular/common": "^19.2.6", "@angular/compiler": "^19.2.6", "@angular/core": "^19.2.6", "@angular/forms": "^19.2.6", - "@angular/material": "^18.1.1", - "@angular/material-date-fns-adapter": "^18.1.1", + "@angular/material": "^19.2.9", + "@angular/material-date-fns-adapter": "^19.2.9", "@angular/platform-browser": "^19.2.6", "@angular/platform-browser-dynamic": "^19.2.6", "@angular/router": "^19.2.6", - "@apollo/client": "^3.0.0", + "@apollo/client": "^3.13.8", "@azure/msal-angular": "^3.0.22", "@azure/msal-browser": "^3.19.1", "@grafana/faro-web-sdk": "^1.15.0", @@ -33,16 +34,17 @@ "@opentelemetry/auto-instrumentations-web": "^0.45.1", "@opentelemetry/context-zone": "^1.30.1", "@opentelemetry/core": "^2.0.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.57.2", - "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", "@opentelemetry/instrumentation-document-load": "^0.44.1", + "@opentelemetry/propagator-b3": "^1.30.1", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-web": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.30.0", - "apollo-angular": "^7.0.2", + "@opentelemetry/semantic-conventions": "^1.34.0", + "apollo-angular": "^10.0.3", "date-fns": "^3.6.0", "echarts": "^5.5.1", - "graphql": "^16", + "graphql": "^16.11.0", "graphql-ws": "^5.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -53,6 +55,12 @@ "@angular/cli": "^19.2.7", "@angular/compiler-cli": "^19.2.6", "@angular/localize": "^19.2.6", + "@graphql-codegen/cli": "^5.0.5", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/typescript-apollo-angular": "^4.0.0", + "@graphql-codegen/typescript-operations": "^4.6.0", + "@material/material-color-utilities": "^0.3.0", + "@tailwindcss/postcss": "^4.1.4", "@types/jasmine": "~5.1.0", "autoprefixer": "^10.4.19", "jasmine-core": "~5.1.0", @@ -62,7 +70,7 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "postcss": "^8.4.39", - "tailwindcss": "^3.4.6", + "tailwindcss": "^4.1.4", "typescript": "~5.5.2" } } diff --git a/service/app-hub/dashboard/src/app/app.config.ts b/service/app-hub/dashboard/src/app/app.config.ts index 26bed45..c700c49 100644 --- a/service/app-hub/dashboard/src/app/app.config.ts +++ b/service/app-hub/dashboard/src/app/app.config.ts @@ -19,10 +19,10 @@ import { GlobalErrorHandler } from './core/telemetry/global-error-handler'; export const appConfig: ApplicationConfig = { providers: [ - provideAppInitializer(() => { - const initializerFn = faroInitializer(); - return initializerFn(); - }), + // provideAppInitializer(() => { + // const initializerFn = faroInitializer(); + // return initializerFn(); + // }), { provide: ErrorHandler, useClass: GlobalErrorHandler, diff --git a/service/app-hub/dashboard/src/app/app.routes.ts b/service/app-hub/dashboard/src/app/app.routes.ts index 8f92bd3..38a7e90 100644 --- a/service/app-hub/dashboard/src/app/app.routes.ts +++ b/service/app-hub/dashboard/src/app/app.routes.ts @@ -3,6 +3,18 @@ import { MsalGuard } from '@azure/msal-angular'; import { roleGuard } from './core/components/ms-authentication/role.guard'; export const routes: Routes = [ + { + path: 'home', + loadComponent: () => + import('./pages/home/home.component').then( + (m) => m.HomeComponent + ), + canActivate: [MsalGuard, roleGuard], + data: { + title: 'Home', + roles: ['manager', 'admin'], + }, + }, { path: 'control-center', loadChildren: () => diff --git a/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.html b/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.html index 9de9513..44339ab 100644 --- a/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.html +++ b/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.html @@ -1,7 +1,7 @@ Navigation + Home Dashboard Leitstelle Dashboard Manager Abrechnung - Ticket System diff --git a/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.scss b/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.scss index 631c2d7..5e946c2 100644 --- a/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.scss +++ b/service/app-hub/dashboard/src/app/core/components/app-shell/app-shell.component.scss @@ -1,3 +1,16 @@ -:root { - --mat-toolbar-container-background-color: #17253D; +@use '@angular/material' as mat; + +:host { + @include mat.sidenav-overrides(( + container-width: 16rem, + )); +} + +.nav-link-active { + background-color: var(--mat-sys-primary); + @include mat.list-overrides(( + list-item-label-text-color: var(--mat-sys-on-primary), + list-item-hover-label-text-color: var(--mat-sys-on-primary), + list-item-focus-label-text-color: var(--mat-sys-on-primary) + )); } \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/core/components/avatar/avatar.component.ts b/service/app-hub/dashboard/src/app/core/components/avatar/avatar.component.ts index 1a22f43..31c2d44 100644 --- a/service/app-hub/dashboard/src/app/core/components/avatar/avatar.component.ts +++ b/service/app-hub/dashboard/src/app/core/components/avatar/avatar.component.ts @@ -8,8 +8,9 @@ import { AuthService } from '../ms-authentication/auth.service'; changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-avatar', template: `
{{ userInitials$ | async }}
diff --git a/service/app-hub/dashboard/src/app/core/components/charts/gauge-chart/gauge-chart.component.ts b/service/app-hub/dashboard/src/app/core/components/charts/gauge-chart/gauge-chart.component.ts new file mode 100644 index 0000000..90ff48e --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/charts/gauge-chart/gauge-chart.component.ts @@ -0,0 +1,94 @@ +import { Component, computed, effect, input, signal } from '@angular/core'; +import { EChartsOption } from 'echarts'; +import { GaugeChart } from 'echarts/charts'; +import { ECharts } from 'echarts/core'; +import { UtilNgxEchartsModule } from '../../ngx-echarts/util-ngx-echarts.module'; + +@Component({ + selector: 'app-gauge-chart', + imports: [UtilNgxEchartsModule], + template: `
`, + styles: ``, +}) +export class GaugeChartComponent { + private chart?: ECharts; + + value = input.required(); + options = computed(() => ({ + series: [ + { + type: 'gauge', + center: ['50%', '100%'], + startAngle: 180, + endAngle: -40, + radius: '200%', + min: 0, + max: 100, + progress: { + show: true, + width: 4, + }, + pointer: { + show: false, + }, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + splitLine: { + show: false, + }, + axisLabel: { + show: false, + }, + detail: { + valueAnimation: true, + width: '100%', + lineHeight: 20, + borderRadius: 8, + offsetCenter: [0, '-30%'], + fontSize: 28, + fontWeight: 'normal', + formatter: '{value}%', + color: 'inherit', + }, + data: [ + { + value: this.value(), + }, + ], + }, + ], + })); + extentions = signal([GaugeChart]); + + constructor() { + effect(() => { + if (!!this.chart) { + this.chart.setOption({ + series: [ + { + data: [ + { + value: this.value(), + }, + ], + }, + ], + }); + } + }); + } + + setChartInstance(chart: ECharts) { + this.chart = chart; + } +} diff --git a/service/app-hub/dashboard/src/app/core/components/confirm-dialog/confirm-dialog.component.ts b/service/app-hub/dashboard/src/app/core/components/confirm-dialog/confirm-dialog.component.ts index 7beb74d..8ba276d 100644 --- a/service/app-hub/dashboard/src/app/core/components/confirm-dialog/confirm-dialog.component.ts +++ b/service/app-hub/dashboard/src/app/core/components/confirm-dialog/confirm-dialog.component.ts @@ -8,16 +8,26 @@ export interface ConfirmDialogData { } @Component({ - template: `
+ template: `
{{ ref.data.title }}
{{ ref.data.body }}
- - + +
`, - imports: [MatButtonModule, DialogCloseDirective], - changeDetection: ChangeDetectionStrategy.OnPush + styles: `@use "@angular/material" as mat; + + .warn-btn { + @include mat.button-overrides( + ( + text-label-text-color: var(--mat-sys-error) + ) + ); + } + `, + imports: [MatButtonModule, DialogCloseDirective], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ConfirmDialogComponent { ref: DialogRef = inject(DialogRef); diff --git a/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.html b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.html new file mode 100644 index 0000000..f6d089a --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.html @@ -0,0 +1,36 @@ + + @if(title() !== undefined || subtitle() !== undefined) { + + {{ title() }} + {{ subtitle() }} + + } + +
+ @if (chartLabel() !== undefined && chartValue() !== undefined) { +
+
+ ⓘ +
+ +
+ } @if (chartValue() !== undefined) { + + } + + + +
+ @if (hasMainContentContent() && hasFooterContent()) { + + } +
+ @if (hasFooterContent()) { + + + + } +
diff --git a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.scss b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.scss similarity index 100% rename from service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.scss rename to service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.scss diff --git a/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.spec.ts b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.spec.ts new file mode 100644 index 0000000..a773892 --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InfoCardComponent } from './info-card.component'; + +describe('InfoCardComponent', () => { + let component: InfoCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [InfoCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(InfoCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.ts b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.ts new file mode 100644 index 0000000..a05185f --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/info-card/info-card.component.ts @@ -0,0 +1,107 @@ +import { + AfterContentInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ContentChildren, + input, + NgModule, + QueryList, + signal, +} from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { GaugeChartComponent } from '../charts/gauge-chart/gauge-chart.component'; +import { UtilNgxEchartsModule } from '../ngx-echarts/util-ngx-echarts.module'; +import { MatDividerModule } from '@angular/material/divider'; + +@Component({ + standalone: false, + selector: 'app-info-card-footer', + template: `
{{ value() }}
+
{{ label() }}
`, + host: { class: 'flex flex-col items-center' }, +}) +export class InfoCardFooterValueGroup { + value = input.required(); + label = input(); +} + +@Component({ + standalone: false, + selector: 'app-info-card-content', + template: `
+ {{ label() }} +
+
+ {{ value() }} +
`, + host: { class: 'flex flex-col' }, +}) +export class InfoCardContentValueGroup { + value = input.required(); + label = input(); +} + +@Component({ + standalone: false, + selector: 'app-info-card', + templateUrl: './info-card.component.html', + styleUrl: './info-card.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InfoCardComponent implements AfterContentInit { + @ContentChildren(InfoCardFooterValueGroup) + projectedFooterItems!: QueryList; + hasFooterContent = signal(false); + + @ContentChildren(InfoCardContentValueGroup) + projectedMainContentItems!: QueryList; + hasMainContentContent = signal(false); + + chartValue = input(); + chartLabel = input(); + title = input(); + subtitle = input(); + + constructor(private readonly cdr: ChangeDetectorRef) {} + + ngAfterContentInit() { + this.hasFooterContent.set(this.projectedFooterItems.length > 0); + this.hasMainContentContent.set(this.projectedMainContentItems.length > 0); + this.cdr.detectChanges(); + this.projectedFooterItems.changes.subscribe(() => { + this.hasFooterContent.set(this.projectedFooterItems.length > 0); + }); + this.projectedMainContentItems.changes.subscribe(() => { + this.hasMainContentContent.set(this.projectedMainContentItems.length > 0); + }); + } +} + +@NgModule({ + imports: [ + MatCardModule, + MatDividerModule, + MatTooltipModule, + UtilNgxEchartsModule, + GaugeChartComponent, + ], + declarations: [ + InfoCardComponent, + InfoCardContentValueGroup, + InfoCardFooterValueGroup, + ], + exports: [ + InfoCardComponent, + InfoCardContentValueGroup, + InfoCardFooterValueGroup, + ], +}) +export class InfoCardModule {} diff --git a/service/app-hub/dashboard/src/app/core/components/ms-authentication/auth.service.ts b/service/app-hub/dashboard/src/app/core/components/ms-authentication/auth.service.ts index 338f6b6..1b89b59 100644 --- a/service/app-hub/dashboard/src/app/core/components/ms-authentication/auth.service.ts +++ b/service/app-hub/dashboard/src/app/core/components/ms-authentication/auth.service.ts @@ -1,4 +1,4 @@ -import { Injectable, OnDestroy, inject } from '@angular/core'; +import { Injectable, OnDestroy, inject, signal } from '@angular/core'; import { MsalBroadcastService, MsalService } from '@azure/msal-angular'; import { AccountInfo, InteractionStatus } from '@azure/msal-browser'; import { @@ -20,12 +20,14 @@ export class AuthService implements OnDestroy { activeAccount$ = this.account$.pipe( tap((account) => this.msalService.instance.setActiveAccount(account ?? null) - ) + ), + tap((account) => this.activeAccount.set(account)) ); + activeAccount = signal(undefined); roles$ = this.activeAccount$.pipe( filter(Boolean), map((account) => account?.idTokenClaims?.roles), - shareReplay(1), + shareReplay(1) ); msalService = inject(MsalService); diff --git a/service/app-hub/dashboard/src/app/core/components/ngx-echarts/echarts.directive.ts b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/echarts.directive.ts index 9f3d822..cfa704d 100644 --- a/service/app-hub/dashboard/src/app/core/components/ngx-echarts/echarts.directive.ts +++ b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/echarts.directive.ts @@ -13,10 +13,14 @@ import { EChartsOption } from 'echarts'; import { filter, interval, map, Observable, Subscription } from 'rxjs'; import * as echarts from 'echarts/core'; import { CanvasRenderer } from 'echarts/renderers'; +import waldenTheme from './walden.theme.json'; +import westerosTheme from './westeros.theme.json'; + +const CUSTOM_THEME_TOKEN = 'customTheme'; @Directive({ - selector: '[dksEcharts]', - standalone: false + selector: '[dksEcharts]', + standalone: false, }) export class EchartsDirective implements OnInit, OnDestroy, OnChanges { @Input() options?: EChartsOption; @@ -38,16 +42,21 @@ export class EchartsDirective implements OnInit, OnDestroy, OnChanges { ngOnInit(): void { echarts.use([...this.extentions, CanvasRenderer]); - this.echartsInstance = echarts.init(this._el.nativeElement, this.theme, { - width: - this._el.nativeElement.clientWidth === 0 - ? this.defaultWidth - : undefined, - height: - this._el.nativeElement.clientHeight === 0 - ? this.defaultHeight - : undefined, - }); + echarts.registerTheme(CUSTOM_THEME_TOKEN, westerosTheme.theme); + this.echartsInstance = echarts.init( + this._el.nativeElement, + CUSTOM_THEME_TOKEN, + { + width: + this._el.nativeElement.clientWidth === 0 + ? this.defaultWidth + : undefined, + height: + this._el.nativeElement.clientHeight === 0 + ? this.defaultHeight + : undefined, + } + ); this.chartInit.emit(this.echartsInstance); this.setParams(); if (this.isResizable) { @@ -93,7 +102,7 @@ export class EchartsDirective implements OnInit, OnDestroy, OnChanges { private getWidthSensor( element: HTMLElement, - periodicityInMilliseconds: number = 2000 + periodicityInMilliseconds: number = 1000 ): Observable { let oldWidth = element.clientWidth; return interval(periodicityInMilliseconds).pipe( diff --git a/service/app-hub/dashboard/src/app/core/components/ngx-echarts/walden.theme.json b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/walden.theme.json new file mode 100644 index 0000000..1a079f1 --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/walden.theme.json @@ -0,0 +1,392 @@ + +{ + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "backgroundColor": "rgba(252,252,252,0)", + "textStyle": {}, + "title": { + "textStyle": { + "color": "#666666" + }, + "subtextStyle": { + "color": "#999999" + } + }, + "line": { + "itemStyle": { + "borderWidth": "2" + }, + "lineStyle": { + "width": "3" + }, + "symbolSize": "8", + "symbol": "emptyCircle", + "smooth": false + }, + "radar": { + "itemStyle": { + "borderWidth": "2" + }, + "lineStyle": { + "width": "3" + }, + "symbolSize": "8", + "symbol": "emptyCircle", + "smooth": false + }, + "bar": { + "itemStyle": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + } + }, + "pie": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "scatter": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "boxplot": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "parallel": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "sankey": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "funnel": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "gauge": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "candlestick": { + "itemStyle": { + "color": "#e6a0d2", + "color0": "transparent", + "borderColor": "#e6a0d2", + "borderColor0": "#3fb1e3", + "borderWidth": "2" + } + }, + "graph": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "lineStyle": { + "width": "1", + "color": "#cccccc" + }, + "symbolSize": "8", + "symbol": "emptyCircle", + "smooth": false, + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "label": { + "color": "#ffffff" + } + }, + "map": { + "itemStyle": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "label": { + "color": "#ffffff" + }, + "emphasis": { + "itemStyle": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + }, + "label": { + "color": "#3fb1e3" + } + } + }, + "geo": { + "itemStyle": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "label": { + "color": "#ffffff" + }, + "emphasis": { + "itemStyle": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + }, + "label": { + "color": "#3fb1e3" + } + } + }, + "categoryAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "valueAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "logAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "timeAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "toolbox": { + "iconStyle": { + "borderColor": "#999999" + }, + "emphasis": { + "iconStyle": { + "borderColor": "#666666" + } + } + }, + "legend": { + "textStyle": { + "color": "#999999" + } + }, + "tooltip": { + "axisPointer": { + "lineStyle": { + "color": "#cccccc", + "width": 1 + }, + "crossStyle": { + "color": "#cccccc", + "width": 1 + } + } + }, + "timeline": { + "lineStyle": { + "color": "#626c91", + "width": 1 + }, + "itemStyle": { + "color": "#626c91", + "borderWidth": 1 + }, + "controlStyle": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + }, + "checkpointStyle": { + "color": "#3fb1e3", + "borderColor": "#3fb1e3" + }, + "label": { + "color": "#626c91" + }, + "emphasis": { + "itemStyle": { + "color": "#626c91" + }, + "controlStyle": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + }, + "label": { + "color": "#626c91" + } + } + }, + "visualMap": { + "color": [ + "#2a99c9", + "#afe8ff" + ] + }, + "dataZoom": { + "backgroundColor": "rgba(255,255,255,0)", + "dataBackgroundColor": "rgba(222,222,222,1)", + "fillerColor": "rgba(114,230,212,0.25)", + "handleColor": "#cccccc", + "handleSize": "100%", + "textStyle": { + "color": "#999999" + } + }, + "markPoint": { + "label": { + "color": "#ffffff" + }, + "emphasis": { + "label": { + "color": "#ffffff" + } + } + } +} diff --git a/service/app-hub/dashboard/src/app/core/components/ngx-echarts/westeros.theme.json b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/westeros.theme.json new file mode 100644 index 0000000..c765ea3 --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/components/ngx-echarts/westeros.theme.json @@ -0,0 +1,168 @@ +{ + "version": 1, + "themeName": "westeros", + "theme": { + "seriesCnt": "6", + "backgroundColor": "rgba(0,0,0,0)", + "titleColor": "#3956bf", + "subtitleColor": "#1794b5", + "textColorShow": false, + "textColor": "#333", + "markTextColor": "#eeeeee", + "color": [ + "#3956bf", + "#1794b5", + "#93b7e3", + "#a5e7f0", + "#cbb0e3", + "#edafda" + ], + "borderColor": "#ccc", + "borderWidth": 0, + "visualMapColor": [ + "#516b91", + "#59c4e6", + "#a5e7f0" + ], + "legendTextColor": "#999999", + "kColor": "#edafda", + "kColor0": "transparent", + "kBorderColor": "#d680bc", + "kBorderColor0": "#8fd3e8", + "kBorderWidth": "2", + "lineWidth": "2", + "symbolSize": "6", + "symbol": "emptyCircle", + "symbolBorderWidth": "2", + "lineSmooth": true, + "graphLineWidth": 1, + "graphLineColor": "#aaaaaa", + "mapLabelColor": "#000", + "mapLabelColorE": "#516b91", + "mapBorderColor": "#516b91", + "mapBorderColorE": "#516b91", + "mapBorderWidth": 0.5, + "mapBorderWidthE": 1, + "mapAreaColor": "#f3f3f3", + "mapAreaColorE": "#a5e7f0", + "axes": [ + { + "type": "all", + "name": "通用坐标轴", + "axisLineShow": true, + "axisLineColor": "#cccccc", + "axisTickShow": false, + "axisTickColor": "#333", + "axisLabelShow": true, + "axisLabelColor": "#999999", + "splitLineShow": true, + "splitLineColor": [ + "#eeeeee" + ], + "splitAreaShow": false, + "splitAreaColor": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + }, + { + "type": "category", + "name": "类目坐标轴", + "axisLineShow": true, + "axisLineColor": "#333", + "axisTickShow": true, + "axisTickColor": "#333", + "axisLabelShow": true, + "axisLabelColor": "#333", + "splitLineShow": false, + "splitLineColor": [ + "#ccc" + ], + "splitAreaShow": false, + "splitAreaColor": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + }, + { + "type": "value", + "name": "数值坐标轴", + "axisLineShow": true, + "axisLineColor": "#333", + "axisTickShow": true, + "axisTickColor": "#333", + "axisLabelShow": true, + "axisLabelColor": "#333", + "splitLineShow": true, + "splitLineColor": [ + "#ccc" + ], + "splitAreaShow": false, + "splitAreaColor": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + }, + { + "type": "log", + "name": "对数坐标轴", + "axisLineShow": true, + "axisLineColor": "#333", + "axisTickShow": true, + "axisTickColor": "#333", + "axisLabelShow": true, + "axisLabelColor": "#333", + "splitLineShow": true, + "splitLineColor": [ + "#ccc" + ], + "splitAreaShow": false, + "splitAreaColor": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + }, + { + "type": "time", + "name": "时间坐标轴", + "axisLineShow": true, + "axisLineColor": "#333", + "axisTickShow": true, + "axisTickColor": "#333", + "axisLabelShow": true, + "axisLabelColor": "#333", + "splitLineShow": true, + "splitLineColor": [ + "#ccc" + ], + "splitAreaShow": false, + "splitAreaColor": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + } + ], + "axisSeperateSetting": false, + "toolboxColor": "#999999", + "toolboxEmphasisColor": "#666666", + "tooltipAxisColor": "#cccccc", + "tooltipAxisWidth": 1, + "timelineLineColor": "#8fd3e8", + "timelineLineWidth": 1, + "timelineItemColor": "#8fd3e8", + "timelineItemColorE": "#8fd3e8", + "timelineCheckColor": "#8fd3e8", + "timelineCheckBorderColor": "#8a7ca8", + "timelineItemBorderWidth": 1, + "timelineControlColor": "#8fd3e8", + "timelineControlBorderColor": "#8fd3e8", + "timelineControlBorderWidth": 0.5, + "timelineLabelColor": "#8fd3e8", + "datazoomBackgroundColor": "rgba(0,0,0,0)", + "datazoomDataColor": "rgba(255,255,255,0.3)", + "datazoomFillColor": "rgba(167,183,204,0.4)", + "datazoomHandleColor": "#a7b7cc", + "datazoomHandleWidth": "100", + "datazoomLabelColor": "#333" + } +} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/core/data-access/graphql/generated/generated.ts b/service/app-hub/dashboard/src/app/core/data-access/graphql/generated/generated.ts index 51f62ed..069bb95 100644 --- a/service/app-hub/dashboard/src/app/core/data-access/graphql/generated/generated.ts +++ b/service/app-hub/dashboard/src/app/core/data-access/graphql/generated/generated.ts @@ -82,6 +82,19 @@ export type DocumentInfo = { tdLocation?: Maybe; }; +export type HomeDashboardKpIs = { + __typename?: 'HomeDashboardKPIs'; + anomalyCount: Scalars['Int']['output']; + billableTourCount: Scalars['Int']['output']; + billableTourRevenueSum: Scalars['Float']['output']; + billedTourCount: Scalars['Int']['output']; + billedTourNegativeRevenueDeviation: Scalars['Float']['output']; + billedTourPositiveRevenueDeviation: Scalars['Float']['output']; + employeesWithoutTourCount: Scalars['Int']['output']; + revenueTrend: Array; + toursWithoutApprovalCount: Scalars['Int']['output']; +}; + export type Interval = { __typename?: 'Interval'; end: Scalars['DateTime']['output']; @@ -108,6 +121,19 @@ export type KpiMetadata = { tourAmount: Scalars['Float']['output']; }; +export type KpiInfo = { + __typename?: 'KpiInfo'; + additional: Array; + main: Metric; + secondary: Metric; +}; + +export type Metric = { + __typename?: 'Metric'; + label: Scalars['String']['output']; + value: Scalars['Float']['output']; +}; + export type Mutation = { __typename?: 'Mutation'; acceptAnomaly: Anomaly; @@ -175,19 +201,19 @@ export type Query = { anomalies: PaginatedAnomaly; anomaliesProto: Array; anomaly: Anomaly; - anomalyAmountByType: Array; - averageAnomalyResolutionTimeReport: Array; groupedAnomalies: PaginatedAnomalyGroup; + homeDashboardKpis: HomeDashboardKpIs; + managerKpi: KpiInfo; searchTickets: Array; ticket: Ticket; ticketStateKeyFigures: TicketStateKeyFigures; + ticketStateKpi: KpiInfo; ticketStateMeta: TicketStateMeta; tickets: PaginatedTicket; timePerTourMetricForDay: Array; timePerTourMetricForMonth: Array; - tour: Tour; + tourCostBreakdown: TourCostBreakdown; toursPerTimeKPI: Array; - upcomingTourNotificationReport: Array; upcomingTours: Array; }; @@ -222,6 +248,11 @@ export type QueryGroupedAnomaliesArgs = { }; +export type QueryManagerKpiArgs = { + ordinanceType: Scalars['String']['input']; +}; + + export type QuerySearchTicketsArgs = { query: Scalars['String']['input']; }; @@ -237,6 +268,11 @@ export type QueryTicketStateKeyFiguresArgs = { }; +export type QueryTicketStateKpiArgs = { + state: TicketValidationState; +}; + + export type QueryTicketStateMetaArgs = { state: TicketValidationState; }; @@ -262,7 +298,7 @@ export type QueryTimePerTourMetricForMonthArgs = { }; -export type QueryTourArgs = { +export type QueryTourCostBreakdownArgs = { operationId: Scalars['String']['input']; }; @@ -271,10 +307,18 @@ export type QueryToursPerTimeKpiArgs = { ordinanceTypes: Scalars['String']['input']; }; -export type Report = { - __typename?: 'Report'; - label: Scalars['String']['output']; +export type RevenueTrend = { + __typename?: 'RevenueTrend'; + date: Scalars['DateTime']['output']; + ordinanceType: Scalars['String']['output']; + revenueSum: Scalars['Float']['output']; +}; + +export type ServicePosition = { + __typename?: 'ServicePosition'; + description: Scalars['String']['output']; value: Scalars['Float']['output']; + variant: Scalars['String']['output']; }; export type SolutionTarget = { @@ -433,9 +477,18 @@ export type Tour = { type: Scalars['String']['output']; }; +export type TourCostBreakdown = { + __typename?: 'TourCostBreakdown'; + servicePositions: Array; + tariffDescription: Scalars['String']['output']; + tariffValidityPeriod: Scalars['String']['output']; +}; + export type TourStateMeta = { __typename?: 'TourStateMeta'; count: Scalars['Int']['output']; + negativeRevenueDeviation?: Maybe; + positiveRevenueDeviation?: Maybe; revenueSum?: Maybe; }; @@ -471,6 +524,11 @@ export type AcceptAnomalyMutationVariables = Exact<{ export type AcceptAnomalyMutation = { __typename?: 'Mutation', acceptAnomaly: { __typename?: 'Anomaly', id: string, type: string, description: string, groupKey: string, groupDescription: string, sleepTimer: number, sleepSince?: any | null, workedOnBy: string, resolvedAt?: any | null, createdAt: any, solution: Array<{ __typename?: 'SolutionTarget', anomalyId: string, id: string, name: string, steps: Array<{ __typename?: 'SolutionTargetStep', description: string, id: string, solutionTargetId: string }> }> } }; +export type HomeDashboardQueryVariables = Exact<{ [key: string]: never; }>; + + +export type HomeDashboardQuery = { __typename?: 'Query', homeDashboardKpis: { __typename?: 'HomeDashboardKPIs', anomalyCount: number, employeesWithoutTourCount: number, toursWithoutApprovalCount: number, billableTourCount: number, billableTourRevenueSum: number, billedTourCount: number, billedTourPositiveRevenueDeviation: number, billedTourNegativeRevenueDeviation: number, revenueTrend: Array<{ __typename?: 'RevenueTrend', date: any, ordinanceType: string, revenueSum: number }> } }; + export type TimePerTourUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; @@ -506,20 +564,19 @@ export type GetTimePerTourMetricForMonthQueryVariables = Exact<{ export type GetTimePerTourMetricForMonthQuery = { __typename?: 'Query', timePerTourMetricForMonth: Array<{ __typename?: 'TimePerTourMetric', availableTime: number, tourAmount: number, breakEven: number, revenue: number, averageRevenue: number, personnelCost: number, consumptionCost: number, forecast: number, forecastRevenue: number, interval: { __typename?: 'Interval', start: any, end: any }, categoryAmounts: Array<{ __typename?: 'TimePerTourMetricCategoryAmount', category: string, amount: number }> }> }; -export type GetAnomalyByTypeReportQueryVariables = Exact<{ [key: string]: never; }>; +export type TicketStateKpiQueryVariables = Exact<{ + state: TicketValidationState; +}>; -export type GetAnomalyByTypeReportQuery = { __typename?: 'Query', anomalyAmountByType: Array<{ __typename?: 'Report', label: string, value: number }> }; +export type TicketStateKpiQuery = { __typename?: 'Query', ticketStateKpi: { __typename?: 'KpiInfo', main: { __typename?: 'Metric', label: string, value: number }, secondary: { __typename?: 'Metric', label: string, value: number }, additional: Array<{ __typename?: 'Metric', label: string, value: number }> } }; -export type GetUpcomingTourNotificationReportQueryVariables = Exact<{ [key: string]: never; }>; +export type ManagerKpiQueryVariables = Exact<{ + ordinanceType: Scalars['String']['input']; +}>; -export type GetUpcomingTourNotificationReportQuery = { __typename?: 'Query', upcomingTourNotificationReport: Array<{ __typename?: 'Report', label: string, value: number }> }; - -export type GetAverageAnomalyResolutionTimeReportQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetAverageAnomalyResolutionTimeReportQuery = { __typename?: 'Query', averageAnomalyResolutionTimeReport: Array<{ __typename?: 'Report', label: string, value: number }> }; +export type ManagerKpiQuery = { __typename?: 'Query', managerKpi: { __typename?: 'KpiInfo', main: { __typename?: 'Metric', label: string, value: number }, secondary: { __typename?: 'Metric', label: string, value: number }, additional: Array<{ __typename?: 'Metric', label: string, value: number }> } }; export type TicketsUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; @@ -569,7 +626,7 @@ export type GetAccountingStateMetaQueryVariables = Exact<{ }>; -export type GetAccountingStateMetaQuery = { __typename?: 'Query', accountingStateMeta: { __typename?: 'TourStateMeta', count: number, revenueSum?: number | null } }; +export type GetAccountingStateMetaQuery = { __typename?: 'Query', accountingStateMeta: { __typename?: 'TourStateMeta', count: number, revenueSum?: number | null, positiveRevenueDeviation?: number | null, negativeRevenueDeviation?: number | null } }; export type GetAccountingToursQueryVariables = Exact<{ state: AccountingState; @@ -581,6 +638,13 @@ export type GetAccountingToursQueryVariables = Exact<{ export type GetAccountingToursQuery = { __typename?: 'Query', accountingTours: { __typename?: 'PaginatedTour', prevCursor: string, endCursor: string, hasNextPage: boolean, totalCount: number, nodes: Array<{ __typename?: 'Tour', id: string, done: boolean, direction: string, carName?: string | null, operationId: string, driverName?: string | null, codriverName?: string | null, patientName?: string | null, patientSurname?: string | null, patientStreet?: string | null, patientZip?: string | null, patientCity?: string | null, healthInsurance?: string | null, category?: string | null, transportType?: string | null, ordinanceType?: string | null, startStreet?: string | null, startZip?: string | null, startCity?: string | null, targetStreet?: string | null, targetZip?: string | null, targetCity?: string | null, startDate?: any | null, check: number, occupiedKm: number, totalKm: number, type: string, rangeEndDate?: any | null, startBegin?: string | null, startEnd?: string | null, target?: string | null, targetBegin?: string | null, empty?: string | null, billDate?: any | null, billNumber?: string | null, consumptionCosts: number, revenue: number, revenueDispoLive: number, revenueDeviation: number, startInstitution?: string | null, targetInstitution?: string | null, ticketId?: string | null, createdAt?: any | null, ticket?: { __typename?: 'Ticket', id: string, currentState: TicketValidationState, approvalState?: ApprovalState | null, errors: Array, notes: Array, isUrgent: boolean, urgency: any, createdAt: any } | null }> } }; +export type GetTourCostBreakdownQueryVariables = Exact<{ + operationId: Scalars['String']['input']; +}>; + + +export type GetTourCostBreakdownQuery = { __typename?: 'Query', tourCostBreakdown: { __typename?: 'TourCostBreakdown', tariffDescription: string, tariffValidityPeriod: string, servicePositions: Array<{ __typename?: 'ServicePosition', value: number, description: string, variant: string }> } }; + export const AnomalyAllFragmentDoc = gql` fragment AnomalyAll on Anomaly { id @@ -688,6 +752,36 @@ export const AcceptAnomalyDocument = gql` export class AcceptAnomalyGQL extends Apollo.Mutation { override document = AcceptAnomalyDocument; + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } +export const HomeDashboardDocument = gql` + query HomeDashboard { + homeDashboardKpis { + anomalyCount + employeesWithoutTourCount + toursWithoutApprovalCount + billableTourCount + billableTourRevenueSum + billedTourCount + billedTourPositiveRevenueDeviation + billedTourNegativeRevenueDeviation + revenueTrend { + date + ordinanceType + revenueSum + } + } +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class HomeDashboardGQL extends Apollo.Query { + override document = HomeDashboardDocument; + constructor(apollo: Apollo.Apollo) { super(apollo); } @@ -844,11 +938,21 @@ export const GetTimePerTourMetricForMonthDocument = gql` super(apollo); } } -export const GetAnomalyByTypeReportDocument = gql` - query GetAnomalyByTypeReport { - anomalyAmountByType { - label - value +export const TicketStateKpiDocument = gql` + query TicketStateKpi($state: TicketValidationState!) { + ticketStateKpi(state: $state) { + main { + label + value + } + secondary { + label + value + } + additional { + label + value + } } } `; @@ -856,46 +960,37 @@ export const GetAnomalyByTypeReportDocument = gql` @Injectable({ providedIn: 'root' }) - export class GetAnomalyByTypeReportGQL extends Apollo.Query { - override document = GetAnomalyByTypeReportDocument; + export class TicketStateKpiGQL extends Apollo.Query { + override document = TicketStateKpiDocument; constructor(apollo: Apollo.Apollo) { super(apollo); } } -export const GetUpcomingTourNotificationReportDocument = gql` - query GetUpcomingTourNotificationReport { - upcomingTourNotificationReport { - label - value - } -} - `; - - @Injectable({ - providedIn: 'root' - }) - export class GetUpcomingTourNotificationReportGQL extends Apollo.Query { - override document = GetUpcomingTourNotificationReportDocument; - - constructor(apollo: Apollo.Apollo) { - super(apollo); +export const ManagerKpiDocument = gql` + query ManagerKpi($ordinanceType: String!) { + managerKpi(ordinanceType: $ordinanceType) { + main { + label + value + } + secondary { + label + value + } + additional { + label + value } } -export const GetAverageAnomalyResolutionTimeReportDocument = gql` - query GetAverageAnomalyResolutionTimeReport { - averageAnomalyResolutionTimeReport { - label - value - } } `; @Injectable({ providedIn: 'root' }) - export class GetAverageAnomalyResolutionTimeReportGQL extends Apollo.Query { - override document = GetAverageAnomalyResolutionTimeReportDocument; + export class ManagerKpiGQL extends Apollo.Query { + override document = ManagerKpiDocument; constructor(apollo: Apollo.Apollo) { super(apollo); @@ -1220,6 +1315,8 @@ export const GetAccountingStateMetaDocument = gql` accountingStateMeta(state: $state) { count revenueSum + positiveRevenueDeviation + negativeRevenueDeviation } } `; @@ -1306,6 +1403,30 @@ export const GetAccountingToursDocument = gql` export class GetAccountingToursGQL extends Apollo.Query { override document = GetAccountingToursDocument; + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } +export const GetTourCostBreakdownDocument = gql` + query GetTourCostBreakdown($operationId: String!) { + tourCostBreakdown(operationId: $operationId) { + tariffDescription + tariffValidityPeriod + servicePositions { + value + description + variant + } + } +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class GetTourCostBreakdownGQL extends Apollo.Query { + override document = GetTourCostBreakdownDocument; + constructor(apollo: Apollo.Apollo) { super(apollo); } diff --git a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/home.graphql b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/home.graphql new file mode 100644 index 0000000..0b777ed --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/home.graphql @@ -0,0 +1,17 @@ +query HomeDashboard { + homeDashboardKpis { + anomalyCount + employeesWithoutTourCount + toursWithoutApprovalCount + billableTourCount + billableTourRevenueSum + billedTourCount + billedTourPositiveRevenueDeviation + billedTourNegativeRevenueDeviation + revenueTrend { + date + ordinanceType + revenueSum + } + } +} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/kpis.graphql b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/kpis.graphql index 960b0cc..a9c4885 100644 --- a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/kpis.graphql +++ b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/kpis.graphql @@ -89,3 +89,37 @@ query GetTimePerTourMetricForMonth($day: DateTime!, $ordinanceType: String!) { } } } + +query TicketStateKpi($state: TicketValidationState!) { + ticketStateKpi(state: $state) { + main { + label + value + } + secondary { + label + value + } + additional { + label + value + } + } +} + +query ManagerKpi($ordinanceType: String!) { + managerKpi(ordinanceType: $ordinanceType) { + main { + label + value + } + secondary { + label + value + } + additional { + label + value + } + } +} diff --git a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/reports.graphql b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/reports.graphql deleted file mode 100644 index 0a5d58b..0000000 --- a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/reports.graphql +++ /dev/null @@ -1,20 +0,0 @@ -query GetAnomalyByTypeReport { - anomalyAmountByType { - label - value - } -} - -query GetUpcomingTourNotificationReport { - upcomingTourNotificationReport { - label - value - } -} - -query GetAverageAnomalyResolutionTimeReport { - averageAnomalyResolutionTimeReport { - label - value - } -} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/tours.graphql b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/tours.graphql index 9680d76..0924446 100644 --- a/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/tours.graphql +++ b/service/app-hub/dashboard/src/app/core/data-access/graphql/graphql/tours.graphql @@ -28,6 +28,8 @@ query GetAccountingStateMeta($state: AccountingState!) { accountingStateMeta(state: $state) { count revenueSum + positiveRevenueDeviation + negativeRevenueDeviation } } @@ -105,3 +107,15 @@ query GetAccountingTours( } } } + +query GetTourCostBreakdown($operationId: String!) { + tourCostBreakdown(operationId: $operationId) { + tariffDescription + tariffValidityPeriod + servicePositions { + value + description + variant + } + } +} diff --git a/service/app-hub/dashboard/src/app/core/telemetry/instrument.ts b/service/app-hub/dashboard/src/app/core/telemetry/instrument.ts new file mode 100644 index 0000000..bb8e1f2 --- /dev/null +++ b/service/app-hub/dashboard/src/app/core/telemetry/instrument.ts @@ -0,0 +1,66 @@ +import { registerInstrumentations } from '@opentelemetry/instrumentation'; +import { + WebTracerProvider, + ConsoleSpanExporter, + SimpleSpanProcessor, + BatchSpanProcessor, + ParentBasedSampler, + TraceIdRatioBasedSampler, +} from '@opentelemetry/sdk-trace-web'; +import { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { Resource } from '@opentelemetry/resources'; +import { B3Propagator } from '@opentelemetry/propagator-b3'; +import { + ATTR_SERVICE_NAME, + ATTR_SERVICE_VERSION, +} from '@opentelemetry/semantic-conventions'; +import { environment } from '../../../environments/environment'; + +const resource = Resource.default().merge( + new Resource({ + [ATTR_SERVICE_NAME]: environment.production ? 'avicenna.dashboard.prod' : 'avicenna.dashboard', + // [ATTR_SERVICE_NAMESPACE]: 'avicenna', + [ATTR_SERVICE_VERSION]: '1.0', + environment: environment.production ? 'production' : 'staging' + }) +); + +const provider = new WebTracerProvider({ + resource, + sampler: new ParentBasedSampler({ + root: new TraceIdRatioBasedSampler(0.1), + }), + spanProcessors: [ + new SimpleSpanProcessor(new ConsoleSpanExporter()), + new BatchSpanProcessor( + new OTLPTraceExporter({ + url: 'https://collector.genius.ceo/v1/traces', + }), + { + maxQueueSize: 100, + maxExportBatchSize: 10, + scheduledDelayMillis: 500, + } + ), + ], +}); + +provider.register({ + propagator: new B3Propagator(), +}); + +registerInstrumentations({ + instrumentations: [ + getWebAutoInstrumentations({ + '@opentelemetry/instrumentation-document-load': {}, + '@opentelemetry/instrumentation-user-interaction': {}, + '@opentelemetry/instrumentation-fetch': { + propagateTraceHeaderCorsUrls: /.+/, + }, + '@opentelemetry/instrumentation-xml-http-request': { + propagateTraceHeaderCorsUrls: /.+/, + }, + }), + ], +}); diff --git a/service/app-hub/dashboard/src/app/pages/accounting/accounting-info-card/accounting-info-card.component.ts b/service/app-hub/dashboard/src/app/pages/accounting/accounting-info-card/accounting-info-card.component.ts new file mode 100644 index 0000000..7ef0425 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/accounting/accounting-info-card/accounting-info-card.component.ts @@ -0,0 +1,91 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, effect, inject, input, signal } from '@angular/core'; +import { tap } from 'rxjs'; +import { InfoCardModule } from '../../../core/components/info-card/info-card.component'; +import { + AccountingState, + TourStateMeta, +} from '../../../core/data-access/graphql/generated/generated'; +import { DashboardAccountingService } from '../dashboard-accounting.service'; + +@Component({ + selector: 'app-accounting-info-card', + imports: [InfoCardModule, CurrencyPipe], + template: ` + @if (kpi()) { + +
+
+
{{ kpi()?.count }}
+
Tickets
+
+ @if(kpi()?.revenueSum && accountingState() !== AccountingState.Billed) { +
+
+ {{ kpi()?.revenueSum | currency : 'EUR' : 'symbol' : '.2' }} +
+
Umsatz
+
+ } @if(kpi()?.positiveRevenueDeviation && kpi()?.negativeRevenueDeviation + && accountingState() === AccountingState.Billed) { +
+
+ +{{ + kpi()?.positiveRevenueDeviation + | currency : 'EUR' : 'symbol' : '.2' + }} +
+
+ {{ + kpi()?.negativeRevenueDeviation + | currency : 'EUR' : 'symbol' : '.2' + }} +
+
Umsatz
+
+ } +
+
+ } + + `, + styles: ``, +}) +export class AccountingInfoCardComponent { + AccountingState = AccountingState; + + private service = inject(DashboardAccountingService); + + accountingState = input.required(); + kpi = signal(undefined); + + constructor() { + effect(() => { + this.service + .fetchAccountingStateMeta(this.accountingState()) + .pipe(tap((res) => this.kpi.set(res))) + .subscribe(); + }); + } +} diff --git a/service/app-hub/dashboard/src/app/pages/accounting/accounting-lane/accounting-item.component.ts b/service/app-hub/dashboard/src/app/pages/accounting/accounting-lane/accounting-item.component.ts index f32b1b6..15bf850 100644 --- a/service/app-hub/dashboard/src/app/pages/accounting/accounting-lane/accounting-item.component.ts +++ b/service/app-hub/dashboard/src/app/pages/accounting/accounting-lane/accounting-item.component.ts @@ -12,12 +12,17 @@ import { MatBadgeModule } from '@angular/material/badge'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { HotToastService } from '@ngxpert/hot-toast'; -import { Tour, Ticket, AccountingState, TicketValidationState } from '../../../core/data-access/graphql/generated/generated'; +import { + AccountingState, + Ticket, + TicketValidationState, + Tour, +} from '../../../core/data-access/graphql/generated/generated'; @Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'dks-accounting-item', - template: `
+ changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'dks-accounting-item', + template: `
-
diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.scss b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.scss new file mode 100644 index 0000000..e148da9 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.scss @@ -0,0 +1,9 @@ +@use "@angular/material" as mat; + +.warn-btn { + @include mat.button-overrides( + ( + text-label-text-color: var(--mat-sys-error) + ) + ); +} diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.ts b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.ts index 71916da..14f9744 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.ts +++ b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component.ts @@ -11,7 +11,10 @@ interface SolutionTarget { @Component({ selector: 'dks-anomaly-solution-dialog', templateUrl: './anomaly-solution-dialog.component.html', - styleUrls: ['./anomaly-solution-dialog.component.css'], + styleUrls: ['./anomaly-solution-dialog.component.scss'], + host: { + class: 'm-4', + }, standalone: false }) export class AnomalySolutionDialogComponent { diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.css b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.css deleted file mode 100644 index 9b724b9..0000000 --- a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.css +++ /dev/null @@ -1,3 +0,0 @@ -:host { - @apply flex flex-col h-full; -} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.html b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.html index 958d758..4585256 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.html +++ b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.html @@ -27,7 +27,7 @@ {{ node.name }} -
{{ node?.childCount }}
+
{{ node?.childCount }}
diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.scss b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.ts b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.ts index 4a7e1cd..4ebce72 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.ts +++ b/service/app-hub/dashboard/src/app/pages/control-center/anomaly-tree/anomaly-tree.component.ts @@ -43,7 +43,10 @@ interface AnomalyFlatNode { @Component({ selector: 'dks-anomaly-tree', templateUrl: './anomaly-tree.component.html', - styleUrls: ['./anomaly-tree.component.css'], + styleUrls: ['./anomaly-tree.component.scss'], + host: { + class: 'flex flex-col h-full', + }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false }) diff --git a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.html b/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.html similarity index 79% rename from service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.html rename to service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.html index fc99a23..c738ce5 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.html +++ b/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.html @@ -14,7 +14,7 @@ >
- + Anomalien @@ -22,7 +22,7 @@ - + Mitarbeiter ohne Tour @@ -30,12 +30,12 @@ - + Nächste Touren ohne Anfahrt - +
diff --git a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.scss b/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.spec.ts b/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.spec.ts similarity index 100% rename from service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.spec.ts rename to service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.spec.ts diff --git a/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.ts b/service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.ts similarity index 100% rename from service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard/control-center-dashboard.component.ts rename to service/app-hub/dashboard/src/app/pages/control-center/control-center-dashboard.component.ts diff --git a/service/app-hub/dashboard/src/app/pages/control-center/dashboard-control-center.module.ts b/service/app-hub/dashboard/src/app/pages/control-center/dashboard-control-center.module.ts index 8697bd3..1b63bf2 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/dashboard-control-center.module.ts +++ b/service/app-hub/dashboard/src/app/pages/control-center/dashboard-control-center.module.ts @@ -15,7 +15,7 @@ import { AnomalyListItemComponent } from './anomaly-list/anomaly-list-item/anoma import { AnomalyListComponent } from './anomaly-list/anomaly-list.component'; import { AnomalySolutionDialogComponent } from './anomaly-list/anomaly-solution-dialog/anomaly-solution-dialog.component'; import { AnomalyTreeComponent } from './anomaly-tree/anomaly-tree.component'; -import { ControlCenterDashboardComponent } from './control-center-dashboard/control-center-dashboard.component'; +import { ControlCenterDashboardComponent } from './control-center-dashboard.component'; import { ToursPerTimeKPIComponent } from './kpis/tours-per-time-kpi/tours-per-time-kpi.component'; import { TourViewDialogComponent } from './upcoming-tours/tour-view-dialog/tour-view-dialog.component'; import { UpcomingToursComponent } from './upcoming-tours/upcoming-tours.component'; diff --git a/service/app-hub/dashboard/src/app/pages/control-center/kpis/tours-per-time-kpi/tours-per-time-kpi.component.html b/service/app-hub/dashboard/src/app/pages/control-center/kpis/tours-per-time-kpi/tours-per-time-kpi.component.html index a56d59e..1623654 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/kpis/tours-per-time-kpi/tours-per-time-kpi.component.html +++ b/service/app-hub/dashboard/src/app/pages/control-center/kpis/tours-per-time-kpi/tours-per-time-kpi.component.html @@ -1,4 +1,4 @@ - + {{ ordinanceType }} @@ -6,17 +6,18 @@
-
- {{ kpi.kpi.value.toString().replace('.', ',') }} +
+ {{ kpi.kpi.value.toString().replace(".", ",") }}
- {{ kpi.interval.start | date: 'HH:mm' }} - - {{ kpi.interval.end | date: 'HH:mm' }} + {{ kpi.interval.start | date : "HH:mm" }} - + {{ kpi.interval.end | date : "HH:mm" }}
diff --git a/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.css b/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.css index 04bc910..e69de29 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.css +++ b/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.css @@ -1,3 +0,0 @@ -:host { - @apply m-4; -} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.ts b/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.ts index 2f11b26..69bc903 100644 --- a/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.ts +++ b/service/app-hub/dashboard/src/app/pages/control-center/upcoming-tours/tour-view-dialog/tour-view-dialog.component.ts @@ -6,6 +6,9 @@ import { Tour } from '../../../../core/data-access/graphql/generated/generated'; selector: 'dks-tour-view-dialog', templateUrl: './tour-view-dialog.component.html', styleUrls: ['./tour-view-dialog.component.css'], + host: { + class: 'm-4', + }, standalone: false }) export class TourViewDialogComponent { diff --git a/service/app-hub/dashboard/src/app/pages/home/home.component.spec.ts b/service/app-hub/dashboard/src/app/pages/home/home.component.spec.ts new file mode 100644 index 0000000..1191557 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/home.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/pages/home/home.component.ts b/service/app-hub/dashboard/src/app/pages/home/home.component.ts new file mode 100644 index 0000000..85d86d2 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/home.component.ts @@ -0,0 +1,217 @@ +import { CurrencyPipe } from '@angular/common'; +import { Component, computed, effect, OnInit, signal } from '@angular/core'; +import { MatDividerModule } from '@angular/material/divider'; +import { tap } from 'rxjs'; +import { InfoCardModule } from '../../core/components/info-card/info-card.component'; +import { + HomeDashboardGQL, + HomeDashboardQuery, + TicketValidationState, +} from '../../core/data-access/graphql/generated/generated'; +import { ManagerInfoCardComponent } from '../manager/components/manager-info-card/manager-info-card.component'; +import { TicketStateInfoCardComponent } from '../ticket-system/ticket-state-info-card/ticket-state-info-card.component'; +import { LinkCardComponent } from './link-card/link-card.component'; + +@Component({ + selector: 'app-home', + imports: [ + ManagerInfoCardComponent, + TicketStateInfoCardComponent, + InfoCardModule, + LinkCardComponent, + MatDividerModule, + CurrencyPipe, + ], + template: ` +
+ @if (kpis() !== undefined) { +
+
Übersicht
+ +
+
+
+ {{ kpis()?.anomalyCount }} +
+
Aktuelle
Anomalien
+
+
+
+ {{ kpis()?.employeesWithoutTourCount }} +
+
Mitarbeiter ohne Tour
+
+
+
+ +
+
+ @for (revenueItem of revenueByOrdinanceType(); track $index) { +
+
+ {{ + revenueItem.value + | currency : 'EUR' : 'symbol-narrow' : '.2' : 'de' + }} +
+
{{ revenueItem.label }}
+
+ } +
+ +
+
+ +
+
+
Abrechenbar
+
+
+ {{ kpis()?.billableTourCount }} +
+
Touren
+
+
+
+ {{ + kpis()?.billableTourRevenueSum + | currency : 'EUR' : 'symbol-narrow' : '.2' : 'de' + }} +
+
Umsatz
+
+
+
+
Falsch abgerechnet
+
+
+ {{ kpis()?.billedTourCount }} +
+
Touren
+
+
+
+ +{{ + kpis()?.billedTourPositiveRevenueDeviation + | currency : 'EUR' : 'symbol-narrow' : '.2' : 'de' + }} +
+
+ {{ + kpis()?.billedTourNegativeRevenueDeviation + | currency : 'EUR' : 'symbol-narrow' : '.2' : 'de' + }} +
+
Umsatz
+
+
+
+
+ +
+
+ {{ + kpis()?.employeesWithoutTourCount + }} + Touren starten in 3 Tagen ohne Genehmigung +
+
+
+
+ + } +
+
Manager System - Tagespotenzial
+ + + + +
+
+
Ticket System - Bearbeitungsstatus
+ + + + +
+
+ `, + styles: ``, +}) +export class HomeComponent implements OnInit { + TicketState = TicketValidationState; + + kpis = signal(undefined); + + public readonly revenueByOrdinanceType = computed(() => { + const currentData = this.kpis()?.revenueTrend; + if (!currentData) return; + + const groupedByOrdinanceType = [...currentData] + .sort( + ({ date: aDate }, { date: bDate }) => + new Date(aDate).getTime() - new Date(bDate).getTime() + ) + .reduce((sum, { ordinanceType, revenueSum }) => { + return { + ...sum, + [ordinanceType]: [ + ...(sum[ordinanceType] ? sum[ordinanceType] : []), + revenueSum, + ], + }; + }, {} as Record); + + return Object.entries(groupedByOrdinanceType).map(([ot, revenues]) => { + return { + label: ot, + value: revenues.at(-1), //.reduce((sum, cur) => (sum += cur), 0), + }; + }); + }); + + constructor(private readonly homeDashboardGql: HomeDashboardGQL) { + effect(() => { + this.homeDashboardGql + .fetch() + .pipe(tap((res) => this.kpis.set(res.data.homeDashboardKpis))) + .subscribe(); + }); + } + + ngOnInit() {} +} diff --git a/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.spec.ts b/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.spec.ts new file mode 100644 index 0000000..0640339 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LinkCardComponent } from './link-card.component'; + +describe('LinkCardComponent', () => { + let component: LinkCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LinkCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LinkCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.ts b/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.ts new file mode 100644 index 0000000..5d39db3 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/link-card/link-card.component.ts @@ -0,0 +1,45 @@ +import { Component, input } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; +import { RouterModule } from '@angular/router'; + +@Component({ + selector: 'app-link-card', + imports: [MatCardModule, RouterModule], + template: ` + + +
+
+ +
+
+ + + +
+
+
+
+ `, + styles: ``, +}) +export class LinkCardComponent { + appearance = input<'raised' | 'outlined'>('raised'); + target = input.required(); +} diff --git a/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.spec.ts b/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.spec.ts new file mode 100644 index 0000000..32b667e --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TrendGraphComponent } from './trend-graph.component'; + +describe('TrendGraphComponent', () => { + let component: TrendGraphComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TrendGraphComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TrendGraphComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.ts b/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.ts new file mode 100644 index 0000000..fc488a6 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/home/trend-graph/trend-graph.component.ts @@ -0,0 +1,257 @@ +import { Component, computed, input, signal } from '@angular/core'; +import { format } from 'date-fns'; +import { EChartsOption } from 'echarts'; +import { LineChart } from 'echarts/charts'; +import { + GridComponent, + MarkPointComponent, + TooltipComponent, +} from 'echarts/components'; +import { ECharts } from 'echarts/core'; +import { UtilNgxEchartsModule } from '../../../core/components/ngx-echarts/util-ngx-echarts.module'; + +@Component({ + selector: 'app-trend-graph', + imports: [UtilNgxEchartsModule], + template: `
`, + styles: ``, +}) +export class TrendGraphComponent { + data = input<{ date: Date; ordinanceType: string; revenueSum: number }[]>(); + + private chart?: ECharts; + + public readonly options = computed(() => { + console.log(this.data()); + return this.generateEchartsOptions(); + }); + + extentions = signal([ + LineChart, + GridComponent, + TooltipComponent, + MarkPointComponent, + ]); + + constructor() { + // effect(() => { + // console.log(`chartvalue changed`, this.data(), this.chart); + // const currentData = this.data(); + // if (!currentData) return; + // const groupedByOrdinanceType = [...currentData] + // .sort( + // ({ date: aDate }, { date: bDate }) => + // new Date(aDate).getTime() - new Date(bDate).getTime() + // ) + // .reduce((sum, { ordinanceType, revenueSum }) => { + // return { + // ...sum, + // [ordinanceType]: [ + // ...(sum[ordinanceType] ? sum[ordinanceType] : []), + // revenueSum, + // ], + // }; + // }, {} as Record); + // setTimeout(() => { + // if (!!this.chart) { + // console.log({ + // xAxis: [ + // { + // data: [ + // ...new Set( + // this.data()?.map(({ date }) => + // format(new Date(date), 'EEE: dd.MM') + // ) + // ), + // ], + // }, + // ], + // series: [ + // ...Object.entries(groupedByOrdinanceType).map( + // ([ot, revenues]) => { + // return { + // id: ot, + // data: revenues, + // }; + // } + // ), + // // { + // // data: [ + // // { + // // value: this.data(), + // // }, + // // ], + // // }, + // ], + // }); + // this.chart.setOption({ + // xAxis: [ + // { + // data: [ + // ...new Set( + // this.data()?.map(({ date }) => + // format(new Date(date), 'EEEE: dd.MM') + // ) + // ), + // ], + // }, + // ], + // series: [ + // ...Object.entries(groupedByOrdinanceType).map( + // ([ot, revenues]) => { + // return { + // id: ot, + // data: [{ value: revenues }], + // }; + // } + // ), + // // { + // // data: [ + // // { + // // value: this.data(), + // // }, + // // ], + // // }, + // ], + // }); + // } + // }, 1000); + // }); + } + + generateEchartsOptions(): EChartsOption { + + const baseOptions: EChartsOption = { + grid: { + left: '30px', + right: '30px', + bottom: '3px', + top: '15px', + // containLabel: false, + }, + xAxis: { + type: 'category', + boundaryGap: false, + axisLabel: { show: false }, + axisTick: { show: false }, + axisLine: { show: true }, + splitLine: { show: false }, + }, + yAxis: { + type: 'value', + axisLabel: { show: false }, + axisTick: { show: false }, + axisLine: { show: true }, + splitLine: { show: false }, + min: 0, + max: 'dataMax', + }, + tooltip: { + trigger: 'axis', + // axisPointer: { + // type: 'cross', + // label: { + // precision: 2, + // }, + // }, + formatter: function (params: any) { + const param = params[0]; + const dateLabel = param.name; + const revenueValue = param.value; + + const formattedRevenue = + typeof revenueValue === 'number' + ? revenueValue.toLocaleString('de-DE', { + style: 'currency', + currency: 'EUR', + }) + : revenueValue; // Fallback falls kein Zahlenwert + + return `${dateLabel}
Umsatz: ${formattedRevenue}`; + }, + backgroundColor: 'rgba(50,50,50,0.7)', + borderColor: '#333', + borderWidth: 0, + textStyle: { + color: '#fff', + }, + }, + series: [ + {id: '1. KTW', data: []}, + {id: '2. TSW', data: []}, + {id: '3. BTW', data: []}, + // { + // data: [], + // type: 'line', + // // smooth: true, + // // showSymbol: false, + // emphasis: { + // focus: 'series', + // }, + // markPoint: { + // symbol: 'circle', + // symbolSize: 25, + // label: { + // formatter: '{c}€', + // }, + // data: [ + // { name: 'min', type: 'min' }, + // { name: 'max', type: 'max' }, + // { name: 'Current day', x: 'Di', y: 14744 }, + // ], + // }, + // }, + ], + }; + + // return baseOptions + + const currentData = this.data(); + if (!currentData) return baseOptions; + + const groupedByOrdinanceType = [...currentData] + .sort( + ({ date: aDate }, { date: bDate }) => + new Date(aDate).getTime() - new Date(bDate).getTime() + ) + .reduce((sum, { ordinanceType, revenueSum }) => { + return { + ...sum, + [ordinanceType]: [ + ...(sum[ordinanceType] ? sum[ordinanceType] : []), + revenueSum, + ], + }; + }, {} as Record); + + return { + ...baseOptions, + xAxis: { + ...baseOptions.xAxis, + // data: [ + // ...new Set( + // this.data()?.map(({ date }) => format(new Date(date), 'EEE: dd.MM')) + // ), + // ], + }, + series: [ + ...Object.entries(groupedByOrdinanceType).map(([ot, revenues]) => { + return { + id: ot, + data: revenues, + }; + }), + ], + }; + } + + setChartInstance(chart: ECharts) { + this.chart = chart; + } +} diff --git a/service/app-hub/dashboard/src/app/pages/manager/avicenna-web-feature-dashboard-manager.module.ts b/service/app-hub/dashboard/src/app/pages/manager/avicenna-web-feature-dashboard-manager.module.ts index 2e7698e..e854efb 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/avicenna-web-feature-dashboard-manager.module.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/avicenna-web-feature-dashboard-manager.module.ts @@ -15,15 +15,16 @@ import { MatTableModule } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; import { de } from 'date-fns/locale'; +import { UtilNgxEchartsModule } from '../../core/components/ngx-echarts/util-ngx-echarts.module'; +import { ManagerInfoCardComponent } from './components/manager-info-card/manager-info-card.component'; import { MetricSummaryComponent } from './components/metric-summary/metric-summary.component'; +import { ViewTypeSelectorComponent } from './components/view-type-selector/view-type-selector.component'; import { DayviewComponent } from './dayview/dayview.component'; import { ManagerDashboardComponent } from './manager-dashboard/manager-dashboard.component'; import { MonthviewComponent } from './monthview/monthview.component'; import { OverviewComponent } from './overview/overview.component'; import { TimePerTourByCarComponent } from './time-per-tour-by-car/time-per-tour-by-car.component'; import { TimePerTourKPIComponent } from './time-per-tour-kpi/time-per-tour-kpi.component'; -import { ViewTypeSelectorComponent } from './components/view-type-selector/view-type-selector.component'; -import { UtilNgxEchartsModule } from '../../core/components/ngx-echarts/util-ngx-echarts.module'; @NgModule({ imports: [ @@ -69,6 +70,7 @@ import { UtilNgxEchartsModule } from '../../core/components/ngx-echarts/util-ngx UtilNgxEchartsModule, MetricSummaryComponent, ViewTypeSelectorComponent, + ManagerInfoCardComponent, ], declarations: [ ManagerDashboardComponent, diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.css b/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.css index 95dedde..e69de29 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.css +++ b/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.css @@ -1,3 +0,0 @@ -:host { - @apply flex justify-center items-center; -} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.ts b/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.ts index 2b7dd4a..a28fb97 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/components/average-revenue-summary/average-revenue-summary.component.ts @@ -9,7 +9,10 @@ import { summarizeMetrics } from '../../util/summarize-metrics'; selector: 'dks-average-revenue-summary', imports: [CommonModule, MatIconModule], templateUrl: './average-revenue-summary.component.html', - styleUrls: ['./average-revenue-summary.component.css'] + styleUrls: ['./average-revenue-summary.component.css'], + host: { + class: 'flex justify-center items-center', + }, }) export class AverageRevenueSummaryComponent { @Input() set metrics(value: TimePerTourMetric[]) { diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.css b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.css index 95dedde..e69de29 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.css +++ b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.css @@ -1,3 +0,0 @@ -:host { - @apply flex justify-center items-center; -} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.html b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.html index 59451b6..1c1a556 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.html @@ -31,7 +31,8 @@ account_balance
-
+ +
diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.ts b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.ts index f20ded8..b706be8 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/components/breakeven-summary/breakeven-summary.component.ts @@ -6,10 +6,13 @@ import { TimePerTourMetric } from '../../../../core/data-access/graphql/generate import { summarizeMetrics } from '../../util/summarize-metrics'; @Component({ - selector: 'dks-breakeven-summary', - imports: [CommonModule, MatIconModule], - templateUrl: './breakeven-summary.component.html', - styleUrls: ['./breakeven-summary.component.css'] + selector: 'dks-breakeven-summary', + imports: [CommonModule, MatIconModule], + templateUrl: './breakeven-summary.component.html', + styleUrls: ['./breakeven-summary.component.css'], + host: { + class: 'flex justify-center items-center', + }, }) export class BreakevenSummaryComponent { @Input() set metrics(value: TimePerTourMetric[]) { diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.html b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.html new file mode 100644 index 0000000..3cc3c81 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.html @@ -0,0 +1,19 @@ +@if (kpi()?.main?.label) { + + + @for (metric of kpi()?.additional; track $index) { + + + } + +} diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.scss b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.spec.ts b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.spec.ts new file mode 100644 index 0000000..3499551 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManagerInfoCardComponent } from './manager-info-card.component'; + +describe('ManagerInfoCardComponent', () => { + let component: ManagerInfoCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ManagerInfoCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ManagerInfoCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.ts b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.ts new file mode 100644 index 0000000..aaea02d --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/manager/components/manager-info-card/manager-info-card.component.ts @@ -0,0 +1,35 @@ +import { DecimalPipe } from '@angular/common'; +import { Component, effect, inject, input, signal } from '@angular/core'; +import { tap } from 'rxjs'; +import { InfoCardModule } from '../../../../core/components/info-card/info-card.component'; +import { + KpiInfo, + Metric, +} from '../../../../core/data-access/graphql/generated/generated'; +import { ManagerDashboardService } from '../../manager-dashboard.service'; + +@Component({ + selector: 'app-manager-info-card', + imports: [InfoCardModule, DecimalPipe], + templateUrl: './manager-info-card.component.html', + styleUrl: './manager-info-card.component.scss', +}) +export class ManagerInfoCardComponent { + private service = inject(ManagerDashboardService); + + ordinanceType = input.required(); + kpi = signal(undefined); + metrics = signal([]); + + constructor() { + effect(() => { + this.service + .fetchManagerKpi(this.ordinanceType()) + .pipe( + tap((res) => this.metrics.set(res.additional)), + tap((res) => this.kpi.set(res)) + ) + .subscribe(); + }); + } +} diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/metric-summary/metric-summary.component.html b/service/app-hub/dashboard/src/app/pages/manager/components/metric-summary/metric-summary.component.html index f0f3b9d..3ebd572 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/metric-summary/metric-summary.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/components/metric-summary/metric-summary.component.html @@ -18,7 +18,7 @@ >
- + + - {{ viewType }} + + {{ viewType }} + + - -
+ + @switch (currentMetric) { @case (DiagrammType.TimePerTour) { +
{{ summary.tourAmount.toFixed(2) }} local_shipping @@ -22,28 +26,28 @@ departure_board
-
-
- {{ summary.breakEven | currency:'EUR' }} - account_balance + } @case (DiagrammType.Revenue) { +
+
+ {{ summary.revenue | currency : "EUR" : "symbol" : ".2" }} + euro
-
- {{ summary.forecastRevenue | currency:'EUR' }} +
+ {{ summary.breakEven | currency : "EUR" }} account_balance
-
+ } @case (DiagrammType.AverageRevenue) { +
Ø - {{ summary.averageRevenue | currency:'EUR' }} + {{ summary.averageRevenue | currency : "EUR" }}
{{ calculateIndex(summary).toFixed(2) }} Index
- -
+ } } + + diff --git a/service/app-hub/dashboard/src/app/pages/manager/components/view-type-selector/view-type-selector.component.ts b/service/app-hub/dashboard/src/app/pages/manager/components/view-type-selector/view-type-selector.component.ts index cdc50a5..1b755a6 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/components/view-type-selector/view-type-selector.component.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/components/view-type-selector/view-type-selector.component.ts @@ -2,22 +2,28 @@ import { AsyncPipe, CurrencyPipe, NgClass, - NgIf, - NgSwitch, - NgSwitchCase, + NgIf } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; import { MatIconModule } from '@angular/material/icon'; import { BehaviorSubject, map } from 'rxjs'; +import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated'; import { DashboardViewType, DiagrammType } from '../../types'; import { summarizeMetrics } from '../../util/summarize-metrics'; -import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated'; @Component({ - selector: 'dks-view-type-selector', - imports: [NgIf, NgSwitch, NgSwitchCase, NgClass, AsyncPipe, CurrencyPipe, MatIconModule], - templateUrl: './view-type-selector.component.html', - styleUrls: ['./view-type-selector.component.css'] + selector: 'dks-view-type-selector', + imports: [ + NgIf, + NgClass, + AsyncPipe, + CurrencyPipe, + MatIconModule, + MatCardModule, + ], + templateUrl: './view-type-selector.component.html', + styleUrls: ['./view-type-selector.component.css'], }) export class ViewTypeSelectorComponent { @Input() viewType!: DashboardViewType; diff --git a/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.html b/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.html index a3bf181..9520f9b 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.html @@ -8,7 +8,7 @@
- {{ vm.selectedDate | date : 'dd.MM.yyyy' }} + {{ vm.selectedDate | date : "dd.MM.yyyy" }}
+ + Umsatz + Kapazität pro Tour - - Deckungsbeitrag -
+ + +
@@ -79,62 +89,62 @@ (viewTypeSelected)="setSelectedViewType(DashboardViewType.Gesamt)" >
-
+ -
- -
-
- -
-
- -
-
- -
-
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
- - - {{ typeAndSummary.type }} - diff --git a/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.ts b/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.ts index 95fe1a9..66c1850 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/dayview/dayview.component.ts @@ -36,7 +36,7 @@ export class DayviewComponent { startWith(this.selectedDate.value), map((date) => (date?.getHours() === 0 ? addHours(date, 12) : date)) ); - selectedMetric$ = new BehaviorSubject(DiagrammType.TimePerTour); + selectedMetric$ = new BehaviorSubject(DiagrammType.Revenue); selectedViewType$ = new BehaviorSubject( DashboardViewType.Gesamt ); diff --git a/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard.service.ts b/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard.service.ts index 6afb2f6..9eafbdd 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard.service.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard.service.ts @@ -15,13 +15,15 @@ import { throwError, } from 'rxjs'; import { - GetTourAmountPerTimeKpiManagerGQL, GetTimePerTourMetricForDayGQL, - GetTimePerTourMetricForMonthGQL, - TimePerTourUpdatedGQL, - GetTourAmountPerTimeKpiManagerQuery, GetTimePerTourMetricForDayQuery, + GetTimePerTourMetricForMonthGQL, GetTimePerTourMetricForMonthQuery, + GetTourAmountPerTimeKpiManagerGQL, + GetTourAmountPerTimeKpiManagerQuery, + ManagerKpiGQL, + ManagerKpiQuery, + TimePerTourUpdatedGQL, } from '../../core/data-access/graphql/generated/generated'; @Injectable({ providedIn: 'root' }) @@ -35,6 +37,7 @@ export class ManagerDashboardService { private readonly getTimePerTourMetricForDayGql: GetTimePerTourMetricForDayGQL, private readonly getTimePerTourMetricForMonthGql: GetTimePerTourMetricForMonthGQL, private readonly timePerTourUpdatedGql: TimePerTourUpdatedGQL, + private readonly managerKpiGql: ManagerKpiGQL, private readonly toast: HotToastService ) { this.timePerTourUpdate$ = this.timePerTourUpdatedGql.subscribe().pipe( @@ -50,6 +53,31 @@ export class ManagerDashboardService { ); } + fetchManagerKpi( + ordinanceType: string + ): Observable { + const managerKpiQuery = this.managerKpiGql.watch({ + ordinanceType, + }); + + const update = this.timePerTourUpdate$.pipe( + switchMap(() => managerKpiQuery.refetch()), + startWith(undefined) + ); + + return combineLatest([update, managerKpiQuery.valueChanges]).pipe( + catchError((error) => { + console.error(error); + return throwError(() => error); + }), + retry({ delay: 1000, count: 3 }), + map(([updatedData, firstData]) => + updatedData ? updatedData : firstData + ), + map((response) => response.data.managerKpi) + ); + } + getTimePerTourKPIByOrdinanceTypes( ordinanceType: string ): Observable { diff --git a/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard/manager-dashboard.component.html b/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard/manager-dashboard.component.html index 487475f..21ea1bc 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard/manager-dashboard.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/manager-dashboard/manager-dashboard.component.html @@ -1,13 +1,14 @@ -
diff --git a/service/app-hub/dashboard/src/app/pages/manager/monthview/monthview.component.ts b/service/app-hub/dashboard/src/app/pages/manager/monthview/monthview.component.ts index dd6f19a..109e71c 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/monthview/monthview.component.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/monthview/monthview.component.ts @@ -21,10 +21,10 @@ import { import { mergeMetrics } from '../util/merge-metric'; @Component({ - selector: 'dks-monthview', - templateUrl: './monthview.component.html', - styleUrls: ['./monthview.component.css'], - standalone: false + selector: 'dks-monthview', + templateUrl: './monthview.component.html', + styleUrls: ['./monthview.component.css'], + standalone: false, }) export class MonthviewComponent { OrdinanceTypes = OrdinanceTypes; @@ -36,7 +36,7 @@ export class MonthviewComponent { selectedDate$ = this.selectedDate.valueChanges.pipe( startWith(this.selectedDate.value) ); - selectedMetric$ = new BehaviorSubject(DiagrammType.TimePerTour); + selectedMetric$ = new BehaviorSubject(DiagrammType.Revenue); selectedViewType$ = new BehaviorSubject( DashboardViewType.Gesamt ); diff --git a/service/app-hub/dashboard/src/app/pages/manager/overview/overview.component.html b/service/app-hub/dashboard/src/app/pages/manager/overview/overview.component.html index 430884b..67f3933 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/overview/overview.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/overview/overview.component.html @@ -5,31 +5,31 @@
- - - - - + + + + + + + + +
diff --git a/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-by-car/time-per-tour-by-car.component.html b/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-by-car/time-per-tour-by-car.component.html index a5e9b89..39eff08 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-by-car/time-per-tour-by-car.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-by-car/time-per-tour-by-car.component.html @@ -37,8 +37,6 @@ diff --git a/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-kpi/time-per-tour-kpi.component.html b/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-kpi/time-per-tour-kpi.component.html index 767ef24..72afa5b 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-kpi/time-per-tour-kpi.component.html +++ b/service/app-hub/dashboard/src/app/pages/manager/time-per-tour-kpi/time-per-tour-kpi.component.html @@ -1,4 +1,4 @@ - + {{ text }} @@ -14,7 +14,8 @@ class="w-1/3 flex flex-col justify-center items-center" >
{{ kpi.interval.start | date: 'HH:mm' }} - diff --git a/service/app-hub/dashboard/src/app/pages/manager/types.ts b/service/app-hub/dashboard/src/app/pages/manager/types.ts index 70acf0b..2aeece3 100644 --- a/service/app-hub/dashboard/src/app/pages/manager/types.ts +++ b/service/app-hub/dashboard/src/app/pages/manager/types.ts @@ -6,7 +6,7 @@ export enum OrdinanceTypes { export enum DiagrammType { TimePerTour = 'TimePerTour', - BreakEven = 'BreakEven', + Revenue = 'Revenue', AverageRevenue = 'AverageRevenue', } diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-item/ticket-item.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-item/ticket-item.component.ts index 16b0fba..8a696b0 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-item/ticket-item.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-item/ticket-item.component.ts @@ -18,17 +18,21 @@ import { import CategoryColors from './category-colors'; @Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'dks-ticket-item', - templateUrl: './ticket-item.component.html', - styles: [ - ` + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'dks-ticket-item', + templateUrl: './ticket-item.component.html', + host: { + class: + 'flex flex-col rounded-sm border-l-2 border-r-8 p-2 m-2 bg-white cursor-pointer', + }, + styles: [ + ` :host { - @apply flex flex-col rounded border-l-2 border-r-8 p-2 m-2 bg-white cursor-pointer; + box-shadow: var(--mat-sys-level2); } `, - ], - imports: [MatIconModule, MatBadgeModule, NgIf] + ], + imports: [MatIconModule, MatBadgeModule, NgIf], }) export class TicketItemComponent implements OnInit { @Input() ticket!: Ticket & { tours: Tour[] }; diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-footer.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-footer.component.ts index 022b0c9..aa5475d 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-footer.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-footer.component.ts @@ -1,11 +1,11 @@ -import { AsyncPipe, CurrencyPipe, NgIf } from '@angular/common'; +import { NgIf } from '@angular/common'; import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { TicketStateMeta } from '../../../core/data-access/graphql/generated/generated'; @Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'dks-ticket-lane-footer', - template: ` + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'dks-ticket-lane-footer', + template: ` {{ ticketStateMeta.count }} Tickets @@ -21,14 +21,11 @@ import { TicketStateMeta } from '../../../core/data-access/graphql/generated/gen {{ ticketStateMeta.tdNotCompanyCount }} davon fehlender Transportschein `, - styles: [ - ` - :host { - @apply flex flex-col items-center justify-center p-2; - } - `, - ], - imports: [NgIf, AsyncPipe, CurrencyPipe] + host: { + class: 'flex flex-col items-center justify-center p-2', + }, + styles: [``], + imports: [NgIf], }) export class TicketLaneFooterComponent { @Input() ticketStateMeta!: TicketStateMeta; diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-header.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-header.component.ts index 9184118..d4cb6b8 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-header.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane-header.component.ts @@ -33,10 +33,14 @@ import { TicketLaneHeaderFilterComponent } from './ticket-lane-header-filter.com [state]="state" (filterChange)="filterChanged($event)" >`, + host: { + class: 'flex items-center justify-between p-2', + }, styles: [ ` :host { - @apply flex items-center justify-between p-2 bg-gray-50; + color: var(--mat-sys-on-secondary-container); + background-color: var(--mat-sys-secondary-container); } `, ], diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.html b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.html index ca0f729..3e7087d 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.html +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.html @@ -1,4 +1,3 @@ - - + diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.ts index ab26ba5..c5c20ef 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-lane/ticket-lane.component.ts @@ -2,7 +2,7 @@ import { CdkVirtualScrollViewport, ScrollingModule, } from '@angular/cdk/scrolling'; -import { AsyncPipe, NgFor, NgIf } from '@angular/common'; +import { AsyncPipe, NgIf } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -16,14 +16,11 @@ import { Observable, combineLatest, debounceTime, - filter, map, mergeMap, scan, - switchMap, tap, } from 'rxjs'; -import { RoleDirective } from '../../../core/components/ms-authentication/role.directive'; import { Ticket, TicketFilterArgs, @@ -33,32 +30,31 @@ import { import { TicketItemComponent } from '../ticket-item/ticket-item.component'; import { TicketViewComponent } from '../ticket-view/ticket-view.component'; import { TicketsService } from '../tickets.service'; -import { TicketLaneFooterComponent } from './ticket-lane-footer.component'; import { TicketLaneHeaderComponent } from './ticket-lane-header.component'; @Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'dks-ticket-lane', - templateUrl: './ticket-lane.component.html', - styles: [ - ` + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'dks-ticket-lane', + templateUrl: './ticket-lane.component.html', + host: { + class: 'rounded-sm h-full w-full grid', + }, + styles: [ + ` :host { - @apply rounded bg-gray-200 h-full w-full grid; + box-shadow: var(--mat-sys-level1); + background-color: var(--mat-sys-surface-container-low); grid-template-rows: auto 1fr auto; } `, - ], - imports: [ - TicketLaneHeaderComponent, - TicketLaneFooterComponent, - TicketItemComponent, - TicketViewComponent, - NgIf, - NgFor, - AsyncPipe, - RoleDirective, - ScrollingModule, - ] + ], + imports: [ + TicketLaneHeaderComponent, + TicketItemComponent, + NgIf, + AsyncPipe, + ScrollingModule, + ], }) export class TicketLaneComponent { private dialog = inject(DialogService); @@ -87,12 +83,12 @@ export class TicketLaneComponent { cursor$ = new BehaviorSubject(''); tickets$: Observable<(Ticket & { tours: Tour[] })[]>; - ticketStateMeta$ = this.ticketState$.pipe( - filter(Boolean), - switchMap((ticketState) => - this.ticketsService.fetchTicketStateMeta(ticketState) - ) - ); + // ticketStateMeta$ = this.ticketState$.pipe( + // filter(Boolean), + // switchMap((ticketState) => + // this.ticketsService.fetchTicketStateMeta(ticketState) + // ) + // ); totalCount$ = new BehaviorSubject(0); constructor() { diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.html b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.html new file mode 100644 index 0000000..e7718e6 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.html @@ -0,0 +1,19 @@ +@if (kpi()?.main?.label) { + + + @for (metric of kpi()?.additional; track $index) { + + + } + +} diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.scss b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.spec.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.spec.ts new file mode 100644 index 0000000..a67d6b3 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TicketStateInfoCardComponent } from './ticket-state-info-card.component'; + +describe('TicketStateInfoCardComponent', () => { + let component: TicketStateInfoCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TicketStateInfoCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TicketStateInfoCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.ts new file mode 100644 index 0000000..2aa54c1 --- /dev/null +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-state-info-card/ticket-state-info-card.component.ts @@ -0,0 +1,51 @@ +import { DecimalPipe } from '@angular/common'; +import { Component, effect, inject, input, signal } from '@angular/core'; +import { tap } from 'rxjs'; +import { InfoCardModule } from '../../../core/components/info-card/info-card.component'; +import { + KpiInfo, + Metric, + TicketValidationState, +} from '../../../core/data-access/graphql/generated/generated'; +import { TicketsService } from '../tickets.service'; + +@Component({ + selector: 'app-ticket-state-info-card', + imports: [InfoCardModule, DecimalPipe], + templateUrl: './ticket-state-info-card.component.html', + styleUrl: './ticket-state-info-card.component.scss', +}) +export class TicketStateInfoCardComponent { + private service = inject(TicketsService); + + ticketState = input.required(); + kpi = signal(undefined); + metrics = signal([]); + + constructor() { + effect(() => { + this.service + .fetchTicketStateKpi(this.ticketState()) + .pipe( + tap((res) => this.metrics.set(res.additional)), + tap((res) => this.kpi.set(res)) + ) + .subscribe(); + }); + } + + title(): string | undefined { + switch (this.ticketState()) { + case TicketValidationState.Created: + return 'Prüfung Daten'; + case TicketValidationState.UserInteractionRequired: + return 'Prüfung Genehmigungen'; + case TicketValidationState.TdUncertain: + return 'Prüfung Transportscheine'; + case TicketValidationState.DocumentsMissing: + return 'Prüfung Dokumente'; + default: + return undefined; + } + } +} diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-overview.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-overview.component.ts index 19d1a2e..797e368 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-overview.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-overview.component.ts @@ -86,7 +86,6 @@ import { imports: [ MatListModule, MatIconModule, - NgClass, NgIf, NgForOf, NgSwitch, diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-td-uncertain.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-td-uncertain.component.ts index e5e1ad0..54a120f 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-td-uncertain.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-td-uncertain.component.ts @@ -47,12 +47,14 @@ import { Beim Kunden + + In der Praxis +
`, imports: [ - NgIf, MatButtonModule, MatIconModule, MatFormFieldModule, diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-tours.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-tours.component.ts index 046073c..a802def 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-tours.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-tours.component.ts @@ -79,10 +79,8 @@ import { `, imports: [ - NgIf, NgClass, DatePipe, - RoleDirective, MatButtonModule, MatCheckboxModule, MatTableModule, @@ -109,6 +107,7 @@ export class TicketToursComponent implements OnInit { ); ngOnInit(): void { + console.log(this.ticket.tours) this.dataSource = [...this.ticket.tours] .filter(({ check }) => check === 0) .sort( diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-user-action-required.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-user-action-required.component.ts index 0b9400a..9acb73c 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-user-action-required.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/ticket-view/ticket-user-action-required.component.ts @@ -1,11 +1,17 @@ import { NgIf } from '@angular/common'; import { ChangeDetectionStrategy, + ChangeDetectorRef, Component, + computed, + effect, EventEmitter, + inject, Input, + model, OnInit, Output, + Signal, } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; @@ -20,11 +26,12 @@ import { TicketValidationState, Tour, } from '../../../core/data-access/graphql/generated/generated'; +import { AuthService } from '../../../core/components/ms-authentication/auth.service'; @Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - selector: 'dks-ticket-user-action-required', - template: `
+ changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'dks-ticket-user-action-required', + template: `
+ + + + --> `, - styles: [ - ` + styles: [ + ` :host { display: block; height: calc(100% - 64px); } section { - grid-template-rows: 2rem 1fr; + grid-template-rows: 2rem auto 1fr; } `, - ], - imports: [ - TicketLaneComponent, - TicketsSearchDialogComponent, - MatButtonModule, - MatIconModule, - RoleDirective, - ] + ], + imports: [ + TicketStateInfoCardComponent, + TicketLaneComponent, + MatButtonModule, + MatIconModule, + ], }) export class TicketsPageComponent { private dialog = inject(DialogService); diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/tickets-search-dialog/tickets-search-dialog.component.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/tickets-search-dialog/tickets-search-dialog.component.ts index b4ed34b..446b3c3 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/tickets-search-dialog/tickets-search-dialog.component.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/tickets-search-dialog/tickets-search-dialog.component.ts @@ -57,7 +57,6 @@ import { TicketsService } from '../tickets.service';
`, imports: [ - TicketViewComponent, MatFormFieldModule, MatInputModule, ReactiveFormsModule, diff --git a/service/app-hub/dashboard/src/app/pages/ticket-system/tickets.service.ts b/service/app-hub/dashboard/src/app/pages/ticket-system/tickets.service.ts index 6527066..4873004 100644 --- a/service/app-hub/dashboard/src/app/pages/ticket-system/tickets.service.ts +++ b/service/app-hub/dashboard/src/app/pages/ticket-system/tickets.service.ts @@ -24,6 +24,8 @@ import { SetDocumentInfoGQL, SetDocumentInfoMutationVariables, TicketFilterArgs, + TicketStateKpiGQL, + TicketStateKpiQuery, TicketValidationState, } from '../../core/data-access/graphql/generated/generated'; @@ -50,6 +52,7 @@ export class TicketsService { private readonly getTicketStateMetaGql: GetTicketStateMetaGQL, private readonly searchTicketsGql: SearchTicketsGQL, private readonly setDocumentInfoGql: SetDocumentInfoGQL, + private readonly ticketStateKpiGql: TicketStateKpiGQL, private readonly toast: HotToastService ) { this.updateTickets$.next(); @@ -120,6 +123,37 @@ export class TicketsService { ); } + fetchTicketStateKpi( + state: TicketValidationState + ): Observable { + const ticketStateKpiQuery = this.ticketStateKpiGql.watch({ + state, + }); + + const ticketsUpdate = combineLatest([ + this.ticketsUpdated$, + this.updateTickets$, + ]).pipe( + switchMap(() => ticketStateKpiQuery.refetch()), + startWith(undefined) + ); + + return combineLatest([ + ticketsUpdate, + ticketStateKpiQuery.valueChanges, + ]).pipe( + catchError((error) => { + console.error(error); + return throwError(() => error); + }), + retry({ delay: 1000, count: 3 }), + map(([updatedData, firstData]) => + updatedData ? updatedData : firstData + ), + map((response) => response.data.ticketStateKpi) + ); + } + searchTickets( query: string ): Observable { diff --git a/service/app-hub/dashboard/src/environments/environment.development.ts b/service/app-hub/dashboard/src/environments/environment.development.ts index ab21a3a..38314cc 100644 --- a/service/app-hub/dashboard/src/environments/environment.development.ts +++ b/service/app-hub/dashboard/src/environments/environment.development.ts @@ -1,8 +1,8 @@ export const environment = { production: false, graphQl: { - endpoint: 'https://avicenna.genius.ceo/graphql', - ws: 'ws://avicenna.genius.ceo/graphql', + endpoint: 'http://localhost:3000/graphql', + ws: 'ws://localhost:3000/graphql', }, msAuth: { clientId: '9a4a1e7a-9544-439f-9cd3-3c20066a8a82', diff --git a/service/app-hub/dashboard/src/m3-theme.scss b/service/app-hub/dashboard/src/m3-theme.scss index 1e31d5e..d9a9aa3 100644 --- a/service/app-hub/dashboard/src/m3-theme.scss +++ b/service/app-hub/dashboard/src/m3-theme.scss @@ -1,126 +1,246 @@ // This file was generated by running 'ng generate @angular/material:m3-theme'. // Proceed with caution if making changes to this file. -@use 'sass:map'; -@use '@angular/material' as mat; +@use "sass:map"; +@use "@angular/material" as mat; -// Note: Color palettes are generated from primary: #17253D +// Note: Color palettes are generated from primary: #4263eb, secondary: #1c7ed6, tertiary: #15aabf, error: #f03e3e +// $_palettes: ( +// primary: ( +// 0: #000000, +// 10: #0d1b33, +// 20: #233049, +// 25: #2e3c55, +// 30: #394761, +// 35: #45536d, +// 40: #515f7a, +// 50: #6a7793, +// 60: #8391ae, +// 70: #9eabca, +// 80: #b9c7e6, +// 90: #d7e3ff, +// 95: #ecf0ff, +// 98: #f9f9ff, +// 99: #fdfbff, +// 100: #ffffff, +// ), +// secondary: ( +// 0: #000000, +// 10: #001c38, +// 20: #00315b, +// 25: #003d6e, +// 30: #004881, +// 35: #005495, +// 40: #0060a9, +// 50: #1079d1, +// 60: #3e93ed, +// 70: #6baeff, +// 80: #a2c9ff, +// 90: #d3e4ff, +// 95: #eaf1ff, +// 98: #f8f9ff, +// 99: #fdfcff, +// 100: #ffffff, +// ), +// tertiary: ( +// 0: #000000, +// 10: #001f25, +// 20: #00363e, +// 25: #00424b, +// 30: #004e59, +// 35: #005b67, +// 40: #006876, +// 50: #008394, +// 60: #009fb3, +// 70: #36bbd0, +// 80: #5bd7ec, +// 90: #a0efff, +// 95: #d3f7ff, +// 98: #eefcff, +// 99: #f7fdff, +// 100: #ffffff, +// ), +// neutral: ( +// 0: #000000, +// 10: #1a1b23, +// 20: #2f3039, +// 25: #3a3b44, +// 30: #45464f, +// 35: #51525b, +// 40: #5d5e67, +// 50: #767680, +// 60: #90909a, +// 70: #aaaab5, +// 80: #c6c5d1, +// 90: #e2e1ed, +// 95: #f1effb, +// 98: #fbf8ff, +// 99: #fefbff, +// 100: #ffffff, +// 4: #0c0e15, +// 6: #12131b, +// 12: #1e1f27, +// 17: #282932, +// 22: #33343d, +// 24: #383942, +// 87: #dad9e4, +// 92: #e8e7f3, +// 94: #eeedf8, +// 96: #f4f2fe, +// ), +// neutral-variant: ( +// 0: #000000, +// 10: #181b28, +// 20: #2d303d, +// 25: #383b49, +// 30: #444654, +// 35: #4f5260, +// 40: #5b5d6d, +// 50: #747686, +// 60: #8e90a0, +// 70: #a9aabb, +// 80: #c4c5d7, +// 90: #e0e1f3, +// 95: #f0efff, +// 98: #fbf8ff, +// 99: #fefbff, +// 100: #ffffff, +// ), +// error: ( +// 0: #000000, +// 10: #410003, +// 20: #680009, +// 25: #7d000d, +// 30: #930012, +// 35: #a90016, +// 40: #bc131f, +// 50: #e03234, +// 60: #ff5450, +// 70: #ff8981, +// 80: #ffb3ad, +// 90: #ffdad6, +// 95: #ffedeb, +// 98: #fff8f7, +// 99: #fffbff, +// 100: #ffffff, +// ), +// ); $_palettes: ( primary: ( 0: #000000, - 10: #001b3f, - 20: #002f65, - 25: #003a79, - 30: #02458e, - 35: #1b519a, - 40: #2b5ea7, - 50: #4877c2, - 60: #6491de, - 70: #7fabfb, - 80: #abc7ff, - 90: #d7e3ff, - 95: #ecf0ff, - 98: #f9f9ff, - 99: #fdfbff, - 100: #ffffff, + 10: #001453, + 20: #002584, + 25: #042F9B, + 30: #1B3CA7, + 35: #2B49B3, + 40: #3956BF, + 50: #546FDA, + 60: #6F8AF6, + 70: #92A6FF, + 80: #B7C4FF, + 90: #DDE1FF, + 95: #EFEFFF, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF, ), secondary: ( 0: #000000, - 10: #131c2b, - 20: #283141, - 25: #333c4d, - 30: #3e4759, - 35: #4a5365, - 40: #565e71, - 50: #6e778b, - 60: #8891a5, - 70: #a3abc0, - 80: #bec6dc, - 90: #dae2f9, - 95: #ecf0ff, - 98: #f9f9ff, - 99: #fdfbff, - 100: #ffffff, + 10: #141A35, + 20: #292F4B, + 25: #343A57, + 30: #3F4563, + 35: #4B516F, + 40: #575D7C, + 50: #6F7596, + 60: #898FB0, + 70: #A4A9CC, + 80: #BFC5E8, + 90: #DDE1FF, + 95: #F0EFFF, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF, ), tertiary: ( 0: #000000, - 10: #28132e, - 20: #3f2844, - 25: #4b3350, - 30: #573e5c, - 35: #634a68, - 40: #705574, - 50: #8a6e8e, - 60: #a587a9, - 70: #c0a1c4, - 80: #ddbce0, - 90: #fad8fd, - 95: #ffebfe, - 98: #fff7fb, + 10: #29103a, + 20: #3f2650, + 25: #4a315b, + 30: #563c69, + 35: #624875, + 40: #6e5483, + 50: #886c9c, + 60: #a385b7, + 70: #bea0d2, + 80: #dbbaef, + 90: #f2dafe, + 95: #fbecff, + 98: #fff6fe, 99: #fffbff, - 100: #ffffff, + 100: #FFFFFF ), neutral: ( 0: #000000, - 10: #1a1b1f, - 20: #2f3033, - 25: #3a3b3f, - 30: #46474a, + 10: #1B1B1F, + 20: #303034, + 25: #3B3B3F, + 30: #47464A, 35: #525256, - 40: #5e5e62, - 50: #77777a, + 40: #5F5E62, + 50: #77767A, 60: #919094, - 70: #ababaf, - 80: #c7c6ca, - 90: #e3e2e6, - 95: #f2f0f4, - 98: #faf9fd, - 99: #fdfbff, - 100: #ffffff, - 4: #0d0e11, - 6: #121316, - 12: #1f1f23, - 17: #292a2d, - 22: #343538, - 24: #38393c, - 87: #dbd9dd, - 92: #e9e7ec, - 94: #efedf1, - 96: #f4f3f7, + 70: #ACAAAF, + 80: #C8C6CA, + 90: #E4E1E6, + 95: #F2F0F4, + 98: #FBF8FD, + 99: #FEFBFF, + 100: #FFFFFF, + 4: #0c0e15, + 6: #12131b, + 12: #1e1f27, + 17: #282932, + 22: #33343d, + 24: #383942, + 87: #dad9e4, + 92: #e8e7f3, + 94: #eeedf8, + 96: #f4f2fe, ), neutral-variant: ( 0: #000000, - 10: #181c22, - 20: #2d3038, - 25: #383b43, - 30: #44474e, - 35: #4f525a, - 40: #5b5e66, - 50: #74777f, - 60: #8e9099, - 70: #a9abb4, - 80: #c4c6d0, - 90: #e0e2ec, - 95: #eff0fa, - 98: #f9f9ff, - 99: #fdfbff, - 100: #ffffff, + 10: #1A1B23, + 20: #2F3038, + 25: #3A3B43, + 30: #45464F, + 35: #51525B, + 40: #5D5E67, + 50: #767680, + 60: #90909A, + 70: #ABAAB4, + 80: #C6C5D0, + 90: #E2E1EC, + 95: #F1F0FA, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF ), error: ( 0: #000000, - 10: #410002, + 10: #2d0102, 20: #690005, - 25: #7e0007, + 25: #7d0006, 30: #93000a, - 35: #a80710, + 35: #a8070f, 40: #ba1a1a, - 50: #de3730, - 60: #ff5449, + 50: #de372f, + 60: #ff544a, 70: #ff897d, - 80: #ffb4ab, - 90: #ffdad6, - 95: #ffedea, - 98: #fff8f7, + 80: #feb4ab, + 90: #ffdad7, + 95: #ffede9, + 98: #fff8f6, 99: #fffbff, 100: #ffffff, ), @@ -129,31 +249,21 @@ $_palettes: ( $_rest: ( secondary: map.get($_palettes, secondary), neutral: map.get($_palettes, neutral), - neutral-variant: map.get($_palettes, neutral-variant), + neutral-variant: map.get($_palettes, neutral-variant), error: map.get($_palettes, error), ); $_primary: map.merge(map.get($_palettes, primary), $_rest); $_tertiary: map.merge(map.get($_palettes, tertiary), $_rest); -$light-theme: mat.define-theme(( - color: ( - theme-type: light, - primary: $_primary, - tertiary: $_tertiary, - use-system-variables: true, - ), - typography: ( - use-system-variables: true, - ), -)); -$dark-theme: mat.define-theme(( - color: ( - theme-type: dark, - primary: $_primary, - tertiary: $_tertiary, - use-system-variables: true, - ), - typography: ( - use-system-variables: true, - ), -)); +html { + color-scheme: light; + @include mat.theme(( + color: ( + primary: $_primary, + tertiary: $_tertiary, + theme-type: light, + ), + typography: Roboto, + density: 0, + )); +} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/main.ts b/service/app-hub/dashboard/src/main.ts index f987f2a..396ed63 100644 --- a/service/app-hub/dashboard/src/main.ts +++ b/service/app-hub/dashboard/src/main.ts @@ -4,6 +4,7 @@ import '@angular/common/locales/global/de'; import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { appConfig } from './app/app.config'; +import './app/core/telemetry/instrument'; bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err) diff --git a/service/app-hub/dashboard/src/style_theme-colors.scss b/service/app-hub/dashboard/src/style_theme-colors.scss new file mode 100644 index 0000000..ca43e8c --- /dev/null +++ b/service/app-hub/dashboard/src/style_theme-colors.scss @@ -0,0 +1,137 @@ +// This file was generated by running 'ng generate @angular/material:theme-color'. +// Proceed with caution if making changes to this file. + +@use 'sass:map'; +@use '@angular/material' as mat; + +// Note: Color palettes are generated from primary: #17253D +$_palettes: ( + primary: ( + 0: #000000, + 10: #0d1b33, + 20: #233049, + 25: #2e3c55, + 30: #394761, + 35: #45536d, + 40: #515f7a, + 50: #6a7793, + 60: #8391ae, + 70: #9eabca, + 80: #b9c7e6, + 90: #d7e3ff, + 95: #ecf0ff, + 98: #f9f9ff, + 99: #fdfbff, + 100: #ffffff, + ), + secondary: ( + 0: #000000, + 10: #171c26, + 20: #2c303b, + 25: #373b46, + 30: #424752, + 35: #4e525e, + 40: #5a5e6a, + 50: #727783, + 60: #8c919d, + 70: #a7abb8, + 80: #c2c6d4, + 90: #dee2f0, + 95: #ecf0ff, + 98: #f9f9ff, + 99: #fdfbff, + 100: #ffffff, + ), + tertiary: ( + 0: #000000, + 10: #29142a, + 20: #3f2840, + 25: #4b334c, + 30: #573e57, + 35: #644a64, + 40: #705670, + 50: #8b6e89, + 60: #a587a4, + 70: #c1a1bf, + 80: #debcdb, + 90: #fbd8f7, + 95: #ffebfa, + 98: #fff7fa, + 99: #fffbff, + 100: #ffffff, + ), + neutral: ( + 0: #000000, + 10: #1b1b1d, + 20: #303032, + 25: #3b3b3d, + 30: #474649, + 35: #525254, + 40: #5e5e60, + 50: #777779, + 60: #919092, + 70: #acabad, + 80: #c8c6c8, + 90: #e4e2e4, + 95: #f2f0f2, + 98: #fbf8fb, + 99: #fefbfe, + 100: #ffffff, + 4: #0e0e10, + 6: #131315, + 12: #1f1f21, + 17: #2a2a2c, + 22: #343537, + 24: #39393b, + 87: #dbd9dc, + 92: #eae7ea, + 94: #efedef, + 96: #f5f3f5, + ), + neutral-variant: ( + 0: #000000, + 10: #191c21, + 20: #2e3036, + 25: #393b41, + 30: #44474d, + 35: #505259, + 40: #5c5e65, + 50: #75777e, + 60: #8f9098, + 70: #aaabb2, + 80: #c5c6ce, + 90: #e1e2ea, + 95: #f0f0f8, + 98: #f9f9ff, + 99: #fdfbff, + 100: #ffffff, + ), + error: ( + 0: #000000, + 10: #410002, + 20: #690005, + 25: #7e0007, + 30: #93000a, + 35: #a80710, + 40: #ba1a1a, + 50: #de3730, + 60: #ff5449, + 70: #ff897d, + 80: #ffb4ab, + 90: #ffdad6, + 95: #ffedea, + 98: #fff8f7, + 99: #fffbff, + 100: #ffffff, + ), +); + +$_rest: ( + secondary: map.get($_palettes, secondary), + neutral: map.get($_palettes, neutral), + neutral-variant: map.get($_palettes, neutral-variant), + error: map.get($_palettes, error), +); + +$primary-palette: map.merge(map.get($_palettes, primary), $_rest); +$tertiary-palette: map.merge(map.get($_palettes, tertiary), $_rest); \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles.scss b/service/app-hub/dashboard/src/styles.scss index 6f96bf3..b0b49ac 100644 --- a/service/app-hub/dashboard/src/styles.scss +++ b/service/app-hub/dashboard/src/styles.scss @@ -1,8 +1,13 @@ /* You can add global styles to this file, and also import other style files */ -@tailwind base; -@tailwind components; -@tailwind utilities; +@use '@angular/material' as mat; - -html, body { height: 100%; } -body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } +html, +body { + height: 100%; +} +body { + margin: 0; + font-family: Roboto, "Helvetica Neue", sans-serif; + background: var(--mat-sys-surface-dim); + color: var(--mat-sys-on-surface); +} diff --git a/service/app-hub/dashboard/src/styles/material-theme.json b/service/app-hub/dashboard/src/styles/material-theme.json new file mode 100644 index 0000000..0d98865 --- /dev/null +++ b/service/app-hub/dashboard/src/styles/material-theme.json @@ -0,0 +1,419 @@ +{ + "description": "TYPE: CUSTOM\nMaterial Theme Builder export 2025-04-22 04:44:20", + "seed": "#346DBB", + "coreColors": { + "primary": "#346DBB", + "tertiary": "#AE90C2" + }, + "extendedColors": [], + "schemes": { + "light": { + "primary": "#0D54A1", + "surfaceTint": "#205EAB", + "onPrimary": "#FFFFFF", + "primaryContainer": "#346DBB", + "onPrimaryContainer": "#EBF0FF", + "secondary": "#4D5F7E", + "onSecondary": "#FFFFFF", + "secondaryContainer": "#C8DBFF", + "onSecondaryContainer": "#4E607F", + "tertiary": "#6E5482", + "onTertiary": "#FFFFFF", + "tertiaryContainer": "#AE90C2", + "onTertiaryContainer": "#412953", + "error": "#BA1A1A", + "onError": "#FFFFFF", + "errorContainer": "#FFDAD6", + "onErrorContainer": "#93000A", + "background": "#F9F9FF", + "onBackground": "#191C21", + "surface": "#F9F9FF", + "onSurface": "#191C21", + "surfaceVariant": "#DEE2EF", + "onSurfaceVariant": "#424751", + "outline": "#727782", + "outlineVariant": "#C2C6D3", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#2E3036", + "inverseOnSurface": "#F0F0F7", + "inversePrimary": "#A9C7FF", + "primaryFixed": "#D6E3FF", + "onPrimaryFixed": "#001B3D", + "primaryFixedDim": "#A9C7FF", + "onPrimaryFixedVariant": "#00468B", + "secondaryFixed": "#D6E3FF", + "onSecondaryFixed": "#061B38", + "secondaryFixedDim": "#B5C7EB", + "onSecondaryFixedVariant": "#354765", + "tertiaryFixed": "#F2DAFF", + "onTertiaryFixed": "#28103A", + "tertiaryFixedDim": "#DBBBEF", + "onTertiaryFixedVariant": "#563C68", + "surfaceDim": "#D9D9E1", + "surfaceBright": "#F9F9FF", + "surfaceContainerLowest": "#FFFFFF", + "surfaceContainerLow": "#F3F3FA", + "surfaceContainer": "#EDEDF5", + "surfaceContainerHigh": "#E7E8EF", + "surfaceContainerHighest": "#E1E2E9" + }, + "light-medium-contrast": { + "primary": "#00366D", + "surfaceTint": "#205EAB", + "onPrimary": "#FFFFFF", + "primaryContainer": "#346DBB", + "onPrimaryContainer": "#FFFFFF", + "secondary": "#243654", + "onSecondary": "#FFFFFF", + "secondaryContainer": "#5C6E8E", + "onSecondaryContainer": "#FFFFFF", + "tertiary": "#442C57", + "onTertiary": "#FFFFFF", + "tertiaryContainer": "#7E6291", + "onTertiaryContainer": "#FFFFFF", + "error": "#740006", + "onError": "#FFFFFF", + "errorContainer": "#CF2C27", + "onErrorContainer": "#FFFFFF", + "background": "#F9F9FF", + "onBackground": "#191C21", + "surface": "#F9F9FF", + "onSurface": "#0F1116", + "surfaceVariant": "#DEE2EF", + "onSurfaceVariant": "#313640", + "outline": "#4E525D", + "outlineVariant": "#686D78", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#2E3036", + "inverseOnSurface": "#F0F0F7", + "inversePrimary": "#A9C7FF", + "primaryFixed": "#346DBB", + "onPrimaryFixed": "#FFFFFF", + "primaryFixedDim": "#0D54A1", + "onPrimaryFixedVariant": "#FFFFFF", + "secondaryFixed": "#5C6E8E", + "onSecondaryFixed": "#FFFFFF", + "secondaryFixedDim": "#435574", + "onSecondaryFixedVariant": "#FFFFFF", + "tertiaryFixed": "#7E6291", + "onTertiaryFixed": "#FFFFFF", + "tertiaryFixedDim": "#644A77", + "onTertiaryFixedVariant": "#FFFFFF", + "surfaceDim": "#C5C6CD", + "surfaceBright": "#F9F9FF", + "surfaceContainerLowest": "#FFFFFF", + "surfaceContainerLow": "#F3F3FA", + "surfaceContainer": "#E7E8EF", + "surfaceContainerHigh": "#DCDCE3", + "surfaceContainerHighest": "#D0D1D8" + }, + "light-high-contrast": { + "primary": "#002C5B", + "surfaceTint": "#205EAB", + "onPrimary": "#FFFFFF", + "primaryContainer": "#00488F", + "onPrimaryContainer": "#FFFFFF", + "secondary": "#1A2C49", + "onSecondary": "#FFFFFF", + "secondaryContainer": "#384A68", + "onSecondaryContainer": "#FFFFFF", + "tertiary": "#3A224C", + "onTertiary": "#FFFFFF", + "tertiaryContainer": "#583F6B", + "onTertiaryContainer": "#FFFFFF", + "error": "#600004", + "onError": "#FFFFFF", + "errorContainer": "#98000A", + "onErrorContainer": "#FFFFFF", + "background": "#F9F9FF", + "onBackground": "#191C21", + "surface": "#F9F9FF", + "onSurface": "#000000", + "surfaceVariant": "#DEE2EF", + "onSurfaceVariant": "#000000", + "outline": "#272C36", + "outlineVariant": "#444954", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#2E3036", + "inverseOnSurface": "#FFFFFF", + "inversePrimary": "#A9C7FF", + "primaryFixed": "#00488F", + "onPrimaryFixed": "#FFFFFF", + "primaryFixedDim": "#003267", + "onPrimaryFixedVariant": "#FFFFFF", + "secondaryFixed": "#384A68", + "onSecondaryFixed": "#FFFFFF", + "secondaryFixedDim": "#213350", + "onSecondaryFixedVariant": "#FFFFFF", + "tertiaryFixed": "#583F6B", + "onTertiaryFixed": "#FFFFFF", + "tertiaryFixedDim": "#402853", + "onTertiaryFixedVariant": "#FFFFFF", + "surfaceDim": "#B7B8BF", + "surfaceBright": "#F9F9FF", + "surfaceContainerLowest": "#FFFFFF", + "surfaceContainerLow": "#F0F0F7", + "surfaceContainer": "#E1E2E9", + "surfaceContainerHigh": "#D3D4DB", + "surfaceContainerHighest": "#C5C6CD" + }, + "dark": { + "primary": "#A9C7FF", + "surfaceTint": "#A9C7FF", + "onPrimary": "#003062", + "primaryContainer": "#346DBB", + "onPrimaryContainer": "#EBF0FF", + "secondary": "#B5C7EB", + "onSecondary": "#1E314E", + "secondaryContainer": "#384968", + "onSecondaryContainer": "#A7B9DD", + "tertiary": "#DBBBEF", + "onTertiary": "#3E2650", + "tertiaryContainer": "#AE90C2", + "onTertiaryContainer": "#412953", + "error": "#FFB4AB", + "onError": "#690005", + "errorContainer": "#93000A", + "onErrorContainer": "#FFDAD6", + "background": "#111318", + "onBackground": "#E1E2E9", + "surface": "#111318", + "onSurface": "#E1E2E9", + "surfaceVariant": "#424751", + "onSurfaceVariant": "#C2C6D3", + "outline": "#8C919C", + "outlineVariant": "#424751", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#E1E2E9", + "inverseOnSurface": "#2E3036", + "inversePrimary": "#205EAB", + "primaryFixed": "#D6E3FF", + "onPrimaryFixed": "#001B3D", + "primaryFixedDim": "#A9C7FF", + "onPrimaryFixedVariant": "#00468B", + "secondaryFixed": "#D6E3FF", + "onSecondaryFixed": "#061B38", + "secondaryFixedDim": "#B5C7EB", + "onSecondaryFixedVariant": "#354765", + "tertiaryFixed": "#F2DAFF", + "onTertiaryFixed": "#28103A", + "tertiaryFixedDim": "#DBBBEF", + "onTertiaryFixedVariant": "#563C68", + "surfaceDim": "#111318", + "surfaceBright": "#37393F", + "surfaceContainerLowest": "#0C0E13", + "surfaceContainerLow": "#191C21", + "surfaceContainer": "#1D2025", + "surfaceContainerHigh": "#282A2F", + "surfaceContainerHighest": "#32353A" + }, + "dark-medium-contrast": { + "primary": "#CCDDFF", + "surfaceTint": "#A9C7FF", + "onPrimary": "#00254F", + "primaryContainer": "#5D91E2", + "onPrimaryContainer": "#000000", + "secondary": "#CCDDFF", + "onSecondary": "#122642", + "secondaryContainer": "#7F91B3", + "onSecondaryContainer": "#000000", + "tertiary": "#EFD2FF", + "onTertiary": "#331B45", + "tertiaryContainer": "#AE90C2", + "onTertiaryContainer": "#17012A", + "error": "#FFD2CC", + "onError": "#540003", + "errorContainer": "#FF5449", + "onErrorContainer": "#000000", + "background": "#111318", + "onBackground": "#E1E2E9", + "surface": "#111318", + "onSurface": "#FFFFFF", + "surfaceVariant": "#424751", + "onSurfaceVariant": "#D8DCE9", + "outline": "#ADB2BE", + "outlineVariant": "#8C909C", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#E1E2E9", + "inverseOnSurface": "#282A2F", + "inversePrimary": "#00478D", + "primaryFixed": "#D6E3FF", + "onPrimaryFixed": "#00112A", + "primaryFixedDim": "#A9C7FF", + "onPrimaryFixedVariant": "#00366D", + "secondaryFixed": "#D6E3FF", + "onSecondaryFixed": "#00112A", + "secondaryFixedDim": "#B5C7EB", + "onSecondaryFixedVariant": "#243654", + "tertiaryFixed": "#F2DAFF", + "onTertiaryFixed": "#1D052F", + "tertiaryFixedDim": "#DBBBEF", + "onTertiaryFixedVariant": "#442C57", + "surfaceDim": "#111318", + "surfaceBright": "#42444A", + "surfaceContainerLowest": "#05070C", + "surfaceContainerLow": "#1B1E23", + "surfaceContainer": "#26282D", + "surfaceContainerHigh": "#303338", + "surfaceContainerHighest": "#3B3E43" + }, + "dark-high-contrast": { + "primary": "#EBF0FF", + "surfaceTint": "#A9C7FF", + "onPrimary": "#000000", + "primaryContainer": "#A2C4FF", + "onPrimaryContainer": "#000B1F", + "secondary": "#EBF0FF", + "onSecondary": "#000000", + "secondaryContainer": "#B1C3E7", + "onSecondaryContainer": "#000B1F", + "tertiary": "#FAEBFF", + "onTertiary": "#000000", + "tertiaryContainer": "#D7B7EB", + "onTertiaryContainer": "#160029", + "error": "#FFECE9", + "onError": "#000000", + "errorContainer": "#FFAEA4", + "onErrorContainer": "#220001", + "background": "#111318", + "onBackground": "#E1E2E9", + "surface": "#111318", + "onSurface": "#FFFFFF", + "surfaceVariant": "#424751", + "onSurfaceVariant": "#FFFFFF", + "outline": "#ECF0FD", + "outlineVariant": "#BEC2CF", + "shadow": "#000000", + "scrim": "#000000", + "inverseSurface": "#E1E2E9", + "inverseOnSurface": "#000000", + "inversePrimary": "#00478D", + "primaryFixed": "#D6E3FF", + "onPrimaryFixed": "#000000", + "primaryFixedDim": "#A9C7FF", + "onPrimaryFixedVariant": "#00112A", + "secondaryFixed": "#D6E3FF", + "onSecondaryFixed": "#000000", + "secondaryFixedDim": "#B5C7EB", + "onSecondaryFixedVariant": "#00112A", + "tertiaryFixed": "#F2DAFF", + "onTertiaryFixed": "#000000", + "tertiaryFixedDim": "#DBBBEF", + "onTertiaryFixedVariant": "#1D052F", + "surfaceDim": "#111318", + "surfaceBright": "#4E5056", + "surfaceContainerLowest": "#000000", + "surfaceContainerLow": "#1D2025", + "surfaceContainer": "#2E3036", + "surfaceContainerHigh": "#393B41", + "surfaceContainerHighest": "#45474C" + } + }, + "palettes": { + "primary": { + "0": "#000000", + "5": "#00112A", + "10": "#001B3D", + "15": "#00254F", + "20": "#003062", + "25": "#003B76", + "30": "#00468B", + "35": "#07529E", + "40": "#205EAB", + "50": "#4077C6", + "60": "#5D91E2", + "70": "#78ACFF", + "80": "#A9C7FF", + "90": "#D6E3FF", + "95": "#ECF0FF", + "98": "#F9F9FF", + "99": "#FDFBFF", + "100": "#FFFFFF" + }, + "secondary": { + "0": "#000000", + "5": "#071121", + "10": "#121C2C", + "15": "#1C2637", + "20": "#273142", + "25": "#323C4E", + "30": "#3D4759", + "35": "#495366", + "40": "#555F72", + "50": "#6D778B", + "60": "#8791A6", + "70": "#A1ABC1", + "80": "#BDC7DD", + "90": "#D9E3FA", + "95": "#ECF0FF", + "98": "#F9F9FF", + "99": "#FDFBFF", + "100": "#FFFFFF" + }, + "tertiary": { + "0": "#000000", + "5": "#1C052F", + "10": "#28103A", + "15": "#331B45", + "20": "#3E2650", + "25": "#4A315C", + "30": "#563C68", + "35": "#624875", + "40": "#6E5482", + "50": "#886C9C", + "60": "#A386B7", + "70": "#BFA0D3", + "80": "#DBBBEF", + "90": "#F2DAFF", + "95": "#FBECFF", + "98": "#FFF7FD", + "99": "#FFFBFF", + "100": "#FFFFFF" + }, + "neutral": { + "0": "#000000", + "5": "#101114", + "10": "#1A1B1E", + "15": "#252629", + "20": "#2F3033", + "25": "#3A3B3F", + "30": "#46474A", + "35": "#525256", + "40": "#5E5E62", + "50": "#77777A", + "60": "#909094", + "70": "#ABABAF", + "80": "#C7C6CA", + "90": "#E3E2E6", + "95": "#F1F0F4", + "98": "#FAF9FD", + "99": "#FDFBFF", + "100": "#FFFFFF" + }, + "neutral-variant": { + "0": "#000000", + "5": "#0E1117", + "10": "#181C22", + "15": "#22262D", + "20": "#2D3038", + "25": "#383B43", + "30": "#43474E", + "35": "#4F525A", + "40": "#5B5E66", + "50": "#74777F", + "60": "#8E9099", + "70": "#A8ABB4", + "80": "#C4C6CF", + "90": "#E0E2EC", + "95": "#EEF0FA", + "98": "#F9F9FF", + "99": "#FDFBFF", + "100": "#FFFFFF" + } + } +} \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/open-colors-theme.scss b/service/app-hub/dashboard/src/styles/open-colors-theme.scss new file mode 100644 index 0000000..7acb720 --- /dev/null +++ b/service/app-hub/dashboard/src/styles/open-colors-theme.scss @@ -0,0 +1,135 @@ +// This file was generated by running 'ng generate @angular/material:theme-color'. +// Proceed with caution if making changes to this file. + +@use 'sass:map'; +@use '@angular/material' as mat; +$_palettes: ( + primary: ( + 0: #000000, + 10: #001453, + 20: #002584, + 25: #042F9B, + 30: #1B3CA7, + 35: #2B49B3, + 40: #3956BF, + 50: #546FDA, + 60: #6F8AF6, + 70: #92A6FF, + 80: #B7C4FF, + 90: #DDE1FF, + 95: #EFEFFF, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF, + ), + secondary: ( + 0: #000000, + 10: #141A35, + 20: #292F4B, + 25: #343A57, + 30: #3F4563, + 35: #4B516F, + 40: #575D7C, + 50: #6F7596, + 60: #898FB0, + 70: #A4A9CC, + 80: #BFC5E8, + 90: #DDE1FF, + 95: #F0EFFF, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF, + ), + tertiary: ( + 0: #000000, + 10: #001E2B, + 20: #003548, + 25: #004157, + 30: #004D67, + 35: #005977, + 40: #006687, + 50: #0080A9, + 60: #009CCD, + 70: #26B8EE, + 80: #74D1FF, + 90: #C1E8FF, + 95: #E2F3FF, + 98: #F4FAFF, + 99: #FBFCFF, + 100: #FFFFFF + ), + neutral: ( + 0: #000000, + 10: #1B1B1F, + 20: #303034, + 25: #3B3B3F, + 30: #47464A, + 35: #525256, + 40: #5F5E62, + 50: #77767A, + 60: #919094, + 70: #ACAAAF, + 80: #C8C6CA, + 90: #E4E1E6, + 95: #F2F0F4, + 98: #FBF8FD, + 99: #FEFBFF, + 100: #FFFFFF, + 4: #0c0e15, + 6: #12131b, + 12: #1e1f27, + 17: #282932, + 22: #33343d, + 24: #383942, + 87: #dad9e4, + 92: #e8e7f3, + 94: #eeedf8, + 96: #f4f2fe, + ), + neutral-variant: ( + 0: #000000, + 10: #1A1B23, + 20: #2F3038, + 25: #3A3B43, + 30: #45464F, + 35: #51525B, + 40: #5D5E67, + 50: #767680, + 60: #90909A, + 70: #ABAAB4, + 80: #C6C5D0, + 90: #E2E1EC, + 95: #F1F0FA, + 98: #FBF8FF, + 99: #FEFBFF, + 100: #FFFFFF + ), + error: ( + 0: #000000, + 10: #2d0102, + 20: #690005, + 25: #7d0006, + 30: #93000a, + 35: #a8070f, + 40: #ba1a1a, + 50: #de372f, + 60: #ff544a, + 70: #ff897d, + 80: #feb4ab, + 90: #ffdad7, + 95: #ffede9, + 98: #fff8f6, + 99: #fffbff, + 100: #ffffff, + ), +); + +$_rest: ( + secondary: map.get($_palettes, secondary), + neutral: map.get($_palettes, neutral), + neutral-variant: map.get($_palettes, neutral-variant), + error: map.get($_palettes, error), +); + +$primary-palette: map.merge(map.get($_palettes, primary), $_rest); +$tertiary-palette: map.merge(map.get($_palettes, tertiary), $_rest); \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/open-colors.scss b/service/app-hub/dashboard/src/styles/open-colors.scss new file mode 100644 index 0000000..114f2c7 --- /dev/null +++ b/service/app-hub/dashboard/src/styles/open-colors.scss @@ -0,0 +1,399 @@ +// +// +// 𝗖 𝗢 𝗟 𝗢 𝗥 +// v 1.9.1 +// +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + +// General +// ─────────────────────────────────── + +$oc-white: #ffffff; +$oc-black: #000000; + + +// Gray +// ─────────────────────────────────── + +$oc-gray-list: ( + "0": #f8f9fa, + "1": #f1f3f5, + "2": #e9ecef, + "3": #dee2e6, + "4": #ced4da, + "5": #adb5bd, + "6": #868e96, + "7": #495057, + "8": #343a40, + "9": #212529 +); + +$oc-gray-0: map-get($oc-gray-list, "0"); +$oc-gray-1: map-get($oc-gray-list, "1"); +$oc-gray-2: map-get($oc-gray-list, "2"); +$oc-gray-3: map-get($oc-gray-list, "3"); +$oc-gray-4: map-get($oc-gray-list, "4"); +$oc-gray-5: map-get($oc-gray-list, "5"); +$oc-gray-6: map-get($oc-gray-list, "6"); +$oc-gray-7: map-get($oc-gray-list, "7"); +$oc-gray-8: map-get($oc-gray-list, "8"); +$oc-gray-9: map-get($oc-gray-list, "9"); + + +// Red +// ─────────────────────────────────── + +$oc-red-list: ( + "0": #fff5f5, + "1": #ffe3e3, + "2": #ffc9c9, + "3": #ffa8a8, + "4": #ff8787, + "5": #ff6b6b, + "6": #fa5252, + "7": #f03e3e, + "8": #e03131, + "9": #c92a2a +); + +$oc-red-0: map-get($oc-red-list, "0"); +$oc-red-1: map-get($oc-red-list, "1"); +$oc-red-2: map-get($oc-red-list, "2"); +$oc-red-3: map-get($oc-red-list, "3"); +$oc-red-4: map-get($oc-red-list, "4"); +$oc-red-5: map-get($oc-red-list, "5"); +$oc-red-6: map-get($oc-red-list, "6"); +$oc-red-7: map-get($oc-red-list, "7"); +$oc-red-8: map-get($oc-red-list, "8"); +$oc-red-9: map-get($oc-red-list, "9"); + + +// Pink +// ─────────────────────────────────── + +$oc-pink-list: ( + "0": #fff0f6, + "1": #ffdeeb, + "2": #fcc2d7, + "3": #faa2c1, + "4": #f783ac, + "5": #f06595, + "6": #e64980, + "7": #d6336c, + "8": #c2255c, + "9": #a61e4d +); + +$oc-pink-0: map-get($oc-pink-list, "0"); +$oc-pink-1: map-get($oc-pink-list, "1"); +$oc-pink-2: map-get($oc-pink-list, "2"); +$oc-pink-3: map-get($oc-pink-list, "3"); +$oc-pink-4: map-get($oc-pink-list, "4"); +$oc-pink-5: map-get($oc-pink-list, "5"); +$oc-pink-6: map-get($oc-pink-list, "6"); +$oc-pink-7: map-get($oc-pink-list, "7"); +$oc-pink-8: map-get($oc-pink-list, "8"); +$oc-pink-9: map-get($oc-pink-list, "9"); + + +// Grape +// ─────────────────────────────────── + +$oc-grape-list: ( + "0": #f8f0fc, + "1": #f3d9fa, + "2": #eebefa, + "3": #e599f7, + "4": #da77f2, + "5": #cc5de8, + "6": #be4bdb, + "7": #ae3ec9, + "8": #9c36b5, + "9": #862e9c +); + +$oc-grape-0: map-get($oc-grape-list, "0"); +$oc-grape-1: map-get($oc-grape-list, "1"); +$oc-grape-2: map-get($oc-grape-list, "2"); +$oc-grape-3: map-get($oc-grape-list, "3"); +$oc-grape-4: map-get($oc-grape-list, "4"); +$oc-grape-5: map-get($oc-grape-list, "5"); +$oc-grape-6: map-get($oc-grape-list, "6"); +$oc-grape-7: map-get($oc-grape-list, "7"); +$oc-grape-8: map-get($oc-grape-list, "8"); +$oc-grape-9: map-get($oc-grape-list, "9"); + + +// Violet +// ─────────────────────────────────── + +$oc-violet-list: ( + "0": #f3f0ff, + "1": #e5dbff, + "2": #d0bfff, + "3": #b197fc, + "4": #9775fa, + "5": #845ef7, + "6": #7950f2, + "7": #7048e8, + "8": #6741d9, + "9": #5f3dc4 +); + +$oc-violet-0: map-get($oc-violet-list, "0"); +$oc-violet-1: map-get($oc-violet-list, "1"); +$oc-violet-2: map-get($oc-violet-list, "2"); +$oc-violet-3: map-get($oc-violet-list, "3"); +$oc-violet-4: map-get($oc-violet-list, "4"); +$oc-violet-5: map-get($oc-violet-list, "5"); +$oc-violet-6: map-get($oc-violet-list, "6"); +$oc-violet-7: map-get($oc-violet-list, "7"); +$oc-violet-8: map-get($oc-violet-list, "8"); +$oc-violet-9: map-get($oc-violet-list, "9"); + + +// Indigo +// ─────────────────────────────────── + +$oc-indigo-list: ( + "0": #edf2ff, + "1": #dbe4ff, + "2": #bac8ff, + "3": #91a7ff, + "4": #748ffc, + "5": #5c7cfa, + "6": #4c6ef5, + "7": #4263eb, + "8": #3b5bdb, + "9": #364fc7 +); + +$oc-indigo-0: map-get($oc-indigo-list, "0"); +$oc-indigo-1: map-get($oc-indigo-list, "1"); +$oc-indigo-2: map-get($oc-indigo-list, "2"); +$oc-indigo-3: map-get($oc-indigo-list, "3"); +$oc-indigo-4: map-get($oc-indigo-list, "4"); +$oc-indigo-5: map-get($oc-indigo-list, "5"); +$oc-indigo-6: map-get($oc-indigo-list, "6"); +$oc-indigo-7: map-get($oc-indigo-list, "7"); +$oc-indigo-8: map-get($oc-indigo-list, "8"); +$oc-indigo-9: map-get($oc-indigo-list, "9"); + + +// Blue +// ─────────────────────────────────── + +$oc-blue-list: ( + "0": #e7f5ff, + "1": #d0ebff, + "2": #a5d8ff, + "3": #74c0fc, + "4": #4dabf7, + "5": #339af0, + "6": #228be6, + "7": #1c7ed6, + "8": #1971c2, + "9": #1864ab +); + +$oc-blue-0: map-get($oc-blue-list, "0"); +$oc-blue-1: map-get($oc-blue-list, "1"); +$oc-blue-2: map-get($oc-blue-list, "2"); +$oc-blue-3: map-get($oc-blue-list, "3"); +$oc-blue-4: map-get($oc-blue-list, "4"); +$oc-blue-5: map-get($oc-blue-list, "5"); +$oc-blue-6: map-get($oc-blue-list, "6"); +$oc-blue-7: map-get($oc-blue-list, "7"); +$oc-blue-8: map-get($oc-blue-list, "8"); +$oc-blue-9: map-get($oc-blue-list, "9"); + + +// Cyan +// ─────────────────────────────────── + +$oc-cyan-list: ( + "0": #e3fafc, + "1": #c5f6fa, + "2": #99e9f2, + "3": #66d9e8, + "4": #3bc9db, + "5": #22b8cf, + "6": #15aabf, + "7": #1098ad, + "8": #0c8599, + "9": #0b7285 +); + +$oc-cyan-0: map-get($oc-cyan-list, "0"); +$oc-cyan-1: map-get($oc-cyan-list, "1"); +$oc-cyan-2: map-get($oc-cyan-list, "2"); +$oc-cyan-3: map-get($oc-cyan-list, "3"); +$oc-cyan-4: map-get($oc-cyan-list, "4"); +$oc-cyan-5: map-get($oc-cyan-list, "5"); +$oc-cyan-6: map-get($oc-cyan-list, "6"); +$oc-cyan-7: map-get($oc-cyan-list, "7"); +$oc-cyan-8: map-get($oc-cyan-list, "8"); +$oc-cyan-9: map-get($oc-cyan-list, "9"); + + +// Teal +// ─────────────────────────────────── + +$oc-teal-list: ( + "0": #e6fcf5, + "1": #c3fae8, + "2": #96f2d7, + "3": #63e6be, + "4": #38d9a9, + "5": #20c997, + "6": #12b886, + "7": #0ca678, + "8": #099268, + "9": #087f5b +); + +$oc-teal-0: map-get($oc-teal-list, "0"); +$oc-teal-1: map-get($oc-teal-list, "1"); +$oc-teal-2: map-get($oc-teal-list, "2"); +$oc-teal-3: map-get($oc-teal-list, "3"); +$oc-teal-4: map-get($oc-teal-list, "4"); +$oc-teal-5: map-get($oc-teal-list, "5"); +$oc-teal-6: map-get($oc-teal-list, "6"); +$oc-teal-7: map-get($oc-teal-list, "7"); +$oc-teal-8: map-get($oc-teal-list, "8"); +$oc-teal-9: map-get($oc-teal-list, "9"); + + +// Green +// ─────────────────────────────────── + +$oc-green-list: ( + "0": #ebfbee, + "1": #d3f9d8, + "2": #b2f2bb, + "3": #8ce99a, + "4": #69db7c, + "5": #51cf66, + "6": #40c057, + "7": #37b24d, + "8": #2f9e44, + "9": #2b8a3e +); + +$oc-green-0: map-get($oc-green-list, "0"); +$oc-green-1: map-get($oc-green-list, "1"); +$oc-green-2: map-get($oc-green-list, "2"); +$oc-green-3: map-get($oc-green-list, "3"); +$oc-green-4: map-get($oc-green-list, "4"); +$oc-green-5: map-get($oc-green-list, "5"); +$oc-green-6: map-get($oc-green-list, "6"); +$oc-green-7: map-get($oc-green-list, "7"); +$oc-green-8: map-get($oc-green-list, "8"); +$oc-green-9: map-get($oc-green-list, "9"); + + +// Lime +// ─────────────────────────────────── + +$oc-lime-list: ( + "0": #f4fce3, + "1": #e9fac8, + "2": #d8f5a2, + "3": #c0eb75, + "4": #a9e34b, + "5": #94d82d, + "6": #82c91e, + "7": #74b816, + "8": #66a80f, + "9": #5c940d +); + +$oc-lime-0: map-get($oc-lime-list, "0"); +$oc-lime-1: map-get($oc-lime-list, "1"); +$oc-lime-2: map-get($oc-lime-list, "2"); +$oc-lime-3: map-get($oc-lime-list, "3"); +$oc-lime-4: map-get($oc-lime-list, "4"); +$oc-lime-5: map-get($oc-lime-list, "5"); +$oc-lime-6: map-get($oc-lime-list, "6"); +$oc-lime-7: map-get($oc-lime-list, "7"); +$oc-lime-8: map-get($oc-lime-list, "8"); +$oc-lime-9: map-get($oc-lime-list, "9"); + + +// Yellow +// ─────────────────────────────────── + +$oc-yellow-list: ( + "0": #fff9db, + "1": #fff3bf, + "2": #ffec99, + "3": #ffe066, + "4": #ffd43b, + "5": #fcc419, + "6": #fab005, + "7": #f59f00, + "8": #f08c00, + "9": #e67700 +); + +$oc-yellow-0: map-get($oc-yellow-list, "0"); +$oc-yellow-1: map-get($oc-yellow-list, "1"); +$oc-yellow-2: map-get($oc-yellow-list, "2"); +$oc-yellow-3: map-get($oc-yellow-list, "3"); +$oc-yellow-4: map-get($oc-yellow-list, "4"); +$oc-yellow-5: map-get($oc-yellow-list, "5"); +$oc-yellow-6: map-get($oc-yellow-list, "6"); +$oc-yellow-7: map-get($oc-yellow-list, "7"); +$oc-yellow-8: map-get($oc-yellow-list, "8"); +$oc-yellow-9: map-get($oc-yellow-list, "9"); + + +// Orange +// ─────────────────────────────────── + +$oc-orange-list: ( + "0": #fff4e6, + "1": #ffe8cc, + "2": #ffd8a8, + "3": #ffc078, + "4": #ffa94d, + "5": #ff922b, + "6": #fd7e14, + "7": #f76707, + "8": #e8590c, + "9": #d9480f +); + +$oc-orange-0: map-get($oc-orange-list, "0"); +$oc-orange-1: map-get($oc-orange-list, "1"); +$oc-orange-2: map-get($oc-orange-list, "2"); +$oc-orange-3: map-get($oc-orange-list, "3"); +$oc-orange-4: map-get($oc-orange-list, "4"); +$oc-orange-5: map-get($oc-orange-list, "5"); +$oc-orange-6: map-get($oc-orange-list, "6"); +$oc-orange-7: map-get($oc-orange-list, "7"); +$oc-orange-8: map-get($oc-orange-list, "8"); +$oc-orange-9: map-get($oc-orange-list, "9"); + + +// Color list +// ─────────────────────────────────── + +$oc-color-spectrum: 9; + +$oc-color-list: ( + $oc-gray-list: "gray", + $oc-red-list: "red", + $oc-pink-list: "pink", + $oc-grape-list: "grape", + $oc-violet-list: "violet", + $oc-indigo-list: "indigo", + $oc-blue-list: "blue", + $oc-cyan-list: "cyan", + $oc-teal-list: "teal", + $oc-green-list: "green", + $oc-lime-list: "lime", + $oc-yellow-list: "yellow", + $oc-orange-list: "orange" +); \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/tailwind-m3-theme/index.js b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/index.js new file mode 100644 index 0000000..8db8f5d --- /dev/null +++ b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/index.js @@ -0,0 +1,51 @@ +import { tailwindThemeFromColor } from "./tailwindThemeFromColor"; +import tailwindMaterialSurfaces from "./packages/tailwind-material-surface"; +import withModeAwareColors from "./packages/with-mode-aware-colors"; + +export const withMaterialColors = ( + config, + colorsMap, + options = { scheme: "content", contrast: 0, extend: false } +) => { + if (colorsMap.primary) { + const materialColors = tailwindThemeFromColor( + colorsMap, + options?.scheme || "content", + options?.contrast || 0 + ); + + return withModeAwareColors({ + ...config, + theme: options.extend + ? { + ...(config.theme || {}), + extend: { + ...(config.theme?.extend || {}), + colors: { + ...(config.theme?.extend?.colors || {}), + ...materialColors, + }, + }, + } + : { + ...(config.theme || {}), + colors: { ...(config.theme?.colors || {}), ...materialColors }, + }, + plugins: [ + ...(config.plugins || []), + ...tailwindMaterialSurfaces({ + surfacePrefix: "bg", + interactiveSurfacePrefix: "interactive-bg", + draggedSurfacePrefix: "dragged-bg", + disabledStyles: { + textOpacity: 0.38, + backgroundOpacity: 0.12, + colorName: "on-surface", + }, + }), + ], + }); + } else { + throw "A primary color must be specified"; + } +}; \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/tailwind-material-surface.js b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/tailwind-material-surface.js new file mode 100644 index 0000000..9065e2a --- /dev/null +++ b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/tailwind-material-surface.js @@ -0,0 +1,103 @@ +const colorMix = require("tailwindcss-color-mix"); +const plugin = require("tailwindcss/plugin"); +const { + default: flattenColorPalette, +} = require("tailwindcss/lib/util/flattenColorPalette"); + +const DEFAULT_OPTIONS = { + hoverAmount: "8", + pressAmount: "12", + focusAmount: "12", + dragAmount: "16", + surfacePrefix: "surface", + interactiveSurfacePrefix: "interactive-surface", + draggedSurfacePrefix: "dragged-surface", + disabledStyles: { + textOpacity: 0.38, + backgroundOpacity: 0.12, + colorName: "black", + }, + transition: { + duration: 150, + }, +}; + +module.exports = (options = {}) => { + const { + surfacePrefix, + interactiveSurfacePrefix, + draggedSurfacePrefix, + disabledStyles, + transition, + ...mixAmounts + } = { + ...DEFAULT_OPTIONS, + ...options, + }; + + return [ + colorMix(), + plugin(({ matchComponents, theme }) => { + const colors = flattenColorPalette(theme("colors")); + + const materialColors = Object.keys(colors).filter( + (colorName) => colors[`on-${colorName}`] + ); + + const materialColorsObject = Object.fromEntries( + materialColors.map((colorName) => [colorName, colorName]) + ); + + matchComponents( + { + [surfacePrefix]: (colorName) => ({ + ...(surfacePrefix === "bg" + ? {} + : { + [`@apply bg-${colorName}`]: {}, + }), + [`@apply text-on-${colorName}`]: {}, + }), + [interactiveSurfacePrefix]: (colorName) => ({ + [`@apply bg-${colorName}`]: {}, + [`@apply text-on-${colorName}`]: {}, + [`@apply bg-mix-on-${colorName}`]: {}, + ...(transition + ? { + [`@apply transition-colors`]: {}, + [`@apply duration-${transition.duration}`]: {}, + } + : {}), + [`@apply hover:bg-mix-amount-[${mixAmounts.hoverAmount}]`]: {}, + [`@apply active:bg-mix-amount-[${mixAmounts.pressAmount}]`]: {}, + [`@apply focus-visible:bg-mix-amount-[${mixAmounts.focusAmount}]`]: + {}, + ...(disabledStyles + ? { + [`@apply disabled:text-${disabledStyles.colorName}/[${disabledStyles.textOpacity}]`]: + {}, + [`@apply disabled:bg-${disabledStyles.colorName}/[${disabledStyles.backgroundOpacity}]`]: + {}, + } + : {}), + }), + [draggedSurfacePrefix]: (colorName) => ({ + [`@apply bg-${colorName}`]: {}, + [`@apply text-on-${colorName}`]: {}, + [`@apply bg-mix-on-${colorName}`]: {}, + [`@apply bg-mix-amount-[${mixAmounts.dragAmount}]`]: {}, + ...(transition + ? { + [`@apply transition-colors`]: {}, + [`@apply duration-${transition.duration}`]: {}, + } + : {}), + }), + }, + { + values: materialColorsObject, + } + ); + }, {}), + ]; +}; \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/with-mode-aware-colors.js b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/with-mode-aware-colors.js new file mode 100644 index 0000000..e2375a3 --- /dev/null +++ b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/packages/with-mode-aware-colors.js @@ -0,0 +1,237 @@ +const plugin = require("tailwindcss/plugin"); +const Color = require("color"); + +// from tailwindcss src/util/flattenColorPalette +const flattenColorPalette = (colors) => + Object.assign( + {}, + ...Object.entries(colors ?? {}).flatMap(([color, values]) => + typeof values == "object" + ? Object.entries(flattenColorPalette(values)).map(([number, hex]) => ({ + [color + (number === "DEFAULT" ? "" : `-${number}`)]: hex, + })) + : [{ [`${color}`]: values }] + ) + ); + +const processColors = ( + palette, + styles, + { usesMediaStrategy, darkSelector, lightId, darkId, variablePrefix = "" } +) => { + if (!palette) return { colors: {}, styles }; + + const colors = flattenColorPalette(palette); + + Object.keys(colors).forEach((colorName) => { + const match = colorName.match( + new RegExp(`^(?:(.+)-)?${lightId}(?:-(.+))?$`) + ); + + if (match) { + const prefix = match[1]; + const suffix = match[2]; + const modeAwareColorName = [prefix, suffix].filter((x) => x).join("-"); + + const lightColor = colors[colorName]; + const darkColor = + colors[[prefix, darkId, suffix].filter((x) => x).join("-")]; + + if (lightColor && darkColor) { + if (colors[modeAwareColorName]) { + throw `withModeAwareColors plugin error: adding the '${modeAwareColorName}' mode-aware color would overwrite an existing color.`; + } else { + const lightArray = Color(lightColor).rgb().array(); + const lightColorStyle = lightArray.slice(0, 3).join(" "); + const lightOpacityStyle = + lightArray.length > 3 ? `${lightArray[3] * 100}%` : undefined; + + const darkArray = Color(darkColor).rgb().array(); + const darkColorStyle = darkArray.slice(0, 3).join(" "); + const darkOpacityStyle = + darkArray.length > 3 ? `${darkArray[3] * 100}%` : undefined; + + const colorVariable = `--color-${ + variablePrefix ? `${variablePrefix}-` : "" + }${modeAwareColorName}`; + + const opacityVariable = `--opacity-${ + variablePrefix ? `${variablePrefix}-` : "" + }${modeAwareColorName}`; + + colors[modeAwareColorName] = ({ opacityValue }) => + `rgb(var(${colorVariable}) / ${ + opacityValue + ? typeof opacityValue === "string" && + opacityValue.startsWith("var(") + ? `var(${opacityVariable}, ${opacityValue})` + : opacityValue + : `var(${opacityVariable}, 1)` + })`; + + styles[":root"][colorVariable] = lightColorStyle; + if (lightOpacityStyle) { + styles[":root"][opacityVariable] = lightOpacityStyle; + } + + if (usesMediaStrategy) { + styles["@media (prefers-color-scheme: dark)"][":root"][ + colorVariable + ] = darkColorStyle; + if (darkOpacityStyle) { + styles["@media (prefers-color-scheme: dark)"][":root"][ + opacityVariable + ] = darkOpacityStyle; + } + } else { + styles[darkSelector][colorVariable] = darkColorStyle; + if (darkOpacityStyle) { + styles[darkSelector][opacityVariable] = darkOpacityStyle; + } + } + } + } + } + }); + + return { colors, styles }; +}; + +module.exports = ( + config, + { lightId, darkId } = { lightId: "light", darkId: "dark" } +) => { + const usesMediaStrategy = Array.isArray(config.darkMode) + ? config.darkMode[0] !== "selector" + : config.darkMode !== "selector"; + const darkSelector = + !usesMediaStrategy && + (Array.isArray(config.darkMode) ? config.darkMode[1] || ".dark" : ".dark"); + + const styles = { + ":root": {}, + ...(usesMediaStrategy + ? { "@media (prefers-color-scheme: dark)": { ":root": {} } } + : { [darkSelector]: {} }), + }; + + // color + if (config.theme?.colors) { + const { colors } = processColors(config.theme.colors, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + }); + config.theme.colors = colors; + } + if (config.theme?.extend?.colors) { + const { colors } = processColors(config.theme.extend.colors, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + }); + config.theme.extend.colors = colors; + } + + // textColor + if (config.theme?.textColor) { + const { colors } = processColors(config.theme.textColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "text", + }); + config.theme.textColor = colors; + } + if (config.theme?.extend?.textColor) { + const { colors } = processColors(config.theme.extend.textColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "text", + }); + config.theme.extend.textColor = colors; + } + + // backgroundColor + if (config.theme?.backgroundColor) { + const { colors } = processColors(config.theme.backgroundColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "background", + }); + config.theme.backgroundColor = colors; + } + if (config.theme?.extend?.backgroundColor) { + const { colors } = processColors( + config.theme.extend.backgroundColor, + styles, + { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "background", + } + ); + config.theme.extend.backgroundColor = colors; + } + + // borderColor + if (config.theme?.borderColor) { + const { colors } = processColors(config.theme.borderColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "border", + }); + config.theme.borderColor = colors; + } + if (config.theme?.extend?.borderColor) { + const { colors } = processColors(config.theme.extend.borderColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "border", + }); + config.theme.extend.borderColor = colors; + } + + // outlineColor + if (config.theme?.outlineColor) { + const { colors } = processColors(config.theme.outlineColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "outline", + }); + config.theme.outlineColor = colors; + } + if (config.theme?.extend?.outlineColor) { + const { colors } = processColors(config.theme.extend.outlineColor, styles, { + usesMediaStrategy, + darkSelector, + lightId, + darkId, + variablePrefix: "outline", + }); + config.theme.extend.outlineColor = colors; + } + + return { + ...config, + plugins: [ + ...(config.plugins || []), + plugin(({ addBase }) => addBase(styles)), + ], + }; +}; \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/tailwind-m3-theme/tailwindThemeFromColor.js b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/tailwindThemeFromColor.js new file mode 100644 index 0000000..f8ae05f --- /dev/null +++ b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/tailwindThemeFromColor.js @@ -0,0 +1,145 @@ +import { + argbFromHex, + hexFromArgb, + customColor, + SchemeContent, + Hct, + MaterialDynamicColors, + SchemeExpressive, + SchemeFidelity, + SchemeMonochrome, + SchemeNeutral, + SchemeTonalSpot, + SchemeVibrant, +} from "@material/material-color-utilities"; +import { kebabize } from "./util/kebabize"; + +const AllMaterialDynamicColors = { + background: MaterialDynamicColors.background, + "on-background": MaterialDynamicColors.onBackground, + + surface: MaterialDynamicColors.surface, + "surface-dim": MaterialDynamicColors.surfaceDim, + "surface-bright": MaterialDynamicColors.surfaceBright, + "surface-container-lowest": MaterialDynamicColors.surfaceContainerLowest, + "surface-container-low": MaterialDynamicColors.surfaceContainerLow, + "surface-container": MaterialDynamicColors.surfaceContainer, + "surface-container-high": MaterialDynamicColors.surfaceContainerHigh, + "surface-container-highest": MaterialDynamicColors.surfaceContainerHighest, + "on-surface": MaterialDynamicColors.onSurface, + "on-surface-dim": MaterialDynamicColors.onSurface, + "on-surface-bright": MaterialDynamicColors.onSurface, + "on-surface-container-lowest": MaterialDynamicColors.onSurface, + "on-surface-container-low": MaterialDynamicColors.onSurface, + "on-surface-container": MaterialDynamicColors.onSurface, + "on-surface-container-high": MaterialDynamicColors.onSurface, + "on-surface-container-highest": MaterialDynamicColors.onSurface, + + "surface-variant": MaterialDynamicColors.surfaceVariant, + "on-surface-variant": MaterialDynamicColors.onSurfaceVariant, + + "inverse-surface": MaterialDynamicColors.inverseSurface, + "on-inverse-surface": MaterialDynamicColors.inverseOnSurface, + + outline: MaterialDynamicColors.outline, + "outline-variant": MaterialDynamicColors.outlineVariant, + + "surface-tint": MaterialDynamicColors.surfaceTint, + "on-surface-tint": MaterialDynamicColors.onSurface, + + primary: MaterialDynamicColors.primary, + "on-primary": MaterialDynamicColors.onPrimary, + + "primary-container": MaterialDynamicColors.primaryContainer, + "on-primary-container": MaterialDynamicColors.onPrimaryContainer, + + "inverse-primary": MaterialDynamicColors.inversePrimary, + + secondary: MaterialDynamicColors.secondary, + "on-secondary": MaterialDynamicColors.onSecondary, + + "secondary-container": MaterialDynamicColors.secondaryContainer, + "on-secondary-container": MaterialDynamicColors.onSecondaryContainer, + + tertiary: MaterialDynamicColors.tertiary, + "on-tertiary": MaterialDynamicColors.onTertiary, + + "tertiary-container": MaterialDynamicColors.tertiaryContainer, + "on-tertiary-container": MaterialDynamicColors.onTertiaryContainer, + + error: MaterialDynamicColors.error, + "on-error": MaterialDynamicColors.onError, + + "error-container": MaterialDynamicColors.errorContainer, + "on-error-container": MaterialDynamicColors.onErrorContainer, + + scrim: MaterialDynamicColors.scrim, + shadow: MaterialDynamicColors.shadow, +}; + +/** + * + * @param {Record} colorsMap Values must be hex colors and 'primary' must be present. + */ +export const tailwindThemeFromColor = (colorsMap, scheme, contrast) => { + const { primary, ...extraColors } = colorsMap; + + const source = argbFromHex(primary); + + const SchemeObjects = { + content: SchemeContent, + expressive: SchemeExpressive, + fidelity: SchemeFidelity, + monochrome: SchemeMonochrome, + neutral: SchemeNeutral, + tonalSpot: SchemeTonalSpot, + vibrant: SchemeVibrant, + }; + const SchemeObject = SchemeObjects[scheme] || SchemeObjects.content; + + const lightScheme = new SchemeObject(Hct.fromInt(source), false, contrast); + const darkScheme = new SchemeObject(Hct.fromInt(source), true, contrast); + + // default colors + const colors = { + transparent: "transparent", + current: "currentColor", + black: "#000000", + white: "#ffffff", + }; + + Object.entries(AllMaterialDynamicColors).forEach(([name, DynamicColor]) => { + const lightHex = hexFromArgb(DynamicColor.getArgb(lightScheme)); + const darkHex = hexFromArgb(DynamicColor.getArgb(darkScheme)); + colors[`${name}-light`] = lightHex; + colors[`${name}-dark`] = darkHex; + }); + + Object.keys(extraColors).forEach((colorName) => { + const value = extraColors[colorName]; + + const hex = typeof value === "string" ? value : value.hex; + const blend = value === hex ? true : value.harmonize; + + const { light, dark } = customColor(source, { + value: argbFromHex(hex), + blend, + }); + const kebabName = kebabize(colorName); + + colors[`${kebabName}-light`] = hexFromArgb(light.color); + colors[`on-${kebabName}-light`] = hexFromArgb(light.onColor); + colors[`${kebabName}-container-light`] = hexFromArgb(light.colorContainer); + colors[`on-${kebabName}-container-light`] = hexFromArgb( + light.onColorContainer + ); + colors[`${kebabName}-dark`] = hexFromArgb(dark.color); + colors[`on-${kebabName}-dark`] = hexFromArgb(dark.onColor); + colors[`${kebabName}-container-dark`] = hexFromArgb(dark.colorContainer); + colors[`on-${kebabName}-container-dark`] = hexFromArgb( + dark.onColorContainer + ); + }); + + return colors; +}; \ No newline at end of file diff --git a/service/app-hub/dashboard/src/styles/tailwind-m3-theme/util/kebabize.js b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/util/kebabize.js new file mode 100644 index 0000000..f2d648d --- /dev/null +++ b/service/app-hub/dashboard/src/styles/tailwind-m3-theme/util/kebabize.js @@ -0,0 +1,10 @@ +export const kebabize = (str) => { + return str + .split("") + .map((letter, idx) => { + return letter.toUpperCase() === letter + ? `${idx !== 0 ? "-" : ""}${letter.toLowerCase()}` + : letter; + }) + .join(""); +}; \ No newline at end of file diff --git a/service/app-hub/dashboard/src/tailwind.css b/service/app-hub/dashboard/src/tailwind.css new file mode 100644 index 0000000..ff8a285 --- /dev/null +++ b/service/app-hub/dashboard/src/tailwind.css @@ -0,0 +1,2 @@ +@import "tailwindcss"; +@custom-variant dark (&:where(.dark, .dark *)); \ No newline at end of file diff --git a/service/app-hub/dashboard/tailwind.config.js b/service/app-hub/dashboard/tailwind.config.js index 73f743a..ba25e39 100644 --- a/service/app-hub/dashboard/tailwind.config.js +++ b/service/app-hub/dashboard/tailwind.config.js @@ -1,8 +1,15 @@ +const { withMaterialColors } = require('tailwind-material-colors'); + /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/**/*.{html,ts}"], theme: { - extend: {}, + extend: { + fontFamily: { + sans: ['Roboto', 'sans-serif'], + } + }, }, plugins: [], }; +