From 183555401f11ae074005e419c552fa7efdcfd7dc Mon Sep 17 00:00:00 2001 From: Nima Kaviani <17132353+nimakaviani@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:00:37 -0700 Subject: [PATCH] update the theme to match the CNOE theme (#6) * update the CNOE look and fill * bump package versions --------- Co-authored-by: Manabu McCloskey --- packages/app/package.json | 1 + packages/app/src/App.tsx | 32 ++++++- packages/app/src/apis.ts | 4 +- packages/app/src/components/Root/Root.tsx | 8 +- plugins/cnoe-ui-plugin/package.json | 53 ++++++++++++ .../src/components/Homepage.tsx | 83 +++++++++++++++++++ .../src/components/logos/LogoBig.tsx | 56 +++++++++++++ .../src/components/logos/LogoFull.tsx | 56 +++++++++++++ .../src/components/logos/LogoIcon.tsx | 44 ++++++++++ .../src/components/logos/index.tsx | 3 + .../src/components/themes/dark-theme.ts | 38 +++++++++ .../src/components/themes/index.ts | 2 + .../src/components/themes/light-theme.ts | 39 +++++++++ plugins/cnoe-ui-plugin/src/index.ts | 3 + plugins/cnoe-ui-plugin/src/plugin.ts | 36 ++++++++ plugins/cnoe-ui-plugin/src/routes.ts | 5 ++ plugins/workflows/package.json | 16 ++-- yarn.lock | 80 ++++++++++++++++-- 18 files changed, 540 insertions(+), 19 deletions(-) create mode 100644 plugins/cnoe-ui-plugin/package.json create mode 100644 plugins/cnoe-ui-plugin/src/components/Homepage.tsx create mode 100644 plugins/cnoe-ui-plugin/src/components/logos/LogoBig.tsx create mode 100644 plugins/cnoe-ui-plugin/src/components/logos/LogoFull.tsx create mode 100644 plugins/cnoe-ui-plugin/src/components/logos/LogoIcon.tsx create mode 100644 plugins/cnoe-ui-plugin/src/components/logos/index.tsx create mode 100644 plugins/cnoe-ui-plugin/src/components/themes/dark-theme.ts create mode 100644 plugins/cnoe-ui-plugin/src/components/themes/index.ts create mode 100644 plugins/cnoe-ui-plugin/src/components/themes/light-theme.ts create mode 100644 plugins/cnoe-ui-plugin/src/index.ts create mode 100644 plugins/cnoe-ui-plugin/src/plugin.ts create mode 100644 plugins/cnoe-ui-plugin/src/routes.ts diff --git a/packages/app/package.json b/packages/app/package.json index a9e0b04..89cfe01 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -49,6 +49,7 @@ "@cnoe-io/plugin-argo-workflows": "0.1.1", "@cnoe-io/plugin-scaffolder-actions-frontend": "0.1.1", "@internal/plugin-workflows": "^0.1.0", + "@internal/cnoe-ui-plugin": "^0.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@rjsf/core": "^5.8.1", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 9ec04a8..e97ca3d 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -40,6 +40,11 @@ import { RequirePermission } from '@backstage/plugin-permission-react'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; import { KubernetesClusterPickerExtension } from '@cnoe-io/plugin-scaffolder-actions-frontend'; +import { ThemeProvider } from '@material-ui/core/styles'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import LightIcon from '@material-ui/icons/WbSunny'; +import {CNOEHomepage, cnoeLightTheme, cnoeDarkTheme} from '@internal/cnoe-ui-plugin' + const app = createApp({ apis, components: { @@ -72,11 +77,36 @@ const app = createApp({ catalogIndex: catalogPlugin.routes.catalogIndex, }); }, + themes: [ + { + id: 'cnoe-light-theme', + title: 'Light Theme', + variant: 'light', + icon: , + Provider: ({ children }) => ( + + {children} + + ), + }, + { + id: 'cnoe-dark-theme', + title: 'Dark Theme', + variant: 'dark', + icon: , + Provider: ({ children }) => ( + + {children} + + ), + }, + ] }); const routes = ( - } /> + } /> + } /> } /> ScmIntegrationsApi.fromConfig(configApi), + deps: {configApi: configApiRef}, + factory: ({configApi}) => ScmIntegrationsApi.fromConfig(configApi), }), ScmAuth.createDefaultApiFactory(), createApiFactory({ diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx index 6768b48..0a44078 100644 --- a/packages/app/src/components/Root/Root.tsx +++ b/packages/app/src/components/Root/Root.tsx @@ -1,12 +1,13 @@ import React, { PropsWithChildren } from 'react'; import { makeStyles } from '@material-ui/core'; import HomeIcon from '@material-ui/icons/Home'; +import CategoryIcon from '@material-ui/icons/Category'; import ExtensionIcon from '@material-ui/icons/Extension'; import MapIcon from '@material-ui/icons/MyLocation'; import LibraryBooks from '@material-ui/icons/LibraryBooks'; import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; -import LogoFull from './LogoFull'; -import LogoIcon from './LogoIcon'; +import {LogoFull, LogoIcon} from '@internal/cnoe-ui-plugin'; + import { Settings as SidebarSettings, UserSettingsSignInAvatar, @@ -65,7 +66,8 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( }> {/* Global nav, not org-specific */} - + + diff --git a/plugins/cnoe-ui-plugin/package.json b/plugins/cnoe-ui-plugin/package.json new file mode 100644 index 0000000..3b03a31 --- /dev/null +++ b/plugins/cnoe-ui-plugin/package.json @@ -0,0 +1,53 @@ +{ + "name": "@internal/cnoe-ui-plugin", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "^0.13.3", + "@backstage/core-plugin-api": "^1.5.3", + "@backstage/plugin-catalog-react": "^1.8.0", + "@backstage/plugin-home": "^0.5.4", + "@backstage/theme": "^0.4.1", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.22.9", + "@backstage/core-app-api": "^1.9.0", + "@backstage/dev-utils": "^1.0.17", + "@backstage/test-utils": "^1.4.1", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/node": "*", + "cross-fetch": "^3.1.5", + "msw": "^0.49.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/cnoe-ui-plugin/src/components/Homepage.tsx b/plugins/cnoe-ui-plugin/src/components/Homepage.tsx new file mode 100644 index 0000000..e1f7029 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/Homepage.tsx @@ -0,0 +1,83 @@ +import { Content, Page } from '@backstage/core-components'; +import { HomePageSearchBar } from '@backstage/plugin-search'; +import { SearchContextProvider } from '@backstage/plugin-search-react'; +import { Grid, makeStyles } from '@material-ui/core'; +import React from 'react'; + +import { + HomePageToolkit, + HomePageCompanyLogo, + HomePageStarredEntities, + TemplateBackstageLogoIcon, +} from '@backstage/plugin-home'; + +import { + LogoBig, +} from './logos'; + +const useStyles = makeStyles(theme => ({ + searchBar: { + display: 'flex', + maxWidth: '60vw', + backgroundColor: theme.palette.background.paper, + boxShadow: theme.shadows[1], + padding: '8px 0', + borderRadius: '50px', + margin: 'auto', + }, +})); + +const useLogoStyles = makeStyles(theme => ({ + container: { + margin: theme.spacing(5, 0), + }, + svg: { + width: 'auto', + height: 100, + }, + path: { + fill: '#00568c', + }, +})); + +export const CNOEHomepage = () => { + const classes = useStyles(); + const { container } = useLogoStyles(); + + return ( + + + + + } /> + + + + + + + + + , + }, + { + url: '/docs', + label: 'Tech Docs', + icon: , + }, + ]} + /> + + + + + + + ); +}; diff --git a/plugins/cnoe-ui-plugin/src/components/logos/LogoBig.tsx b/plugins/cnoe-ui-plugin/src/components/logos/LogoBig.tsx new file mode 100644 index 0000000..048dd9b --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/logos/LogoBig.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 190, + }, + whitePath: { + fill: '#ffffff', + stroke: 'none', + }, + bluePath: { + fill: '#00568c', + stroke: 'none', + }, + cyanPath: { + fill: '#00adee', + stroke: 'none', + }, +}); + +export const LogoBig = () => { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/plugins/cnoe-ui-plugin/src/components/logos/LogoFull.tsx b/plugins/cnoe-ui-plugin/src/components/logos/LogoFull.tsx new file mode 100644 index 0000000..d4489ed --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/logos/LogoFull.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 90, + }, + whitePath: { + fill: '#ffffff', + stroke: 'none', + }, + bluePath: { + fill: '#00568c', + stroke: 'none', + }, + cyanPath: { + fill: '#00adee', + stroke: 'none', + }, +}); + +export const LogoFull = () => { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/plugins/cnoe-ui-plugin/src/components/logos/LogoIcon.tsx b/plugins/cnoe-ui-plugin/src/components/logos/LogoIcon.tsx new file mode 100644 index 0000000..bcf70a1 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/logos/LogoIcon.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 28, + }, + whitePath: { + fill: '#ffffff', + stroke: 'none', + }, + bluePath: { + fill: '#00568c', + stroke: 'none', + }, + cyanPath: { + fill: '#00adee', + stroke: 'none', + }, +}); + +export const LogoIcon = () => { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + ); +}; diff --git a/plugins/cnoe-ui-plugin/src/components/logos/index.tsx b/plugins/cnoe-ui-plugin/src/components/logos/index.tsx new file mode 100644 index 0000000..908ff17 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/logos/index.tsx @@ -0,0 +1,3 @@ +export {LogoFull} from './LogoFull'; +export {LogoIcon} from './LogoIcon'; +export {LogoBig} from './LogoBig'; diff --git a/plugins/cnoe-ui-plugin/src/components/themes/dark-theme.ts b/plugins/cnoe-ui-plugin/src/components/themes/dark-theme.ts new file mode 100644 index 0000000..08bbcc8 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/themes/dark-theme.ts @@ -0,0 +1,38 @@ +import {createTheme, darkTheme, genPageTheme, shapes} from '@backstage/theme'; + +export const cnoeDarkTheme = createTheme({ + palette: { + ...darkTheme.palette, + primary: { + main: '#25a0c2', + }, + secondary: { + main: '#00568c', + }, + }, + defaultPageTheme: 'home', + pageTheme: { + home: genPageTheme({colors: ['#25a0c2', '#00568c'], shape: shapes.wave}), + documentation: genPageTheme({ + colors: ['#25a0c2', '#00568c'], + shape: shapes.wave2, + }), + tool: genPageTheme({colors: ['#25a0c2', '#00568c'], shape: shapes.round}), + service: genPageTheme({ + colors: ['#25a0c2', '#00568c'], + shape: shapes.wave, + }), + website: genPageTheme({ + colors: ['#25a0c2', '#00568c'], + shape: shapes.wave, + }), + library: genPageTheme({ + colors: ['#25a0c2', '#00568c'], + shape: shapes.wave, + }), + other: genPageTheme({colors: ['#25a0c2', '#00568c'], shape: shapes.wave}), + app: genPageTheme({colors: ['#25a0c2', '#00568c'], shape: shapes.wave}), + apis: genPageTheme({colors: ['#25a0c2', '#00568c'], shape: shapes.wave}), + }, +}); + diff --git a/plugins/cnoe-ui-plugin/src/components/themes/index.ts b/plugins/cnoe-ui-plugin/src/components/themes/index.ts new file mode 100644 index 0000000..197db68 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/themes/index.ts @@ -0,0 +1,2 @@ +export {cnoeDarkTheme} from './dark-theme'; +export {cnoeLightTheme} from './light-theme'; diff --git a/plugins/cnoe-ui-plugin/src/components/themes/light-theme.ts b/plugins/cnoe-ui-plugin/src/components/themes/light-theme.ts new file mode 100644 index 0000000..2a6dbe8 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/components/themes/light-theme.ts @@ -0,0 +1,39 @@ +import {createTheme, lightTheme, genPageTheme, shapes} from '@backstage/theme'; + +export const cnoeLightTheme = createTheme({ + palette: { + ...lightTheme.palette, + primary: { + main: '#00568c', + }, + secondary: { + main: '#00adee', + }, + }, + defaultPageTheme: 'home', + pageTheme: { + home: genPageTheme({colors: ['#00568c', '#00adee'], shape: shapes.wave}), + documentation: genPageTheme({ + colors: ['#00568c', '#00adee'], + shape: shapes.wave2, + }), + tool: genPageTheme({colors: ['#00568c', '#00adee'], shape: shapes.round}), + service: genPageTheme({ + colors: ['#00568c', '#00adee'], + shape: shapes.wave, + }), + website: genPageTheme({ + colors: ['#00568c', '#00adee'], + shape: shapes.wave, + }), + library: genPageTheme({ + colors: ['#00568c', '#00adee'], + shape: shapes.wave, + }), + other: genPageTheme({colors: ['#00568c', '#00adee'], shape: shapes.wave}), + app: genPageTheme({colors: ['#00568c', '#00adee'], shape: shapes.wave}), + apis: genPageTheme({colors: ['#00568c', '#00adee'], shape: shapes.wave}), + }, +}); + + diff --git a/plugins/cnoe-ui-plugin/src/index.ts b/plugins/cnoe-ui-plugin/src/index.ts new file mode 100644 index 0000000..467f2b0 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/index.ts @@ -0,0 +1,3 @@ +export * from './components/themes'; +export {LogoFull, LogoIcon} from './components/logos'; +export {CNOEHomepage} from './components/Homepage'; diff --git a/plugins/cnoe-ui-plugin/src/plugin.ts b/plugins/cnoe-ui-plugin/src/plugin.ts new file mode 100644 index 0000000..60bb363 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/plugin.ts @@ -0,0 +1,36 @@ +import {createPlugin, createComponentExtension} from '@backstage/core-plugin-api'; + +import {rootRouteRef} from './routes'; + +export const cnoeFrontendPlugin = createPlugin({ + id: 'cnoe-ui-plugin', + routes: { + root: rootRouteRef, + }, +}); + +export const AWSLogoFull = cnoeFrontendPlugin + .provide( + createComponentExtension({ + name: 'LogoFull', + component: {lazy: () => import('./components/logos/LogoFull').then(m => m.LogoFull)}, + }), + ); + +export const AWSLogoIcon = cnoeFrontendPlugin + .provide( + createComponentExtension({ + name: 'LogoIcon', + component: {lazy: () => import('./components/logos/LogoIcon').then(m => m.LogoIcon)}, + }), + ); + +export const CNOEHomepage = cnoeFrontendPlugin + .provide( + createComponentExtension({ + name: 'Homepage', + component: { + lazy: () => import('./components/Homepage').then(m => m.CNOEHomepage), + }, + }), + ); diff --git a/plugins/cnoe-ui-plugin/src/routes.ts b/plugins/cnoe-ui-plugin/src/routes.ts new file mode 100644 index 0000000..c54a838 --- /dev/null +++ b/plugins/cnoe-ui-plugin/src/routes.ts @@ -0,0 +1,5 @@ +import {createRouteRef} from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'cnoe-ui', +}); diff --git a/plugins/workflows/package.json b/plugins/workflows/package.json index c8e289c..f5bc5d1 100644 --- a/plugins/workflows/package.json +++ b/plugins/workflows/package.json @@ -23,10 +23,10 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.13.1", - "@backstage/core-plugin-api": "^1.5.1", - "@backstage/plugin-catalog-react": "^1.6.0", - "@backstage/theme": "^0.3.0", + "@backstage/core-components": "^0.13.3", + "@backstage/core-plugin-api": "^1.5.3", + "@backstage/plugin-catalog-react": "^1.8.0", + "@backstage/theme": "^0.4.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", @@ -36,10 +36,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.22.7", - "@backstage/core-app-api": "^1.8.0", - "@backstage/dev-utils": "^1.0.15", - "@backstage/test-utils": "^1.3.1", + "@backstage/cli": "^0.22.9", + "@backstage/core-app-api": "^1.9.0", + "@backstage/dev-utils": "^1.0.17", + "@backstage/test-utils": "^1.4.1", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/yarn.lock b/yarn.lock index 6123f63..da467b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3762,6 +3762,43 @@ luxon "^3.0.0" react-use "^17.2.4" +"@backstage/plugin-home-react@^0.1.1": + version "0.1.1" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/@backstage/plugin-home-react/-/plugin-home-react-0.1.1.tgz#31dd9877d95b45a12221cf70c5a190c2fecf618f" + integrity sha512-4mHWNkeS4eXpnA85d6g3GHCp+F+gtHsPqTLfZCBjkBnHn5Gxo7t0WNjsxTl97HRD85v+Scud6XtZ/ATMHt8RQA== + dependencies: + "@backstage/core-components" "^0.13.3" + "@backstage/core-plugin-api" "^1.5.3" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@rjsf/utils" "5.7.3" + +"@backstage/plugin-home@^0.5.4": + version "0.5.4" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/@backstage/plugin-home/-/plugin-home-0.5.4.tgz#c3be22030c941c50325dc59c59a49810043d2d32" + integrity sha512-/NMXu0wccITryITFFGR6g3M3Flr/vduFpJlIir7tLvV+EA/YCVz8TClWcOI8kD9WWD9KA8fa7rRdHyTPWSxDRQ== + dependencies: + "@backstage/catalog-model" "^1.4.1" + "@backstage/config" "^1.0.8" + "@backstage/core-components" "^0.13.3" + "@backstage/core-plugin-api" "^1.5.3" + "@backstage/plugin-catalog-react" "^1.8.0" + "@backstage/plugin-home-react" "^0.1.1" + "@backstage/theme" "^0.4.1" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "4.0.0-alpha.61" + "@rjsf/core-v5" "npm:@rjsf/core@5.7.3" + "@rjsf/material-ui-v5" "npm:@rjsf/material-ui@5.7.3" + "@rjsf/utils" "5.7.3" + "@rjsf/validator-ajv8" "5.7.3" + "@types/react" "^16.13.1 || ^17.0.0" + lodash "^4.17.21" + react-grid-layout "^1.3.4" + react-resizable "^3.0.4" + react-use "^17.2.4" + zod "~3.21.4" + "@backstage/plugin-kubernetes-backend@^0.11.2": version "0.11.2" resolved "https://registry.npmmirror.com/@backstage/plugin-kubernetes-backend/-/plugin-kubernetes-backend-0.11.2.tgz#cb83ad81c2b689f2395e2d25670492f08f29d6d2" @@ -9283,9 +9320,9 @@ resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@*", "@types/react-dom@<18.0.0": +"@types/react-dom@*", "@types/react-dom@<18.0.0", "@types/react-dom@^17": version "17.0.20" - resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53" integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== dependencies: "@types/react" "^17" @@ -10080,6 +10117,7 @@ anymatch@^3.0.3, anymatch@~3.1.2: "@cnoe-io/plugin-apache-spark" "0.1.1" "@cnoe-io/plugin-argo-workflows" "0.1.1" "@cnoe-io/plugin-scaffolder-actions-frontend" "0.1.1" + "@internal/cnoe-ui-plugin" "^0.1.0" "@internal/plugin-workflows" "^0.1.0" "@material-ui/core" "^4.12.2" "@material-ui/icons" "^4.9.1" @@ -11311,7 +11349,7 @@ clone@^1.0.2: resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@^1.0.2, clsx@^1.0.4, clsx@^1.2.1: +clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmmirror.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -17053,6 +17091,11 @@ lodash.isarguments@^3.1.0: resolved "https://registry.npmmirror.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.npmmirror.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -20029,7 +20072,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -20431,6 +20474,14 @@ react-double-scrollbar@0.0.15: resolved "https://registry.npmmirror.com/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz#e915ab8cb3b959877075f49436debfdb04288fe4" integrity sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg== +react-draggable@^4.0.0, react-draggable@^4.0.3: + version "4.4.5" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" @@ -20441,6 +20492,17 @@ react-fast-compare@^3.1.1: resolved "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== +react-grid-layout@^1.3.4: + version "1.3.4" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/react-grid-layout/-/react-grid-layout-1.3.4.tgz#4fa819be24a1ba9268aa11b82d63afc4762a32ff" + integrity sha512-sB3rNhorW77HUdOjB4JkelZTdJGQKuXLl3gNg+BI8gJkTScspL1myfZzW/EM0dLEn+1eH+xW+wNqk0oIM9o7cw== + dependencies: + clsx "^1.1.1" + lodash.isequal "^4.0.0" + prop-types "^15.8.1" + react-draggable "^4.0.0" + react-resizable "^3.0.4" + react-helmet@6.1.0: version "6.1.0" resolved "https://registry.npmmirror.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" @@ -20538,6 +20600,14 @@ react-refresh@^0.14.0: resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-resizable@^3.0.4: + version "3.0.5" + resolved "https://cnoe-833162080385.d.codeartifact.us-west-2.amazonaws.com/npm/cnoe/react-resizable/-/react-resizable-3.0.5.tgz#362721f2efbd094976f1780ae13f1ad7739786c1" + integrity sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w== + dependencies: + prop-types "15.x" + react-draggable "^4.0.3" + "react-router-dom@6.0.0-beta.0 || ^6.3.0": version "6.14.2" resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.14.2.tgz#88f520118b91aa60233bd08dbd3fdcaea3a68488" @@ -24172,7 +24242,7 @@ zod-to-json-schema@^3.20.4: resolved "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.21.1.tgz#a24b2737bf361fc516c92421eb59988b6e2fc046" integrity sha512-y5g0MPxDq+YG/T+cHGPYH4PcBpyCqwK6wxeJ76MR563y0gk/14HKfebq8xHiItY7lkc9GDFygCnkvNDTvAhYAg== -zod@^3.21.4: +zod@^3.21.4, zod@~3.21.4: version "3.21.4" resolved "https://registry.npmmirror.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==