From 0e688da06ea85c3b86c0a82e73027194845b3f90 Mon Sep 17 00:00:00 2001 From: dalthecow Date: Mon, 19 May 2025 12:16:44 -0400 Subject: [PATCH 1/5] implement guidellm ui app --- ui/.eslintrc.json | 11 +- ui/__mocks__/@nivo/bar.tsx | 2 + ui/__mocks__/@nivo/core.tsx | 1 + ui/__mocks__/@nivo/line.tsx | 1 + ui/jest.config.js | 3 + ui/jest.setup.ts | 16 + ui/package-lock.json | 616 ++++++++- ui/package.json | 7 + ui/src/app/layout.tsx | 24 + ui/src/app/not-found.tsx | 4 + ui/src/app/page.tsx | 23 +- .../lib/components/Badge/Badge.component.tsx | 8 + .../lib/components/Badge/Badge.interfaces.ts | 3 + ui/src/lib/components/Badge/Badge.styles.tsx | 11 + ui/src/lib/components/Badge/index.tsx | 2 + .../BlockHeader/BlockHeader.component.tsx | 26 + .../BlockHeader/BlockHeader.interfaces.ts | 4 + .../BlockHeader/BlockHeader.styles.tsx | 8 + ui/src/lib/components/BlockHeader/index.tsx | 2 + .../Carousel/Carousel.component.tsx | 48 + .../Carousel/Carousel.interfaces.ts | 4 + .../components/Carousel/Carousel.styles.tsx | 11 + ui/src/lib/components/Carousel/index.tsx | 2 + .../Charts/Combined/Combined.component.tsx | 153 +++ .../Charts/Combined/Combined.interfaces.ts | 11 + .../CustomBars/CustomBars.interfaces.ts | 7 + .../Combined/components/CustomBars/index.tsx | 50 + .../CustomGrid/CustomGrid.interfaces.ts | 10 + .../Combined/components/CustomGrid/index.tsx | 72 + .../CustomLegendLayer.interfaces.ts | 6 + .../components/CustomLegendLayer/index.tsx | 42 + .../CustomTick/CustomTick.interfaces.ts | 8 + .../Combined/components/CustomTick/index.tsx | 58 + .../DottedLines/DottedLines.interfaces.ts | 9 + .../Combined/components/DottedLines/index.tsx | 33 + .../lib/components/Charts/Combined/index.tsx | 2 + .../DashedLine/DashedLine.component.tsx | 128 ++ .../DashedLine/DashedLine.interfaces.ts | 16 + .../CustomLegendLayer.interfaces.ts | 5 + .../components/CustomLegendLayer/index.tsx | 62 + .../DashedSolidLine.interfaces.ts | 7 + .../components/DashedSolidLine/index.tsx | 76 ++ .../components/Charts/DashedLine/helpers.ts | 76 ++ .../components/Charts/DashedLine/index.tsx | 2 + .../MetricLine/MetricLine.component.tsx | 123 ++ .../Charts/MetricLine/MetricLine.interface.ts | 15 + .../CustomAxes/CustomAxes.interfaces.ts | 6 + .../components/CustomAxes/index.tsx | 23 + .../CustomGrid/CustomGrid.interfaces.ts | 10 + .../components/CustomGrid/index.tsx | 72 + .../CustomTick/CustomTick.interfaces.ts | 8 + .../components/CustomTick/index.tsx | 65 + .../ThresholdBar/ThresholdBar.interfaces.ts | 9 + .../components/ThresholdBar/index.tsx | 53 + .../components/Charts/MetricLine/index.tsx | 3 + .../MiniCombined/MiniCombined.component.tsx | 131 ++ .../MiniCombined/MiniCombined.interfaces.ts | 15 + .../components/ContainerSizeWrapper/index.tsx | 39 + .../CustomBars/CustomBars.interfaces.ts | 7 + .../components/CustomBars/index.tsx | 87 ++ .../CustomGrid/CustomGrid.interfaces.ts | 10 + .../components/CustomGrid/index.tsx | 72 + .../CustomTick/CustomTick.interfaces.ts | 8 + .../components/CustomTick/index.tsx | 60 + .../DottedLines/DottedLines.interfaces.ts | 9 + .../components/DottedLines/index.tsx | 31 + .../components/Charts/MiniCombined/index.tsx | 2 + .../components/Charts/common/interfaces.ts | 34 + .../Charts/common/useChartScales.ts | 50 + .../Charts/common/useLineColors.tsx | 14 + .../DataPanel/DataPanel.component.tsx | 26 + .../DataPanel/DataPanel.interfaces.ts | 7 + .../components/DataPanel/DataPanel.styles.tsx | 35 + ui/src/lib/components/DataPanel/index.tsx | 2 + .../DistributionPercentiles.component.tsx | 22 + .../DistributionPercentiles.interfaces.tsx | 10 + .../DistributionPercentiles.styles.tsx | 8 + .../DistributionPercentiles/index.tsx | 5 + .../GraphTitle/GraphTitle.component.tsx | 12 + .../GraphTitle/GraphTitle.interfaces.ts | 3 + ui/src/lib/components/GraphTitle/index.tsx | 2 + .../lib/components/Input/Input.component.tsx | 60 + .../lib/components/Input/Input.interfaces.ts | 23 + ui/src/lib/components/Input/Input.styles.tsx | 60 + ui/src/lib/components/Input/index.tsx | 2 + .../MeanMetricSummary.component.tsx | 22 + .../MeanMetricSummary.interfaces.tsx | 5 + .../components/MeanMetricSummary/index.tsx | 2 + .../MetricsContainer.component.tsx | 48 + .../MetricsContainer.interfaces.ts | 8 + .../MetricsContainer.styles.tsx | 33 + .../lib/components/MetricsContainer/index.tsx | 2 + .../MetricSummary.interfaces.ts | 3 + .../MetricsSummary.component.tsx | 303 +++++ .../MetricsSummary/MetricsSummary.styles.tsx | 213 +++ .../MetricValue/MetricValue.component.tsx | 27 + .../MetricValue/MetricValue.interfaces.ts | 8 + .../components/MetricValue/index.tsx | 2 + .../lib/components/MetricsSummary/index.tsx | 1 + .../components/MetricsSummary/useSummary.ts | 118 ++ .../PageHeader/PageHeader.component.tsx | 101 ++ .../PageHeader/PageHeader.interfaces.ts | 3 + .../PageHeader/PageHeader.styles.tsx | 19 + ui/src/lib/components/PageHeader/index.tsx | 1 + .../RequestOverTime.component.tsx | 53 + .../RequestOverTime.interfaces.ts | 9 + .../lib/components/RequestOverTime/index.tsx | 2 + .../RowContainer/RowContainer.component.tsx | 18 + .../RowContainer/RowContainer.interfaces.tsx | 6 + ui/src/lib/components/RowContainer/index.tsx | 2 + .../components/Section/Section.component.tsx | 19 + .../components/Section/Section.interfaces.ts | 4 + .../lib/components/Section/Section.styles.tsx | 10 + ui/src/lib/components/Section/index.tsx | 2 + .../SectionContainer.component.tsx | 65 + .../SectionContainer.interfaces.ts | 5 + .../SectionContainer.styles.tsx | 21 + .../lib/components/SectionContainer/index.tsx | 2 + .../SpecBadge/SpecBadge.component.tsx | 30 + .../SpecBadge/SpecBadge.interfaces.ts | 12 + .../components/SpecBadge/SpecBadge.styles.tsx | 21 + ui/src/lib/components/SpecBadge/index.tsx | 2 + .../TokenLength/TokenLength.component.tsx | 47 + .../TokenLength/TokenLength.interfaces.ts | 6 + ui/src/lib/components/TokenLength/index.tsx | 2 + .../WorkloadDetails.component.tsx | 106 ++ .../lib/components/WorkloadDetails/index.tsx | 1 + .../WorkloadMetricSummary.interfaces.tsx | 0 .../WorkloadMetrics.component.tsx | 127 ++ .../WorkloadMetrics.styles.tsx | 6 + .../lib/components/WorkloadMetrics/index.tsx | 1 + ui/src/lib/hooks/useColor.ts | 19 + ui/src/lib/store/benchmarksWindowData.ts | 1154 +++++++++++++++++ ui/src/lib/store/index.ts | 33 +- ui/src/lib/store/mockData.ts | 191 +++ ui/src/lib/store/runInfoWindowData.ts | 11 + .../store/slices/benchmarks/benchmarks.api.ts | 82 ++ .../slices/benchmarks/benchmarks.constants.ts | 7 + .../benchmarks/benchmarks.interfaces.ts | 44 + .../slices/benchmarks/benchmarks.selectors.ts | 149 +++ .../slices/benchmarks/benchmarks.slice.ts | 31 + ui/src/lib/store/slices/benchmarks/index.ts | 4 + .../store/slices/metrics/metrics.constants.ts | 10 + .../slices/metrics/metrics.interfaces.ts | 13 + .../store/slices/metrics/metrics.selectors.ts | 3 + .../lib/store/slices/metrics/metrics.slice.ts | 20 + ui/src/lib/store/slices/runInfo/index.ts | 4 + .../lib/store/slices/runInfo/runInfo.api.ts | 21 + .../store/slices/runInfo/runInfo.constants.ts | 3 + .../slices/runInfo/runInfo.interfaces.ts | 13 + .../store/slices/runInfo/runInfo.selectors.ts | 3 + .../lib/store/slices/runInfo/runInfo.slice.ts | 31 + ui/src/lib/store/slices/slo/slo.constants.ts | 22 + ui/src/lib/store/slices/slo/slo.interfaces.ts | 18 + ui/src/lib/store/slices/slo/slo.selectors.ts | 3 + ui/src/lib/store/slices/slo/slo.slice.ts | 44 + .../lib/store/slices/workloadDetails/index.ts | 4 + .../workloadDetails/workloadDetails.api.ts | 21 + .../workloadDetails.constants.ts | 58 + .../workloadDetails.interfaces.ts | 49 + .../workloadDetails.selectors.ts | 71 + .../workloadDetails/workloadDetails.slice.ts | 34 + ui/src/lib/store/workloadDetailsWindowData.ts | 167 +++ ui/src/lib/utils/helpers.ts | 67 + ui/src/lib/utils/interpolation.ts | 67 + ui/src/tests/test.helper.tsx | 17 + .../Charts/DashedLine/helpers.test.ts | 86 ++ ui/src/tests/unit/store/slices/slo.test.tsx | 19 + ui/src/tests/unit/utils/interpolation.test.ts | 50 + ui/src/types/declaration.d.ts | 11 + 170 files changed, 7029 insertions(+), 26 deletions(-) create mode 100644 ui/__mocks__/@nivo/bar.tsx create mode 100644 ui/__mocks__/@nivo/core.tsx create mode 100644 ui/__mocks__/@nivo/line.tsx create mode 100644 ui/src/app/not-found.tsx create mode 100644 ui/src/lib/components/Badge/Badge.component.tsx create mode 100644 ui/src/lib/components/Badge/Badge.interfaces.ts create mode 100644 ui/src/lib/components/Badge/Badge.styles.tsx create mode 100644 ui/src/lib/components/Badge/index.tsx create mode 100644 ui/src/lib/components/BlockHeader/BlockHeader.component.tsx create mode 100644 ui/src/lib/components/BlockHeader/BlockHeader.interfaces.ts create mode 100644 ui/src/lib/components/BlockHeader/BlockHeader.styles.tsx create mode 100644 ui/src/lib/components/BlockHeader/index.tsx create mode 100644 ui/src/lib/components/Carousel/Carousel.component.tsx create mode 100644 ui/src/lib/components/Carousel/Carousel.interfaces.ts create mode 100644 ui/src/lib/components/Carousel/Carousel.styles.tsx create mode 100644 ui/src/lib/components/Carousel/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/Combined.component.tsx create mode 100644 ui/src/lib/components/Charts/Combined/Combined.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomBars/CustomBars.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomBars/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomGrid/CustomGrid.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomGrid/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomLegendLayer/CustomLegendLayer.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomLegendLayer/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomTick/CustomTick.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/CustomTick/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/components/DottedLines/DottedLines.interfaces.ts create mode 100644 ui/src/lib/components/Charts/Combined/components/DottedLines/index.tsx create mode 100644 ui/src/lib/components/Charts/Combined/index.tsx create mode 100644 ui/src/lib/components/Charts/DashedLine/DashedLine.component.tsx create mode 100644 ui/src/lib/components/Charts/DashedLine/DashedLine.interfaces.ts create mode 100644 ui/src/lib/components/Charts/DashedLine/components/CustomLegendLayer/CustomLegendLayer.interfaces.ts create mode 100644 ui/src/lib/components/Charts/DashedLine/components/CustomLegendLayer/index.tsx create mode 100644 ui/src/lib/components/Charts/DashedLine/components/DashedSolidLine/DashedSolidLine.interfaces.ts create mode 100644 ui/src/lib/components/Charts/DashedLine/components/DashedSolidLine/index.tsx create mode 100644 ui/src/lib/components/Charts/DashedLine/helpers.ts create mode 100644 ui/src/lib/components/Charts/DashedLine/index.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/MetricLine.component.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/MetricLine.interface.ts create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomAxes/CustomAxes.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomAxes/index.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomGrid/CustomGrid.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomGrid/index.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomTick/CustomTick.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MetricLine/components/CustomTick/index.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/components/ThresholdBar/ThresholdBar.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MetricLine/components/ThresholdBar/index.tsx create mode 100644 ui/src/lib/components/Charts/MetricLine/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/MiniCombined.component.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/MiniCombined.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/ContainerSizeWrapper/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomBars/CustomBars.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomBars/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomGrid/CustomGrid.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomGrid/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomTick/CustomTick.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/CustomTick/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/DottedLines/DottedLines.interfaces.ts create mode 100644 ui/src/lib/components/Charts/MiniCombined/components/DottedLines/index.tsx create mode 100644 ui/src/lib/components/Charts/MiniCombined/index.tsx create mode 100644 ui/src/lib/components/Charts/common/interfaces.ts create mode 100644 ui/src/lib/components/Charts/common/useChartScales.ts create mode 100644 ui/src/lib/components/Charts/common/useLineColors.tsx create mode 100644 ui/src/lib/components/DataPanel/DataPanel.component.tsx create mode 100644 ui/src/lib/components/DataPanel/DataPanel.interfaces.ts create mode 100644 ui/src/lib/components/DataPanel/DataPanel.styles.tsx create mode 100644 ui/src/lib/components/DataPanel/index.tsx create mode 100644 ui/src/lib/components/DistributionPercentiles/DistributionPercentiles.component.tsx create mode 100644 ui/src/lib/components/DistributionPercentiles/DistributionPercentiles.interfaces.tsx create mode 100644 ui/src/lib/components/DistributionPercentiles/DistributionPercentiles.styles.tsx create mode 100644 ui/src/lib/components/DistributionPercentiles/index.tsx create mode 100644 ui/src/lib/components/GraphTitle/GraphTitle.component.tsx create mode 100644 ui/src/lib/components/GraphTitle/GraphTitle.interfaces.ts create mode 100644 ui/src/lib/components/GraphTitle/index.tsx create mode 100644 ui/src/lib/components/Input/Input.component.tsx create mode 100644 ui/src/lib/components/Input/Input.interfaces.ts create mode 100644 ui/src/lib/components/Input/Input.styles.tsx create mode 100644 ui/src/lib/components/Input/index.tsx create mode 100644 ui/src/lib/components/MeanMetricSummary/MeanMetricSummary.component.tsx create mode 100644 ui/src/lib/components/MeanMetricSummary/MeanMetricSummary.interfaces.tsx create mode 100644 ui/src/lib/components/MeanMetricSummary/index.tsx create mode 100644 ui/src/lib/components/MetricsContainer/MetricsContainer.component.tsx create mode 100644 ui/src/lib/components/MetricsContainer/MetricsContainer.interfaces.ts create mode 100644 ui/src/lib/components/MetricsContainer/MetricsContainer.styles.tsx create mode 100644 ui/src/lib/components/MetricsContainer/index.tsx create mode 100644 ui/src/lib/components/MetricsSummary/MetricSummary.interfaces.ts create mode 100644 ui/src/lib/components/MetricsSummary/MetricsSummary.component.tsx create mode 100644 ui/src/lib/components/MetricsSummary/MetricsSummary.styles.tsx create mode 100644 ui/src/lib/components/MetricsSummary/components/MetricValue/MetricValue.component.tsx create mode 100644 ui/src/lib/components/MetricsSummary/components/MetricValue/MetricValue.interfaces.ts create mode 100644 ui/src/lib/components/MetricsSummary/components/MetricValue/index.tsx create mode 100644 ui/src/lib/components/MetricsSummary/index.tsx create mode 100644 ui/src/lib/components/MetricsSummary/useSummary.ts create mode 100644 ui/src/lib/components/PageHeader/PageHeader.component.tsx create mode 100644 ui/src/lib/components/PageHeader/PageHeader.interfaces.ts create mode 100644 ui/src/lib/components/PageHeader/PageHeader.styles.tsx create mode 100644 ui/src/lib/components/PageHeader/index.tsx create mode 100644 ui/src/lib/components/RequestOverTime/RequestOverTime.component.tsx create mode 100644 ui/src/lib/components/RequestOverTime/RequestOverTime.interfaces.ts create mode 100644 ui/src/lib/components/RequestOverTime/index.tsx create mode 100644 ui/src/lib/components/RowContainer/RowContainer.component.tsx create mode 100644 ui/src/lib/components/RowContainer/RowContainer.interfaces.tsx create mode 100644 ui/src/lib/components/RowContainer/index.tsx create mode 100644 ui/src/lib/components/Section/Section.component.tsx create mode 100644 ui/src/lib/components/Section/Section.interfaces.ts create mode 100644 ui/src/lib/components/Section/Section.styles.tsx create mode 100644 ui/src/lib/components/Section/index.tsx create mode 100644 ui/src/lib/components/SectionContainer/SectionContainer.component.tsx create mode 100644 ui/src/lib/components/SectionContainer/SectionContainer.interfaces.ts create mode 100644 ui/src/lib/components/SectionContainer/SectionContainer.styles.tsx create mode 100644 ui/src/lib/components/SectionContainer/index.tsx create mode 100644 ui/src/lib/components/SpecBadge/SpecBadge.component.tsx create mode 100644 ui/src/lib/components/SpecBadge/SpecBadge.interfaces.ts create mode 100644 ui/src/lib/components/SpecBadge/SpecBadge.styles.tsx create mode 100644 ui/src/lib/components/SpecBadge/index.tsx create mode 100644 ui/src/lib/components/TokenLength/TokenLength.component.tsx create mode 100644 ui/src/lib/components/TokenLength/TokenLength.interfaces.ts create mode 100644 ui/src/lib/components/TokenLength/index.tsx create mode 100644 ui/src/lib/components/WorkloadDetails/WorkloadDetails.component.tsx create mode 100644 ui/src/lib/components/WorkloadDetails/index.tsx create mode 100644 ui/src/lib/components/WorkloadMetrics/WorkloadMetricSummary.interfaces.tsx create mode 100644 ui/src/lib/components/WorkloadMetrics/WorkloadMetrics.component.tsx create mode 100644 ui/src/lib/components/WorkloadMetrics/WorkloadMetrics.styles.tsx create mode 100644 ui/src/lib/components/WorkloadMetrics/index.tsx create mode 100644 ui/src/lib/hooks/useColor.ts create mode 100644 ui/src/lib/store/benchmarksWindowData.ts create mode 100644 ui/src/lib/store/mockData.ts create mode 100644 ui/src/lib/store/runInfoWindowData.ts create mode 100644 ui/src/lib/store/slices/benchmarks/benchmarks.api.ts create mode 100644 ui/src/lib/store/slices/benchmarks/benchmarks.constants.ts create mode 100644 ui/src/lib/store/slices/benchmarks/benchmarks.interfaces.ts create mode 100644 ui/src/lib/store/slices/benchmarks/benchmarks.selectors.ts create mode 100644 ui/src/lib/store/slices/benchmarks/benchmarks.slice.ts create mode 100644 ui/src/lib/store/slices/benchmarks/index.ts create mode 100644 ui/src/lib/store/slices/metrics/metrics.constants.ts create mode 100644 ui/src/lib/store/slices/metrics/metrics.interfaces.ts create mode 100644 ui/src/lib/store/slices/metrics/metrics.selectors.ts create mode 100644 ui/src/lib/store/slices/metrics/metrics.slice.ts create mode 100644 ui/src/lib/store/slices/runInfo/index.ts create mode 100644 ui/src/lib/store/slices/runInfo/runInfo.api.ts create mode 100644 ui/src/lib/store/slices/runInfo/runInfo.constants.ts create mode 100644 ui/src/lib/store/slices/runInfo/runInfo.interfaces.ts create mode 100644 ui/src/lib/store/slices/runInfo/runInfo.selectors.ts create mode 100644 ui/src/lib/store/slices/runInfo/runInfo.slice.ts create mode 100644 ui/src/lib/store/slices/slo/slo.constants.ts create mode 100644 ui/src/lib/store/slices/slo/slo.interfaces.ts create mode 100644 ui/src/lib/store/slices/slo/slo.selectors.ts create mode 100644 ui/src/lib/store/slices/slo/slo.slice.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/index.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/workloadDetails.api.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/workloadDetails.constants.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/workloadDetails.interfaces.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/workloadDetails.selectors.ts create mode 100644 ui/src/lib/store/slices/workloadDetails/workloadDetails.slice.ts create mode 100644 ui/src/lib/store/workloadDetailsWindowData.ts create mode 100644 ui/src/lib/utils/helpers.ts create mode 100644 ui/src/lib/utils/interpolation.ts create mode 100644 ui/src/tests/test.helper.tsx create mode 100644 ui/src/tests/unit/components/Charts/DashedLine/helpers.test.ts create mode 100644 ui/src/tests/unit/store/slices/slo.test.tsx create mode 100644 ui/src/tests/unit/utils/interpolation.test.ts create mode 100644 ui/src/types/declaration.d.ts diff --git a/ui/.eslintrc.json b/ui/.eslintrc.json index e1b46682..c6e3094f 100644 --- a/ui/.eslintrc.json +++ b/ui/.eslintrc.json @@ -76,6 +76,15 @@ "peerDependencies": false } ], - "no-secrets/no-secrets": ["error", { "additionalRegexes": {}, "ignoreContent": [] }] + "no-secrets/no-secrets": ["error", { "additionalRegexes": {}, "ignoreContent": [] }], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", // or "error" + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ] } } diff --git a/ui/__mocks__/@nivo/bar.tsx b/ui/__mocks__/@nivo/bar.tsx new file mode 100644 index 00000000..a99b6dec --- /dev/null +++ b/ui/__mocks__/@nivo/bar.tsx @@ -0,0 +1,2 @@ +export const ResponsiveBar = () => null; +export const BarCustomLayerProps = () => null; diff --git a/ui/__mocks__/@nivo/core.tsx b/ui/__mocks__/@nivo/core.tsx new file mode 100644 index 00000000..66e2da8a --- /dev/null +++ b/ui/__mocks__/@nivo/core.tsx @@ -0,0 +1 @@ +export const Point = () => null; diff --git a/ui/__mocks__/@nivo/line.tsx b/ui/__mocks__/@nivo/line.tsx new file mode 100644 index 00000000..bf985ef3 --- /dev/null +++ b/ui/__mocks__/@nivo/line.tsx @@ -0,0 +1 @@ +export const ResponsiveLine = () => null; diff --git a/ui/jest.config.js b/ui/jest.config.js index f05bde8b..7d407467 100644 --- a/ui/jest.config.js +++ b/ui/jest.config.js @@ -22,6 +22,9 @@ const customJestConfig = { transform: { '^.+\\.(ts|tsx)$': 'ts-jest', }, + transformIgnorePatterns: [ + '/node_modules/(?!(@nivo|d3|d3-.*|internmap|delaunator|robust-predicates)/)', + ], }; module.exports = createJestConfig(customJestConfig); diff --git a/ui/jest.setup.ts b/ui/jest.setup.ts index 7b0828bf..09b64885 100644 --- a/ui/jest.setup.ts +++ b/ui/jest.setup.ts @@ -1 +1,17 @@ import '@testing-library/jest-dom'; + +jest.mock('@nivo/bar'); +jest.mock('@nivo/line'); +jest.mock('@nivo/core'); + +jest.mock('next/dynamic', () => ({ + __esModule: true, + default: (...props: any[]) => { + const dynamicModule = jest.requireActual('next/dynamic'); + const dynamicActualComp = dynamicModule.default; + const RequiredComponent = dynamicActualComp(props[0]); + // eslint-disable-next-line no-unused-expressions, @typescript-eslint/no-unused-expressions + RequiredComponent.preload ? RequiredComponent.preload() : RequiredComponent.render.preload(); + return RequiredComponent; + }, +})); diff --git a/ui/package-lock.json b/ui/package-lock.json index 969d7647..e90e36f3 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -13,10 +13,17 @@ "@emotion/styled": "^11.14.0", "@mui/material": "^5.11.7", "@mui/material-nextjs": "^5.16.6", + "@nivo/bar": "^0.88.0", + "@nivo/core": "^0.88.0", + "@nivo/line": "^0.88.0", + "@nivo/scales": "^0.88.0", + "@nivo/tooltip": "^0.88.0", "@reduxjs/toolkit": "^2.2.7", + "filesize": "^10.1.6", "next": "14.2.5", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-material-ui-carousel": "^3.4.2", "react-redux": "^9.1.2" }, "devDependencies": { @@ -3018,6 +3025,32 @@ "url": "https://opencollective.com/mui-org" } }, + "node_modules/@mui/icons-material": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.17.1.tgz", + "integrity": "sha512-CN86LocjkunFGG0yPlO4bgqHkNGgaEOEc3X/jG5Bzm401qYw79/SaLrofA7yAKCCXAGdIGnLoMHohc3+ubs95A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/material": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.17.1.tgz", @@ -3460,6 +3493,198 @@ "node": ">= 10" } }, + "node_modules/@nivo/annotations": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/annotations/-/annotations-0.88.0.tgz", + "integrity": "sha512-NXE+1oIUn+EGWMQpnpeRMLgi2wyuzhGDoJQY4OUHissCUiNotid2oNQ/PXJwN0toiu+/j9SyhzI32xr70OPi7Q==", + "license": "MIT", + "dependencies": { + "@nivo/colors": "0.88.0", + "@nivo/core": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/axes": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/axes/-/axes-0.88.0.tgz", + "integrity": "sha512-jF7aIxzTNayV5cI1J/b9Q1FfpMBxTXGk3OwSigXMSfYWlliskDn2u0qGRLiYhuXFdQAWIp4oXsO1GcAQ0eRVdg==", + "license": "MIT", + "dependencies": { + "@nivo/core": "0.88.0", + "@nivo/scales": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-format": "^1.4.1", + "@types/d3-time-format": "^2.3.1", + "d3-format": "^1.4.4", + "d3-time-format": "^3.0.0" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/bar": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/bar/-/bar-0.88.0.tgz", + "integrity": "sha512-wckwuHWeCikxGvvdRfGL+dVFsUD9uHk1r9s7bWUfOD+p8BWhxtYqfXpHolEfgGg3UyPaHtpGA7P4zgE5vgo7gQ==", + "license": "MIT", + "dependencies": { + "@nivo/annotations": "0.88.0", + "@nivo/axes": "0.88.0", + "@nivo/colors": "0.88.0", + "@nivo/core": "0.88.0", + "@nivo/legends": "0.88.0", + "@nivo/scales": "0.88.0", + "@nivo/tooltip": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-scale": "^4.0.8", + "@types/d3-shape": "^3.1.6", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/colors": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/colors/-/colors-0.88.0.tgz", + "integrity": "sha512-IZ+leYIqAlo7dyLHmsQwujanfRgXyoQ5H7PU3RWLEn1PP0zxDKLgEjFEDADpDauuslh2Tx0L81GNkWR6QSP0Mw==", + "license": "MIT", + "dependencies": { + "@nivo/core": "0.88.0", + "@types/d3-color": "^3.0.0", + "@types/d3-scale": "^4.0.8", + "@types/d3-scale-chromatic": "^3.0.0", + "@types/prop-types": "^15.7.2", + "d3-color": "^3.1.0", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.0.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/core": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/core/-/core-0.88.0.tgz", + "integrity": "sha512-XjUkA5MmwjLP38bdrJwn36Gj7T5SYMKD55LYQp/1nIJPdxqJ38dUfE4XyBDfIEgfP6yrHOihw3C63cUdnUBoiw==", + "license": "MIT", + "dependencies": { + "@nivo/tooltip": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-shape": "^3.1.6", + "d3-color": "^3.1.0", + "d3-format": "^1.4.4", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.0.0", + "d3-shape": "^3.2.0", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nivo/donate" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/legends": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/legends/-/legends-0.88.0.tgz", + "integrity": "sha512-d4DF9pHbD8LmGJlp/Gp1cF4e8y2wfQTcw3jVhbZj9zkb7ZWB7JfeF60VHRfbXNux9bjQ9U78/SssQqueVDPEmg==", + "license": "MIT", + "dependencies": { + "@nivo/colors": "0.88.0", + "@nivo/core": "0.88.0", + "@types/d3-scale": "^4.0.8", + "d3-scale": "^4.0.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/line": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/line/-/line-0.88.0.tgz", + "integrity": "sha512-hFTyZ3BdAZvq2HwdwMj2SJGUeodjEW+7DLtFMIIoVIxmjZlAs3z533HcJ9cJd3it928fDm8SF/rgHs0TztYf9Q==", + "license": "MIT", + "dependencies": { + "@nivo/annotations": "0.88.0", + "@nivo/axes": "0.88.0", + "@nivo/colors": "0.88.0", + "@nivo/core": "0.88.0", + "@nivo/legends": "0.88.0", + "@nivo/scales": "0.88.0", + "@nivo/tooltip": "0.88.0", + "@nivo/voronoi": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "d3-shape": "^3.2.0" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/scales": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/scales/-/scales-0.88.0.tgz", + "integrity": "sha512-HbpxkQp6tHCltZ1yDGeqdLcaJl5ze54NPjurfGtx/Uq+H5IQoBd4Tln49bUar5CsFAMsXw8yF1HQvASr7I1SIA==", + "license": "MIT", + "dependencies": { + "@types/d3-scale": "^4.0.8", + "@types/d3-time": "^1.1.1", + "@types/d3-time-format": "^3.0.0", + "d3-scale": "^4.0.2", + "d3-time": "^1.0.11", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + } + }, + "node_modules/@nivo/scales/node_modules/@types/d3-time-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-3.0.4.tgz", + "integrity": "sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg==", + "license": "MIT" + }, + "node_modules/@nivo/tooltip": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/tooltip/-/tooltip-0.88.0.tgz", + "integrity": "sha512-iEjVfQA8gumAzg/yUinjTwswygCkE5Iwuo8opwnrbpNIqMrleBV+EAKIgB0PrzepIoW8CFG/SJhoiRfbU8jhOw==", + "license": "MIT", + "dependencies": { + "@nivo/core": "0.88.0", + "@react-spring/web": "9.4.5 || ^9.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/voronoi": { + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@nivo/voronoi/-/voronoi-0.88.0.tgz", + "integrity": "sha512-MyiNLvODthFoMjQ7Wjp693nogbTmVEx8Yn/7QkJhyPQbFyyA37TF/D1a/ox4h2OslXtP6K9QFN+42gB/zu7ixw==", + "license": "MIT", + "dependencies": { + "@nivo/core": "0.88.0", + "@nivo/tooltip": "0.88.0", + "@types/d3-delaunay": "^6.0.4", + "@types/d3-scale": "^4.0.8", + "d3-delaunay": "^6.0.4", + "d3-scale": "^4.0.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3542,6 +3767,78 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT" + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@reduxjs/toolkit": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", @@ -4095,6 +4392,66 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==", + "license": "MIT" + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", + "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.4.tgz", + "integrity": "sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -6270,6 +6627,134 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-time": "1 - 2" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -6458,6 +6943,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8144,6 +8638,15 @@ "node": ">=10" } }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -8274,6 +8777,52 @@ "node": ">= 6" } }, + "node_modules/framer-motion": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-4.1.17.tgz", + "integrity": "sha512-thx1wvKzblzbs0XaK2X0G1JuwIdARcoNOW7VVwjO8BUltzXPyONGAElLu6CiCScsOQRI7FIk/45YTFtJw5Yozw==", + "license": "MIT", + "dependencies": { + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "popmotion": "9.3.6", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8 || ^17.0.0", + "react-dom": ">=16.8 || ^17.0.0" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/framesync": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz", + "integrity": "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8716,6 +9265,12 @@ "node": ">= 0.4" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, "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", @@ -8975,6 +9530,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -11187,7 +11751,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { @@ -12185,6 +12748,18 @@ "node": ">=8" } }, + "node_modules/popmotion": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.3.6.tgz", + "integrity": "sha512-ZTbXiu6zIggXzIliMi8LGxXBF5ST+wkpXGEjeTUDUOCdSQ356hij/xjeUdv0F8zCQNeqB1+PR5/BB+gC+QLAPw==", + "license": "MIT", + "dependencies": { + "framesync": "5.3.0", + "hey-listen": "^1.0.8", + "style-value-types": "4.1.4", + "tslib": "^2.1.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -12484,6 +13059,29 @@ "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", "license": "MIT" }, + "node_modules/react-material-ui-carousel": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/react-material-ui-carousel/-/react-material-ui-carousel-3.4.2.tgz", + "integrity": "sha512-jUbC5aBWqbbbUOOdUe3zTVf4kMiZFwKJqwhxzHgBfklaXQbSopis4iWAHvEOLcZtSIJk4JAGxKE0CmxDoxvUuw==", + "license": "MIT", + "dependencies": { + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@mui/icons-material": "^5.4.1", + "@mui/material": "^5.4.1", + "@mui/system": "^5.4.1", + "framer-motion": "^4.1.17" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "@mui/icons-material": "^5.0.0", + "@mui/material": "^5.0.0", + "@mui/system": "^5.0.0", + "react": "^17.0.1 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, "node_modules/react-redux": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", @@ -12867,6 +13465,12 @@ "node": "*" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -13569,6 +14173,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-value-types": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-4.1.4.tgz", + "integrity": "sha512-LCJL6tB+vPSUoxgUBt9juXIlNJHtBMy8jkXzUJSBzeHWdBu6lhzHqCvLVkXFGsFIlNa2ln1sQHya/gzaFmB2Lg==", + "license": "MIT", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", diff --git a/ui/package.json b/ui/package.json index ddc93d1a..37a86be1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -18,10 +18,17 @@ "@emotion/styled": "^11.14.0", "@mui/material": "^5.11.7", "@mui/material-nextjs": "^5.16.6", + "@nivo/bar": "^0.88.0", + "@nivo/core": "^0.88.0", + "@nivo/line": "^0.88.0", + "@nivo/scales": "^0.88.0", + "@nivo/tooltip": "^0.88.0", "@reduxjs/toolkit": "^2.2.7", + "filesize": "^10.1.6", "next": "14.2.5", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-material-ui-carousel": "^3.4.2", "react-redux": "^9.1.2" }, "devDependencies": { diff --git a/ui/src/app/layout.tsx b/ui/src/app/layout.tsx index 0e0af570..213dd7eb 100644 --- a/ui/src/app/layout.tsx +++ b/ui/src/app/layout.tsx @@ -1,5 +1,9 @@ import React from 'react'; +import { benchmarksScript } from '@/lib/store/benchmarksWindowData'; +import { runInfoScript } from '@/lib/store/runInfoWindowData'; +import { workloadDetailsScript } from '@/lib/store/workloadDetailsWindowData'; + import './globals.css'; export default function RootLayout({ @@ -21,6 +25,26 @@ export default function RootLayout({ Guide LLM + {/*