From 8902dda602df1e960c76919827c278f6385e9627 Mon Sep 17 00:00:00 2001 From: Milho001 <l.milhomemfrancochristino@uu.nl> Date: Wed, 26 Jul 2023 19:30:43 +0000 Subject: [PATCH] feat(querybuilder): full rework of querybuilder Inner query in JSON format fully reworked. The interface was reworked to use entity attributes as part of query logic. Handle inner logic and types fully reworked for better type-checking and future-proofing. Includes logic in query building, parsing, and execution. Logic pills can be created from the handle drop and from the side panel. Solves #42 and #53 --- .gitignore | 5 +- Dockerfile | 20 +- apps/web/.eslintignore | 4 +- apps/web/node.d.ts | 18 + apps/web/package.json | 11 +- apps/web/src/app/app.module.scss | 3 - apps/web/src/app/app.tsx | 49 +- apps/web/src/app/panels/Visualization.tsx | 41 +- .../navbar/AddDatabaseForm/index.tsx | 278 + .../stories/add-database-form.stories.tsx | 26 + apps/web/src/components/navbar/navbar.tsx | 471 +- apps/web/src/components/panels/panel.tsx | 53 + apps/web/src/main.tsx | 20 +- apps/web/tsconfig.json | 13 +- libs/shared/.eslintignore | 2 - libs/shared/lib/data-access/api/schema.ts | 3 +- libs/shared/lib/data-access/index.ts | 1 + libs/shared/lib/data-access/store/index.ts | 8 + .../lib/data-access/store/schemaSlice.ts | 10 +- .../theme/colorPaletteConfigSlice.ts | 41 + .../theme/graphPolarisThemeProvider.spec.tsx | 33 + .../theme/graphPolarisThemeProvider.tsx | 44 + .../querybuilder/model/graphology/utils.ts | 4 +- .../lib/querybuilder/model/logic/general.ts | 7 +- .../lib/querybuilder/model/logic/index.ts | 20 +- .../model/logic/mathAggregations.tsx | 745 +++ .../querybuilder/model/logic/mathFilters.tsx | 93 + .../model/logic/mathFunctions.tsx | 67 + .../lib/querybuilder/model/logic/utils.ts | 0 .../panel/querybuilder.module.scss | 2 + .../panel/querybuilder.module.scss.d.ts | 1 + .../lib/querybuilder/panel/querybuilder.tsx | 325 +- .../panel/shemaquerybuilder.stories.tsx | 20 +- ...erybuilder-simple-disconnected.stories.tsx | 28 +- .../stories/querybuilder-simple.stories.tsx | 28 +- .../querybuilder-single-entity.stories.tsx | 28 +- ...erybuilder-single-relationship.stories.tsx | 28 +- .../pills/customFlowLines/connection.tsx | 26 +- .../attributepill.module.scss.d.ts | 36 + .../attributepill.storiesDEFUNCT.tsx | 46 + .../attributepill/attributepill.tsx | 138 + .../getAttributeBoolOperators.ts | 61 + .../attributepill/operator/operatorselect.tsx | 75 + .../attributepill/select-component.tsx | 84 + .../entitypill/entitypill-full.stories.tsx | 13 +- .../entitypill/entitypill.module.scss | 104 +- .../entitypill/entitypill.module.scss.d.ts | 6 + .../entitypill/entitypill.stories.tsx | 10 +- .../customFlowPills/entitypill/entitypill.tsx | 85 +- .../functionpill/SelectFunction.tsx | 84 + .../functionpill/functionpill.module.scss | 175 + .../functionpill.module.scss.d.ts | 53 + .../functionpill/functionpill.stories.tsx | 64 + .../functionpill/functionpill.tsx | 143 + .../customFlowPills/functionpill/index.ts | 1 + .../pills/customFlowPills/index.ts | 1 + .../logicpill/logicpill.module.scss | 45 +- .../customFlowPills/logicpill/logicpill.tsx | 119 +- .../relation-full_reactflow.stories.tsx | 13 +- .../relationpill/relationpill.stories.tsx | 10 +- .../relationpill/relationpill.tsx | 46 +- .../querybuilder/pills/handles.module.scss | 9 +- .../query-utils/query2backend.spec.ts | 26 +- .../querybuilder/query-utils/query2backend.ts | 17 +- .../lib/schema/panel/schema.stories.tsx | 23 +- libs/shared/lib/schema/panel/schema.tsx | 169 +- libs/shared/lib/schema/panel/schemaOLD.tsx | 122 + .../lib/schema/pills/edges/node-edge.tsx | 4 +- .../lib/schema/pills/edges/self-edge.tsx | 10 +- .../nodes/entity/entity-node.stories.tsx | 25 +- .../schema/pills/nodes/entity/entity-node.tsx | 44 +- ...attribute-analytics-popup-menu.stories.tsx | 8 +- .../popup/attribute-analytics-popup-menu.tsx | 179 +- .../node-quality-entity-popup.stories.tsx | 8 +- .../nodes/popup/node-quality-entity-popup.tsx | 22 +- .../node-quality-relation-popup.stories.tsx | 8 +- .../popup/node-quality-relation-popup.tsx | 22 +- ...attribute-analytics-popup-menu.stories.tsx | 10 +- .../attribute-analytics-popup-menu.tsx | 227 +- .../popup/popupmenus/filterbar.stories.tsx | 12 +- .../nodes/popup/popupmenus/filterbar.tsx | 198 +- .../node-quality-entity-popup.stories.tsx | 8 +- .../popupmenus/node-quality-entity-popup.tsx | 22 +- .../node-quality-relation-popup.stories.tsx | 8 +- .../node-quality-relation-popup.tsx | 22 +- .../popup/popupmenus/searchbar.stories.tsx | 12 +- .../nodes/relation/relation-node.stories.tsx | 23 +- .../pills/nodes/relation/relation-node.tsx | 72 +- .../lib/vis/geovis/GeoNodeLinkMap.stories.tsx | 22 +- libs/shared/lib/vis/geovis/GeoNodeLinkMap.tsx | 2 + .../lib/vis/nodelink/NodeLinkViewModel.tsx | 14 +- .../lib/vis/nodelink/nodelinkvis.stories.tsx | 30 +- libs/shared/lib/vis/nodelink/nodelinkvis.tsx | 47 +- .../paohvis/components/MakePaohvisMenu.tsx | 205 +- .../components/PaohvisFilterComponent.tsx | 150 +- .../lib/vis/paohvis/paohvis.stories.tsx | 8 +- libs/shared/lib/vis/paohvis/paohvis.tsx | 105 +- .../lib/vis/rawjsonvis/rawjsonvis.stories.tsx | 18 +- libs/shared/lib/vis/rawjsonvis/rawjsonvis.tsx | 10 +- .../semanticsubstrates.stories.tsx | 14 +- .../semanticsubstrates/semanticsubstrates.tsx | 4 + .../subcomponents/AddPlotPopup.tsx | 75 +- .../subcomponents/OptimizedAutocomplete.tsx | 87 +- .../subcomponents/PlotAxisLabelsComponent.tsx | 26 +- .../subcomponents/PlotTitleComponent.tsx | 30 +- .../CalcConnectionLinePositionsUseCase.tsx | 8 +- .../CalcEntityAttrNamesFromResultUseCase.tsx | 1 + libs/shared/tsconfig.json | 4 +- libs/shared/vite.config.ts | 11 +- libs/storybook/.storybook/preview.ts | 14 - libs/storybook/vite.config.ts | 6 - pnpm-lock.yaml | 5305 ++++------------- 112 files changed, 6193 insertions(+), 5301 deletions(-) create mode 100644 apps/web/node.d.ts create mode 100644 apps/web/src/components/navbar/AddDatabaseForm/index.tsx create mode 100644 apps/web/src/components/navbar/AddDatabaseForm/stories/add-database-form.stories.tsx create mode 100644 apps/web/src/components/panels/panel.tsx create mode 100644 libs/shared/lib/data-access/theme/graphPolarisThemeProvider.spec.tsx create mode 100644 libs/shared/lib/data-access/theme/graphPolarisThemeProvider.tsx create mode 100644 libs/shared/lib/querybuilder/model/logic/mathAggregations.tsx create mode 100644 libs/shared/lib/querybuilder/model/logic/mathFilters.tsx create mode 100644 libs/shared/lib/querybuilder/model/logic/mathFunctions.tsx create mode 100644 libs/shared/lib/querybuilder/model/logic/utils.ts create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.module.scss.d.ts create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.storiesDEFUNCT.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/getAttributeBoolOperators.ts create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/operator/operatorselect.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/select-component.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/SelectFunction.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss.d.ts create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.stories.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.tsx create mode 100644 libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/index.ts create mode 100644 libs/shared/lib/schema/panel/schemaOLD.tsx diff --git a/.gitignore b/.gitignore index 6f9727aa4..3d9346567 100644 --- a/.gitignore +++ b/.gitignore @@ -75,7 +75,4 @@ Thumbs.db # Certs certs/*.pem -node_modules - -tsconfig.tsbuildinfo -vite.config.ts.* \ No newline at end of file +node_modules \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 85f1344cf..b9ba18921 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,12 @@ -FROM node:lts-slim AS base -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable -COPY . /app +# Prepare nginx +FROM nginx:1.19-alpine WORKDIR /app -FROM base AS build -RUN pnpm install --frozen-lockfile -# Fixes: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory -ENV NODE_OPTIONS="--max-old-space-size=4096" -RUN pnpm run build +COPY ./apps/web/dist /usr/share/nginx/html -FROM nginx:1.25-alpine -COPY --from=build /app/apps/web/dist /usr/share/nginx/html -COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf +RUN rm /etc/nginx/conf.d/default.conf +COPY nginx/nginx.conf /etc/nginx/conf.d + +# Fire up nginx EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] diff --git a/apps/web/.eslintignore b/apps/web/.eslintignore index ed9d65c51..ebd538ec9 100644 --- a/apps/web/.eslintignore +++ b/apps/web/.eslintignore @@ -1,6 +1,4 @@ node_modules/* node_modules/ node_modules -*.d.ts -*.mjs -*.tsbuildinfo \ No newline at end of file +*.d.ts \ No newline at end of file diff --git a/apps/web/node.d.ts b/apps/web/node.d.ts new file mode 100644 index 000000000..544d25be2 --- /dev/null +++ b/apps/web/node.d.ts @@ -0,0 +1,18 @@ +interface ImportMeta { + env: { + VITE_BACKEND_URL: string; + VITE_BACKEND_WSS_URL: string; + VITE_BACKEND_USER: string; + VITE_BACKEND_SCHEMA: string; + VITE_BACKEND_QUERY: string; + VITE_STAGING: string; + VITE_KEYCLOAK_URL: string; + VITE_KEYCLOAK_REALM: string; + VITE_KEYCLOAK_CLIENT: string; + }; +} + +declare module "*.png"; +declare module "*.svg"; +declare module "*.jpeg"; +declare module "*.jpg"; \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index e70fa522b..1d9b84946 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -14,9 +14,10 @@ }, "dependencies": { "@graphpolaris/shared": "workspace:*", + "@mui/base": "5.0.0-alpha.118", "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.11.13", "@reduxjs/toolkit": "^1.9.2", - "config": "workspace:*", "graphology": "^0.25.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -27,12 +28,7 @@ "styled-components": "^5.3.6" }, "devDependencies": { - "@iconify/json": "^2.2.95", - "@iconify/react": "^4.1.1", "@storybook/react": "7.0.0-rc.5", - "@svgr/core": "^8.0.0", - "@svgr/plugin-jsx": "^8.0.1", - "@tailwindcss/typography": "^0.5.9", "@testing-library/react": "14.0.0", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", @@ -41,16 +37,13 @@ "@vitejs/plugin-basic-ssl": "^1.0.1", "@vitejs/plugin-react-swc": "^3.0.0", "autoprefixer": "^10.4.14", - "daisyui": "^3.5.0", "graphology-types": "^0.24.7", - "npm": "^9.8.1", "postcss": "^8.4.21", "react-is": "^18.2.0", "tailwindcss": "^3.3.1", "typescript": "^4.9.3", "vite": "^4.2.0", "vite-plugin-dts": "^2.1.0", - "vite-plugin-sass-dts": "^1.3.2", "vitest": "^0.29.2" } } diff --git a/apps/web/src/app/app.module.scss b/apps/web/src/app/app.module.scss index 9c19687bc..1dc1ca7dd 100644 --- a/apps/web/src/app/app.module.scss +++ b/apps/web/src/app/app.module.scss @@ -40,8 +40,5 @@ margin-left: 0.8em; } } - .tabContent-hide { - display: none; - } } } diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx index 880906c6a..c616b6452 100644 --- a/apps/web/src/app/app.tsx +++ b/apps/web/src/app/app.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { readInSchemaFromBackend, useAuth, @@ -18,10 +17,11 @@ import { GraphQueryResultFromBackendPayload, resetGraphQueryResults, } from '@graphpolaris/shared/lib/data-access/store/graphQueryResultSlice'; -import { Query2BackendQuery, QueryBuilder, QueryMultiGraph } from '@graphpolaris/shared/lib/querybuilder'; +import { Query2BackendQuery, QueryBuilder } from '@graphpolaris/shared/lib/querybuilder'; import { Schema } from '@graphpolaris/shared/lib/schema/panel'; import { useCallback, useEffect, useRef, useState } from 'react'; import { Navbar } from '../components/navbar/navbar'; +import Panel from '../components/panels/panel'; import { VisualizationPanel } from './panels/Visualization'; import styles from './app.module.scss'; import { logout } from '@graphpolaris/shared/lib/data-access/store/authSlice'; @@ -37,7 +37,7 @@ export function App(props: App) { const api_query = useQueryAPI(); const dispatch = useAppDispatch(); const session = useSessionCache(); - const query = useQuerybuilderGraph() as QueryMultiGraph; + const query = useQuerybuilderGraph(); const queryHash = useQuerybuilderHash(); const ws = useRef(new WebSocketHandler(import.meta.env.VITE_BACKEND_WSS_URL)); const [authCheck, setAuthCheck] = useState(false); @@ -96,28 +96,33 @@ export function App(props: App) { return ( <div className="h-screen w-screen"> - <div className={'h-screen w-screen ' + (!auth.authorized ? 'blur-sm pointer-events-none ' : '')}> - <div className="flex flex-col h-screen max-h-screen relative"> - <aside className="h-[4rem]"> + <div className={'flex h-screen w-screen overflow-hidden ' + (!auth.authorized ? 'blur-sm pointer-events-none ' : '')}> + <div className="h-full relative flex flex-col flex-1 overflow-y-auto overflow-x-hidden"> + <div className="h-fit flex-grow-0"> <Navbar /> - </aside> - <main className="flex w-screen h-[calc(100%-4.2rem)] gap-0.5"> - <div className="w-full max-w-[35vw] panel h-full"> - <Schema auth={authCheck} /> + </div> + <main className={styles.mainContainer}> + <div className={styles.schema}> + <Panel content="Schema"> + <Schema auth={authCheck} /> + </Panel> </div> - <div className="h-full w-full"> - <div className="w-full panel h-[50%]"> - <VisualizationPanel /> + <div className={styles.panel}> + <div className={styles.visualization}> + <Panel content="Visualization Panel"> + <VisualizationPanel /> + </Panel> </div> - <div className="h-0.5"></div> - <div className="w-full panel h-[calc(50%-0.125rem)]"> - {/* <h1>Query Panel</h1> */} - <QueryBuilder - onRunQuery={() => { - console.log('Run Query'); - runQuery(); - }} - /> + <div className={styles.queryBuilder}> + <Panel content="Query Panel"> + <QueryBuilder + onRunQuery={() => { + console.log('Run Query'); + + runQuery(); + }} + /> + </Panel> </div> </div> </main> diff --git a/apps/web/src/app/panels/Visualization.tsx b/apps/web/src/app/panels/Visualization.tsx index 77f923184..10f7820cc 100644 --- a/apps/web/src/app/panels/Visualization.tsx +++ b/apps/web/src/app/panels/Visualization.tsx @@ -1,17 +1,12 @@ -import React from 'react'; import { RawJSONVis, NodeLinkVis, PaohVis, SemanticSubstrates } from '@graphpolaris/shared/lib/vis'; +import Panel from '../../components/panels/panel'; import { assignNewGraphQueryResult, useAppDispatch } from '@graphpolaris/shared/lib/data-access'; -import { display } from '@graphpolaris/shared/lib/vis/semanticsubstrates/subcomponents/AddPlotButtonComponent.module.scss'; -import { useVisualizationCache } from '@graphpolaris/shared/lib/data-access'; -import { connect } from 'react-redux'; -import { setVisualTab } from '@graphpolaris/shared/lib/data-access/store/visualisationSlice' export const VisualizationPanel = () => { - const vis = useVisualizationCache() + const dispatch = useAppDispatch(); + return ( - <div className="h-full w-full overflow-y-auto"> - <h1>Visualization Panel</h1> - <p className='text-sm'>{vis.visual}</p> + <div> {/* <div> <button onClick={() => @@ -38,23 +33,23 @@ export const VisualizationPanel = () => { Remove mock result </button> </div> */} + {/* width: '83%', height: '95vh', */} - <div className="w-full h-[calc(100%-2rem)]"> - <div id="NodeLinkVis" className='tabContent'> - {vis.visual === "NodeLinkVis" ? <><NodeLinkVis /></> : null} - </div> - <div id="RawJSONVis" className='tabContent'> - {vis.visual === "RawJSONVis" ? <><RawJSONVis /></> : null} - </div> - <div id="PaohVis" className='tabContent'> - {vis.visual === "PaohVis" ? <><PaohVis rowHeight={30} hyperedgeColumnWidth={30} gapBetweenRanges={3} /></> : null} - </div> - {/* <div id="SemSubVis" className='tabContent'> - <SemanticSubstrates /> - </div> */} - </div> + <div className="h-[60vh] overflow-y-auto"> + {/* <div className="h-full overflow-y-auto"> */} + {/* <RawJSONVis /> */} + {/* <PaohVis + rowHeight={30} + hyperedgeColumnWidth={30} + gapBetweenRanges={3} + /> */} + {/* <RawJSONVis /> */} + {/* <RawJSONVis /> */} + <NodeLinkVis /> + {/* <SemanticSubstrates /> */} + </div> {/* <div /> */} </div> ); diff --git a/apps/web/src/components/navbar/AddDatabaseForm/index.tsx b/apps/web/src/components/navbar/AddDatabaseForm/index.tsx new file mode 100644 index 000000000..8df366cd4 --- /dev/null +++ b/apps/web/src/components/navbar/AddDatabaseForm/index.tsx @@ -0,0 +1,278 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +/* istanbul ignore file */ +/* The comment above was added so the code coverage wouldn't count this file towards code coverage. + * We do not test components/renderfunctions/styling files. + * See testing plan for more details.*/ +import React, { useState, useEffect } from 'react'; +import { TextField, Button, NativeSelect } from '@mui/material'; +import styles from './add-database-form.module.scss'; +import { AddDatabaseRequest, DatabaseType, databaseNameMapping, databaseProtocolMapping } from '@graphpolaris/shared/lib/data-access'; + +/** AddDatabaseFormProps is an interface containing the AuthViewModel. */ +export interface AddDatabaseFormProps { + styles: any; + open: boolean; + onClose(): void; + onSubmit(data: AddDatabaseRequest): void; +} + +/** AddDatabaseFormState is an interface containing the databasehost information. */ +export interface AddDatabaseFormState extends AddDatabaseRequest { + // username: string; + // password: string; + // hostname: string; + // port: number; + // databaseName: string; + // internalDatabase: string; + // databaseType: string; + // styles: Record<string, string>; // TODO: check if needed +} + +/** AddDatabaseForm is the View implementation for the connect screen that will be rendered. */ +export default function AddDatabaseForm(props: AddDatabaseFormProps) { + const [state, setState] = useState<AddDatabaseFormState>({ + // username: 'root', + // password: 'DikkeDraak', + // url: 'https://datastrophe.science.uu.nl/', + // port: 8529, + // name: 'Tweede Kamer Dataset', + // internal_database_name: 'TweedeKamer', + // type: DatabaseType.ArangoDB, + + // username: 'neo4j', + // password: 'oL3nNlebrx4le2A0zxaFVqAo3HAvodHxwEiI_7_2JxI', + // url: '635176c8.databases.neo4j.io', + // port: 7687, + // name: 'neo4j', + // internal_database_name: 'neo4j', + // type: DatabaseType.Neo4j, + + username: 'neo4j', + password: 'StrongPass2022', + url: 'localhost', + port: 7687, + name: 'neo4j', + protocol: 'neo4j://', + internal_database_name: 'neo4j', + type: DatabaseType.Neo4j, + }); + const [portValidation, setPortValidation] = useState<string>('valid'); + + useEffect(() => { + if (state && state.port && state.port > 9999) { + setPortValidation('error'); + } else { + setPortValidation('valid'); + } + }, [state.port]); + + useEffect(() => { + if (!state) return; + if (state.type === DatabaseType.ArangoDB && state.port === 7687) { + setState({ ...state, port: 8529 }); + } else if (state.type === DatabaseType.Neo4j && state.port === 8529) { + setState({ ...state, port: 7687 }); + } + }, [state.type]); + + /** + * Validates if the port value is numerical. Only then will the state be updated. + * @param port The new port value. + */ + function handlePortChanged(port: string): void { + if (!isNaN(Number(port))) setState({ ...state, port: Number(port) }); + } + + /** Handles the submit button click. Calls the onSubmit in the props with all the fields. */ + function handleSubmitClicked(): void { + props.onSubmit(state); + } + + return props.open ? ( + // return ( + <div + className={styles.wrapper} + onMouseDown={() => { + props.onClose(); + }} + > + <div + className={styles.authWrapper} + onMouseDown={(e) => { + e.stopPropagation(); + }} + > + <h1 className={styles.header}>Database Connect</h1> + <form + className={styles.formWrapper} + onSubmit={(event: React.FormEvent) => { + event.preventDefault(); + handleSubmitClicked(); + }} + > + <div className={styles.loginContainer}> + <TextField + className={styles.passLabel} + label="Database name" + type="databaseName" + value={state.name} + onChange={(event) => + setState({ + ...state, + name: event.currentTarget.value, + }) + } + required + /> + </div> + <div className={styles.loginContainer}> + <NativeSelect + className={styles.passLabel} + value={databaseNameMapping[state.type]} + onChange={(event) => { + setState({ + ...state, + type: databaseNameMapping.indexOf(event.currentTarget.value), + }); + }} + > + {databaseNameMapping.map((dbName) => ( + <option value={dbName} key={dbName}> + {dbName} + </option> + ))} + </NativeSelect> + </div> + <div className={styles.loginContainer}> + <NativeSelect + className={styles.passLabel} + value={state.protocol} + onChange={(event) => { + setState({ + ...state, + protocol: event.currentTarget.value, + }); + }} + > + {databaseProtocolMapping.map((protocol) => ( + <option value={protocol} key={protocol}> + {protocol} + </option> + ))} + </NativeSelect> + </div> + <div className={styles.loginContainerRow}> + <TextField + className={styles.hostLabel} + label="Hostname/IP" + type="hostname" + value={state.url} + onChange={(event) => + setState({ + ...state, + url: event.currentTarget.value, + }) + } + required + /> + {portValidation && portValidation == 'error' ? ( + <TextField + error + className={styles.portLabel} + label="Port error" + type="port" + value={state.port} + onChange={(event) => handlePortChanged(event.currentTarget.value)} + required + /> + ) : ( + <TextField + className={styles.portLabel} + label="Port" + type="port" + value={state.port} + onChange={(event) => handlePortChanged(event.currentTarget.value)} + required + /> + )} + </div> + <div className={styles.loginContainer}> + <TextField + className={styles.userLabel} + label="Username" + type="username" + value={state.username} + onChange={(event) => + setState({ + ...state, + username: event.currentTarget.value, + }) + } + required + /> + </div> + <div className={styles.loginContainer}> + <TextField + className={styles.passLabel} + label="Password" + type="password" + value={state.password} + onChange={(event) => + setState({ + ...state, + password: event.currentTarget.value, + }) + } + required + /> + </div> + <div className={styles.loginContainer}> + <TextField + className={styles.passLabel} + label="Internal database" + type="internalDatabaseName" + value={state.internal_database_name} + onChange={(event) => + setState({ + ...state, + internal_database_name: event.currentTarget.value, + }) + } + required + /> + </div> + <div className={styles.loginContainerButton}> + {portValidation && portValidation == 'error' ? ( + <Button disabled variant="contained" type="submit" color="success"> + Submit + </Button> + ) : ( + <Button variant="contained" type="submit" color="success"> + Submit + </Button> + )} + + <Button + className={styles.cancelButton} + variant="outlined" + color="error" + onClick={() => { + props.onClose(); + }} + > + Cancel + </Button> + </div> + </form> + </div> + </div> + ) : ( + //); + <></> + ); +} diff --git a/apps/web/src/components/navbar/AddDatabaseForm/stories/add-database-form.stories.tsx b/apps/web/src/components/navbar/AddDatabaseForm/stories/add-database-form.stories.tsx new file mode 100644 index 000000000..446dbf80a --- /dev/null +++ b/apps/web/src/components/navbar/AddDatabaseForm/stories/add-database-form.stories.tsx @@ -0,0 +1,26 @@ +import { AddDatabaseRequest, GraphPolarisThemeProvider, store } from '@graphpolaris/shared/lib/data-access'; +import AddDatabaseForm, { AddDatabaseFormProps } from '../index'; +import { Provider } from 'react-redux'; +import { Meta } from '@storybook/react'; +import { ReactFlowProvider } from 'reactflow'; + +const Component: Meta<typeof AddDatabaseForm> = { + title: 'Add database form', + component: AddDatabaseForm, + decorators: [ + // using the real store here + (story: () => any) => ( + <Provider store={store}> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> + </Provider> + ), + ], +}; + +export default Component; + +export const Simple = { + args: { open: true }, +}; diff --git a/apps/web/src/components/navbar/navbar.tsx b/apps/web/src/components/navbar/navbar.tsx index 31dc14511..9e1fe7716 100644 --- a/apps/web/src/components/navbar/navbar.tsx +++ b/apps/web/src/components/navbar/navbar.tsx @@ -9,9 +9,13 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ import React, { useEffect, useState } from 'react'; +import { AppBar, Toolbar, CssBaseline, Typography, MenuItem, ListItemText, Menu, IconButton, Button } from '@mui/material'; import { AccountCircle } from '@mui/icons-material'; import logo from './logogp.png'; import logo_white from './logogpwhite.png'; +import AddDatabaseForm from './AddDatabaseForm'; +import { useTheme } from '@mui/material/styles'; +import styles from './navbar.module.scss'; import { updateCurrentDatabase, updateDatabaseList } from '@graphpolaris/shared/lib/data-access/store/sessionSlice'; import { @@ -21,16 +25,9 @@ import { useDatabaseAPI, useSchemaAPI, useSessionCache, - useVisualizationCache, } from '@graphpolaris/shared/lib/data-access'; -import { DatabaseMenu } from './databasemenu'; -import { NewDatabaseForm } from './AddDatabaseForm/newdatabaseform'; -import { DbDashboard } from './DatabaseDashboard/dbDashboard'; -// import { changeTabs } from 'src/app/panels/Visualization'; -import { visualization } from 'src/app/app.module.scss'; + /** NavbarComponentProps is an interface containing the NavbarViewModel. */ -import { connect } from 'react-redux'; -import { setVisual } from '@graphpolaris/shared/lib/data-access/store/visualisationSlice' export interface NavbarComponentProps { // changeColourPalette: () => void; FIXME move to redux } @@ -51,21 +48,70 @@ export interface NavbarSubComponentState { deleteDb?: String; } - /** NavbarComponent is the View implementation for Navbar */ export const Navbar = (props: NavbarComponentProps) => { + const theme = useTheme(); const auth = useAuthorizationCache(); const session = useSessionCache(); - const vis = useVisualizationCache(); const api = useDatabaseAPI(); const schemaApi = useSchemaAPI(); const dispatch = useAppDispatch(); - const [addDatabaseFormOpen, setAddDatabaseFormOpen] = useState(false); - const [menuOpen, setMenuOpen] = useState(false); - const [subMenuOpen, setSubMenuOpen] = useState<string | undefined>(undefined); + useEffect(() => { + // console.log(auth); + }, [auth.accessToken]); + + // const { navbarViewModel, currentColours } = props; + // this.navbarViewModel = navbarViewModel; + + const [state, setState] = useState<NavbarComponentState>({ + userMenuAnchor: undefined, + selectDatabaseMenuAnchor: undefined, + deleteDatabaseMenuAnchor: undefined, + showAddDatabaseForm: false, + }); + + const [subMenuChangeDisplay, setSubMenuChangewDisplay] = useState('block'); + const [subMenuDeleteDisplay, setSubMenuDeletewDisplay] = useState('block'); + + /** Closes the user menu. */ + function closeUserMenu(): void { + // If a nested window is open, close the main user menu a bit later + setState({ + ...state, + selectDatabaseMenuAnchor: undefined, + deleteDatabaseMenuAnchor: undefined, + }); + + setTimeout(() => { + setState({ ...state, userMenuAnchor: undefined }); + }, 100); + } + + /** Open nested menu's. */ + const openChangeSubMenu = () => { + if (subMenuChangeDisplay === 'none') { + setSubMenuChangewDisplay('block'); + } + }; + const openDeleteSubMenu = () => { + if (subMenuDeleteDisplay === 'none') { + setSubMenuDeletewDisplay('block'); + } + }; + + /** Closes nested menu's. */ + const closeChangeSubMenu = () => { + setSubMenuChangewDisplay('none'); + }; + const closeDeleteSubMenu = () => { + setSubMenuDeletewDisplay('none'); + }; + + function changeColourPalette() { + // TODO + } - const [dbDashboardOpen, setdbDashboardOpen] = useState(false); /** * Called when the user clicks on the 'submit' button of the add database form. */ @@ -75,184 +121,257 @@ export const Navbar = (props: NavbarComponentProps) => { }); } - const currentLogo = !'dark' ? logo_white : logo; // TODO: support dark mode + const currentLogo = theme.palette.custom.logo == 'white' ? logo_white : logo; return ( - <div className="w-full h-auto px-5"> - <NewDatabaseForm open={addDatabaseFormOpen} onClose={() => setAddDatabaseFormOpen(false)} /> - <DbDashboard open={dbDashboardOpen} onClose={() => setdbDashboardOpen(false)}/> - <div title="GraphPolaris" className="navbar w-full"> - <div className="w-8/12"> - <a href="https://graphpolaris.com/" > - <img src={currentLogo} /> + <div className={styles.root}> + <CssBaseline /> + <AppBar + title="GraphPolaris" + style={{ + backgroundColor: theme.palette.custom.background, + }} + sx={{ + zIndex: 9999, + }} + position="fixed" + className={styles.appBar} + > + <Toolbar style={{ marginLeft: -5 }}> + <a href="https://graphpolaris.com/" className={styles.logo}> + <img src={currentLogo} className={styles.logo} /> </a> - </div> - <div className="dropdown"> - <label tabIndex= {0} className="btn s-1">Vis</label> - <ul tabIndex={0} className="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52"> - <li onClick={()=>{ - dispatch(setVisual("NodeLinkVis")) - }}> - <a>Visualization</a></li> - <li onClick={()=>{ - dispatch(setVisual("RawJSONVis")) - }}> - <a>JSON</a></li> - <li onClick={()=>{ - dispatch(setVisual("PaohVis")) - }}><a>Paoh</a></li> - <li><a>Semantic Substrates</a></li> - </ul> - </div> - <div className="dropdown"> - <label tabIndex= {1} className="btn s-1">Data</label> - <ul tabIndex={1} className="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52"> - <li> - <button - onClick={() => { - setdbDashboardOpen(true); - setMenuOpen(false); - setSubMenuOpen(undefined); - }} - > - Databases - </button> - </li> - <li> - <button - onClick={() => { - setAddDatabaseFormOpen(true); - setMenuOpen(false); - setSubMenuOpen(undefined); - }} - > - Add database - </button> - </li> - <li> - <button - onClick={(e) => { - e.stopPropagation(); - setSubMenuOpen(subMenuOpen === 'changeDb' ? undefined : 'changeDb'); - }} - className={`${session.databases.length === 0 ? 'btn-disabled' : ''} ${ - subMenuOpen === 'changeDb' ? 'btn-active' : '' - }`} - > - Change Database - </button> - {subMenuOpen === 'changeDb' && ( - <DatabaseMenu - onClick={(db) => { - if (session.currentDatabase != db) { - dispatch(updateCurrentDatabase(db)); + <div className={styles.menubox}> + {/* <Button + className={styles.menuText} + style={{ color: theme.palette.custom.menuText }} + onClick={changeColourPalette} + > + Change Palette + </Button> */} + <Button href="https://graphpolaris.com/" className={styles.menuText} style={{ color: theme.palette.custom.menuText }}> + Home + </Button> + <Button + href="https://graphpolaris.com/index.php/products/" + className={styles.menuText} + style={{ color: theme.palette.custom.menuText }} + > + Products + </Button> + <Button href="https://graphpolaris.com#usecases" className={styles.menuText} style={{ color: theme.palette.custom.menuText }}> + Use Cases + </Button> + <Button + href="https://graphpolaris.com#earlyadoption" + className={styles.menuText} + style={{ color: theme.palette.custom.menuText }} + > + Contact + </Button> + {auth.authorized ? ( + <div> + <IconButton + color="inherit" + onClick={(event) => + setState({ + ...state, + userMenuAnchor: event.currentTarget, + }) + } + > + <AccountCircle htmlColor={theme.palette.custom.menuText} /> + </IconButton> + <Menu + id="user-menus" + anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }} + transformOrigin={{ vertical: 'top', horizontal: 'left' }} + anchorEl={state.userMenuAnchor} + keepMounted + open={Boolean(state.userMenuAnchor)} + onClose={() => closeUserMenu()} + > + <MenuItem> + <ListItemText primary={'userID: ' + auth.userID} /> + </MenuItem> + <MenuItem> + <ListItemText primary={'sessionID: ' + auth.sessionID} /> + </MenuItem> + {/* <MenuItem + onClick={() => + navbarViewModel.handleLoginButtonClicked('google') } - setSubMenuOpen(undefined); - setMenuOpen(false); - }} - /> - )} - </li> - <li> - <button - onClick={() => setSubMenuOpen(subMenuOpen === 'deleteDb' ? undefined : 'deleteDb')} - className={`${session.databases.length === 0 ? 'btn-disabled' : ''} ${ - subMenuOpen === 'deleteDb' ? 'btn-active' : '' - }`} - > - Delete Database - </button> - {subMenuOpen === 'deleteDb' && ( - <DatabaseMenu - onClick={(db) => { - if (session.currentDatabase === db) { - dispatch(updateCurrentDatabase('')); + > + <ListItemText primary={'request new'} /> + </MenuItem> */} + {/*<MenuItem onClick={() => LocalStorage.instance().Reset()}>*/} + {/* <ListItemText primary={'Empty localstorage'} />*/} + {/*</MenuItem>*/} + <MenuItem + onClick={() => + setState({ + ...state, + userMenuAnchor: undefined, + showAddDatabaseForm: true, + }) } - api.DeleteDatabase(db); - setSubMenuOpen(undefined); - setMenuOpen(false); - }} - /> - )} - </li> - </ul> - </div> - <div className="dropdown"> - <label tabIndex= {2} className="btn s-1">Adv</label> - <ul tabIndex={2} className="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52"> - </ul> - </div> - <div className="dropdown"> - <label tabIndex= {3} className="btn s-1">Share</label> - <ul tabIndex={3} className="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52"> - <li><a>Visual</a></li> - <li><a>Knowledge Base</a></li> - </ul> - </div> - - <div className="w-fit"> - <div className="pl-80"> - <button - tabIndex={0} - className="btn btn-circle btn-ghost hover:bg-gray-200" - onClick={(event) => { - setMenuOpen(!menuOpen); - setSubMenuOpen(undefined); - }} - > - <AccountCircle htmlColor="black"/> - </button> - {menuOpen && ( - <> - <div - className="z-10 bg-transparent absolute w-screen h-screen top-0 left-0" - onClick={() => { - setMenuOpen(false); - setSubMenuOpen(undefined); - }} - ></div> - <ul tabIndex={0} className="z-20 dropdown-content menu absolute right-4 p-2 shadow-xl bg-offwhite-100 rounded-box w-52"> - {auth.authorized ? ( - <> - <div className="menu-title"> - <h2>user: {auth.userID}</h2> - <h3 className="text-xs">session: {auth.sessionID}</h3> - </div> - - </> - ) : ( - <> - <div className="menu-title"> - <h2>user: {auth.userID}</h2> - <h3 className="text-xs">session: {auth.sessionID}</h3> - </div> - <div> - <button - className="btn btn-ghost" + > + <ListItemText primary={'Add database'} /> + </MenuItem> + <MenuItem + onClick={(event) => + setState({ + ...state, + selectDatabaseMenuAnchor: event.currentTarget, + }) + } + > + <ListItemText onClick={() => openChangeSubMenu()} primary={'Change database'} /> + </MenuItem> + <Menu + id="databases-menus" + anchorOrigin={{ vertical: 'top', horizontal: 'left' }} + transformOrigin={{ vertical: 'top', horizontal: 'right' }} + anchorEl={state.selectDatabaseMenuAnchor} + keepMounted + disableAutoFocusItem + open={Boolean(state.selectDatabaseMenuAnchor)} + sx={{ display: subMenuChangeDisplay }} + onClose={() => closeChangeSubMenu()} + > + {session.databases.length > 0 ? ( + session.databases.map((database) => ( + <MenuItem + key={database} + selected={database == session.currentDatabase} + sx={{ display: subMenuChangeDisplay }} onClick={() => { - setMenuOpen(false); + if (session.currentDatabase != database) { + dispatch(updateCurrentDatabase(database)); + } + closeChangeSubMenu(); }} > - <span>Login</span> - {/* !TODO */} - </button> - </div> - </> - )} - </ul> - </> + <ListItemText primary={database} /> + </MenuItem> + )) + ) : ( + <MenuItem key="placeholder" value="" disabled> + no databases connected + </MenuItem> + )} + </Menu> + <MenuItem + onClick={(event) => + setState({ + ...state, + deleteDatabaseMenuAnchor: event.currentTarget, + }) + } + > + <ListItemText onClick={() => openDeleteSubMenu()} primary={'Delete database'} /> + </MenuItem> + <Menu + id="delete-databases-menus" + anchorOrigin={{ vertical: 'top', horizontal: 'left' }} + transformOrigin={{ vertical: 'top', horizontal: 'right' }} + anchorEl={state.deleteDatabaseMenuAnchor} + keepMounted + disableAutoFocusItem + open={Boolean(state?.deleteDatabaseMenuAnchor)} + sx={{ display: subMenuDeleteDisplay }} + onClose={() => closeDeleteSubMenu()} + > + {session.databases.length > 0 ? ( + session.databases.map((database) => ( + <MenuItem + key={database} + selected={database == session.currentDatabase} + onClick={() => { + if (session.currentDatabase === database) { + dispatch(updateCurrentDatabase('')); + } + api.DeleteDatabase(database); + closeDeleteSubMenu(); + }} + > + <ListItemText primary={database} /> + </MenuItem> + )) + ) : ( + <MenuItem key="placeholder" value="" disabled> + no databases connected + </MenuItem> + )} + </Menu> + </Menu> + </div> + ) : ( + <div> + <Button + className={styles.loginButton} + onClick={(event) => + setState({ + ...state, + userMenuAnchor: event.currentTarget, + }) + } + > + <span + className={styles.loginButtonText} + style={{ + color: theme.palette.custom.menuText, + }} + > + Login + </span> + </Button> + {/* <Menu + id="user-menus" + getContentAnchorEl={null} + anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }} + transformOrigin={{ vertical: 'top', horizontal: 'left' }} + anchorEl={state.userMenuAnchor} + keepMounted + open={Boolean(state.userMenuAnchor)} + onClose={() => closeUserMenu()} + > + <MenuItem + onClick={() => + navbarViewModel.handleLoginButtonClicked('google') + } + > + <ListItemText primary={'Login with Google'} /> + </MenuItem> + <MenuItem + onClick={() => + navbarViewModel.handleLoginButtonClicked('github') + } + > + <ListItemText primary={'Login with GitHub'} /> + </MenuItem> + <MenuItem + onClick={() => + navbarViewModel.handleLoginButtonClicked('free') + } + > + <ListItemText primary={'Login with free (debug)'} /> + </MenuItem> + </Menu> */} + </div> )} </div> - </div> - </div> - {/* <AddDatabaseForm + </Toolbar> + </AppBar> + <AddDatabaseForm open={state.showAddDatabaseForm} onClose={() => setState({ ...state, showAddDatabaseForm: false })} onSubmit={(...params) => { onAddDatabaseFormSubmit(...params); setState({ ...state, showAddDatabaseForm: false }); }} - /> */} + styles={undefined} + /> </div> ); }; diff --git a/apps/web/src/components/panels/panel.tsx b/apps/web/src/components/panels/panel.tsx new file mode 100644 index 000000000..93ca8bd86 --- /dev/null +++ b/apps/web/src/components/panels/panel.tsx @@ -0,0 +1,53 @@ +import styled from 'styled-components'; +import { ReactNode } from 'react'; +import { useTheme } from '@mui/material/styles'; +interface Props { + content: string; + color?: string; + children?: ReactNode; +} + +const Wrapper = styled.div<{ color: string }>` + background-color: ${(props) => props.color}; + font-family: 'Arial'; + + // Light shadow + // box-shadow: 0 3px 10px rgb(0 0 0 / 0.2); + border: 1px solid #dddddd; + + height: 100%; + width: 100%; + + display: flex; + justify-content: center; + align-items: center; +`; + +const Content = styled.div` + margin: 0.8em; + border-radius: 8px; + width: 100%; + height: 98%; + overflow: hidden; +`; + +const Panel = (props: Props) => { + return ( + <Wrapper color={props?.color || 'white'} className=""> + <Content className=""> + <h1 + style={ + { + // backgroundColor: theme.palette.custom.dataPointColors[1], + } + } + > + {props.content} + </h1> + {props.children} + </Content> + </Wrapper> + ); +}; + +export default Panel; diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index aecf30009..b6d8c226a 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -1,9 +1,14 @@ import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import { StrictMode } from 'react'; import { Provider } from 'react-redux'; import { store } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import App from './app/app'; +import { CssBaseline } from '@mui/material'; import { createRoot } from 'react-dom/client'; import './styles.css'; @@ -13,12 +18,15 @@ if (domNode) { const root = createRoot(domNode); root.render( <Provider store={store}> - <Router> - <Routes> - {/* App */} - <Route path="/" element={<App />}></Route> - </Routes> - </Router> + <GraphPolarisThemeProvider> + <CssBaseline /> + <Router> + <Routes> + {/* App */} + <Route path="/" element={<App />}></Route> + </Routes> + </Router> + </GraphPolarisThemeProvider> </Provider>, ); } diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 0da6cc5e6..e3f42121e 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -1,7 +1,4 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "display": "React Library", - "target": "ESNext", "compilerOptions": { "jsx": "react-jsx", "allowJs": true, @@ -22,14 +19,12 @@ "isolatedModules": true, "noEmit": true, "baseUrl": ".", - "types": ["vite/client"], "paths": { "@graphpolaris/shared/lib/*": ["../../libs/shared/lib/*"] - }, - "types": ["unplugin-icons/types/react"] + } }, - "exclude": ["node_modules", "public", "dist", "build"], - "include": ["vite.config.ts", "../../libs/shared/lib/**/*", "src/**/*"], - "files": ["vite.config.ts"], + "exclude": ["node_modules", "public"], + "include": ["src", "../../libs/shared/lib/querybuilder/panel/attributepill"], + "files": ["./node.d.ts"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/libs/shared/.eslintignore b/libs/shared/.eslintignore index ed9d65c51..86439d7da 100644 --- a/libs/shared/.eslintignore +++ b/libs/shared/.eslintignore @@ -2,5 +2,3 @@ node_modules/* node_modules/ node_modules *.d.ts -*.mjs -*.tsbuildinfo \ No newline at end of file diff --git a/libs/shared/lib/data-access/api/schema.ts b/libs/shared/lib/data-access/api/schema.ts index dbe1e7a77..417b60783 100644 --- a/libs/shared/lib/data-access/api/schema.ts +++ b/libs/shared/lib/data-access/api/schema.ts @@ -16,8 +16,7 @@ export const useSchemaAPI = () => { const request = { databaseName, - cached: false, - // cached: true, + cached: true, }; const response = await fetch(`${domain}${schema}/`, { diff --git a/libs/shared/lib/data-access/index.ts b/libs/shared/lib/data-access/index.ts index 1084b2e70..2706d3a0f 100644 --- a/libs/shared/lib/data-access/index.ts +++ b/libs/shared/lib/data-access/index.ts @@ -1,3 +1,4 @@ export * from './api'; export * from './authorization'; export * from './store'; +export * from './theme'; diff --git a/libs/shared/lib/data-access/store/index.ts b/libs/shared/lib/data-access/store/index.ts index 02dc9bb14..be78c8572 100644 --- a/libs/shared/lib/data-access/store/index.ts +++ b/libs/shared/lib/data-access/store/index.ts @@ -11,6 +11,14 @@ export { resetGraphQueryResults, graphQueryResultSlice, } from './graphQueryResultSlice'; +export { + changePrimary, + changeDataPointColors, + toggleDarkMode, + selectColorPaletteConfig, + colorPaletteConfigSlice, +} from './colorPaletteConfigSlice'; // Exported types export type { Node, Edge, GraphQueryResult } from './graphQueryResultSlice'; +export type { ColorPaletteConfig, ExtraColorsForMui5 } from './colorPaletteConfigSlice'; diff --git a/libs/shared/lib/data-access/store/schemaSlice.ts b/libs/shared/lib/data-access/store/schemaSlice.ts index b187a78d9..80f957305 100644 --- a/libs/shared/lib/data-access/store/schemaSlice.ts +++ b/libs/shared/lib/data-access/store/schemaSlice.ts @@ -6,17 +6,16 @@ import { SchemaFromBackend, SchemaGraph, SchemaGraphology } from '../../schema'; /**************************************************************** */ -type schemaSliceI = { +// Define the initial state using that type +export const initialState: { graphologySerialized: SchemaGraph; layoutName: AllLayoutAlgorithms; -}; - -// Define the initial state using that type -export const initialState: schemaSliceI = { +} = { graphologySerialized: new SchemaGraphology().export(), // layoutName: 'Cytoscape_fcose', layoutName: CytoscapeLayoutAlgorithms.KLAY as AllLayoutAlgorithms, }; + export const schemaSlice = createSlice({ name: 'schema', // `createSlice` will infer the state type from the `initialState` argument @@ -70,6 +69,7 @@ export const schemaSlice = createSlice({ }, }, }); + export const { readInSchemaFromBackend, setSchema } = schemaSlice.actions; /** diff --git a/libs/shared/lib/data-access/theme/colorPaletteConfigSlice.ts b/libs/shared/lib/data-access/theme/colorPaletteConfigSlice.ts index f8c83ebf1..57f596303 100644 --- a/libs/shared/lib/data-access/theme/colorPaletteConfigSlice.ts +++ b/libs/shared/lib/data-access/theme/colorPaletteConfigSlice.ts @@ -1,3 +1,6 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import type { RootState } from './store'; + /** Extra properties that are not present in the default PaletteOptions of mui. For autocompletion */ export interface ExtraColorsForMui5 { /** Colors that can be used for data visualisation, e.g. nodes, edges */ @@ -186,3 +189,41 @@ export const initialState: ColorPaletteConfig = { }, darkMode: false, }; + +export const colorPaletteConfigSlice = createSlice({ + name: 'colorPaletteConfig', + // `createSlice` will infer the state type from the `initialState` argument + initialState, + reducers: { + changePrimary: ( + state, + action: PayloadAction<{ + main?: string; + light?: string; + dark?: string; + darkMode?: 'light' | 'dark'; + }> + ) => { + const { main, light, dark, darkMode } = action.payload; + let palette = state.lightPalette; + if (darkMode == 'dark') palette = state.darkPalette; + + if (main) palette.primary.main = main; + if (light) palette.primary.light = light; + if (dark) palette.primary.dark = dark; + }, + changeDataPointColors: (state, action: PayloadAction<string[]>) => { + state.lightPalette.custom.dataPointColors = action.payload; + }, + toggleDarkMode: (state) => { + state.darkMode = !state.darkMode; + }, + }, +}); + +export const { changePrimary, changeDataPointColors, toggleDarkMode } = colorPaletteConfigSlice.actions; + +// Select the schema and convert it to a graphology object +export const selectColorPaletteConfig = (state: RootState) => state.colorPaletteConfig; + +export default colorPaletteConfigSlice.reducer; diff --git a/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.spec.tsx b/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.spec.tsx new file mode 100644 index 000000000..6a262bc1e --- /dev/null +++ b/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.spec.tsx @@ -0,0 +1,33 @@ +// import Button from '@mui/material/Button'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { MockTheme, MockThemeGraphPolaris } from './mockTheme'; +import { assert, describe, expect, it } from 'vitest'; + +describe('<MockTheme GraphPolarisThemeProvider>', () => { + // TODO: This test should be implemented and running, but I get import issues in the mono-repo with jest (MIB) + // https://emotion.sh/docs/@emotion/jest + + it('renders without crashing', () => undefined); + // it('passes smoke test no config of mocktheme', () => { + // const div = document.createElement('div'); + + // ReactDOM.render( + // <MockTheme> + // <Button variant="text">Text</Button> + // </MockTheme>, + // div + // ); + // }); + + // it('passes smoke test config GraphPolaris', () => { + // const div = document.createElement('div'); + + // ReactDOM.render( + // <MockThemeGraphPolaris> + // <Button variant="text">Text</Button> + // </MockThemeGraphPolaris>, + // div + // ); + // }); +}); diff --git a/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.tsx b/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.tsx new file mode 100644 index 000000000..f9ead3f62 --- /dev/null +++ b/libs/shared/lib/data-access/theme/graphPolarisThemeProvider.tsx @@ -0,0 +1,44 @@ +import React, { ReactNode } from 'react'; +import { ColorPaletteConfig, ExtraColorsForMui5, selectColorPaletteConfig, useAppSelector } from '../../data-access/store'; +import { createTheme, ThemeOptions, ThemeProvider } from '@mui/material/styles'; +import { ColorPalette } from '../store/colorPaletteConfigSlice'; + +// Add custom theme variables to the mui theme types +declare module '@mui/material/styles' { + interface Palette extends ColorPalette {} + interface Theme { + palette: Palette; + } + interface PaletteOptions extends Partial<ColorPalette> {} + interface ThemeOptions { + palette?: PaletteOptions; + } +} + +export function GraphPolarisThemeProvider({ children }: { children: ReactNode }) { + const colorPaletteConfig = useAppSelector(selectColorPaletteConfig); + + // Create a new theme when our custom color palette in redux changed + const theme = React.useMemo( + () => + // Map our color palette config (stored in redux) to the mui 5 format + createTheme(MapColorsConfigToMuiTheme(colorPaletteConfig)), + [colorPaletteConfig] + ); + + return <ThemeProvider theme={theme}>{children}</ThemeProvider>; +} + +export function MapColorsConfigToMuiTheme(colorsConfig: ColorPaletteConfig): ThemeOptions { + return { + palette: { + mode: colorsConfig.darkMode ? 'dark' : 'light', + ...(colorsConfig.darkMode ? colorsConfig.darkPalette : colorsConfig.lightPalette), + // ...(colorsConfig.darkMode + // ? colorsConfig.darkPalette.custom + // : colorsConfig.lightPalette.custom) as ExtraColorsForMui5, + }, + }; +} + +export default GraphPolarisThemeProvider; diff --git a/libs/shared/lib/querybuilder/model/graphology/utils.ts b/libs/shared/lib/querybuilder/model/graphology/utils.ts index a629f8d1c..5da3f1cd3 100644 --- a/libs/shared/lib/querybuilder/model/graphology/utils.ts +++ b/libs/shared/lib/querybuilder/model/graphology/utils.ts @@ -93,7 +93,7 @@ export class QueryMultiGraphology extends Graph<QueryGraphNodes, QueryGraphEdges } // Add a node to the graphology object - this.addNode(attributes.id, { ...attributes }); + const nodeId = this.addNode(attributes.id, { ...attributes }); // Set the new nodes in the query builder slice TODO: maybe remove for efficiency // dispatch(setQuerybuilderNodes(this.export())); // Can't do this due to loop import @@ -118,7 +118,7 @@ export class QueryMultiGraphology extends Graph<QueryGraphNodes, QueryGraphEdges } else throw Error('using wrong function! use addPill2Graphology instead'); // Add a node to the graphology object - this.addNode(attributes.id, { ...attributes }); + const nodeId = this.addNode(attributes.id, { ...attributes }); // Set the new nodes in the query builder slice TODO: maybe remove for efficiency // dispatch(setQuerybuilderNodes(this.export())); // Can't do this due to loop import diff --git a/libs/shared/lib/querybuilder/model/logic/general.ts b/libs/shared/lib/querybuilder/model/logic/general.ts index 9d2337393..7963d68ac 100644 --- a/libs/shared/lib/querybuilder/model/logic/general.ts +++ b/libs/shared/lib/querybuilder/model/logic/general.ts @@ -1,7 +1,7 @@ export type InputNodeTypeTypes = string | number | boolean; export type InputNodeType = 'string' | 'float' | 'int' | 'bool' | 'date' | 'time' | 'datetime' | 'duration'; -export enum NumberFilterTypes { +export enum MathFilterTypes { EQUAL = '==', NOT_EQUAL = '!=', GREATER_THAN = '>', @@ -10,7 +10,7 @@ export enum NumberFilterTypes { LESS_THAN_EQUAL = '<=', } -export enum NumberAggregationTypes { +export enum MathAggregationTypes { AVG = 'Avg', COUNT = 'Count', MAX = 'Max', @@ -18,7 +18,7 @@ export enum NumberAggregationTypes { SUM = 'Sum', } -export enum NumberFunctionTypes { +export enum MathFunctionTypes { ADD = '+', SUBTRACT = '-', MULTIPLY = '*', @@ -202,5 +202,4 @@ export interface GeneralDescription<T> { output: OutputNode; key: string; logic: AllLogicStatement; - icon?: string; } diff --git a/libs/shared/lib/querybuilder/model/logic/index.ts b/libs/shared/lib/querybuilder/model/logic/index.ts index 01d406255..00f4dfeff 100644 --- a/libs/shared/lib/querybuilder/model/logic/index.ts +++ b/libs/shared/lib/querybuilder/model/logic/index.ts @@ -1,31 +1,31 @@ import { GeneralDescription, InputNodeType, - NumberFunctionTypes, - NumberFilterTypes, + MathFunctionTypes, + MathFilterTypes, StringFilterTypes, StringFunctionTypes, - NumberAggregationTypes, + MathAggregationTypes, } from './general'; -import { MathAggregations } from './numberAggregations'; -import { MathFilters } from './numberFilters'; -import { NumberFunctions } from './numberFunctions'; +import { MathAggregations } from './mathAggregations'; +import { MathFilters } from './mathFilters'; +import { MathFunctions } from './mathFunctions'; import { StringFilters } from './stringFilters'; import { StringFunctions } from './stringFunctions'; -export type AllLogicTypes = NumberFilterTypes | NumberFunctionTypes | NumberAggregationTypes | StringFilterTypes | StringFunctionTypes; +export type AllLogicTypes = MathFilterTypes | MathFunctionTypes | MathAggregationTypes | StringFilterTypes | StringFunctionTypes; export type AllLogicDescriptions = GeneralDescription<AllLogicTypes>; export const AllLogicMap: Record<string, AllLogicDescriptions> = { ...Object.fromEntries(Object.values(MathFilters).map((x) => [x.key, x])), - ...Object.fromEntries(Object.values(NumberFunctions).map((x) => [x.key, x])), + ...Object.fromEntries(Object.values(MathFunctions).map((x) => [x.key, x])), ...Object.fromEntries(Object.values(MathAggregations).map((x) => [x.key, x])), ...Object.fromEntries(Object.values(StringFilters).map((x) => [x.key, x])), ...Object.fromEntries(Object.values(StringFunctions).map((x) => [x.key, x])), }; export * from './graphFunctions'; -export * from './numberFunctions'; -export * from './numberFilters'; +export * from './mathFunctions'; +export * from './mathFilters'; export * from './stringFunctions'; export * from './stringFilters'; diff --git a/libs/shared/lib/querybuilder/model/logic/mathAggregations.tsx b/libs/shared/lib/querybuilder/model/logic/mathAggregations.tsx new file mode 100644 index 000000000..5baebb3b6 --- /dev/null +++ b/libs/shared/lib/querybuilder/model/logic/mathAggregations.tsx @@ -0,0 +1,745 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +import { Position } from 'reactflow'; +import { GeneralDescription, MathAggregationTypes } from './general'; + +export const MathAggregations: Record<MathAggregationTypes, GeneralDescription<MathAggregationTypes>> = { + [MathAggregationTypes.AVG]: { + key: 'mathFunctionAvg', + name: 'Average', + type: MathAggregationTypes.AVG, + description: 'Average of all values', + numInputs: 1, + inputs: [{ name: '1', type: 'float', default: 0 }], + output: { name: 'avg', type: 'float' }, + logic: ['Avg', '@1'], + }, + [MathAggregationTypes.COUNT]: { + key: 'mathFunctionCount', + name: 'Count', + type: MathAggregationTypes.COUNT, + description: 'Count the number of values', + numInputs: 1, + inputs: [{ name: '1', type: 'float', default: 0 }], + + output: { name: 'count', type: 'float' }, + logic: ['Count', '@1'], + }, + [MathAggregationTypes.MAX]: { + key: 'mathFunctionMax', + name: 'Maximum', + type: MathAggregationTypes.MAX, + description: 'Maximum of all values', + numInputs: 1, + inputs: [{ name: '1', type: 'float', default: 0 }], + output: { name: 'max', type: 'float' }, + logic: ['Max', '@1'], + }, + [MathAggregationTypes.MIN]: { + key: 'mathFunctionMin', + name: 'Minimum', + type: MathAggregationTypes.MIN, + description: 'Minimum of all values', + numInputs: 1, + inputs: [{ name: '1', type: 'float', default: 0 }], + output: { name: 'min', type: 'float' }, + logic: ['Min', '@1'], + }, + [MathAggregationTypes.SUM]: { + key: 'mathFunctionSum', + name: 'Sum', + type: MathAggregationTypes.SUM, + description: 'Sum of all values', + numInputs: 1, + inputs: [{ name: '1', type: 'float', default: 0 }], + output: { name: 'sum', type: 'float' }, + logic: ['Sum', '@1'], + }, + // [MathAggregationTypes.STD]: { + // key: 'mathFunctionStd', + // name: 'Standard Deviation', + // type: MathAggregationTypes.STD, + // description: 'Standard deviation of all values', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'std', type: 'float' }, + // logic: ['Std', '@1'], + // }, + // [MathAggregationTypes.ADD]: { + // key: 'mathFunctionAdd', + // name: 'Add', + // type: MathAggregationTypes.ADD, + // description: 'Add two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float', default: 0 }, + // { name: '2', type: 'float', default: 0 }, + // ], + // output: { name: '+', type: 'float' }, + // logic: ['+', '@1', '@2'], + // }, + // [MathAggregationTypes.SUBTRACT]: { + // key: 'mathFunctionSubtract', + // name: 'Subtract', + // type: MathAggregationTypes.SUBTRACT, + // description: 'Subtract two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: '-', type: 'float' }, + // logic: ['-', '@1', '@2'], + // }, + // [MathAggregationTypes.MULTIPLY]: { + // key: 'mathFunctionMultiply', + // name: 'Multiply', + // type: MathAggregationTypes.MULTIPLY, + // description: 'Multiply two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: '*', type: 'float' }, + // logic: ['*', '@1', '@2'], + // }, + // [MathAggregationTypes.DIVIDE]: { + // key: 'mathFunctionDivide', + // name: 'Divide', + // type: MathAggregationTypes.DIVIDE, + // description: 'Divide two values', + + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: '/', type: 'float' }, + // logic: ['/', '@1', '@2'], + // }, + // [MathAggregationTypes.POWER]: { + // key: 'mathFunctionPower', + // name: 'Power', + // type: MathAggregationTypes.POWER, + // description: 'Raise a value to the power of another value', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: '^', type: 'float' }, + // logic: ['^', '@1', '@2'], + // }, + // [MathAggregationTypes.SQRT]: { + // key: 'mathFunctionSqrt', + // name: 'Square Root', + // type: MathAggregationTypes.SQRT, + // description: 'Square root of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'sqrt', type: 'float' }, + // logic: ['Sqrt', '@1'], + // }, + // [MathAggregationTypes.LOG]: { + // key: 'mathFunctionLog', + // name: 'Logarithm', + // type: MathAggregationTypes.LOG, + // description: 'Logarithm of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'log', type: 'float' }, + // logic: ['Log', '@1'], + // }, + // [MathAggregationTypes.EXP]: { + // key: 'mathFunctionExp', + // name: 'Exponential', + // type: MathAggregationTypes.EXP, + // description: 'Exponential of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'exp', type: 'float' }, + // logic: ['Exp', '@1'], + // }, + // [MathAggregationTypes.ABS]: { + // key: 'mathFunctionAbs', + // name: 'Absolute Value', + // type: MathAggregationTypes.ABS, + // description: 'Absolute value of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'abs', type: 'float' }, + // logic: ['Abs', '@1'], + // }, + // [MathAggregationTypes.CEIL]: { + // key: 'mathFunctionCeil', + // name: 'Ceiling', + // type: MathAggregationTypes.CEIL, + // description: 'Ceiling of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'ceil', type: 'float' }, + // logic: ['Ceil', '@1'], + // }, + // [MathAggregationTypes.FLOOR]: { + // key: 'mathFunctionFloor', + // name: 'Floor', + // type: MathAggregationTypes.FLOOR, + // description: 'Floor of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'floor', type: 'float' }, + // logic: ['Floor', '@1'], + // }, + // [MathAggregationTypes.ROUND]: { + // key: 'mathFunctionRound', + // name: 'Round', + // type: MathAggregationTypes.ROUND, + // description: 'Round a value to the nearest integer', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'round', type: 'float' }, + // logic: ['Round', '@1'], + // }, + // [MathAggregationTypes.TRUNC]: { + // key: 'mathFunctionTrunc', + // name: 'Truncate', + // type: MathAggregationTypes.TRUNC, + // description: 'Truncate a value to the nearest integer towards zero', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + + // output: { name: 'trunc', type: 'float' }, + // logic: ['Trunc', '@1'], + // }, + // [MathAggregationTypes.RANDOM]: { + // key: 'mathFunctionRandom', + // name: 'Random', + // type: MathAggregationTypes.RANDOM, + // description: 'Random value between 0 and 1', + // numInputs: 0, + // inputs: [], + // output: { name: 'random', type: 'float' }, + // logic: ['Random'], + // }, + // [MathAggregationTypes.RANDOMINT]: { + // key: 'mathFunctionRandomInt', + // name: 'Random Integer', + // type: MathAggregationTypes.RANDOMINT, + // description: 'Random integer between two values', + // numInputs: 2, + // inputs: [ + // { name: 'min', type: 'float' }, + // { name: 'max', type: 'float' }, + // ], + // output: { name: 'randomInt', type: 'float' }, + // logic: ['RandomInt', '@1', '@2'], + // }, + // [MathAggregationTypes.SIN]: { + // key: 'mathFunctionSin', + // name: 'Sine', + // type: MathAggregationTypes.SIN, + // description: 'Sine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'sin', type: 'float' }, + // logic: ['Sin', '@1'], + // }, + // [MathAggregationTypes.COS]: { + // key: 'mathFunctionCos', + // name: 'Cosine', + // type: MathAggregationTypes.COS, + // description: 'Cosine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'cos', type: 'float' }, + // logic: ['Cos', '@1'], + // }, + // [MathAggregationTypes.TAN]: { + // key: 'mathFunctionTan', + // name: 'Tangent', + // type: MathAggregationTypes.TAN, + // description: 'Tangent of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'tan', type: 'float' }, + // logic: ['Tan', '@1'], + // }, + // [MathAggregationTypes.ASIN]: { + // key: 'mathFunctionAsin', + // name: 'Arcsine', + // type: MathAggregationTypes.ASIN, + // description: 'Arcsine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'asin', type: 'float' }, + // logic: ['Asin', '@1'], + // }, + // [MathAggregationTypes.ACOS]: { + // key: 'mathFunctionAcos', + // name: 'Arccosine', + // type: MathAggregationTypes.ACOS, + // description: 'Arccosine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'acos', type: 'float' }, + // logic: ['Acos', '@1'], + // }, + // [MathAggregationTypes.ATAN]: { + // key: 'mathFunctionAtan', + // name: 'Arctangent', + // type: MathAggregationTypes.ATAN, + // description: 'Arctangent of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'atan', type: 'float' }, + // logic: ['Atan', '@1'], + // }, + // [MathAggregationTypes.SINH]: { + // key: 'mathFunctionSinh', + // name: 'Hyperbolic Sine', + // type: MathAggregationTypes.SINH, + // description: 'Hyperbolic sine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'sinh', type: 'float' }, + // logic: ['Sinh', '@1'], + // }, + // [MathAggregationTypes.COSH]: { + // key: 'mathFunctionCosh', + // name: 'Hyperbolic Cosine', + // type: MathAggregationTypes.COSH, + // description: 'Hyperbolic cosine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'cosh', type: 'float' }, + // logic: ['Cosh', '@1'], + // }, + // [MathAggregationTypes.TANH]: { + // key: 'mathFunctionTanh', + // name: 'Hyperbolic Tangent', + // type: MathAggregationTypes.TANH, + // description: 'Hyperbolic tangent of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'tanh', type: 'float' }, + // logic: ['Tanh', '@1'], + // }, + // [MathAggregationTypes.ASINH]: { + // key: 'mathFunctionAsinh', + // name: 'Hyperbolic Arcsine', + // type: MathAggregationTypes.ASINH, + // description: 'Hyperbolic arcsine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'asinh', type: 'float' }, + // logic: ['Asinh', '@1'], + // }, + // [MathAggregationTypes.ACOSH]: { + // key: 'mathFunctionAcosh', + // name: 'Hyperbolic Arccosine', + // type: MathAggregationTypes.ACOSH, + // description: 'Hyperbolic arccosine of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'acosh', type: 'float' }, + // logic: ['Acosh', '@1'], + // }, + // [MathAggregationTypes.ATANH]: { + // key: 'mathFunctionAtanh', + // name: 'Hyperbolic Arctangent', + // type: MathAggregationTypes.ATANH, + // description: 'Hyperbolic arctangent of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'atanh', type: 'float' }, + // logic: ['Atanh', '@1'], + // }, + // [MathAggregationTypes.DEGREES]: { + // key: 'mathFunctionDegrees', + // name: 'Degrees', + // type: MathAggregationTypes.DEGREES, + // description: 'Convert a value from radians to degrees', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'degrees', type: 'float' }, + // logic: ['Degrees', '@1'], + // }, + // [MathAggregationTypes.RADIANS]: { + // key: 'mathFunctionRadians', + // name: 'Radians', + // type: MathAggregationTypes.RADIANS, + // description: 'Convert a value from degrees to radians', + // numInputs: 1, + + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'radians', type: 'float' }, + // logic: ['Radians', '@1'], + // }, + // [MathAggregationTypes.SIGN]: { + // key: 'mathFunctionSign', + // name: 'Sign', + // type: MathAggregationTypes.SIGN, + // description: 'Sign of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'sign', type: 'float' }, + // logic: ['Sign', '@1'], + // }, + // [MathAggregationTypes.RANDOMNORMAL]: { + // key: 'mathFunctionRandomNormal', + // name: 'Random Normal', + // type: MathAggregationTypes.RANDOMNORMAL, + // description: 'Random value from a normal distribution', + // numInputs: 2, + // inputs: [ + // { name: 'mean', type: 'float' }, + // { name: 'std', type: 'float' }, + // ], + // output: { name: 'randomNormal', type: 'float' }, + // logic: ['RandomNormal', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMLOGNORMAL]: { + // key: 'mathFunctionRandomLogNormal', + // name: 'Random Log Normal', + // type: MathAggregationTypes.RANDOMLOGNORMAL, + // description: 'Random value from a log normal distribution', + // numInputs: 2, + // inputs: [ + // { name: 'mean', type: 'float' }, + // { name: 'std', type: 'float' }, + // ], + // output: { name: 'randomLogNormal', type: 'float' }, + // logic: ['RandomLogNormal', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMEXPONENTIAL]: { + // key: 'mathFunctionRandomExponential', + // name: 'Random Exponential', + // type: MathAggregationTypes.RANDOMEXPONENTIAL, + // description: 'Random value from an exponential distribution', + // numInputs: 1, + // inputs: [{ name: 'lambda', type: 'float' }], + // output: { name: 'randomExponential', type: 'float' }, + // logic: ['RandomExponential', '@1'], + // }, + // [MathAggregationTypes.RANDOMGAMMA]: { + // key: 'mathFunctionRandomGamma', + // name: 'Random Gamma', + // type: MathAggregationTypes.RANDOMGAMMA, + // description: 'Random value from a gamma distribution', + // numInputs: 2, + // inputs: [ + // { name: 'alpha', type: 'float' }, + // { name: 'beta', type: 'float' }, + // ], + // output: { name: 'randomGamma', type: 'float' }, + // logic: ['RandomGamma', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMBETA]: { + // key: 'mathFunctionRandomBeta', + // name: 'Random Beta', + // type: MathAggregationTypes.RANDOMBETA, + // description: 'Random value from a beta distribution', + // numInputs: 2, + // inputs: [ + // { name: 'alpha', type: 'float' }, + // { name: 'beta', type: 'float' }, + // ], + // output: { name: 'randomBeta', type: 'float' }, + // logic: ['RandomBeta', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMCHISQUARE]: { + // key: 'mathFunctionRandomChiSquare', + // name: 'Random Chi Square', + // type: MathAggregationTypes.RANDOMCHISQUARE, + // description: 'Random value from a chi square distribution', + // numInputs: 1, + // inputs: [{ name: 'k', type: 'float' }], + // output: { name: 'randomChiSquare', type: 'float' }, + // logic: ['RandomChiSquare', '@1'], + // }, + // [MathAggregationTypes.RANDOMWEIBULL]: { + // key: 'mathFunctionRandomWeibull', + // name: 'Random Weibull', + // type: MathAggregationTypes.RANDOMWEIBULL, + // description: 'Random value from a Weibull distribution', + // numInputs: 2, + // inputs: [ + // { name: 'k', type: 'float' }, + // { name: 'lambda', type: 'float' }, + // ], + // output: { name: 'randomWeibull', type: 'float' }, + // logic: ['RandomWeibull', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMCAUCHY]: { + // key: 'mathFunctionRandomCauchy', + // name: 'Random Cauchy', + // type: MathAggregationTypes.RANDOMCAUCHY, + // description: 'Random value from a Cauchy distribution', + // numInputs: 2, + // inputs: [ + // { name: 'x0', type: 'float' }, + // { name: 'gamma', type: 'float' }, + // ], + // output: { name: 'randomCauchy', type: 'float' }, + // logic: ['RandomCauchy', '@1', '@2'], + // }, + // [MathAggregationTypes.RANDOMPOISSON]: { + // key: 'mathFunctionRandomPoisson', + // name: 'Random Poisson', + // type: MathAggregationTypes.RANDOMPOISSON, + // description: 'Random value from a Poisson distribution', + // numInputs: 1, + // inputs: [{ name: 'lambda', type: 'float' }], + // output: { name: 'randomPoisson', type: 'float' }, + // logic: ['RandomPoisson', '@1'], + // }, + // [MathAggregationTypes.RANDOMIRWINHALL]: { + // key: 'mathFunctionRandomIrwinHall', + // name: 'Random Irwin Hall', + // type: MathAggregationTypes.RANDOMIRWINHALL, + // description: 'Random value from an Irwin Hall distribution', + // numInputs: 2, + // inputs: [ + // { name: 'n', type: 'float' }, + // { name: 'scale', type: 'float' }, + // ], + // output: { name: 'randomIrwinHall', type: 'float' }, + // logic: ['RandomIrwinHall', '@1', '@2'], + // }, + // [MathAggregationTypes.CHIQUARETEST]: { + // key: 'mathFunctionChiSquareTest', + // name: 'Chi Square Test', + // type: MathAggregationTypes.CHIQUARETEST, + // description: 'Chi square test', + // numInputs: 2, + // inputs: [ + // { name: 'observed', type: 'float' }, + // { name: 'expected', type: 'float' }, + // ], + // output: { name: 'chiSquareTest', type: 'float' }, + // logic: ['ChiSquareTest', '@1', '@2'], + // }, + // [MathAggregationTypes.CORRELATION]: { + // key: 'mathFunctionCorrelation', + // name: 'Correlation', + // type: MathAggregationTypes.CORRELATION, + // description: 'Correlation between two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: 'correlation', type: 'float' }, + // logic: ['Correlation', '@1', '@2'], + // }, + // [MathAggregationTypes.COVARIANCE]: { + // key: 'mathFunctionCovariance', + // name: 'Covariance', + // type: MathAggregationTypes.COVARIANCE, + // description: 'Covariance between two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: 'covariance', type: 'float' }, + // logic: ['Covariance', '@1', '@2'], + // }, + // [MathAggregationTypes.FREQUENCY]: { + // key: 'mathFunctionFrequency', + // name: 'Frequency', + // type: MathAggregationTypes.FREQUENCY, + // description: 'Frequency of a value in a dataset', + // numInputs: 2, + // inputs: [ + // { name: 'value', type: 'float' }, + // { name: 'dataset', type: 'float' }, + // ], + // output: { name: 'frequency', type: 'float' }, + // logic: ['Frequency', '@1', '@2'], + // }, + // [MathAggregationTypes.MEAN]: { + // key: 'mathFunctionMean', + // name: 'Mean', + // type: MathAggregationTypes.MEAN, + // description: 'Mean of a dataset', + // numInputs: 1, + // inputs: [{ name: 'dataset', type: 'float' }], + // output: { name: 'mean', type: 'float' }, + // logic: ['Mean', '@1'], + // }, + // [MathAggregationTypes.MEDIAN]: { + // key: 'mathFunctionMedian', + // name: 'Median', + // type: MathAggregationTypes.MEDIAN, + // description: 'Median of a dataset', + // numInputs: 1, + // inputs: [{ name: 'dataset', type: 'float' }], + // output: { name: 'median', type: 'float' }, + // logic: ['Median', '@1'], + // }, + // [MathAggregationTypes.MODE]: { + // key: 'mathFunctionMode', + // name: 'Mode', + // type: MathAggregationTypes.MODE, + // description: 'Mode of a dataset', + // numInputs: 1, + // inputs: [{ name: 'dataset', type: 'float' }], + // output: { name: 'mode', type: 'float' }, + // logic: ['Mode', '@1'], + // }, + // [MathAggregationTypes.RANK]: { + // key: 'mathFunctionRank', + // name: 'Rank', + // type: MathAggregationTypes.RANK, + // description: 'Rank of a value in a dataset', + // numInputs: 2, + // inputs: [ + // { name: 'value', type: 'float' }, + // { name: 'dataset', type: 'float' }, + // ], + // output: { name: 'rank', type: 'float' }, + // logic: ['Rank', '@1', '@2'], + // }, + // [MathAggregationTypes.STDEV]: { + // key: 'mathFunctionStdev', + // name: 'Standard Deviation', + // type: MathAggregationTypes.STDEV, + // description: 'Standard deviation of a dataset', + // numInputs: 1, + // inputs: [{ name: 'dataset', type: 'float' }], + // output: { name: 'stdev', type: 'float' }, + // logic: ['Stdev', '@1'], + // }, + // [MathAggregationTypes.VARIANCE]: { + // key: 'mathFunctionVariance', + // name: 'Variance', + // type: MathAggregationTypes.VARIANCE, + // description: 'Variance of a dataset', + // numInputs: 1, + // inputs: [{ name: 'dataset', type: 'float' }], + // output: { name: 'variance', type: 'float' }, + // logic: ['Variance', '@1'], + // }, + // [MathAggregationTypes.ZSCORE]: { + // key: 'mathFunctionZscore', + // name: 'Z-Score', + // type: MathAggregationTypes.ZSCORE, + // description: 'Z-score of a value in a dataset', + // numInputs: 2, + // inputs: [ + // { name: 'value', type: 'float' }, + // { name: 'dataset', type: 'float' }, + // ], + // output: { name: 'zscore', type: 'float' }, + // logic: ['Zscore', '@1', '@2'], + // }, + // [MathAggregationTypes.AND]: { + // key: 'mathFunctionAnd', + // name: 'And', + // type: MathAggregationTypes.AND, + // description: 'Logical AND of two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'boolean' }, + // { name: '2', type: 'boolean' }, + // ], + // output: { name: 'and', type: 'boolean' }, + // logic: ['And', '@1', '@2'], + // }, + // [MathAggregationTypes.OR]: { + // key: 'mathFunctionOr', + // name: 'Or', + // type: MathAggregationTypes.OR, + // description: 'Logical OR of two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'boolean' }, + // { name: '2', type: 'boolean' }, + // ], + // output: { name: 'or', type: 'boolean' }, + // logic: ['Or', '@1', '@2'], + // }, + // [MathAggregationTypes.NOT]: { + // key: 'mathFunctionNot', + // name: 'Not', + // type: MathAggregationTypes.NOT, + // description: 'Logical NOT of a value', + // numInputs: 1, + // inputs: [{ name: '1', type: 'boolean' }], + // output: { name: 'not', type: 'boolean' }, + // logic: ['Not', '@1'], + // }, + + // { + // key: 'mathFunctionCount', + // name: 'Count', + // type: MathAggregationTypes.COUNT, + // description: 'Count the number of values', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'count', type: 'float' }, + // logic: ['Count', '@1'], + // }, + // { + // key: 'mathFunctionMax', + // name: 'Maximum', + // type: MathAggregationTypes.MAX, + // description: 'Maximum of all values', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'max', type: 'float' }, + // logic: ['Max', '@1'], + // }, + // { + // key: 'mathFunctionMin', + // name: 'Minimum', + // type: MathAggregationTypes.MIN, + // description: 'Minimum of all values', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'min', type: 'float' }, + // logic: ['Min', '@1'], + // }, + // { + // key: 'mathFunctionSum', + // name: 'Sum', + // type: MathAggregationTypes.SUM, + // description: 'Sum of all values', + // numInputs: 1, + // inputs: [{ name: '1', type: 'float' }], + // output: { name: 'sum', type: 'float' }, + // logic: ['Sum', '@1'], + // }, + // // { + // // key: 'mathFunctionStd', + // // name: 'Standard Deviation', + // // type: MathAggregationTypes.STD, + // // description: 'Standard deviation of all values', + // // numInputs: 1, + // // inputs: [{ name: '1', type: 'float' }], + // // output: { name: 'std', type: 'float' }, + // // logic: ['Std', '@1'], + // // }, + // { + // key: 'mathFunctionAdd', + // name: 'Add', + // type: MathAggregationTypes.ADD, + // description: 'Add two values', + // numInputs: 2, + // inputs: [ + // { name: '1', type: 'float' }, + // { name: '2', type: 'float' }, + // ], + // output: { name: '+', type: 'float' }, + // logic: ['+', '@1', '@2'], + // }, +}; + +/** All available functions in the function bar. */ +export const MathAggregationArray: Array<GeneralDescription<MathAggregationTypes>> = Object.values(MathAggregations); diff --git a/libs/shared/lib/querybuilder/model/logic/mathFilters.tsx b/libs/shared/lib/querybuilder/model/logic/mathFilters.tsx new file mode 100644 index 000000000..0c235dd78 --- /dev/null +++ b/libs/shared/lib/querybuilder/model/logic/mathFilters.tsx @@ -0,0 +1,93 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +import { Position } from 'reactflow'; +import { GeneralDescription, InputNode, MathFilterTypes } from './general'; + +export const MathFilters: Record<MathFilterTypes, GeneralDescription<MathFilterTypes>> = { + [MathFilterTypes.EQUAL]: { + key: 'mathFilterEqual', + name: 'Equal', + type: MathFilterTypes.EQUAL, + description: 'Equal to another value', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '==', type: 'float' }, + logic: ['==', '@1', '@2'], + }, + [MathFilterTypes.NOT_EQUAL]: { + key: 'mathFilterNotEqual', + name: 'Not Equal', + type: MathFilterTypes.NOT_EQUAL, + description: 'Not equal to another value', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '!=', type: 'float' }, + logic: ['!=', '@1', '@2'], + }, + [MathFilterTypes.LESS_THAN]: { + key: 'mathFilterLessThan', + name: 'Less Than', + type: MathFilterTypes.LESS_THAN, + description: 'Less than another value', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '<', type: 'float' }, + logic: ['<', '@1', '@2'], + }, + [MathFilterTypes.LESS_THAN_EQUAL]: { + key: 'mathFilterLessThanOrEqual', + name: 'Less Than or Equal', + type: MathFilterTypes.LESS_THAN_EQUAL, + description: 'Less than or equal to another value', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '<=', type: 'float' }, + logic: ['<=', '@1', '@2'], + }, + [MathFilterTypes.GREATER_THAN]: { + key: 'mathFilterGreaterThan', + name: 'Greater Than', + type: MathFilterTypes.GREATER_THAN, + description: 'Greater than another value', + + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '>', type: 'float' }, + logic: ['>', '@1', '@2'], + }, + [MathFilterTypes.GREATER_THAN_EQUAL]: { + key: 'mathFilterGreaterThanOrEqual', + name: 'Greater Than or Equal', + type: MathFilterTypes.GREATER_THAN_EQUAL, + description: 'Greater than or equal to another value', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '>=', type: 'float' }, + logic: ['>=', '@1', '@2'], + }, +}; + +/** All available functions in the function bar. */ +export const MathFilterArray: Array<GeneralDescription<MathFilterTypes>> = Object.values(MathFilters); diff --git a/libs/shared/lib/querybuilder/model/logic/mathFunctions.tsx b/libs/shared/lib/querybuilder/model/logic/mathFunctions.tsx new file mode 100644 index 000000000..5375664aa --- /dev/null +++ b/libs/shared/lib/querybuilder/model/logic/mathFunctions.tsx @@ -0,0 +1,67 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +import { Position } from 'reactflow'; +import { GeneralDescription, MathFunctionTypes } from './general'; + +export const MathFunctions: Record<MathFunctionTypes, GeneralDescription<MathFunctionTypes>> = { + [MathFunctionTypes.ADD]: { + key: 'mathFunctionAdd', + name: 'Add', + type: MathFunctionTypes.ADD, + description: 'Add two values', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '+', type: 'float' }, + logic: ['+', '@1', '@2'], + }, + [MathFunctionTypes.SUBTRACT]: { + key: 'mathFunctionSubtract', + name: 'Subtract', + type: MathFunctionTypes.SUBTRACT, + description: 'Subtract two values', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '-', type: 'float' }, + logic: ['-', '@1', '@2'], + }, + [MathFunctionTypes.MULTIPLY]: { + key: 'mathFunctionMultiply', + name: 'Multiply', + type: MathFunctionTypes.MULTIPLY, + description: 'Multiply two values', + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '*', type: 'float' }, + logic: ['*', '@1', '@2'], + }, + [MathFunctionTypes.DIVIDE]: { + key: 'mathFunctionDivide', + name: 'Divide', + type: MathFunctionTypes.DIVIDE, + description: 'Divide two values', + + numInputs: 2, + inputs: [ + { name: '1', type: 'float', default: 0 }, + { name: '2', type: 'float', default: 0 }, + ], + output: { name: '/', type: 'float' }, + logic: ['/', '@1', '@2'], + }, +}; + +/** All available functions in the function bar. */ +export const MathFunctionArray: Array<GeneralDescription<MathFunctionTypes>> = Object.values(MathFunctions); diff --git a/libs/shared/lib/querybuilder/model/logic/utils.ts b/libs/shared/lib/querybuilder/model/logic/utils.ts new file mode 100644 index 000000000..e69de29bb diff --git a/libs/shared/lib/querybuilder/panel/querybuilder.module.scss b/libs/shared/lib/querybuilder/panel/querybuilder.module.scss index 388d9f8ac..aa0cb3737 100644 --- a/libs/shared/lib/querybuilder/panel/querybuilder.module.scss +++ b/libs/shared/lib/querybuilder/panel/querybuilder.module.scss @@ -29,6 +29,8 @@ } .menuText { + font-size: small; + font-family: Poppins, sans-serif; } .full { diff --git a/libs/shared/lib/querybuilder/panel/querybuilder.module.scss.d.ts b/libs/shared/lib/querybuilder/panel/querybuilder.module.scss.d.ts index f475ca66c..719453220 100644 --- a/libs/shared/lib/querybuilder/panel/querybuilder.module.scss.d.ts +++ b/libs/shared/lib/querybuilder/panel/querybuilder.module.scss.d.ts @@ -2,6 +2,7 @@ declare const classNames: { readonly reactflow: 'reactflow'; readonly controls: 'controls'; readonly buttons: 'buttons'; + readonly menuText: 'menuText'; readonly full: 'full'; }; export = classNames; diff --git a/libs/shared/lib/querybuilder/panel/querybuilder.tsx b/libs/shared/lib/querybuilder/panel/querybuilder.tsx index f0df37d9b..73bc730e7 100644 --- a/libs/shared/lib/querybuilder/panel/querybuilder.tsx +++ b/libs/shared/lib/querybuilder/panel/querybuilder.tsx @@ -1,49 +1,92 @@ -import React, { useCallback, useMemo, useRef, useState } from 'react'; import { setQuerybuilderNodes, + useAppDispatch, useConfig, useQuerybuilderGraph, useQuerybuilderGraphology, + useSchemaGraph, useSchemaGraphology, } from '@graphpolaris/shared/lib/data-access/store'; import ReactFlow, { + ReactFlowProvider, Background, - Connection, - ControlButton, - Controls, - Edge, - HandleType, Node, + isNode, + ReactFlowInstance, + Controls, + ControlButton, NodeChange, - NodePositionChange, + ConnectionMode, + NodeMouseHandler, OnConnectStartParams, - OnEdgesChange, - ReactFlowInstance, - ReactFlowProvider, - XYPosition, - isNode, useReactFlow, + Edge, + Connection, + HandleType, + XYPosition, + Position, + OnEdgesChange, + NodePositionChange, } from 'reactflow'; import styles from './querybuilder.module.scss'; +import CachedIcon from '@mui/icons-material/Cached'; +import React, { ReactComponentElement, useMemo, useRef, useEffect, useCallback, useState, DragEventHandler } from 'react'; +import { AttributePill, ConnectionDragLine, ConnectionLine, EntityFlowElement, RelationPill } from '../pills'; +import { dragPillStarted, dragPillStopped, movePillTo } from '../pills/dragging/dragPill'; +import { Settings as SettingsIcon, Delete as DeleteIcon, ImportExport as ExportIcon } from '@mui/icons-material'; import { clearQB } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; -import { Cached as CachedIcon, Delete as DeleteIcon, ImportExport as ExportIcon, Settings as SettingsIcon } from '@mui/icons-material'; +import { RelationPosToFromEntityPos, RelationPosToToEntityPos } from '@graphpolaris/shared/lib/querybuilder/model/graphology/utils'; import { useDispatch } from 'react-redux'; +import { + Box, + Card, + CardContent, + Dialog, + DialogTitle, + Grid, + List, + ListItem, + ListItemButton, + ListItemText, + Paper, + PaperProps, + Tab, + Tabs, + Typography, +} from '@mui/material'; import { AllLogicDescriptions, AllLogicMap, + Handles, + MathFilters, + StringFilters, + MathFunctions, NodeAttribute, QueryElementTypes, QueryGraphNodes, + StringFunctions, createReactFlowElements, toHandleData, + QueryGraphEdgeHandle, } from '../model'; -import { InputNodeType } from '../model/logic/general'; -import { ConnectionDragLine, ConnectionLine, EntityFlowElement, RelationPill } from '../pills'; +import Draggable from 'react-draggable'; +import { GeneralDescription, InputNodeType } from '../model/logic/general'; import LogicPill from '../pills/customFlowPills/logicpill/logicpill'; -import { dragPillStarted, movePillTo } from '../pills/dragging/dragPill'; -import { QueryBuilderModal } from './querypopup'; -import { QuerySidePanel, QueryBuilderProps } from './querysidepanel'; +import { current } from '@reduxjs/toolkit'; +import { SchemaAttributeTypes } from '../../schema'; +import { MathAggregations } from '../model/logic/mathAggregations'; + +const nodeTypes = { + entity: EntityFlowElement, + relation: RelationPill, + logic: LogicPill, + attribute: AttributePill, +}; +const edgeTypes = { + connection: ConnectionLine, + attribute_connection: ConnectionLine, +}; /** * This is the main querybuilder component. It is responsible for holding all pills and fire off the visual part of the querybuilder panel logic @@ -52,17 +95,6 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { const [openPopup, setOpenPopup] = useState(false); const reactFlowWrapper = useRef<HTMLDivElement>(null); - var nodeTypes = { - entity: EntityFlowElement, - relation: RelationPill, - logic: LogicPill, - }; - - var edgeTypes = { - connection: ConnectionLine, - attribute_connection: ConnectionLine, - }; - const schema = useSchemaGraphology(); const graphologyGraph = useQuerybuilderGraphology(); const graph = useQuerybuilderGraph(); @@ -355,8 +387,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { [reactFlow.project] ); - const onNewNodeFromPopup = (value: AllLogicDescriptions) => { - setOpenPopup(false); + const onNewNodeFromPopup = (value: AllLogicDescriptions, type: InputNodeType) => { if (connectingNodeId.current === null || connectingNodeId.current?.params?.handleId == null) return; const params = connectingNodeId.current.params; const position = connectingNodeId.current.position; @@ -443,10 +474,10 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { }; return ( - <div ref={reactFlowWrapper} className="h-full w-full"> - <QueryBuilderModal + <div ref={reactFlowWrapper} className={styles.full}> + <PopupMenu open={openPopup} - handle={connectingNodeId.current?.attribute.handleData} + type={connectingNodeId.current?.attribute.handleData.attributeType || 'int'} onClose={() => { setOpenPopup(false); }} @@ -484,6 +515,15 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { attributionPosition="top-right" > <Background gap={10} size={0.7} /> + {elements && elements.edges.length == 0 && elements.nodes.length == 0 && ( + <Card variant="outlined" sx={{ minWidth: 275, marginTop: 3, marginRight: 10 }}> + <CardContent> + <Typography sx={{ fontSize: 20 }} color="text.secondary"> + Drag some node from the Schema panel + </Typography> + </CardContent> + </Card> + )} <Controls showZoom={false} showInteractive={false} className={styles.controls}> <ControlButton className={styles.buttons} title={'Remove all elements'} onClick={() => clearAllNodes()}> @@ -531,10 +571,206 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { ); }; +// const math_functions = ['AVG', 'COUNT', 'MAX', 'MIN', 'SUM', 'ROUND', 'CEIL', 'FLOOR', '+', '-', '*', '/', '%', 'CUSTOM']; +// const string_functions = ['CONCAT', 'LOWER', 'UPPER', 'SUBSTRING', 'TRIM']; +// const math_filters = ['==', '!=', '>', '<', '>=', '<=']; +// const string_filters = ['==', '!=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN']; + +function PaperComponent(props: PaperProps) { + return ( + <Draggable handle="#draggable-dialog-title" cancel={'[class*="MuiDialogContent-root"]'}> + <Paper {...props} /> + </Draggable> + ); +} + +interface TabPanelProps { + children?: React.ReactNode; + index: number; + value: number; +} + +function CustomTabPanel(props: TabPanelProps) { + const { children, value, index, ...other } = props; + + return ( + <div + role="tabpanel" + hidden={value !== index} + id={`simple-tabpanel-${index}`} + aria-labelledby={`simple-tab-${index}`} + {...other} + style={{ maxHeight: '85%', overflow: 'auto' }} + > + {value === index && ( + <Box> + <Typography>{children}</Typography> + </Box> + )} + </div> + ); +} + +function PopupMenu(props: { + open: boolean; + type: InputNodeType; + onClose: () => void; + onClick: (value: AllLogicDescriptions, type: InputNodeType) => void; +}) { + const [value, setValue] = React.useState(props.type === 'string' ? 1 : 0); + + const handleChange = (event: React.SyntheticEvent, newValue: number) => { + setValue(newValue); + }; + + const handleClose = () => { + props.onClose(); + }; + + const handleListItemClick = (value: AllLogicDescriptions, type: InputNodeType) => { + props.onClick(value, type); + }; + + const generateList = (list: Record<string, AllLogicDescriptions>, type: InputNodeType) => ( + <List sx={{ pt: 0 }}> + {Object.keys(list).map((f, i) => ( + <ListItemButton onClick={() => handleListItemClick(list[f], type)} key={f + type}> + {/* <ListItemAvatar> + <Avatar sx={{ bgcolor: blue[100], color: blue[600] }}> + <PersonIcon /> + </Avatar> + </ListItemAvatar> */} + <ListItemText primary={list[f].name} secondary={list[f].description} /> + </ListItemButton> + ))} + </List> + ); + + function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; + } + + return ( + <Dialog onClose={handleClose} open={props.open} PaperComponent={PaperComponent}> + <DialogTitle>Add New Node</DialogTitle> + <Box> + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> + <Tabs value={value} onChange={handleChange} aria-label="basic tabs example"> + <Tab label="Aggregations" disabled={props.type === 'string'} {...a11yProps(0)} /> + <Tab label="Operations" {...a11yProps(1)} /> + <Tab label="Filters" {...a11yProps(2)} /> + </Tabs> + </Box> + <CustomTabPanel value={value} index={0}> + {props.type === 'float' && generateList(MathAggregations, props.type)} + {props.type === 'int' && generateList(MathAggregations, props.type)} + {/* {props.type === 'string' && generateList(MathAggregations, props.type)} */} + </CustomTabPanel> + <CustomTabPanel value={value} index={1}> + {props.type === 'float' && generateList(MathFunctions, props.type)} + {props.type === 'int' && generateList(MathFunctions, props.type)} + {props.type === 'string' && generateList(StringFunctions, props.type)} + </CustomTabPanel> + <CustomTabPanel value={value} index={2}> + {props.type === 'float' && generateList(MathFilters, props.type)} + {props.type === 'int' && generateList(MathFilters, props.type)} + {props.type === 'string' && generateList(StringFilters, props.type)} + </CustomTabPanel> + </Box> + </Dialog> + ); +} + +export const QueryBuilderPills = () => { + const onDragStart = (event: React.DragEvent, value: AllLogicDescriptions, nodeType: InputNodeType) => { + console.log('drag start', nodeType); + + event.dataTransfer.setData('application/reactflow', JSON.stringify({ value, nodeType })); + event.dataTransfer.effectAllowed = 'move'; + }; + + const [value, setValue] = React.useState(0); + + const handleChange = (event: React.SyntheticEvent, newValue: number) => { + setValue(newValue); + }; + + function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; + } + + const handleListItemClick = (value: AllLogicDescriptions, type: InputNodeType) => {}; + + // const generateList = (list: Record<string, AllLogicDescriptions>, type: InputNodeType) => ( + // <List sx={{ pt: 0 }}> + // {Object.keys(list).map((f, i) => ( + // <ListItemButton onClick={() => handleListItemClick(list[f], type)} key={f + type}> + // <ListItemText primary={list[f].name} secondary={list[f].description} /> + // </ListItemButton> + // ))} + // </List> + // ); + const generateList = (list: Record<string, AllLogicDescriptions>, type: InputNodeType) => ( + <List> + {Object.keys(list).map((f, i) => ( + <ListItem key={JSON.stringify(list[f]) + type + i}> + <ListItemText + draggable + primary={list[f].name} + secondary={list[f].description} + onDragStart={(event) => onDragStart(event, list[f], type)} + key={f + type} + /> + </ListItem> + ))} + </List> + ); + + return ( + <aside className=""> + <Box> + <Tabs value={value} onChange={handleChange} aria-label="basic tabs example"> + <Tab label="Aggregations" {...a11yProps(0)} /> + <Tab label="Operations" {...a11yProps(1)} /> + <Tab label="Filters" {...a11yProps(2)} /> + </Tabs> + </Box> + <CustomTabPanel value={value} index={0}> + {generateList(MathAggregations, 'float')} + </CustomTabPanel> + <CustomTabPanel value={value} index={1}> + {generateList(MathFunctions, 'float')} + {generateList(StringFunctions, 'string')} + </CustomTabPanel> + <CustomTabPanel value={value} index={2}> + {generateList(MathFilters, 'float')} + {generateList(StringFilters, 'string')} + </CustomTabPanel> + </aside> + ); +}; + +export type QueryBuilderProps = { + onRunQuery?: () => void; +}; + export const QueryBuilder = (props: QueryBuilderProps) => { return ( - <div className="flex w-full h-full"> - <QuerySidePanel title="Query Panel" draggable /> + <div + style={{ + width: '100%', + height: '22rem', + display: 'flex', + gap: '1rem', + }} + > + <QueryBuilderPills /> <ReactFlowProvider> <QueryBuilderInner {...props} /> </ReactFlowProvider> @@ -542,4 +778,21 @@ export const QueryBuilder = (props: QueryBuilderProps) => { ); }; +// export const QueryBuilder = () => { +// const graphologyGraph = useQuerybuilderGraphology(); +// const schema = useSchemaGraphology(); +// const graph = useQuerybuilderGraph(); +// const config = useConfig(); +// const dispatch = useDispatch(); + +// return ( +// <QueryBuilderRaw +// graphologyGraph={graphologyGraph} +// schema={schema} +// graph={graph} +// config={config} +// /> +// ); +// }; + export default QueryBuilder; diff --git a/libs/shared/lib/querybuilder/panel/shemaquerybuilder.stories.tsx b/libs/shared/lib/querybuilder/panel/shemaquerybuilder.stories.tsx index 3f6ebb25b..f0ee5ed0d 100644 --- a/libs/shared/lib/querybuilder/panel/shemaquerybuilder.stories.tsx +++ b/libs/shared/lib/querybuilder/panel/shemaquerybuilder.stories.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { setQuerybuilderNodes, setSchema, store } from '@graphpolaris/shared/lib/data-access/store'; - +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { SchemaUtils } from '@graphpolaris/shared/lib/schema/schema-utils'; import { Schema } from '@graphpolaris/shared/lib/schema/panel'; import { movieSchemaRaw } from '@graphpolaris/shared/lib/mock-data'; @@ -37,14 +37,16 @@ const Component: Meta = { // using the real store here (story) => ( <Provider store={store}> - <div - style={{ - width: '100%', - height: '95vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '95vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], diff --git a/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple-disconnected.stories.tsx b/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple-disconnected.stories.tsx index 736ae8d21..6d8c661f3 100644 --- a/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple-disconnected.stories.tsx +++ b/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple-disconnected.stories.tsx @@ -1,6 +1,12 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes, setSchema, store } from '@graphpolaris/shared/lib/data-access/store'; - +import { + colorPaletteConfigSlice, + querybuilderSlice, + setQuerybuilderNodes, + setSchema, + store, +} from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -83,14 +89,16 @@ export const SimpleDisconnected = { return ( <Provider store={store}> - <div - style={{ - width: '100%', - height: '95vh', - }} - > - <ReactFlowProvider>{story()}</ReactFlowProvider> - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '95vh', + }} + > + <ReactFlowProvider>{story()}</ReactFlowProvider> + </div> + </GraphPolarisThemeProvider> </Provider> ); }, diff --git a/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx b/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx index 68c0849ba..bd57e342d 100644 --- a/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx +++ b/libs/shared/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx @@ -1,6 +1,12 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes, setSchema, store } from '@graphpolaris/shared/lib/data-access/store'; - +import { + colorPaletteConfigSlice, + querybuilderSlice, + setQuerybuilderNodes, + setSchema, + store, +} from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -14,14 +20,16 @@ const Component: Meta<typeof QueryBuilder> = { decorators: [ (story) => ( <Provider store={store}> - <div - style={{ - width: '100%', - height: '95vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '95vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], diff --git a/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx b/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx index acd8b87cc..c147c023d 100644 --- a/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx +++ b/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx @@ -1,6 +1,12 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes, setSchema, store } from '@graphpolaris/shared/lib/data-access/store'; - +import { + colorPaletteConfigSlice, + querybuilderSlice, + setQuerybuilderNodes, + setSchema, + store, +} from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -13,14 +19,16 @@ const Component: Meta<typeof QueryBuilder> = { decorators: [ (story) => ( <Provider store={store}> - <div - style={{ - width: '100%', - height: '95vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '95vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], diff --git a/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx b/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx index c94a3f367..db2d6634f 100644 --- a/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx +++ b/libs/shared/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx @@ -1,6 +1,12 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes, setSchema, store } from '@graphpolaris/shared/lib/data-access/store'; - +import { + colorPaletteConfigSlice, + querybuilderSlice, + setQuerybuilderNodes, + setSchema, + store, +} from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -13,14 +19,16 @@ const Component: Meta<typeof QueryBuilder> = { decorators: [ (story) => ( <Provider store={store}> - <div - style={{ - width: '100%', - height: '95vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '95vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], diff --git a/libs/shared/lib/querybuilder/pills/customFlowLines/connection.tsx b/libs/shared/lib/querybuilder/pills/customFlowLines/connection.tsx index 9ac746889..ef15a7b00 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowLines/connection.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowLines/connection.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { EdgeProps, getSmoothStepPath, Position } from 'reactflow'; -import './connection.scss'; /** * A custom query element edge line component. @@ -17,7 +16,7 @@ export function ConnectionLine({ id, sourceX, sourceY, targetX, targetY, style, // if (targetHandleId == Handles.ToAttributeHandle) targetX += 2; - // let spos: Position = sourcePosition; + let spos: Position = sourcePosition; // if (sourceHandleId == handles.relation.fromEntity) { // spos = Position.Left; // sourceX += 7; @@ -36,29 +35,32 @@ export function ConnectionLine({ id, sourceX, sourceY, targetX, targetY, style, // sourceY += 3; // } - if (targetPosition === Position.Left) { - targetX += 2; - targetY += 0.5; - } else if (targetPosition === Position.Right) { - targetX -= 2; - targetY -= 0.5; - } + let tpos: Position = targetPosition; + // if (targetHandleId == handles.relation.fromEntity) { + // tpos = Position.Left; + // targetX += 7; + // targetY += 3; + // } else if (targetHandleId == handles.relation.toEntity) { + // tpos = Position.Right; + // targetX -= 2; + // targetY -= 3; + // } // Create smoothstep line const path = getSmoothStepPath({ sourceX: sourceX, sourceY: sourceY, - sourcePosition, + sourcePosition: spos, targetX: targetX, targetY: targetY, - targetPosition, + targetPosition: tpos, }); // console.log(source, target, path); return ( <g stroke="#2e2e2e"> - <path id={id} fill="none" strokeWidth={1.5} style={style} d={path[0]} /> + <path id={id} fill="none" strokeWidth={3} style={style} d={path[0]} /> </g> ); } diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.module.scss.d.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.module.scss.d.ts new file mode 100644 index 000000000..634416569 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.module.scss.d.ts @@ -0,0 +1,36 @@ +declare const classNames: { + readonly handle: 'handle'; + readonly handle_logic: 'handle_logic'; + readonly handle_logic_duration: 'handle_logic_duration'; + readonly handle_logic_datetime: 'handle_logic_datetime'; + readonly handle_logic_time: 'handle_logic_time'; + readonly handle_logic_date: 'handle_logic_date'; + readonly handle_logic_bool: 'handle_logic_bool'; + readonly handle_logic_float: 'handle_logic_float'; + readonly handle_logic_int: 'handle_logic_int'; + readonly handle_logic_string: 'handle_logic_string'; + readonly handle_from_relation: 'handle_from_relation'; + readonly handle_to_relation: 'handle_to_relation'; + readonly 'react-flow__node': 'react-flow__node'; + readonly selected: 'selected'; + readonly entityWrapper: 'entityWrapper'; + readonly hidden: 'hidden'; + readonly 'react-flow__edges': 'react-flow__edges'; + readonly 'react-flow__edge-default': 'react-flow__edge-default'; + readonly handleConnectedFill: 'handleConnectedFill'; + readonly handleConnectedBorderRight: 'handleConnectedBorderRight'; + readonly handleConnectedBorderLeft: 'handleConnectedBorderLeft'; + readonly handleFunction: 'handleFunction'; + readonly attribute: 'attribute'; + readonly contentWrapper: 'contentWrapper'; + readonly content: 'content'; + readonly attributeMain: 'attributeMain'; + readonly attributeHandleLeft: 'attributeHandleLeft'; + readonly attributeInput: 'attributeInput'; + readonly attributeWrapper: 'attributeWrapper'; + readonly attributeWrapperSpan: 'attributeWrapperSpan'; + readonly matchTypeSelect: 'matchTypeSelect'; + readonly matchModifierTypeSelect: 'matchModifierTypeSelect'; + readonly disable: 'disable'; +}; +export = classNames; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.storiesDEFUNCT.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.storiesDEFUNCT.tsx new file mode 100644 index 000000000..a1788066c --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.storiesDEFUNCT.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Meta } from '@storybook/react'; +import AttributePill from './attributepill'; +import { configureStore } from '@reduxjs/toolkit'; +import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; + +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { ReactFlowProvider } from 'reactflow'; + +const Component: Meta<typeof AttributePill> = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'Querybuilder/Pills/AttributePill', + component: AttributePill, + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> + </Provider> + ), + ], +}; + +export default Component; + +// A super-simple mock of a redux store +const Mockstore = configureStore({ + reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, + querybuilder: querybuilderSlice.reducer, + // schema: schemaSlice.reducer, + }, +}); + +export const Simple = { + args: { + data: { + name: 'TestEntity', + }, + }, +}; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.tsx new file mode 100644 index 000000000..0875fe2a2 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/attributepill.tsx @@ -0,0 +1,138 @@ +import { useTheme } from '@mui/material'; +import React, { useMemo, useState } from 'react'; +import styles from './attributepill.module.scss'; +import { Handle, NodeProps, Position } from 'reactflow'; +import { AttributeOperatorSelect } from './operator'; +import Select from './select-component'; +import { Handles } from '../../../model'; + +/** + * Component to render an attribute flow element + * @param {FlowElement<EntityData>)} param0 The data of an entity flow element. + */ +export const AttributePill = React.memo(({ id, data }: any) => { + const theme = useTheme(); + const [read, setRead] = useState(true); + // console.log('AttributePill', data); + + /** + * Check if the pressed key is enter in order to send the new query. + * @param event Key press event. + */ + const _onKeyDown = (event: any): void => { + if (event.key == 'Enter') setRead(true); + }; + + /** + * Checks if the string input is a number. + * @param x String input. + * @returns {boolean} True if input is a number. + */ + const isNumber = (x: string): boolean => { + { + if (typeof x != 'string') return false; + return !Number.isNaN(x) && !Number.isNaN(parseFloat(x)); + } + }; + + /** + * Calculates the width of an element based on the length of a monospaced font. + * @param str Input string. + * @returns {string} Containing the length in css format. + */ + const calcWidth = (str: string) => { + if (str == '') { + return 1.5 + 'ch'; + } + return str.length + 0.5 + 'ch'; + }; + + /** + * Input contraint checker for the attribute input fields. + * @param type Data.dataType. + * @param str Input string. + * @returns {string} Result string after the contraints are applied. + */ + const inputConstraint = (type: string, str: string): string => { + let res = ''; + switch (type) { + case 'string': + res = str; + break; + case 'bool': + res = str; + break; // TODO: only false and true live update will break since it will not allow to write more that 1 letter + case 'int': + isNumber(str) ? (res = str) : (res = ''); + break; // TODO: check if letters after number + default: + res = str; + break; + } + return res; + }; + + //TODO: docstrings + const className = styles.attributeHandleLeft + ' ' + (false ? styles.handleConnectedFill : ''); + + const onChange = (e: any) => { + if (data != undefined) { + data.value = inputConstraint(data.dataType, e.target.value); + e.target.style.maxWidth = calcWidth(data.value); + } + }; + + /**Constraint datatypes back end. + * string MatchTypes: EQ/NEQ/contains/excludes. + * int MatchTypes: EQ/NEQ/GT/LT/GET/LET. + * bool MatchTypes: EQ/NEQ. + */ + //TODO: fix use of relation boilerplate styling + + return ( + <div className={styles.attributeMain} style={{ backgroundColor: theme.palette.custom.elements.attribute[0] }}> + <Handle + id={Handles.OnAttribute} + type="source" + position={Position.Left} + className={styles.attributeHandleLeft + ' ' + (false ? styles.handleConnectedFill : '')} + style={{ backgroundColor: theme.palette.custom.elements.attribute[1] }} + /> + <Handle + id={Handles.ToAttribute} + type="source" + position={Position.Left} + className={styles.attributeHandleLeft + ' ' + (false ? styles.handleConnectedFill : '')} + style={{ + backgroundColor: theme.palette.custom.elements.attribute[1], + left: 50, + }} + /> + <div className={styles.attributeWrapper}> + <span className={styles.attributeWrapperSpan}>{data?.name}</span> + <Select data={data} /> + <span className={styles.attributeInput}> + <input type="hidden"></input> + <input + style={{ maxWidth: calcWidth(data?.value || '') }} + type="string" + readOnly={read} + placeholder={'?'} + value={data?.value || ''} + onChange={onChange} + onDoubleClick={() => { + setRead(false); + }} + onBlur={() => { + setRead(true); + }} + onKeyDown={_onKeyDown} + ></input> + </span> + </div> + </div> + ); +}); +AttributePill.displayName = 'AttributePill'; + +export default AttributePill; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/getAttributeBoolOperators.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/getAttributeBoolOperators.ts new file mode 100644 index 000000000..0d01e2c01 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/getAttributeBoolOperators.ts @@ -0,0 +1,61 @@ +/** Determines the available boolean operators for a certain datatype. */ +export function GetAttributeBoolOperators(datatype: string): { label: string; value: string }[] { + switch (datatype) { + case 'text': + case 'string': + return [ + { + label: '=', + value: 'EQ', + }, + { + label: '≠', + value: 'NEQ', + }, + { + label: 'inc', + value: 'includes', + }, + { + label: 'exc', + value: 'excludes', + }, + ]; + case 'int': + case 'float': + return [ + { + label: '=', + value: 'EQ', + }, + { + label: '≠', + value: 'NEQ', + }, + { + label: '>', + value: 'GT', + }, + { + label: '≥', + value: 'GTE', + }, + { + label: '<', + value: 'LT', + }, + { + label: '≤', + value: 'LTE', + }, + ]; + case 'bool': + default: + return [ + { + label: '=', + value: 'EQ', + }, + ]; + } +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/operator/operatorselect.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/operator/operatorselect.tsx new file mode 100644 index 000000000..4ea581df8 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/operator/operatorselect.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import { SelectOption } from '@mui/base'; +import styles from './operatorselect.module.scss'; +import { useRef, useState } from 'react'; + +// const grey = { +// 100: '#E7EBF0', +// 200: '#E0E3E7', +// 300: '#CDD2D7', +// 400: '#B2BAC2', +// 500: '#A0AAB4', +// 600: '#6F7E8C', +// 700: '#3E5060', +// 800: '#2D3843', +// 900: '#1A2027', +// }; + +interface Props { + options: SelectOption<string>[]; + selected: string; + changed?: (newSelected: SelectOption<string>) => void; +} + +export function AttributeOperatorSelect({ + options, + selected, + changed = () => { + return; + }, +}: Props) { + const listboxRef = useRef<HTMLUListElement>(null); + const [listboxVisible, setListboxVisible] = useState(false); + const [currSelected, setCurrSelected] = useState(options.find((o) => o.value == selected)?.label || options[0].label); + + React.useEffect(() => { + if (listboxVisible) { + listboxRef.current?.focus(); + } + }, [listboxVisible]); + + const changeSelected = (option: SelectOption<string>) => { + if (option.label != currSelected) { + setCurrSelected(option.label); + changed(option); + } + }; + + return ( + <div + className={styles.container} + // onMouseOver={() => setListboxVisible(true)} + onMouseOut={() => setListboxVisible(false)} + onClick={() => setListboxVisible(true)} + onFocus={() => setListboxVisible(true)} + onBlur={() => setListboxVisible(false)} + > + <div className={styles.valueContainer + ' ' + (listboxVisible && styles.highlighted)}> + <span>{currSelected}</span> + </div> + {options.length > 1 && ( + <ul + className={styles.listbox + ' ' + (!listboxVisible && styles.hidden)} + ref={listboxRef} + onMouseOver={() => setListboxVisible(true)} + > + {options.map((option) => ( + <li className={option.label == currSelected ? styles.selected : ''} key={option.value} onClick={() => changeSelected(option)}> + {option.label} + </li> + ))} + </ul> + )} + </div> + ); +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/select-component.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/select-component.tsx new file mode 100644 index 000000000..2f804d657 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/attributepill/select-component.tsx @@ -0,0 +1,84 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +/* istanbul ignore file */ +/* The comment above was added so the code coverage wouldn't count this file towards code coverage. + * We do not test components/renderfunctions/styling files. + * See testing plan for more details.*/ +import { useTheme } from '@mui/material'; +import React, { useState } from 'react'; +import styles from './attributepill.module.scss'; + +export default function SelectComponent({ data }: { data: any }) { + const theme = useTheme(); + + /** + * Calculate the width of the select element based on the displayed value. + * @param str Input string. + * @returns {string} Containing the length in css format. + */ + const calcSelectWidth = (str: string): string => { + if (str == '') { + return 1.5 + 'ch'; + } + return str.length + 1.5 + 'ch'; + }; + + /** + * Constant switch to append the right options for the select element based on the data.dataType. + * @returns {JSX.Element} Option list using React.Fragment as parent element. + */ + const list = (): JSX.Element => { + switch (data.dataType) { + case 'string': + return ( + <React.Fragment> + <option value="EQ">==</option> + <option value="NEQ">!=</option> + <option value="contains">contains</option> + <option value="excludes">excludes</option> + </React.Fragment> + ); + case 'int': + case 'float': + return ( + <React.Fragment> + <option value="EQ">==</option> + <option value="NEQ">!=</option> + <option value="GT">{'>'}</option> + <option value="LT">{'<'}</option> + <option value="GET">{'>='}</option> + <option value="LET">{'<='}</option> + </React.Fragment> + ); + case 'bool': + return ( + <React.Fragment> + <option value="EQ">==</option> + <option value="NEQ">!=</option> + </React.Fragment> + ); + default: + return <option>Error</option>; + } + }; + + return ( + <div className={styles.matchTypeSelect} style={{ backgroundColor: theme.palette.custom.elements.attribute[1] }}> + <select + style={{ maxWidth: calcSelectWidth('==') }} + value={data.matchType} + name="operators" + onChange={(e) => { + data.matchType = e.target.value; + e.target.style.maxWidth = calcSelectWidth(e.target.value); + }} + > + {list()} + </select> + </div> + ); +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill-full.stories.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill-full.stories.tsx index 22698240b..fd47ee277 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill-full.stories.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill-full.stories.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes } from '@graphpolaris/shared/lib/data-access/store'; - +import { colorPaletteConfigSlice, querybuilderSlice, setQuerybuilderNodes } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -11,12 +11,19 @@ import { QueryElementTypes } from '../../../model'; const Component: Meta<typeof QueryBuilder> = { component: QueryBuilder, title: 'Querybuilder/Pills/EntityPill', - decorators: [(story) => <Provider store={mockStore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={mockStore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; // Mock palette store const mockStore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, }, }); diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss index d2b9ad3b2..2590cb9d8 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss @@ -4,6 +4,13 @@ box-shadow: black 0 0 2px; } +.react-flow__edges { + zindex: 3; +} +.react-flow__nodes { +} +.react-flow__pane { +} .react-flow__edge-default .selected { stroke: gray !important; } @@ -22,12 +29,18 @@ // Entity element .entity { - border-left: 3px solid; - @apply bg-entity-50; - @apply border-l-entity-600; + background: #e9e9e9; + // display: flex; + // border: #ffffff solid 2px; + border-radius: 2px; + font-family: monospace; font-weight: bold; + color: black; min-width: 8rem; - font-size: 13px; + + font-size: 10px; + border-radius: 2px; + // padding-left: 45px; .title { position: relative; @@ -59,11 +72,6 @@ animation: slide-down 0.2s ease-out; overflow: hidden; max-height: 0; - font-weight: normal; - // border-left: 1px solid; - // @apply bg-entity-50; - // @apply border-l-entity-800; - // @apply bg-base-100; } .content_display { @@ -97,3 +105,81 @@ } } } + +.entityHandleLeft { + border: 0; + border-radius: 0; + left: 12; + width: 8; + height: 8; + margin-bottom: 15; + background: rgba(0, 0, 0, 0.3); + transform-origin: center; + &::before { + content: ''; + width: 6; + height: 6; + left: 1; + bottom: 1; + border: 0; + border-radius: 0; + background: rgba(255, 255, 255, 0.6); + z-index: -1; + display: inline-block; + position: fixed; + } +} + +.entityHandleBottom { + border: 0; + border-radius: 0; + width: 8; + height: 8; + left: 27.5; + margin-bottom: 15; + background: rgba(0, 0, 0, 0.3); + transform: rotate(-45deg); + transform-origin: center; + &::before { + content: ''; + width: 6; + height: 6; + left: 1; + bottom: 1; + border: 0; + border-radius: 0; + background: rgba(255, 255, 255, 0.6); + z-index: -1; + display: inline-block; + position: fixed; + } +} + +.entityWrapper { + display: block; +} + +.entitySpan { + display: block; +} + +// General style + +.ToAttributeHandle { + border-radius: 1px !important; + left: 20px !important; + top: 35% !important; + background: rgba(0, 0, 0, 0.3) !important; + transform: rotate(45deg) scale(0.9) !important; + transform-origin: center, center; +} + +.ReceiveFunctionHandle { + left: 37px !important; + top: 35% !important; + background: rgba(0, 0, 0, 0.3) !important; +} + +.handleFunctionEntity { + margin-left: 5px; +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss.d.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss.d.ts index e37860555..2812eed57 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss.d.ts +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.module.scss.d.ts @@ -30,5 +30,11 @@ declare const classNames: { readonly io: 'io'; readonly io_right: 'io_right'; readonly entityFade: 'entityFade'; + readonly entityHandleLeft: 'entityHandleLeft'; + readonly entityHandleBottom: 'entityHandleBottom'; + readonly entitySpan: 'entitySpan'; + readonly ToAttributeHandle: 'ToAttributeHandle'; + readonly ReceiveFunctionHandle: 'ReceiveFunctionHandle'; + readonly handleFunctionEntity: 'handleFunctionEntity'; }; export = classNames; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.stories.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.stories.tsx index 7de4cbc2a..edff6caa0 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.stories.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.stories.tsx @@ -3,8 +3,9 @@ import { Meta, StoryObj } from '@storybook/react'; import EntityFlowElement from './entitypill'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { EntityData } from '../../../model'; @@ -18,7 +19,9 @@ const Component: Meta<typeof EntityFlowElement> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -29,6 +32,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, @@ -47,7 +51,7 @@ export const Default: StoryObj<{ data: EntityData }> = { // Default.decorators = [ // (story) => ( // <Provider store={Mockstore}> -// {story()} +// <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> // </Provider> // ), // ]; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.tsx index c8391055c..2d0cd37a3 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/entitypill.tsx @@ -1,16 +1,28 @@ // import { handles } from '@graphpolaris/shared/lib/querybuilder/usecases'; -import { useQuerybuilderGraph } from '@graphpolaris/shared/lib/data-access'; -import React, { useMemo } from 'react'; -import { Handle, Position } from 'reactflow'; -import { NodeAttribute, SchemaReactflowEntityNode, handleDataFromReactflowToId, toHandleId } from '../../../model'; -import { styleHandleMap } from '../../utils'; +import { useTheme } from '@mui/material'; +import React, { MouseEventHandler, useEffect, useMemo } from 'react'; +import { ReactFlow, Handle, Position, getConnectedEdges } from 'reactflow'; import styles from './entitypill.module.scss'; +import { + SchemaReactflowEntityNode, + Handles, + toHandleId, + handleDataFromReactflowToId, + QueryElementTypes, + NodeAttribute, +} from '../../../model'; +import { SchemaAttribute } from '@graphpolaris/shared/lib/schema'; +import { styleHandleMap } from '../../utils'; +import { useQuerybuilderGraph } from '@graphpolaris/shared/lib/data-access'; /** * Component to render an entity flow element * @param {NodeProps} param0 The data of an entity flow element. */ export const EntityFlowElement = React.memo((node: SchemaReactflowEntityNode) => { + const theme = useTheme(); + // console.log('EntityFlowElement', node); + const data = node.data; const forceOpen: boolean = false; if (!data.leftRelationHandleId) throw new Error('EntityFlowElement: data.leftRelationHandleId is undefined'); @@ -25,6 +37,9 @@ export const EntityFlowElement = React.memo((node: SchemaReactflowEntityNode) => const [hovered, setHovered] = React.useState(false); const [handleBeingDragged, setHandleBeingDragged] = React.useState(-1); + // TODO: Change flow element width when text overflows + const animation = styles.entityFade; // TODO: Check if correct + const onMouseEnter = (event: React.MouseEvent) => { setHovered(true); }; @@ -50,10 +65,62 @@ export const EntityFlowElement = React.memo((node: SchemaReactflowEntityNode) => const showingDropdown = hovered || handleBeingDragged !== -1 || attributeEdges.length > 0; return ( - <div className={`${styles.entity} ${styles.entityFade} query_builder-entity`} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}> - <Handle id={toHandleId(data.leftRelationHandleId)} type="target" position={Position.Left} className={styles.handle_from_relation} /> - <Handle id={toHandleId(data.rightRelationHandleId)} type="source" position={Position.Right} className={styles.handle_to_relation} /> - <div className={styles.title}>{data.name}</div> + <div + className={`${styles.entity} ${animation} query_builder-entity`} + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} + style={ + { + // borderColor: theme.palette.custom.elements.entityBase[0], + } + } + > + <Handle + // id={getHandleId(data.name, data.type, Handles.ToRelation, '')} + id={toHandleId(data.leftRelationHandleId)} + type="target" + position={Position.Left} + className={styles.handle_to_relation} + /> + <Handle + // id={getHandleId(data.name, data.type, Handles.ToRelation, '')} + id={toHandleId(data.rightRelationHandleId)} + type="source" + position={Position.Right} + className={styles.handle_to_relation} + /> + {/* <Handle + id={Handles.ToAttribute} + type="target" + position={Position.Bottom} + className={ + styles.ToAttributeHandle + + ' ' + + (false ? styles.handleConnectedFill : '') + } + /> + <Handle + id={Handles.ReceiveFunction} + type="target" + position={Position.Bottom} + className={ + styles.ReceiveFunctionHandle + + ' ' + + (false ? styles.handleConnectedFill : '') + } + /> */} + + <div + className={styles.title} + style={{ + backgroundColor: theme.palette.custom.elements.entityBase[0], + }} + > + {data.name} + </div> + {/* <div className={styles.entityWrapper}> + <span className={styles.entitySpan}>{data.name}</span> + </div> */} {data?.attributes && ( <div className={styles.content + ' ' + (showingDropdown || forceOpen || hovered ? styles.content_display : '')}> {data.attributes diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/SelectFunction.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/SelectFunction.tsx new file mode 100644 index 000000000..5a6fd8c4c --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/SelectFunction.tsx @@ -0,0 +1,84 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +/* istanbul ignore file */ +/* The comment above was added so the code coverage wouldn't count this file towards code coverage. + * We do not test components/renderfunctions/styling files. + * See testing plan for more details.*/ +import { makeStyles } from '@mui/material'; +import React, { useState } from 'react'; +import styles from './functionpill.module.scss'; + +// Create style constant to prevent rereaction of styles +// const madeStyles = makeStyles(useStyles); + +/** + * The flow element for the modifier. + * @param param0 The data of the modifier flow element. + */ +export default function ModifierFlowElement({ data }: any) { + const [disable, setDisable] = useState(true); + const [disClass, setDisClass] = useState<string>(styles.disable); + + /** + * Calculate the width of the select element based on the displayed value. + * @param str Input string. + * @returns String containg the length in css format. + */ + const calcSelectWidth = (str: string): string => { + if (str == '') return 1.5 + 'ch'; + return str.length + 1.5 + 'ch'; + }; + + /** Disable the select field */ + const disableSelect = (): void => { + setDisable(true); + setDisClass(styles.disable); + }; + + /** Enable the select field */ + const enableSelect = (): void => { + setDisable(false); + setDisClass(''); + }; + + /** + * Constant switch to append the right options for the select element based on the data.type. + * @returns {JSX.Element} Option list using React.Fragment as parent element. + */ + const list = (): JSX.Element => { + return ( + <React.Fragment> + <option color="black" value="COUNT"> + COUNT + </option> + <option value="SUM">SUM</option> + <option value="MIN">MIN</option> + <option value="MAX">MAX</option> + </React.Fragment> + ); + }; + + return ( + <div className={styles.matchModifierTypeSelect} onBlur={disableSelect} onDoubleClick={enableSelect}> + <select + style={{ + color: disable ? 'black' : 'black', + maxWidth: calcSelectWidth('COUNT'), + }} + name="operators" + className={disClass} + disabled={disable} + onChange={(e) => { + data.type = e.target.value; + e.target.style.maxWidth = calcSelectWidth(e.target.value); + }} + > + {list()} + </select> + </div> + ); +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss new file mode 100644 index 000000000..4864fb1c0 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss @@ -0,0 +1,175 @@ +@import '../entitypill/entitypill.module.scss'; + +$baseColor: #8c75c9; + +.disable { + pointer-events: none; + opacity: 0.4; +} +.matchModifierTypeSelect { + opacity: 0.4; +} + +// Function element +.function { + background-color: $baseColor; + display: 'flex'; + border-radius: '1px'; + font-family: monospace; + font-weight: 'bold'; + font-size: 11px; + color: black; + min-width: '140px'; + text-align: 'center'; + line-height: 20px; + padding-top: 2; + padding-right: 5; + padding-bottom: 4; + padding-left: 5; + + &::before { + position: 'absolute'; + content: '""'; + width: '100%'; + left: '0px'; + top: '0px'; + height: '100%'; + border-radius: '3px'; + z-index: -1; + background-color: $baseColor; + border-bottom: 'none'; + } + + &::after { + position: 'absolute'; + content: '""'; + width: '100%'; + left: '0px'; + top: '0'; + height: '100%'; + border-radius: '3px'; + z-index: -1; + background-color: $baseColor; + border-top: 'none'; + } +} + +.functionWrapper { + display: 'block'; + width: 'inherit'; + align-items: 'center'; + justify-content: 'space-between'; +} +.functionHandleFiller { + flex: '1 1 0'; + display: 'flow-root'; +} +.functionHandle { + border: 0; + border-radius: 0; + width: 8; + height: 8; + left: 9; + top: 7; + background: 'rgba(0, 0, 0, 0.3)'; + transform-origin: 'center'; + position: 'relative'; + float: 'right'; + margin-right: '20px'; + &::before { + content: '""'; + width: 6; + height: 6; + left: 1; + bottom: 1; + border: 0; + border-radius: 0; + background: 'rgba(255, 255, 255, 0.6)'; + z-index: -1; + display: 'inline-block'; + position: 'fixed'; + } +} +.functionHandleBottom { + border: 0; + border-radius: 0; + width: 8; + height: 8; + left: 27.5; + margin-bottom: 10; + background-color: 'rgba(255, 255, 255, 0.6)'; + transform: 'rotate(-45deg)'; + transform-origin: 'center'; + &::before { + content: '""'; + width: 6; + height: 6; + left: 1; + bottom: 1; + border: 0; + border-radius: 0; + background-color: 'rgba(255, 255, 255, 0.6)'; + z-index: -1; + display: 'inline-block'; + position: 'fixed'; + } +} +.functionInputHolder { + display: 'flex'; + float: 'right'; + margin-right: '20px'; + margin-top: '4px'; + margin-left: '5px'; + max-width: '80px'; + background-color: 'rgba(255, 255, 255, 0.6)'; + border-radius: '2px'; + align-items: 'center'; + max-height: '12px'; +} +.functionInput { + z-index: 1; + cursor: 'text'; + min-width: '0px'; + max-width: '1.5ch'; + height: '14px'; + border: 'none'; + background-color: 'rgba(255, 255, 255, 0.6)'; + text-align: 'center'; + font-family: 'monospace'; + font-weight: 'bold'; + font-size: '11px'; + color: '#181520'; + user-select: 'none'; + font-style: 'italic'; + float: 'right'; + margin: '3px 0'; + margin-right: '10px'; + &:focus { + outline: 'none'; + user-select: 'none'; + } + &::placeholder { + outline: 'none'; + user-select: 'none'; + font-style: 'italic'; + } +} +.functionReadonly { + cursor: 'grab !important'; + color: '#181520 !important'; + user-select: 'none'; + font-style: 'normal !important'; +} +.functionSpan { + float: 'left'; + margin-left: 20; + margin-right: 20; +} +.functionSpanRight { + float: 'right'; + margin-right: 10; +} + +.functionDataWrapper { + display: block; +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss.d.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss.d.ts new file mode 100644 index 000000000..ae6d376d7 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.module.scss.d.ts @@ -0,0 +1,53 @@ +declare const classNames: { + readonly disable: 'disable'; + readonly matchModifierTypeSelect: 'matchModifierTypeSelect'; + readonly handle: 'handle'; + readonly handle_logic: 'handle_logic'; + readonly handle_logic_duration: 'handle_logic_duration'; + readonly handle_logic_datetime: 'handle_logic_datetime'; + readonly handle_logic_time: 'handle_logic_time'; + readonly handle_logic_date: 'handle_logic_date'; + readonly handle_logic_bool: 'handle_logic_bool'; + readonly handle_logic_float: 'handle_logic_float'; + readonly handle_logic_int: 'handle_logic_int'; + readonly handle_logic_string: 'handle_logic_string'; + readonly handle_from_relation: 'handle_from_relation'; + readonly handle_to_relation: 'handle_to_relation'; + readonly 'react-flow__node': 'react-flow__node'; + readonly selected: 'selected'; + readonly entityWrapper: 'entityWrapper'; + readonly hidden: 'hidden'; + readonly 'react-flow__edges': 'react-flow__edges'; + readonly 'react-flow__edge-default': 'react-flow__edge-default'; + readonly handleConnectedFill: 'handleConnectedFill'; + readonly handleConnectedBorderRight: 'handleConnectedBorderRight'; + readonly handleConnectedBorderLeft: 'handleConnectedBorderLeft'; + readonly handleFunction: 'handleFunction'; + readonly highlighted: 'highlighted'; + readonly contentWrapper: 'contentWrapper'; + readonly entity: 'entity'; + readonly title: 'title'; + readonly content: 'content'; + readonly content_display: 'content_display'; + readonly io: 'io'; + readonly io_right: 'io_right'; + readonly entityFade: 'entityFade'; + readonly entityHandleLeft: 'entityHandleLeft'; + readonly entityHandleBottom: 'entityHandleBottom'; + readonly entitySpan: 'entitySpan'; + readonly ToAttributeHandle: 'ToAttributeHandle'; + readonly ReceiveFunctionHandle: 'ReceiveFunctionHandle'; + readonly handleFunctionEntity: 'handleFunctionEntity'; + readonly function: 'function'; + readonly functionWrapper: 'functionWrapper'; + readonly functionHandleFiller: 'functionHandleFiller'; + readonly functionHandle: 'functionHandle'; + readonly functionHandleBottom: 'functionHandleBottom'; + readonly functionInputHolder: 'functionInputHolder'; + readonly functionInput: 'functionInput'; + readonly functionReadonly: 'functionReadonly'; + readonly functionSpan: 'functionSpan'; + readonly functionSpanRight: 'functionSpanRight'; + readonly functionDataWrapper: 'functionDataWrapper'; +}; +export = classNames; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.stories.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.stories.tsx new file mode 100644 index 000000000..b086172fd --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.stories.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { Meta, StoryObj } from '@storybook/react'; +import FunctionFlowElement from './functionpill'; +import { configureStore } from '@reduxjs/toolkit'; +import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; + +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { ReactFlowProvider } from 'reactflow'; + +const Component: Meta<typeof FunctionFlowElement> = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'Querybuilder/Pills/FunctionPill', + component: FunctionFlowElement, + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> + </Provider> + ), + ], +}; + +export default Component; + +// A super-simple mock of a redux store +const Mockstore = configureStore({ + reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, + querybuilder: querybuilderSlice.reducer, + // schema: schemaSlice.reducer, + }, +}); + +// const Template = (args: any) => <EntityRFPill {...args} />; + +export const Default: StoryObj = { + args: { + data: { + functionType: 'test', + args: { + string: { + displayName: 'testarg', + connectable: false, + value: 'testvalue', + visible: true, + }, + }, + }, + }, +}; + +// Default.decorators = [ +// (story) => ( +// <Provider store={Mockstore}> +// <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> +// </Provider> +// ), +// ]; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.tsx new file mode 100644 index 000000000..aeaa2b003 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/functionpill.tsx @@ -0,0 +1,143 @@ +/** + * This program has been developed by students from the bachelor Computer Science at + * Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +/* istanbul ignore file */ +/* The comment above was added so the code coverage wouldn't count this file towards code coverage. + * We do not test components/renderfunctions/styling files. + * See testing plan for more details.*/ +import React, { useState } from 'react'; +import { Handle, Position } from 'reactflow'; +import styles from './functionpill.module.scss'; +import { useTheme } from '@mui/material'; +import { Handles } from '../../../model'; + +const countArgs = (data: any) => { + if (data !== undefined) { + let count = 0; + + for (const name in data.args) { + if (data.args[name].visible) { + count++; + } + } + return count; + } + return 1; +}; + +/** + * Capitalize the first letter of a string. + * @param string This is the given string. + * @returns {string} This is the modified string. + */ +export const capitalizeFirstLetter = (string: string) => { + return string.charAt(0).toUpperCase() + string.slice(1); +}; + +/** + * Component to render a relation flow element + * @param { FlowElement<FunctionData>} param0 The data of a relation flow element. + */ +export default function RelationFlowElement({ data }: any) { + const [read, setRead] = useState(true); + const theme = useTheme(); + + const numOfArgs = countArgs(data); + const height = numOfArgs * 20; + + const _onKeyDown = (event: any): void => { + if (event.key == 'Enter') setRead(true); + }; + + const getArgs = (styles: any, data: any, setRead: any) => { + let rows: JSX.Element[] = []; + + if (data != undefined) { + let index = 0; + + for (const name in data.args) { + const item = data.args[name]; + if (item.visible) { + rows.push( + <span className={styles.functionHandleFiller} key={name}> + <span className={styles.functionSpan}>{capitalizeFirstLetter(name)}</span> + <Handle + id={Handles.FunctionBase + name} + type="source" + position={Position.Top} + className={styles.functionHandle + ' ' + (false ? styles.handleConnectedFill : '')} + style={{ + visibility: item.connectable ? 'inherit' : 'hidden', + }} + /> + {item.value !== undefined && ( + <input + className={styles.functionInput} + style={{ maxWidth: 50 }} + type="string" + placeholder={'?'} + value={item.value} + onChange={(e) => { + if (item.value != undefined) { + item.value = e.target.value; + //TODO restore SetElementsUseCase.updateFunctionCompleteness(data); + } + }} + onDoubleClick={() => { + setRead(false); + }} + onBlur={() => { + setRead(true); + }} + onKeyDown={_onKeyDown} + ></input> + )} + </span> + ); + index++; + } + } + } + + return rows; + }; + + const rows = getArgs(styles, data, setRead); + const entity = undefined; //TODO fix: data !== undefined ? data.entityName : undefined; + + return ( + <div> + <div + className={styles.function} + style={{ + minHeight: height, + background: theme.palette.custom.nodesBase[0], + borderTop: `4px solid ${theme.palette.custom.nodesBase[0]}`, + borderBottom: `6px solid ${theme.palette.custom.elements.function[0]}`, + }} + > + <div className={styles.functionWrapper}>{rows}</div> + </div> + <div className={`${styles.entity} entityWrapper ${entity === undefined ? 'hidden' : ''}`}> + <Handle + id={Handles.FromAttribute} + type="source" + position={Position.Bottom} + className={styles.entityHandleLeft + ' ' + (false ? styles.handleConnectedFill : '')} + /> + <Handle + id={Handles.ToAttribute} + type="source" + position={Position.Bottom} + className={styles.entityHandleBottom + ' ' + (false ? styles.handleConnectedFill : '')} + /> + <div className={styles.entityWrapper}> + <span className={styles.entitySpan}>{entity ? entity : ''}</span> + </div> + </div> + </div> + ); +} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/index.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/index.ts new file mode 100644 index 000000000..3785778d3 --- /dev/null +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/functionpill/index.ts @@ -0,0 +1 @@ +export * from './functionpill'; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/index.ts b/libs/shared/lib/querybuilder/pills/customFlowPills/index.ts index 9587dafce..22ce04749 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/index.ts +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/index.ts @@ -1,2 +1,3 @@ +export * from './attributepill'; export * from './entitypill'; export * from './relationpill'; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.module.scss b/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.module.scss index d4090da75..81e3710c8 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.module.scss +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.module.scss @@ -1,29 +1,28 @@ @import '../../querypills.module.scss'; .logic { - text-align: center; + color: '#181520'; + // background-color: #e68067; + background-color: #fdfdfd; + border: #e68067 solid 1px; + border-radius: 2px; + font-family: monospace; font-weight: bold; - border-left: 3px solid; - @apply border-l-logic-600; - @apply bg-logic-100; - font-size: 13px; + font-size: 10; display: flex; - min-width: 5rem; - + // border-top-right-radius: 5px; + // border-bottom-right-radius: 5px; + // height: 3rem; .logicInput { // float: right; // background-color: #ee917a; padding-left: 2px; padding-right: 2px; - margin-top: 5px; width: 3rem; height: 1.2rem; position: relative; left: 0.8rem; bottom: 0.3rem; - border: 1px solid; - border-radius: 0.1rem; - @apply border-logic-600; } .logicSpan { // height: 100%; @@ -33,3 +32,27 @@ // align-items: center; } } + +// .matchlogicTypeSelect { +// float: left; +// background-color: rgba(255, 255, 255, 0.6); +// border-radius: 2px; +// text-align: center; +// & select { +// background: transparent; +// border: none; +// appearance: none; +// font-family: monospace; +// font-weight: bolder; +// color: black; +// font-size: 11; +// } +// & option { +// font-family: monospace; +// font-size: 11px; +// } +// } +// .disable { +// opacity: 1 !important; +// pointer-events: none; +// } diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.tsx index 5e853e044..538e6391a 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/logicpill/logicpill.tsx @@ -8,19 +8,31 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import React, { useCallback, useMemo } from 'react'; +import { Handle, HandleType, NodeProps, Position } from 'reactflow'; +import styles from './logicpill.module.scss'; +import { + AllLogicMap, + EntityNodeAttributes, + Handles, + LogicData, + LogicNodeAttributes, + QueryGraphEdges, + QueryGraphNodes, + SchemaReactflowLogicNode, + toHandleData, + toHandleId, +} from '../../../model'; +import { Input } from '@mui/material'; +import { styleHandleMap } from '../../utils'; import { setQuerybuilderNodes, useAppDispatch, useQuerybuilderGraph, useQuerybuilderGraphology, - useQuerybuilderHash, } from '@graphpolaris/shared/lib/data-access'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { Handle, HandleType, Position } from 'reactflow'; -import { LogicNodeAttributes, SchemaReactflowLogicNode, toHandleId } from '../../../model'; import { InputNode, InputNodeTypeTypes } from '../../../model/logic/general'; -import { styleHandleMap } from '../../utils'; -import styles from './logicpill.module.scss'; +import { SerializedEdge, SerializedNode } from 'graphology-types'; /** * Component to render an entity flow element @@ -34,14 +46,8 @@ export default function LogicPill(node: SchemaReactflowLogicNode) { const graph = useQuerybuilderGraph(); const graphology = useQuerybuilderGraphology(); - const graphologyHash = useQuerybuilderHash(); const connectionsToLeft = useMemo(() => graph.edges.filter((edge) => edge.target === node.id), [graph]); const connectionsToRight = useMemo(() => graph.edges.filter((edge) => edge.source === node.id), [graph]); - const graphologyNodeAttributes = useMemo<LogicNodeAttributes | undefined>( - () => (graphology.hasNode(node.id) ? { ...(graphology.getNodeAttributes(node.id) as LogicNodeAttributes) } : undefined), - [node.id] - ); - const [localInputCache, setLocalInputCache] = useState<Record<string, InputNodeTypeTypes>>({ ...graphologyNodeAttributes?.inputs }); if (!data.id) throw new Error('LogicPill: data.id is undefined'); const defaultHandleData = { @@ -51,30 +57,61 @@ export default function LogicPill(node: SchemaReactflowLogicNode) { }; const onInputUpdated = (value: string, input: InputNode, idx: number) => { - let logicNode = { ...graphologyNodeAttributes }; + let logicNode = { ...(graphology.getNodeAttributes(node.id) as LogicNodeAttributes) }; if (!logicNode) throw new Error('LogicPill: logicNode is undefined'); - let logicNodeInputs = { ...logicNode.inputs }; if (logicNodeInputs[input.name] != value) { logicNodeInputs[input.name] = value; logicNode.inputs = logicNodeInputs; graphology.setNodeAttribute<any>(node.id, 'inputs', logicNodeInputs); // FIXME: I'm not sure why TS requires <any> to work here dispatch(setQuerybuilderNodes(graphology.export())); - console.log('updated input', input.name, 'to', value); } }; const createLeftHandles = useCallback( - (sideInputs: InputNode[]) => { - return sideInputs.filter((input, i) => { - return !connectionsToLeft.some( - (edge) => edge?.attributes?.targetHandleData.nodeId === data.id && edge?.attributes?.targetHandleData.attributeName === input.name + (sideInputs: InputNode[], positionSide: Position, handleType: HandleType) => { + let numOfInputs = 0; + let ret = sideInputs.map((input, i) => { + let inputTextBox = null; + if ( + !connectionsToLeft.some( + (edge) => + edge?.attributes?.targetHandleData.nodeId === data.id && edge?.attributes?.targetHandleData.attributeName === input.name + ) + ) { + inputTextBox = ( + <Input + className={styles.logicInput} + // value={0} + style={{ top: -5, transform: `translateY(-${i * 20}%)` }} + // onChange={(e) => onInputUpdated(e.target.value, input)} + onKeyDown={(e) => { + if (e.key === 'Enter') onInputUpdated((e.target as HTMLInputElement).value, input, i); + }} + onBlur={(e) => onInputUpdated(e.target.value, input, i)} + /> + ); + numOfInputs++; + } + return ( + <Handle + type={handleType} + position={positionSide} + id={toHandleId({ ...defaultHandleData, attributeName: input.name, attributeType: input.type })} // TODO + key={input.name + input.type} + // style={{ top: `${((i + 0.8) / (side.length + 0.6)) * 120}%` }} + style={{ top: `${((i + 0.8) / (sideInputs.length + 0.6)) * 100}%` }} + className={styleHandleMap[input.type]} + > + {inputTextBox} + </Handle> ); - }).length; + }); + return { handles: ret, number: numOfInputs }; }, [node] ); - const leftInputsNumber = createLeftHandles(node.data.logic.inputs); + const { handles: leftHandles, number: leftInputsNumber } = createLeftHandles(node.data.logic.inputs, Position.Left, 'target'); return ( <div className={styles.logic}> @@ -84,47 +121,13 @@ export default function LogicPill(node: SchemaReactflowLogicNode) { {connectionsToLeft.map((e) => e?.attributes?.sourceHandleData.attributeName)}.{output.name} </span> } - {node.data.logic.inputs.map((input, i) => { - let inputTextBox = null; - if ( - !connectionsToLeft.some( - (edge) => - edge?.attributes?.targetHandleData.nodeId === data.id && edge?.attributes?.targetHandleData.attributeName === input.name - ) - ) { - inputTextBox = ( - <input - className={styles.logicInput} - value={localInputCache?.[input.name] as string} - style={{ top: -5, transform: `translateY(-${i * 20}%)` }} - onChange={(e) => { - setLocalInputCache({ ...localInputCache, [input.name]: e.target.value }); - }} - onKeyDown={(e) => { - if (e.key === 'Enter') onInputUpdated((e.target as HTMLInputElement).value, input, i); - }} - onBlur={(e) => onInputUpdated(e.target.value, input, i)} - /> - ); - } - return ( - <Handle - type={'target'} - position={Position.Left} - id={toHandleId({ ...defaultHandleData, attributeName: input.name, attributeType: input.type })} - key={input.name + input.type} - style={{ top: `${((i + 0.8) / (node.data.logic.inputs.length + 0.6)) * 100}%` }} - className={styleHandleMap[input.type]} - > - {inputTextBox} - </Handle> - ); - })} + {leftHandles} {!!node.data.logic.output && ( <Handle type={'source'} position={Position.Right} - id={toHandleId({ ...defaultHandleData, attributeName: output.name, attributeType: output.type })} + id={toHandleId({ ...defaultHandleData, attributeName: output.name, attributeType: output.type })} // TODO + // style={{ top: `${((i + 0.8) / (side.length + 0.6)) * 100}%` }} className={styleHandleMap?.[output.type]} ></Handle> )} diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relation-full_reactflow.stories.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relation-full_reactflow.stories.tsx index 0d7b64dad..5b6d0c231 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relation-full_reactflow.stories.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relation-full_reactflow.stories.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { querybuilderSlice, setQuerybuilderNodes } from '@graphpolaris/shared/lib/data-access/store'; - +import { colorPaletteConfigSlice, querybuilderSlice, setQuerybuilderNodes } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -11,12 +11,19 @@ import { QueryElementTypes, QueryMultiGraphology } from '../../../model'; const Component: Meta<typeof QueryBuilder> = { component: QueryBuilder, title: 'Querybuilder/Pills/relationPill', - decorators: [(story) => <Provider store={mockStore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={mockStore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; // Mock palette store const mockStore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, }, }); diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.stories.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.stories.tsx index 2dfb0e537..b288a8764 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.stories.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.stories.tsx @@ -3,8 +3,9 @@ import { Meta, StoryObj } from '@storybook/react'; import RelationPill from './relationpill'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { RelationData } from '../../../model'; @@ -18,7 +19,9 @@ const Component: Meta<typeof RelationPill> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -29,6 +32,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, @@ -49,7 +53,7 @@ export const Default: StoryObj<{ data: RelationData }> = { // Default.decorators = [ // (story) => ( // <Provider store={Mockstore}> -// {story()} +// <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> // </Provider> // ), // ]; diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.tsx index 90c89512a..323310f8a 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/relationpill.tsx @@ -1,7 +1,19 @@ -import { memo, useRef, useState } from 'react'; +import React, { memo, useRef, useState } from 'react'; + +import { useTheme } from '@mui/material'; import { Handle, Position } from 'reactflow'; -import { SchemaReactflowRelationNode, toHandleId } from '../../../model'; + import styles from './relationpill.module.scss'; +import { SchemaReactflowRelationNode, Handles, toHandleId } from '../../../model'; + +// export type RelationRFPillProps = { +// data: { +// name: string; +// suggestedForConnection: any; +// isFromEntityConnected?: boolean; +// isToEntityConnected?: boolean; +// }; +// }; /** * Component to render a relation flow element @@ -9,6 +21,10 @@ import styles from './relationpill.module.scss'; */ export const RelationPill = memo((node: SchemaReactflowRelationNode) => { const data = node.data; + // export default function RelationRFPill({ data }: { data: any }) { + const theme = useTheme(); + // console.log('RelationRFPill', data); + const minRef = useRef<HTMLInputElement>(null); const maxRef = useRef<HTMLInputElement>(null); @@ -18,7 +34,7 @@ export const RelationPill = memo((node: SchemaReactflowRelationNode) => { const onDepthChanged = (depth: string) => { // Don't allow depth above 99 const limit = 99; - if (data?.depth != undefined) { + if (data != undefined) { data.depth.min = data.depth.min >= limit ? limit : data.depth.min; data.depth.max = data.depth.max >= limit ? limit : data.depth.max; @@ -49,11 +65,29 @@ export const RelationPill = memo((node: SchemaReactflowRelationNode) => { }; return ( - <div className={styles.relation}> + <div className={styles.relation} style={{ backgroundColor: theme.palette.custom.elements.relation[0] }}> + <div className={styles.rightArrow} style={{ borderLeftColor: theme.palette.custom.elements.relation[0] }}></div> + <div className={styles.leftArrow} style={{ borderRightColor: theme.palette.custom.elements.relation[0] }}></div> + {/* <span + className={styles.relationTop} + style={{ backgroundColor: theme.palette.custom.elements.relation[0] }} + ></span> + <span + className={styles.relationBottom} + style={{ backgroundColor: theme.palette.custom.elements.relation[0] }} + ></span> */} <div className={styles.relationWrapper}> - <span className={styles.relationHandleFiller}> + <span + className={styles.relationHandleFiller} + // style={{ transform: 'translate(-100px,0)' }} + > {data.leftEntityHandleId && ( - <Handle id={toHandleId(data.leftEntityHandleId)} type="target" position={Position.Left} className={styles.relationHandleLeft} /> + <Handle + id={toHandleId(data.leftEntityHandleId)} + type="target" + position={Position.Left} + className={styles.relationHandleLeft + ' ' + (false ? styles.handleConnectedBorderLeft : '')} + /> )} </span> {/* <span className={styles.relationHandleFiller}> diff --git a/libs/shared/lib/querybuilder/pills/handles.module.scss b/libs/shared/lib/querybuilder/pills/handles.module.scss index aa9f29005..a39b5f8ea 100644 --- a/libs/shared/lib/querybuilder/pills/handles.module.scss +++ b/libs/shared/lib/querybuilder/pills/handles.module.scss @@ -7,15 +7,16 @@ .handle_to_relation { @extend .handle; border-radius: 1px !important; - top: 0.75rem !important; - @apply bg-entity-800 #{!important}; //css-ignore + top: 0.6rem !important; + background: rgb(39, 131, 145) !important; } .handle_from_relation { @extend .handle; border-radius: 1px !important; - top: 0.75rem !important; - @apply bg-entity-800 #{!important}; //css-ignore + // left: 10px !important; + top: 0.55rem !important; + // background: rgba(0, 0, 0, 0.3) !important; } .handle_logic { diff --git a/libs/shared/lib/querybuilder/query-utils/query2backend.spec.ts b/libs/shared/lib/querybuilder/query-utils/query2backend.spec.ts index c82c1f655..e99347c6f 100644 --- a/libs/shared/lib/querybuilder/query-utils/query2backend.spec.ts +++ b/libs/shared/lib/querybuilder/query-utils/query2backend.spec.ts @@ -1,11 +1,11 @@ import { describe, expect, it } from 'vitest'; // import { Query2BackendQuery } from './query-utils'; -import { BackendQueryFormat, LogicNodeAttributes, MathFilters, NumberFunctions, QueryElementTypes } from '../model'; +import { BackendQueryFormat, LogicNodeAttributes, MathFilters, MathFunctions, QueryElementTypes } from '../model'; import { QueryMultiGraphology } from '../model/graphology/utils'; -import { NumberAggregationTypes, NumberFilterTypes, NumberFunctionTypes } from '../model/logic/general'; +import { MathAggregationTypes, MathFilterTypes, MathFunctionTypes } from '../model/logic/general'; import { Query2BackendQuery, calculateQueryLogic } from './query2backend'; import { SerializedNode } from 'graphology-types'; -import { MathAggregations } from '../model/logic/numberAggregations'; +import { MathAggregations } from '../model/logic/mathAggregations'; const defaultQuery = { databaseName: 'database', @@ -722,7 +722,7 @@ describe('QueryUtils calculateQueryLogic', () => { x: 100, y: 100, name: 'Logic 1', - logic: MathFilters[NumberFilterTypes.EQUAL], + logic: MathFilters[MathFilterTypes.EQUAL], }); graph.addEdge2Graphology(e1, l1, { type: 'connection' }, { sourceHandleName: 'age', targetHandleName: '1' }); @@ -730,7 +730,7 @@ describe('QueryUtils calculateQueryLogic', () => { let logics = graphExport.nodes.filter((n) => n?.attributes?.type === QueryElementTypes.Logic) as SerializedNode<LogicNodeAttributes>[]; const ret = calculateQueryLogic(logics[0], graphExport, logics); - // console.log(ret); + console.log(ret); }); }); @@ -755,7 +755,7 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Logic 1', - logic: MathFilters[NumberFilterTypes.EQUAL], + logic: MathFilters[MathFilterTypes.EQUAL], }); graph.addEdge2Graphology(e1, l1, { type: 'connection' }, { sourceHandleName: 'age', targetHandleName: '1' }); @@ -811,7 +811,7 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Filter EQ', - logic: MathFilters[NumberFilterTypes.EQUAL], + logic: MathFilters[MathFilterTypes.EQUAL], }); const l2 = graph.addLogicPill2Graphology({ @@ -820,12 +820,12 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Logic ADD', - logic: NumberFunctions[NumberFunctionTypes.ADD], + logic: MathFunctions[MathFunctionTypes.ADD], }); graph.addEdge2Graphology(e1, l2, { type: 'connection' }, { sourceHandleName: 'age', targetHandleName: '1' }); graph.addEdge2Graphology(e2, l2, { type: 'connection' }, { sourceHandleName: 'age', targetHandleName: '2' }); - graph.addEdge2Graphology(l2, l1, { type: 'connection' }, { sourceHandleName: NumberFilterTypes.EQUAL, targetHandleName: '1' }); + graph.addEdge2Graphology(l2, l1, { type: 'connection' }, { sourceHandleName: MathFilterTypes.EQUAL, targetHandleName: '1' }); const expected: BackendQueryFormat = { ...defaultQuery, @@ -875,7 +875,7 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Logic LT', - logic: MathFilters[NumberFilterTypes.LESS_THAN], + logic: MathFilters[MathFilterTypes.LESS_THAN], }); const l2 = graph.addLogicPill2Graphology({ @@ -884,11 +884,11 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Logic average', - logic: MathAggregations[NumberAggregationTypes.AVG], + logic: MathAggregations[MathAggregationTypes.AVG], }); graph.addEdge2Graphology(e1, l2, { type: 'connection' }, { sourceHandleName: 'age', targetHandleName: '1' }); - graph.addEdge2Graphology(l2, l1, { type: 'connection' }, { sourceHandleName: NumberAggregationTypes.AVG, targetHandleName: '1' }); + graph.addEdge2Graphology(l2, l1, { type: 'connection' }, { sourceHandleName: MathAggregationTypes.AVG, targetHandleName: '1' }); const expected: BackendQueryFormat = { ...defaultQuery, @@ -931,7 +931,7 @@ describe('QueryUtils with Logic', () => { x: 100, y: 100, name: 'Logic LT', - logic: MathFilters[NumberFilterTypes.LESS_THAN], + logic: MathFilters[MathFilterTypes.LESS_THAN], }, { '2': 5 } ); diff --git a/libs/shared/lib/querybuilder/query-utils/query2backend.ts b/libs/shared/lib/querybuilder/query-utils/query2backend.ts index 6f1f6dfaa..f4f74943d 100644 --- a/libs/shared/lib/querybuilder/query-utils/query2backend.ts +++ b/libs/shared/lib/querybuilder/query-utils/query2backend.ts @@ -124,9 +124,7 @@ export function calculateQueryLogic( if (!connectionToInputRef) { // Not connected, search for set or default value let val = node.attributes.inputs?.[inputRef.name] || inputRef.default; - if (val && inputRef.type === 'string') { - val = `\"${val}\"`; - } + if (val && inputRef.type === 'string') val = `\"${val}\"`; console.log('val', val, inputRef, node); return val; } else if (connectionToInputRef.attributes?.sourceHandleData.nodeType === QueryElementTypes.Logic) { @@ -191,11 +189,24 @@ export function Query2BackendQuery( const newOrigin = graphologyQuery.addNode(origin + 'cycle', graphologyQuery.getNodeAttributes(origin)); const edgeAttributes = graphologyQuery.getEdgeAttributes(target, origin); graphologyQuery.dropEdge(target, origin); + // edgeAttributes.target = newOrigin; graphologyQuery.addEdge(target, newOrigin, edgeAttributes); }); }); + console.log('graph', graph); return Query2BackendQuery(databaseName, graphologyQuery.export()); + + // if ( + // relations.some((entity, i) => { + // return allSimplePaths(graphologyQuery, entity.id, entity.id); + // }) + // ) + // throw Error('Cycles in query are not supported yet'); + // console.log('cycles', cycles); + // return null; + // } + // return null; } // Chunk extraction: traverse graph to find all paths of logic between relations and entities let graphSequenceChunks: QueryGraphNodes[][] = []; diff --git a/libs/shared/lib/schema/panel/schema.stories.tsx b/libs/shared/lib/schema/panel/schema.stories.tsx index 8a91d9337..79a7114d4 100644 --- a/libs/shared/lib/schema/panel/schema.stories.tsx +++ b/libs/shared/lib/schema/panel/schema.stories.tsx @@ -2,8 +2,8 @@ import React from 'react'; import { Meta, Story, ComponentStory } from '@storybook/react'; import { SchemaUtils } from '@graphpolaris/shared/lib/schema/schema-utils'; -import { schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; - +import { colorPaletteConfigSlice, schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; import Schema from './schema'; @@ -30,14 +30,16 @@ const Component: Meta<typeof Schema> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <div - style={{ - width: '100%', - height: '100vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '100vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -47,6 +49,7 @@ const Component: Meta<typeof Schema> = { const Mockstore = configureStore({ reducer: { schema: schemaSlice.reducer, + colorPaletteConfig: colorPaletteConfigSlice.reducer, }, }); diff --git a/libs/shared/lib/schema/panel/schema.tsx b/libs/shared/lib/schema/panel/schema.tsx index def690e90..846faaeea 100644 --- a/libs/shared/lib/schema/panel/schema.tsx +++ b/libs/shared/lib/schema/panel/schema.tsx @@ -1,7 +1,8 @@ import { AlgorithmToLayoutProvider, AllLayoutAlgorithms, LayoutFactory } from '@graphpolaris/shared/lib/graph-layout'; import { schemaGraphology2Reactflow, schemaExpandRelation } from '@graphpolaris/shared/lib/schema/schema-utils'; -import { useSchemaGraph, useSchemaGraphology, useSchemaLayout, useSessionCache } from '@graphpolaris/shared/lib/data-access/store'; - +import { useSchemaGraph, useSchemaGraphology, useSchemaLayout } from '@graphpolaris/shared/lib/data-access/store'; +import { MultiGraph } from 'graphology'; +// import { AllLayoutAlgorithms, LayoutFactory } from '@graphpolaris/graph-layout'; import { useEffect, useMemo, useRef, useState } from 'react'; import ReactFlow, { ControlButton, @@ -15,19 +16,26 @@ import ReactFlow, { Background, } from 'reactflow'; import CachedIcon from '@mui/icons-material/Cached'; -import SettingsIcon from '@mui/icons-material/Settings'; import 'reactflow/dist/style.css'; import styles from './schema.module.scss'; -import { ConnectionDragLine, ConnectionLine } from '@graphpolaris/shared/lib/querybuilder/pills'; +import { + EntityFlowElement, + RelationPill, + AttributePill, + ConnectionDragLine, + ConnectionLine, +} from '@graphpolaris/shared/lib/querybuilder/pills'; import { EntityNode } from '../pills/nodes/entity/entity-node'; import { RelationNode } from '../pills/nodes/relation/relation-node'; +import { NodeQualityEntityPopupNode } from '../pills/nodes/popup/node-quality-entity-popup'; +import { NodeQualityRelationPopupNode } from '../pills/nodes/popup/node-quality-relation-popup'; +import { AttributeAnalyticsPopupMenu } from '../pills/nodes/popup/attribute-analytics-popup-menu'; import NodeEdge from '../pills/edges/node-edge'; import SelfEdge from '../pills/edges/self-edge'; -import { useSchemaAPI } from '../../data-access'; -import { SchemaDialog } from './schemaDialog'; +import { Card, CardContent, LinearProgress, Typography } from '@mui/material'; interface Props { content?: string; @@ -57,23 +65,28 @@ const edgeTypes = { }; export const Schema = (props: Props) => { - const api_schema = useSchemaAPI(); - const session = useSessionCache(); - - const [toggleSchemaSettings, setToggleSchemaSettings] = useState(false); const [nodes, setNodes, onNodeChanged] = useNodesState([] as Node[]); const [edges, setEdges, onEdgeChanged] = useEdgesState([] as Edge[]); const [firstUserConnection, setFirstUserConnection] = useState<boolean>(true); + const [firstUserConnectionCheck, setFirstUserConnectionCheck] = useState<string | null>(sessionStorage.getItem('firstUserConnection')); const [auth, setAuth] = useState(props.auth); - const settingsIconRef = useRef<SVGSVGElement>(null); - const dialogRef = useRef<HTMLDivElement>(null); + const [authCheck, setAuthCheck] = useState<boolean | null | undefined>(false); // In case the schema is updated const schemaGraphology = useSchemaGraphology(); const schemaGraph = useSchemaGraph(); + // const [schemaGraphology, setSchema] = useState(useSchema()); const schemaLayout = useSchemaLayout(); const layout = useRef<AlgorithmToLayoutProvider<AllLayoutAlgorithms>>(); + // console.log('dbSchema', schemaGraphology.edges()); + // useEffect(() => { + // console.log('dbSchema', schemaGraphology, schemaGraphology.order); + // }, [schemaGraphology]); + + const toggleNodeQualityPopup = (id: string) => {}; + const toggleAttributeAnalyticsPopupMenu = (id: string) => {}; + function updateLayout() { const layoutFactory = new LayoutFactory(); layout.current = layoutFactory.createLayout(schemaLayout as AllLayoutAlgorithms); // TODO: more layouts here @@ -88,6 +101,27 @@ export const Schema = (props: Props) => { setAuth(props.auth); }, [props.auth]); + useEffect(() => { + setAuthCheck(auth); + }, [auth]); + + useEffect(() => { + if (authCheck) { + if (!firstUserConnectionCheck || firstUserConnectionCheck === 'true') { + setFirstUserConnection(true); + } else { + setFirstUserConnection(false); + } + setTimeout(() => { + let sessionStorageUserConnection = sessionStorage.getItem('firstUserConnection'); + if (sessionStorageUserConnection && sessionStorageUserConnection === 'true') { + sessionStorage.setItem('firstUserConnection', 'false'); + setFirstUserConnection(false); + } + }, 5000); + } + }, [authCheck]); + useEffect(() => { if (schemaGraphology == undefined || schemaGraphology.order == 0) { return; @@ -98,7 +132,6 @@ export const Schema = (props: Props) => { updateLayout(); const expandedSchema = schemaExpandRelation(schemaGraphology); layout.current?.layout(expandedSchema); - console.log(expandedSchema); const schemaFlow = schemaGraphology2Reactflow(expandedSchema); @@ -128,37 +161,49 @@ export const Schema = (props: Props) => { // console.log(nodes, edges); - useEffect(() => { - console.log(settingsIconRef.current?.getBoundingClientRect()); - if (dialogRef.current && settingsIconRef.current) { - dialogRef.current.style.top = `${settingsIconRef.current.getBoundingClientRect().top}px`; - dialogRef.current.style.left = `${settingsIconRef.current.getBoundingClientRect().left + 30}px`; - } - }, [settingsIconRef, dialogRef, toggleSchemaSettings]); - return ( - <div className="w-full h-full"> - <SchemaDialog open={toggleSchemaSettings} onClose={() => setToggleSchemaSettings(false)} ref={dialogRef} /> - <h1 className="h-[1rem]">Schema</h1> - {nodes.length === 0 && <p>No Elements</p>} + <div className={styles.schemaPanel}> + {firstUserConnection && ( + <Card + variant="outlined" + sx={{ + width: '20rem', + marginTop: 3, + zIndex: 9, + backgroundColor: '#ffffff', + position: 'absolute', + }} + > + <CardContent> + <Typography sx={{ fontSize: 20 }} color="text.secondary"> + Press "space" while you move the schema + </Typography> + <LinearProgress + sx={{ + color: (theme) => theme.palette.grey[theme.palette.mode === 'light' ? 200 : 800], + }} + /> + </CardContent> + </Card> + )} + {nodes.length === 0 && <p>DEBUG: No Elements</p>} <ReactFlowProvider> - <div className="h-[calc(100%-.8rem)] w-full"> - <ReactFlow - onlyRenderVisibleElements={false} - nodesDraggable={false} - nodeTypes={nodeTypes} - edgeTypes={edgeTypes} - connectionLineComponent={ConnectionDragLine} - onNodesChange={onNodeChanged} - onEdgesChange={onEdgeChanged} - nodes={nodes} - edges={edges} - onInit={onInit} - panOnDrag={false} - attributionPosition="top-right" - > - <Controls showInteractive={false} showZoom={false} showFitView={true} className={styles.controls}> - {/* <ControlButton + <ReactFlow + onlyRenderVisibleElements={false} + nodesDraggable={false} + nodeTypes={nodeTypes} + edgeTypes={edgeTypes} + connectionLineComponent={ConnectionDragLine} + onNodesChange={onNodeChanged} + onEdgesChange={onEdgeChanged} + nodes={nodes} + edges={edges} + onInit={onInit} + panOnDrag={false} + attributionPosition="top-right" + > + <Controls showInteractive={false} showZoom={false} showFitView={true} className={styles.controls}> + {/* <ControlButton className={styles.exportButton} title={'Export graph schema'} onClick={(event) => { @@ -171,32 +216,26 @@ export const Schema = (props: Props) => { > <img src={exportIcon} width={21}></img> </ControlButton> */} - <ControlButton - className={styles.exportButton} - title={'Refresh graph schema'} - onClick={(event) => { - event.stopPropagation(); - api_schema.RequestSchema(session.currentDatabase); - }} - > - <CachedIcon /> - </ControlButton> - <ControlButton - className={styles.exportButton} - title={'Open Settings'} - onClick={(event) => { - event.stopPropagation(); - setToggleSchemaSettings(!toggleSchemaSettings); - }} - > - <SettingsIcon ref={settingsIconRef} /> - </ControlButton> - </Controls> - </ReactFlow> - </div> + <ControlButton + className={styles.exportButton} + title={'Refresh graph schema'} + onClick={(event) => { + event.stopPropagation(); + }} + > + <CachedIcon /> + </ControlButton> + </Controls> + </ReactFlow> </ReactFlowProvider> </div> ); }; export default Schema; + +// Fix layout of the schema +// create reactflow elements on xy coords +// connect reactflow elements together + +// maybe ook gelijk instellingen knoppie fixen op alle panels diff --git a/libs/shared/lib/schema/panel/schemaOLD.tsx b/libs/shared/lib/schema/panel/schemaOLD.tsx new file mode 100644 index 000000000..6f6d33e74 --- /dev/null +++ b/libs/shared/lib/schema/panel/schemaOLD.tsx @@ -0,0 +1,122 @@ +import { AllLayoutAlgorithms, LayoutFactory } from '@graphpolaris/shared/lib/graph-layout'; +import { schemaGraphology2Reactflow, schemaExpandRelation } from '@graphpolaris/shared/lib/schema/schema-utils'; +import { useSchemaGraphology, useSchemaLayout } from '@graphpolaris/shared/lib/data-access/store'; +import { MultiGraph } from 'graphology'; +// import { AllLayoutAlgorithms, LayoutFactory } from '@graphpolaris/graph-layout'; +import { useEffect, useMemo, useState } from 'react'; +import ReactFlow, { ControlButton, Controls, Node, Edge, ReactFlowProvider, useNodesState, useEdgesState } from 'reactflow'; + +import 'reactflow/dist/style.css'; + +import styles from './schema.module.scss'; + +import { + EntityFlowElement, + RelationPill, + AttributePill, + ConnectionDragLine, + ConnectionLine, +} from '@graphpolaris/shared/lib/querybuilder/pills'; + +interface Props { + content?: string; +} + +const onLoad = (reactFlowInstance: any) => { + setTimeout(() => reactFlowInstance.fitView(), 100); +}; + +const nodeTypes = { + entity: EntityFlowElement, + relation: RelationPill, + attribute: AttributePill, +}; +const edgeTypes = { + connection: ConnectionLine, +}; + +export const Schema = (props: Props) => { + const [nodes, setNodes, onNodeChanged] = useNodesState([] as Node[]); + const [edges, setEdges, onEdgeChanged] = useEdgesState([] as Edge[]); + // In case the schema is updated + const dbschema = useSchemaGraphology(); + // const [dbschema, setSchema] = useState(useSchema()); + const [schemaLayout, setSchemaLayout] = useState(useSchemaLayout()); + + // useEffect(() => { + // console.log('dbSchema', dbschema, dbschema.order); + // }, [dbschema]); + + const expandedSchema = useMemo(() => schemaExpandRelation(dbschema), [dbschema]); + + useEffect(() => { + if (dbschema == undefined || dbschema.order == 0) { + return; + } + + const layoutFactory = new LayoutFactory(); + console.log('schema Layout', schemaLayout, 'order', expandedSchema); + const layout = layoutFactory.createLayout(schemaLayout as AllLayoutAlgorithms); + layout?.layout(expandedSchema); + + const flowElements = schemaGraphology2Reactflow(expandedSchema); + setNodes(flowElements.nodes); + setEdges(flowElements.edges); + console.log('update schema useEffect', dbschema, dbschema.order, flowElements); + }, [dbschema, schemaLayout]); + + const graphStyles = { width: '100%', height: '500px' }; + + // console.log(nodes, edges); + + return ( + <div + style={{ + width: '100%', + height: '100%', + }} + > + {nodes.length === 0 && <p>DEBUG: No Elements</p>} + <ReactFlowProvider> + <ReactFlow + className={styles.schemaPanel} + onlyRenderVisibleElements={false} + nodesDraggable={false} + nodeTypes={nodeTypes} + connectionLineComponent={ConnectionDragLine} + onNodesChange={onNodeChanged} + onEdgesChange={onEdgeChanged} + nodes={nodes} + edges={edges} + style={graphStyles} + onLoad={onLoad} + attributionPosition="top-right" + > + <Controls showInteractive={false} showZoom={false} showFitView={true} className={styles.controls}> + <ControlButton + className={styles.exportButton} + title={'Export graph schema'} + onClick={(event) => { + event.stopPropagation(); + // this.setState({ + // ...this.state, + // exportMenuAnchor: event.currentTarget, + // }); + }} + > + {/* <img src={exportIcon} width={21}></img> */} + </ControlButton> + </Controls> + </ReactFlow> + </ReactFlowProvider> + </div> + ); +}; + +export default Schema; + +// Fix layout of the schema +// create reactflow elements on xy coords +// connect reactflow elements together + +// maybe ook gelijk instellingen knoppie fixen op alle panels diff --git a/libs/shared/lib/schema/pills/edges/node-edge.tsx b/libs/shared/lib/schema/pills/edges/node-edge.tsx index 52114f9a0..030980394 100644 --- a/libs/shared/lib/schema/pills/edges/node-edge.tsx +++ b/libs/shared/lib/schema/pills/edges/node-edge.tsx @@ -11,6 +11,7 @@ import React, { useEffect } from 'react'; import { EdgeProps, getMarkerEnd } from 'reactflow'; import { getCenter } from '@graphpolaris/shared/lib/schema/schema-utils'; +import { useTheme } from '@mui/material'; /** * NodeEdge is used for the edges between the nodes in the schema. * It has a path that is altered depending on the algorithm in the SchemaViewModelImpl. @@ -32,6 +33,7 @@ export default function NodeEdge({ }: EdgeProps) { const offset = data.d; const setRelationNodePosition = data.setRelationNodePosition; + const theme = useTheme(); const [centerX, centerY] = getCenter({ sourceX, @@ -55,7 +57,7 @@ export default function NodeEdge({ }); return ( - <g strokeWidth={0.5} style={{ pointerEvents: 'none' }}> + <g stroke={theme.palette.custom.logo} strokeWidth={0.5} style={{ pointerEvents: 'none' }}> <path type="smoothstep" id={id} diff --git a/libs/shared/lib/schema/pills/edges/self-edge.tsx b/libs/shared/lib/schema/pills/edges/self-edge.tsx index d0c1b217f..3ea0bb005 100644 --- a/libs/shared/lib/schema/pills/edges/self-edge.tsx +++ b/libs/shared/lib/schema/pills/edges/self-edge.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ import { getCenter } from '@graphpolaris/shared/lib/schema/schema-utils'; +import { useTheme } from '@mui/material'; import React, { useEffect } from 'react'; import { EdgeProps, getMarkerEnd } from 'reactflow'; @@ -33,6 +34,7 @@ export default function SelfEdge({ }: EdgeProps) { const offset = 0; const setRelationNodePosition = data.setRelationNodePosition; + const theme = useTheme(); const [centerX, centerY] = getCenter({ sourceX, @@ -55,8 +57,14 @@ export default function SelfEdge({ } }); + if (style !== undefined) { + style.stroke = theme.palette.custom.builderEdge; + } else { + style = { stroke: theme.palette.custom.builderEdge }; + } + return ( - <g strokeWidth={0.5} style={{ pointerEvents: 'none' }}> + <g stroke={theme.palette.custom.logo} strokeWidth={0.5} style={{ pointerEvents: 'none' }}> <path type="smoothstep" id={id} diff --git a/libs/shared/lib/schema/pills/nodes/entity/entity-node.stories.tsx b/libs/shared/lib/schema/pills/nodes/entity/entity-node.stories.tsx index 23db8c916..0b1d03671 100644 --- a/libs/shared/lib/schema/pills/nodes/entity/entity-node.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/entity/entity-node.stories.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import { Meta } from '@storybook/react'; +import { Meta, Story, ComponentStory } from '@storybook/react'; import { SchemaUtils } from '@graphpolaris/shared/lib/schema/schema-utils'; -import { schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; - +import { colorPaletteConfigSlice, schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; @@ -20,14 +20,16 @@ const Component: Meta<typeof Schema> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <div - style={{ - width: '100%', - height: '100vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '100vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -37,6 +39,7 @@ const Component: Meta<typeof Schema> = { const Mockstore = configureStore({ reducer: { schema: schemaSlice.reducer, + colorPaletteConfig: colorPaletteConfigSlice.reducer, }, }); diff --git a/libs/shared/lib/schema/pills/nodes/entity/entity-node.tsx b/libs/shared/lib/schema/pills/nodes/entity/entity-node.tsx index 81cfe7a4b..49d6a6500 100644 --- a/libs/shared/lib/schema/pills/nodes/entity/entity-node.tsx +++ b/libs/shared/lib/schema/pills/nodes/entity/entity-node.tsx @@ -12,6 +12,7 @@ import React, { useState } from 'react'; import { Node, Handle, Position, NodeProps } from 'reactflow'; import styles from './entity.module.scss'; import { calcWidthEntityNodeBox, calculateAttributeQuality, calculateEntityQuality } from '@graphpolaris/shared/lib/schema/schema-utils'; +import { useTheme } from '@mui/material'; import { SchemaReactflowNodeWithFunctions } from '../../../model/reactflow'; import { QueryElementTypes } from '@graphpolaris/shared/lib/querybuilder'; @@ -25,6 +26,7 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod // console.log(data); const [hidden, setHidden] = useState<boolean>(true); + const theme = useTheme(); /** * adds drag functionality in order to be able to drag the entityNode to the schema @@ -52,8 +54,17 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod }; return ( - <div className={styles.entityNode} onDragStart={(event) => onDragStart(event)} draggable> - {/* <div + <div + className={styles.entityNode} + onDragStart={(event) => onDragStart(event)} + draggable + style={{ + backgroundColor: theme.palette.custom.nodesBase[0], + borderTop: `4px solid ${theme.palette.custom.nodesBase[0]}`, + borderBottom: `6px solid ${theme.palette.custom.elements.entityBase[0]}`, + }} + > + <div className={styles.entityNodeAttributesBox} onClick={() => onClickToggleAttributeAnalyticsPopupMenu()} style={{ @@ -74,8 +85,8 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod A </span> <span className={styles.nodeSpan}>{data.attributes.length}</span> - </div> */} - {/* <div + </div> + <div className={styles.entityNodeNodesBox} onClick={() => onClickToggleNodeQualityPopup()} style={{ @@ -96,20 +107,18 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod N </span> <span className={styles.nodeSpan}>{data.nodeCount}</span> - </div> */} - {/* <Handle + </div> + <Handle style={{ pointerEvents: 'none' }} id="entitySourceLeft" position={Position.Left} - className={styles.handleTriangleLeft} type="source" // hidden={Array.from(data.handles).includes('entitySourceLeft') ? false : true} - ></Handle> */} + ></Handle> <Handle style={{ pointerEvents: 'none' }} id="entityTargetLeft" position={Position.Left} - className={styles.handleTriangleLeft} type="target" // hidden={Array.from(data.handles).includes('entityTargetLeft') ? false : true} ></Handle> @@ -117,18 +126,17 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod style={{ pointerEvents: 'none' }} id="entitySourceRight" position={Position.Right} - className={styles.handleTriangleRight} type="source" // hidden={Array.from(data.handles).includes('entitySourceRight') ? false : true} ></Handle> - {/* <Handle + <Handle style={{ pointerEvents: 'none' }} id="entityTargetRight" position={Position.Right} type="target" // hidden={Array.from(data.handles).includes('entityTargetRight') ? false : true} - ></Handle> */} - {/* <Handle + ></Handle> + <Handle style={{ pointerEvents: 'none' }} id="entitySourceTop" position={Position.Top} @@ -141,8 +149,8 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod position={Position.Top} type="target" // hidden={Array.from(data.handles).includes('entityTargetTop') ? false : true} - ></Handle> */} - {/* <Handle + ></Handle> + <Handle style={{ pointerEvents: 'none' }} id="entitySourceBottom" position={Position.Bottom} @@ -155,9 +163,11 @@ export const EntityNode = React.memo(({ id, data }: NodeProps<SchemaReactflowNod position={Position.Bottom} type="target" // hidden={Array.from(data.handles).includes('entityTargetBottom') ? false : true} - ></Handle> */} + ></Handle> <div className={styles.nodeWrapper}> - <span className={styles.nodeData}>{id}</span> + <span className={styles.nodeData} style={{ color: theme.palette.custom.elementText }}> + {id} + </span> </div> </div> ); diff --git a/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx index cda942170..ad5a59f0d 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; import { AttributeCategory, NodeType } from '../../../model/reactflow'; @@ -18,7 +19,9 @@ const Component: Meta<typeof AttributeAnalyticsPopupMenu> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -29,6 +32,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx b/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx index e8755e486..5fbfd9f5b 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx @@ -8,6 +8,7 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, MenuItem, Accordion, AccordionSummary, AccordionDetails, Typography, useTheme } from '@mui/material'; import { ExpandMore, Visibility } from '@mui/icons-material'; import React, { ReactElement } from 'react'; import { AttributeAnalyticsData, AttributeWithData, NodeType } from '../../../model/reactflow'; @@ -19,91 +20,95 @@ import './attribute-analytics-popup-menu.module.scss'; * @param data Input data of type AttributeAnalyticsData, which is for the popup menu. */ export const AttributeAnalyticsPopupMenu = ({ data }: NodeProps<AttributeAnalyticsData>) => { - return <div></div>; - // const theme = useTheme(); - // if (data == undefined) throw new Error('No Attribute Analytics data is available for the node.'); - // let entityOrRelationBase: [string, string, string]; - // if (data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; - // else entityOrRelationBase = theme.palette.custom.elements.relationBase; - // let attributesDivs: any[] = []; - // if (data.isAttributeDataIn) { - // data.attributes.forEach((attributeItem: any) => { - // attributesDivs.push( - // <Accordion className="attributesAccordion"> - // <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> - // {attributeItem.attribute.name} - // </AccordionSummary> - // <AccordionDetails className="accordionDetails">{attributeItem.category}</AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <span>Null values:</span> - // <span - // className="nullAmountValue" - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // > - // {attributeItem.nullAmount}% - // </span> - // </AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <div className="attributeButtons"> - // <span>See visualisation</span> - // <span className="rightSideValue"> - // <Visibility className="visualisationEye" /> - // </span> - // </div> - // </AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <div - // className="attributeButtons" - // onClick={() => data.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} - // > - // <span>Place in query builder</span> - // </div> - // </AccordionDetails> - // </Accordion> - // ); - // }); - // } else { - // data.attributes.forEach((attributeItem: AttributeWithData) => { - // attributesDivs.push( - // <Accordion className="attributesAccordion"> - // <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> - // {attributeItem.attribute.name} - // </AccordionSummary> - // <AccordionDetails className="accordionDetails"> - // <div - // className="attributeButtons" - // onClick={() => data.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} - // > - // <span>Place in query builder</span> - // </div> - // </AccordionDetails> - // </Accordion> - // ); - // }); - // } - // console.log(data.attributes); - // return ( - // <div> - // <div className="title"> - // <span id="name">Attributes</span> - // <span className="rightSideValue">{data.attributes.length}</span> - // </div> - // <div className="bar">search bar</div> - // <div className="bar">filter bar</div> - // <div className="attributesWrapper">{attributesDivs}</div> - // <div className="closeButtonWrapper"> - // <ButtonBase - // onClick={() => data.onClickCloseButton()} - // id="closeButton" - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // > - // Close - // </ButtonBase> - // </div> - // </div> - // ); + const theme = useTheme(); + if (data == undefined) throw new Error('No Attribute Analytics data is available for the node.'); + let entityOrRelationBase: [string, string, string]; + if (data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; + else entityOrRelationBase = theme.palette.custom.elements.relationBase; + + let attributesDivs: any[] = []; + if (data.isAttributeDataIn) { + data.attributes.forEach((attributeItem: any) => { + attributesDivs.push( + <Accordion className="attributesAccordion"> + <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> + {attributeItem.attribute.name} + </AccordionSummary> + <AccordionDetails className="accordionDetails">{attributeItem.category}</AccordionDetails> + <AccordionDetails className="accordionDetails"> + <span>Null values:</span> + <span + className="nullAmountValue" + style={{ + backgroundColor: entityOrRelationBase[0], + }} + > + {attributeItem.nullAmount}% + </span> + </AccordionDetails> + <AccordionDetails className="accordionDetails"> + <div className="attributeButtons"> + <span>See visualisation</span> + <span className="rightSideValue"> + <Visibility className="visualisationEye" /> + </span> + </div> + </AccordionDetails> + <AccordionDetails className="accordionDetails"> + <div + className="attributeButtons" + onClick={() => data.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} + > + <span>Place in query builder</span> + </div> + </AccordionDetails> + </Accordion> + ); + }); + } else { + data.attributes.forEach((attributeItem: AttributeWithData) => { + attributesDivs.push( + <Accordion className="attributesAccordion"> + <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> + {attributeItem.attribute.name} + </AccordionSummary> + <AccordionDetails className="accordionDetails"> + <div + className="attributeButtons" + onClick={() => data.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} + > + <span>Place in query builder</span> + </div> + </AccordionDetails> + </Accordion> + ); + }); + } + + console.log(data.attributes); + + return ( + <div> + <div className="title"> + <span id="name">Attributes</span> + <span className="rightSideValue">{data.attributes.length}</span> + </div> + <div className="bar">search bar</div> + <div className="bar">filter bar</div> + + <div className="attributesWrapper">{attributesDivs}</div> + + <div className="closeButtonWrapper"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: entityOrRelationBase[0], + }} + > + Close + </ButtonBase> + </div> + </div> + ); }; diff --git a/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.stories.tsx index 2009a5a30..84a64a45b 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityEntityPopupNode } from './node-quality-entity-popup'; @@ -17,7 +18,9 @@ const Component: Meta<typeof NodeQualityEntityPopupNode> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -28,6 +31,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.tsx b/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.tsx index cab64e2df..4071f98c7 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/node-quality-entity-popup.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, useTheme } from '@mui/material'; import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForEntities } from '../../../model/reactflow'; @@ -18,6 +19,7 @@ import { NodeQualityDataForEntities } from '../../../model/reactflow'; * @param data Input data of type NodeQualityDataForEntities, which is for the popup. */ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataForEntities>) => { + const theme = useTheme(); if (data == undefined) throw new Error('No node quality data is available for this node.'); if (data.isAttributeDataIn) @@ -38,9 +40,15 @@ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataFo </div> </div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.entityBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); @@ -53,9 +61,15 @@ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataFo </div> <div className="information"></div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.entityBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); diff --git a/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx index cf43b5ac9..a29cba028 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityRelationPopupNode } from './node-quality-relation-popup'; @@ -17,7 +18,9 @@ const Component: Meta<typeof NodeQualityRelationPopupNode> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -28,6 +31,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.tsx b/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.tsx index ad5fe9931..a1933b4e1 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/node-quality-relation-popup.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, useTheme } from '@mui/material'; import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForRelations } from '../../../model/reactflow'; @@ -19,6 +20,7 @@ import './node-quality-popup.module.scss'; * @param data Input data of type NodeQualityDataForRelations, which is for the popup. */ export const NodeQualityRelationPopupNode = React.memo(({ data }: NodeProps<NodeQualityDataForRelations>) => { + const theme = useTheme(); if (data == undefined) throw new Error('No node quality data is available for this node.'); if (data.isAttributeDataIn) @@ -43,9 +45,15 @@ export const NodeQualityRelationPopupNode = React.memo(({ data }: NodeProps<Node </div> </div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.relationBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); @@ -58,9 +66,15 @@ export const NodeQualityRelationPopupNode = React.memo(({ data }: NodeProps<Node </div> <div className="information"></div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.relationBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx index 75f124ae7..053778e32 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; import { AttributeCategory, NodeType } from '../../../../model/reactflow'; @@ -18,7 +19,9 @@ const Component: Meta<typeof AttributeAnalyticsPopupMenu> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -29,6 +32,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, @@ -53,7 +57,7 @@ export const Default: Story = { ], isAttributeDataIn: false, onClickCloseButton: () => {}, - onClickPlaceInQueryBuilderButton: (name: string, type: string) => {}, + onClickPlaceInQueryBuilderButton: (name: string, type) => {}, searchForAttributes: (id: string, searchbarValue: string) => {}, resetAttributeFilters: (id: string) => {}, applyAttributeFilters: (id: string, category: AttributeCategory, predicate: string, percentage: number) => {}, diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx index 5ef056983..6db13f653 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, Accordion, AccordionSummary, AccordionDetails, useTheme } from '@mui/material'; import { ExpandMore, Visibility } from '@mui/icons-material'; import React, { ReactElement } from 'react'; import { NodeType, AttributeAnalyticsData, AttributeCategory } from '../../../../model/reactflow'; @@ -21,114 +22,120 @@ import { NodeProps } from 'reactflow'; * @param data Input data of type AttributeAnalyticsData, which is for the popup menu. */ export const AttributeAnalyticsPopupMenu = ({ data }: NodeProps<AttributeAnalyticsData>) => { - return <div></div>; - // if (data == undefined) throw new Error('No Attribute Analytics data is available for the node.'); - // let entityOrRelationBase: [string, string, string]; - // if (data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; - // else entityOrRelationBase = theme.palette.custom.elements.relationBase; - // let dataCopy = { ...data }; - // let attributesDivs = calculateAttributeDivs(data); - // let render = renderPopupMenu(dataCopy, attributesDivs); - // return render; - // /** - // * Creates the divs of the attributes with their data processed. - // * @param attributeData Data that is contained in the attributes. - // * @returns A list of divs that contain the appearance and information of the attributes. - // */ - // function calculateAttributeDivs(attributeData: AttributeAnalyticsData): any[] { - // let attributesDivs: any[] = []; - // if (attributeData.isAttributeDataIn) { - // attributeData.attributes.forEach((attributeItem: any) => { - // attributesDivs.push( - // <Accordion className="attributesAccordion"> - // <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> - // {attributeItem.attribute.name} - // </AccordionSummary> - // <AccordionDetails className="accordionDetails">{attributeItem.category}</AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <span>Null-values:</span> - // <span - // className="nullAmountValue" - // style={{ - // backgroundColor: '#' + entityOrRelationBase[0], - // }} - // > - // {attributeItem.nullAmount}% - // </span> - // </AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <div className="attributeButtons"> - // <span>See visualisation</span> - // <span className="rightSideValue"> - // <Visibility className="visualisationEye" /> - // </span> - // </div> - // </AccordionDetails> - // <AccordionDetails className="accordionDetails"> - // <div - // className="attributeButtons" - // onClick={() => attributeData.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} - // > - // <span>Place in query builder</span> - // </div> - // </AccordionDetails> - // </Accordion> - // ); - // }); - // } else { - // attributeData.attributes.forEach((attributeItem) => { - // attributesDivs.push( - // <Accordion className="attributesAccordion"> - // <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> - // {attributeItem.attribute.name} - // </AccordionSummary> - // <AccordionDetails className="accordionDetails"> - // <div - // className="attributeButtons" - // onClick={() => attributeData.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} - // > - // <span>Place in query builder</span> - // </div> - // </AccordionDetails> - // </Accordion> - // ); - // }); - // } - // return attributesDivs; - // } - // /** - // * Renders the popup-menu. - // * @param data This contains the data of the attributes. - // * @param attributesDivs This contains the list of divs of the attributes. - // */ - // function renderPopupMenu(data: AttributeAnalyticsData, attributesDivs: any[]) { - // return ( - // <div> - // <div className="title"> - // <span id="name">Attributes</span> - // <span className="rightSideValue">{data.attributes.length}</span> - // </div> - // <Search searchForAttributes={(searchbarValue: string) => data.searchForAttributes(data.nodeID, searchbarValue)} /> - // <Filter - // data={data} - // resetAttributeFilters={() => data.resetAttributeFilters(data.nodeID)} - // applyAttributeFilters={(dataType: AttributeCategory, predicate: string, percentage: number) => - // data.applyAttributeFilters(data.nodeID, dataType, predicate, percentage) - // } - // /> - // <div className="attributesWrapper">{attributesDivs}</div> - // <div className="closeButtonWrapper"> - // <ButtonBase - // onClick={() => data.onClickCloseButton()} - // id="closeButton" - // style={{ - // backgroundColor: '#' + entityOrRelationBase[0], - // }} - // > - // Close - // </ButtonBase> - // </div> - // </div> - // ); - // } + const theme = useTheme(); + + if (data == undefined) throw new Error('No Attribute Analytics data is available for the node.'); + let entityOrRelationBase: [string, string, string]; + if (data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; + else entityOrRelationBase = theme.palette.custom.elements.relationBase; + + let dataCopy = { ...data }; + let attributesDivs = calculateAttributeDivs(data); + let render = renderPopupMenu(dataCopy, attributesDivs); + return render; + + /** + * Creates the divs of the attributes with their data processed. + * @param attributeData Data that is contained in the attributes. + * @returns A list of divs that contain the appearance and information of the attributes. + */ + function calculateAttributeDivs(attributeData: AttributeAnalyticsData): any[] { + let attributesDivs: any[] = []; + if (attributeData.isAttributeDataIn) { + attributeData.attributes.forEach((attributeItem: any) => { + attributesDivs.push( + <Accordion className="attributesAccordion"> + <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> + {attributeItem.attribute.name} + </AccordionSummary> + <AccordionDetails className="accordionDetails">{attributeItem.category}</AccordionDetails> + <AccordionDetails className="accordionDetails"> + <span>Null-values:</span> + <span + className="nullAmountValue" + style={{ + backgroundColor: '#' + entityOrRelationBase[0], + }} + > + {attributeItem.nullAmount}% + </span> + </AccordionDetails> + <AccordionDetails className="accordionDetails"> + <div className="attributeButtons"> + <span>See visualisation</span> + <span className="rightSideValue"> + <Visibility className="visualisationEye" /> + </span> + </div> + </AccordionDetails> + <AccordionDetails className="accordionDetails"> + <div + className="attributeButtons" + onClick={() => attributeData.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} + > + <span>Place in query builder</span> + </div> + </AccordionDetails> + </Accordion> + ); + }); + } else { + attributeData.attributes.forEach((attributeItem) => { + attributesDivs.push( + <Accordion className="attributesAccordion"> + <AccordionSummary className="attribute" expandIcon={<ExpandMore className="expandIcon" />}> + {attributeItem.attribute.name} + </AccordionSummary> + <AccordionDetails className="accordionDetails"> + <div + className="attributeButtons" + onClick={() => attributeData.onClickPlaceInQueryBuilderButton(attributeItem.attribute.name, attributeItem.attribute.type)} + > + <span>Place in query builder</span> + </div> + </AccordionDetails> + </Accordion> + ); + }); + } + return attributesDivs; + } + + /** + * Renders the popup-menu. + * @param data This contains the data of the attributes. + * @param attributesDivs This contains the list of divs of the attributes. + */ + function renderPopupMenu(data: AttributeAnalyticsData, attributesDivs: any[]) { + return ( + <div> + <div className="title"> + <span id="name">Attributes</span> + <span className="rightSideValue">{data.attributes.length}</span> + </div> + <Search searchForAttributes={(searchbarValue: string) => data.searchForAttributes(data.nodeID, searchbarValue)} /> + <Filter + data={data} + resetAttributeFilters={() => data.resetAttributeFilters(data.nodeID)} + applyAttributeFilters={(dataType: AttributeCategory, predicate: string, percentage: number) => + data.applyAttributeFilters(data.nodeID, dataType, predicate, percentage) + } + /> + + <div className="attributesWrapper">{attributesDivs}</div> + + <div className="closeButtonWrapper"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: '#' + entityOrRelationBase[0], + }} + > + Close + </ButtonBase> + </div> + </div> + ); + } }; diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx index 852723d38..cb8fa3223 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { Filter } from './filterbar'; @@ -14,7 +15,13 @@ const Component: Meta<typeof Filter> = { */ title: 'Schema/Pills/Popups/Menus/Filter', component: Filter, - decorators: [(story) => <Provider store={Mockstore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; export default Component; @@ -22,6 +29,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx index 6dcaec7b7..df5f60ea2 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { Accordion, AccordionDetails, AccordionSummary, ButtonBase, useTheme } from '@mui/material'; import { ExpandMore } from '@mui/icons-material'; import React, { ReactElement, useState } from 'react'; import { AttributeAnalyticsData, AttributeCategory, NodeType } from '../../../../model/reactflow'; @@ -39,6 +40,8 @@ export const Filter = (props: FilterbarProps) => { onHoverResetButton: false, }); + const theme = useTheme(); + /** * Processes the chosen data-type in the new state. * @param event The event that contains the value of the chosen data-type. @@ -131,107 +134,106 @@ export const Filter = (props: FilterbarProps) => { }; let entityOrRelationBase: [string, string, string]; - // if (props.data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; - // else entityOrRelationBase = theme.palette.custom.elements.relationBase; + if (props.data.nodeType == NodeType.entity) entityOrRelationBase = theme.palette.custom.elements.entityBase; + else entityOrRelationBase = theme.palette.custom.elements.relationBase; - // let applyButtonColor; - // if (state.onHoverApplyButton) applyButtonColor = '#' + entityOrRelationBase[0]; - // else applyButtonColor = 'inherit'; + let applyButtonColor; + if (state.onHoverApplyButton) applyButtonColor = '#' + entityOrRelationBase[0]; + else applyButtonColor = 'inherit'; - // let resetButtonColor; - // if (state.onHoverResetButton) resetButtonColor = '#' + entityOrRelationBase[0]; - // else resetButtonColor = 'inherit'; + let resetButtonColor; + if (state.onHoverResetButton) resetButtonColor = '#' + entityOrRelationBase[0]; + else resetButtonColor = 'inherit'; return ( - <div /> - // <div className="bar"> - // <Accordion className={['attributesAccordion', 'filterbarAccordion'].join(' ')}> - // <AccordionSummary className="filterbarSummary" expandIcon={<ExpandMore className="expandIcon" />}> - // Filter bar - // </AccordionSummary> - // <AccordionDetails className={['accordionDetails', 'accordionDetailsFilterbar'].join(' ')}> - // <span>Datatype:</span> - // <span> - // <select - // className={['nullAmountValue', 'dataTypeSelect'].join(' ')} - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // value={state.dataTypeValue} - // onChange={dataTypeChanged} - // > - // <option value=""></option> - // <option value="Categorical">Categorical</option> - // <option value="Numerical">Numerical</option> - // <option value="Other">Other</option> - // </select> - // </span> - // </AccordionDetails> - // <AccordionDetails className={['accordionDetails', 'accordionDetailsFilterbar'].join(' ')}> - // <span>Null-values:</span> - // <span - // className={['nullAmountValue', 'nullValuesBox'].join(' ')} - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // > - // <input - // className="nullValuesSelect" - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // value={state.nullValuesValue} - // onChange={nullValuesValueChanged} - // type="text" - // pattern="[0-9]*" - // ></input> - // % - // </span> - // <span> - // <select - // className={['nullAmountValue', 'dataTypeSelect', 'predicateSelect'].join(' ')} - // style={{ - // backgroundColor: entityOrRelationBase[0], - // }} - // value={state.nullValuesPredicate} - // onChange={nullValuesPredicateChanged} - // > - // <option value=""></option> - // <option value="Equal">==</option> - // <option value="NotEqual">!=</option> - // <option value="Smaller"><</option> - // <option value="SmallerOrEqual">≤</option> - // <option value="Bigger">></option> - // <option value="BiggerOrEqual">≥</option> - // </select> - // </span> - - // <ButtonBase - // className="attributeButtons" - // onClick={() => resetFilters()} - // onMouseEnter={toggleHoverReset} - // onMouseLeave={toggleHoverReset} - // id="resetFiltersButton" - // style={{ - // backgroundColor: resetButtonColor, - // }} - // > - // Reset - // </ButtonBase> - // <ButtonBase - // className="attributeButtons" - // onClick={() => applyFilters()} - // onMouseEnter={toggleHoverApply} - // onMouseLeave={toggleHoverApply} - // id="applyFiltersButton" - // style={{ - // backgroundColor: applyButtonColor, - // }} - // > - // Apply - // </ButtonBase> - // </AccordionDetails> - // </Accordion> - // </div> + <div className="bar"> + <Accordion className={['attributesAccordion', 'filterbarAccordion'].join(' ')}> + <AccordionSummary className="filterbarSummary" expandIcon={<ExpandMore className="expandIcon" />}> + Filter bar + </AccordionSummary> + <AccordionDetails className={['accordionDetails', 'accordionDetailsFilterbar'].join(' ')}> + <span>Datatype:</span> + <span> + <select + className={['nullAmountValue', 'dataTypeSelect'].join(' ')} + style={{ + backgroundColor: entityOrRelationBase[0], + }} + value={state.dataTypeValue} + onChange={dataTypeChanged} + > + <option value=""></option> + <option value="Categorical">Categorical</option> + <option value="Numerical">Numerical</option> + <option value="Other">Other</option> + </select> + </span> + </AccordionDetails> + <AccordionDetails className={['accordionDetails', 'accordionDetailsFilterbar'].join(' ')}> + <span>Null-values:</span> + <span + className={['nullAmountValue', 'nullValuesBox'].join(' ')} + style={{ + backgroundColor: entityOrRelationBase[0], + }} + > + <input + className="nullValuesSelect" + style={{ + backgroundColor: entityOrRelationBase[0], + }} + value={state.nullValuesValue} + onChange={nullValuesValueChanged} + type="text" + pattern="[0-9]*" + ></input> + % + </span> + <span> + <select + className={['nullAmountValue', 'dataTypeSelect', 'predicateSelect'].join(' ')} + style={{ + backgroundColor: entityOrRelationBase[0], + }} + value={state.nullValuesPredicate} + onChange={nullValuesPredicateChanged} + > + <option value=""></option> + <option value="Equal">==</option> + <option value="NotEqual">!=</option> + <option value="Smaller"><</option> + <option value="SmallerOrEqual">≤</option> + <option value="Bigger">></option> + <option value="BiggerOrEqual">≥</option> + </select> + </span> + + <ButtonBase + className="attributeButtons" + onClick={() => resetFilters()} + onMouseEnter={toggleHoverReset} + onMouseLeave={toggleHoverReset} + id="resetFiltersButton" + style={{ + backgroundColor: resetButtonColor, + }} + > + Reset + </ButtonBase> + <ButtonBase + className="attributeButtons" + onClick={() => applyFilters()} + onMouseEnter={toggleHoverApply} + onMouseLeave={toggleHoverApply} + id="applyFiltersButton" + style={{ + backgroundColor: applyButtonColor, + }} + > + Apply + </ButtonBase> + </AccordionDetails> + </Accordion> + </div> ); }; diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx index 9bf2cc97f..76f59b77c 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityEntityPopupNode } from './node-quality-entity-popup'; @@ -17,7 +18,9 @@ const Component: Meta<typeof NodeQualityEntityPopupNode> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -28,6 +31,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx index 6a98b386f..da68e57ad 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, useTheme } from '@mui/material'; import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForEntities } from '../../../../model/reactflow'; @@ -18,6 +19,7 @@ import { NodeQualityDataForEntities } from '../../../../model/reactflow'; * @param data Input data of type NodeQualityDataForEntities, which is for the popup. */ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataForEntities>) => { + const theme = useTheme(); if (data == undefined) throw new Error('No node quality data is available for this node.'); if (data.isAttributeDataIn) @@ -38,9 +40,15 @@ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataFo </div> </div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.entityBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); @@ -52,9 +60,15 @@ export const NodeQualityEntityPopupNode = ({ data }: NodeProps<NodeQualityDataFo </div> <div className="information"></div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.entityBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx index 64c65d487..33dc68b42 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityRelationPopupNode } from './node-quality-relation-popup'; @@ -17,7 +18,9 @@ const Component: Meta<typeof NodeQualityRelationPopupNode> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <ReactFlowProvider>{story()}</ReactFlowProvider> + <GraphPolarisThemeProvider> + <ReactFlowProvider>{story()}</ReactFlowProvider> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -28,6 +31,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx index 5fb1967e6..a851e0085 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { ButtonBase, useTheme } from '@mui/material'; import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForRelations, NodeType } from '../../../../model/reactflow'; @@ -18,6 +19,7 @@ import { NodeQualityDataForRelations, NodeType } from '../../../../model/reactfl * @param data Input data of type NodeQualityDataForRelations, which is for the popup. */ export const NodeQualityRelationPopupNode = ({ data }: NodeProps<NodeQualityDataForRelations>) => { + const theme = useTheme(); if (data == undefined) throw new Error('No node quality data is available for this node.'); if (data.isAttributeDataIn) @@ -42,9 +44,15 @@ export const NodeQualityRelationPopupNode = ({ data }: NodeProps<NodeQualityData </div> </div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.relationBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); @@ -56,9 +64,15 @@ export const NodeQualityRelationPopupNode = ({ data }: NodeProps<NodeQualityData </div> <div className="information"></div> <div className="closeButtonWrapper"> - <button onClick={() => data.onClickCloseButton()} id="closeButton"> + <ButtonBase + onClick={() => data.onClickCloseButton()} + id="closeButton" + style={{ + backgroundColor: theme.palette.custom.elements.relationBase[0], + }} + > Close - </button> + </ButtonBase> </div> </div> ); diff --git a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx index abaa5977f..c9987ffb4 100644 --- a/libs/shared/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx @@ -2,8 +2,9 @@ import React from 'react'; import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; -import { querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; +import { colorPaletteConfigSlice, querybuilderSlice, schemaSlice } from '@graphpolaris/shared/lib/data-access/store'; import { ReactFlowProvider } from 'reactflow'; import { Search } from './searchbar'; @@ -14,7 +15,13 @@ const Component: Meta<typeof Search> = { */ title: 'Schema/Pills/Popups/Menus/Search', component: Search, - decorators: [(story) => <Provider store={Mockstore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; export default Component; @@ -22,6 +29,7 @@ export default Component; // A super-simple mock of a redux store const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, querybuilder: querybuilderSlice.reducer, // schema: schemaSlice.reducer, }, diff --git a/libs/shared/lib/schema/pills/nodes/relation/relation-node.stories.tsx b/libs/shared/lib/schema/pills/nodes/relation/relation-node.stories.tsx index fc6012764..836d745c7 100644 --- a/libs/shared/lib/schema/pills/nodes/relation/relation-node.stories.tsx +++ b/libs/shared/lib/schema/pills/nodes/relation/relation-node.stories.tsx @@ -2,8 +2,8 @@ import React from 'react'; import { Meta, Story, ComponentStory } from '@storybook/react'; import { SchemaUtils } from '@graphpolaris/shared/lib/schema/schema-utils'; -import { schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; - +import { colorPaletteConfigSlice, schemaSlice, setSchema } from '@graphpolaris/shared/lib/data-access/store'; +import { GraphPolarisThemeProvider } from '@graphpolaris/shared/lib/data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; @@ -20,14 +20,16 @@ const Component: Meta<typeof Schema> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <div - style={{ - width: '100%', - height: '100vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '100vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -37,6 +39,7 @@ const Component: Meta<typeof Schema> = { const Mockstore = configureStore({ reducer: { schema: schemaSlice.reducer, + colorPaletteConfig: colorPaletteConfigSlice.reducer, }, }); diff --git a/libs/shared/lib/schema/pills/nodes/relation/relation-node.tsx b/libs/shared/lib/schema/pills/nodes/relation/relation-node.tsx index 760231dd8..6eab676f8 100644 --- a/libs/shared/lib/schema/pills/nodes/relation/relation-node.tsx +++ b/libs/shared/lib/schema/pills/nodes/relation/relation-node.tsx @@ -11,6 +11,14 @@ import React, { useState } from 'react'; import { Node, Handle, Position, NodeProps } from 'reactflow'; import styles from './relation.module.scss'; +import { + calcWidthEntityNodeBox, + calculateAttributeQuality, + calculateEntityQuality, + calcWidthRelationNodeBox, + calculateRelationQuality, +} from '@graphpolaris/shared/lib/schema/schema-utils'; +import { useTheme } from '@mui/material'; import { SchemaReactflowRelation, SchemaReactflowRelationWithFunctions } from '../../../model/reactflow'; import { QueryElementTypes } from '@graphpolaris/shared/lib/querybuilder'; @@ -21,6 +29,8 @@ import { QueryElementTypes } from '@graphpolaris/shared/lib/querybuilder'; */ export const RelationNode = React.memo(({ id, data }: NodeProps<SchemaReactflowRelationWithFunctions>) => { const [hidden, setHidden] = useState<boolean>(true); + const theme = useTheme(); + // console.log(data); /** * Adds drag functionality in order to be able to drag the relationNode to the schema. @@ -56,21 +66,55 @@ export const RelationNode = React.memo(({ id, data }: NodeProps<SchemaReactflowR data.toggleAttributeAnalyticsPopupMenu(data.collection); }; + const widthExternalBoxes = data.attributes ? calcWidthRelationNodeBox(data.attributes.length, data.nodeCount) : 0; + return ( <div onDragStart={(event) => onDragStart(event)} draggable // style={{ width: 100, height: 100 }} > - <div className={styles.relationNode}> + <div + className={styles.relationNode} + style={{ + background: theme.palette.custom.nodesBase[0], + borderTop: `4px solid ${theme.palette.custom.nodesBase[0]}`, + borderBottom: `6px solid ${theme.palette.custom.elements.relationBase[0]}`, + }} + > + <div + className={[styles.relationNodeTriangleGeneral, styles.relationNodeTriangleLeft].join(' ')} + style={{ + borderRightColor: theme.palette.custom.nodesBase[0], + }} + ></div> + <div + className={[styles.relationNodeTriangleGeneral, styles.relationNodeSmallTriangleLeft].join(' ')} + style={{ + borderRightColor: theme.palette.custom.elements.relationBase[0], + }} + ></div> + <div + className={[styles.relationNodeTriangleGeneral, styles.relationNodeTriangleRight].join(' ')} + style={{ borderLeftColor: theme.palette.custom.nodesBase[0] }} + ></div> + <div + className={[styles.relationNodeTriangleGeneral, styles.relationNodeSmallTriangleRight].join(' ')} + style={{ + borderLeftColor: theme.palette.custom.elements.relationBase[0], + }} + ></div> <Handle - style={{ pointerEvents: 'none' }} - className={styles.handleTriangleTop} + style={{ + pointerEvents: 'none', + borderBottomColor: theme.palette.custom.nodesBase[0], + }} + className={styles.arrowup} id="entitySourceLeft" position={Position.Top} - type="target" + type="source" ></Handle> - {/* <div + <div className={styles.relationNodeAttributesBox} onClick={() => onClickToggleAttributeAnalyticsPopupMenu()} style={{ @@ -90,8 +134,8 @@ export const RelationNode = React.memo(({ id, data }: NodeProps<SchemaReactflowR A </span> <span className={styles.nodeSpan}>{data.attributes.length}</span> - </div> */} - {/* <div + </div> + <div className={styles.relationNodeNodesBox} onClick={() => onClickToggleNodeQualityPopup()} style={{ @@ -111,13 +155,21 @@ export const RelationNode = React.memo(({ id, data }: NodeProps<SchemaReactflowR N </span> <span className={styles.nodeSpan}>{data.nodeCount}</span> - </div> */} + </div> - <div className={styles.nodeWrapper}> + <div className={styles.nodeWrapper} style={{ backgroundColor: theme.palette.custom.nodesBase[0] }}> <span className={styles.nodeData}>{data.collection}</span> </div> - <Handle className={styles.handleTriangleBottom} style={{ pointerEvents: 'none' }} position={Position.Bottom} type="source"></Handle> + <Handle + className={styles.arrowdown} + style={{ + pointerEvents: 'none', + borderTopColor: theme.palette.custom.elements.relationBase[0], + }} + position={Position.Bottom} + type="target" + ></Handle> </div> </div> ); diff --git a/libs/shared/lib/vis/geovis/GeoNodeLinkMap.stories.tsx b/libs/shared/lib/vis/geovis/GeoNodeLinkMap.stories.tsx index 332defe3e..501880b4b 100644 --- a/libs/shared/lib/vis/geovis/GeoNodeLinkMap.stories.tsx +++ b/libs/shared/lib/vis/geovis/GeoNodeLinkMap.stories.tsx @@ -2,12 +2,14 @@ import React from 'react'; import GeoNodeLinkMap from './GeoNodeLinkMap'; import { Provider } from 'react-redux'; import { configureStore } from '@reduxjs/toolkit'; -import { graphQueryResultSlice, assignNewGraphQueryResult } from '../../data-access/store'; +import { GraphPolarisThemeProvider } from '../../data-access/theme'; +import { colorPaletteConfigSlice, graphQueryResultSlice, assignNewGraphQueryResult } from '../../data-access/store'; import { flights } from '../../mock-data/query-result/geo-mock-data'; import { Meta } from '@storybook/react'; const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, graphQueryResult: graphQueryResultSlice.reducer, }, }); @@ -18,14 +20,16 @@ const Component: Meta<typeof GeoNodeLinkMap> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <div - style={{ - width: '100%', - height: '100vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '100vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], diff --git a/libs/shared/lib/vis/geovis/GeoNodeLinkMap.tsx b/libs/shared/lib/vis/geovis/GeoNodeLinkMap.tsx index e8e522521..127b5fc3c 100644 --- a/libs/shared/lib/vis/geovis/GeoNodeLinkMap.tsx +++ b/libs/shared/lib/vis/geovis/GeoNodeLinkMap.tsx @@ -15,6 +15,7 @@ import { generateBaseLayer } from './layers/BaseLayer'; import { FacetingLayer } from './layers/FacetingLayer'; import { ClusterLayer } from './layers/ClusterLayer'; import { NodeLinkLayer } from './layers/NodeLinkLayer'; +import { useTheme } from '@mui/material'; type Props = { mapType: number; @@ -25,6 +26,7 @@ type Props = { }; export const GeoNodeLinkMap = React.memo(({ mapType = 0, isAggregated, isFanned, nodelink = 'nodelink', brushing = false }: Props) => { + const theme = useTheme(); const [graph, setGraph] = useState<NodeLinkViewModel | null>(null); const [isHovering, setIsHovering] = useState<boolean>(); const [isLoading, setIsLoading] = useState<boolean>(true); diff --git a/libs/shared/lib/vis/nodelink/NodeLinkViewModel.tsx b/libs/shared/lib/vis/nodelink/NodeLinkViewModel.tsx index 92816849f..fa2a2ffc8 100644 --- a/libs/shared/lib/vis/nodelink/NodeLinkViewModel.tsx +++ b/libs/shared/lib/vis/nodelink/NodeLinkViewModel.tsx @@ -13,6 +13,7 @@ import ResultNodeLinkParserUseCase, { isNodeLinkResult } from '../shared/ResultN import { AttributeData, NodeAttributeData } from '../shared/InputDataTypes'; import { AttributeCategory } from '../shared/Types'; import { GraphQueryResult } from '../../data-access/store'; // TODO remove +import { Theme } from '@mui/material'; export type AttributesCollection = Record<string, boolean>; // TODO remove export type NodesAttrCollection = Record<string, AttributesCollection>; // TODO remove @@ -32,6 +33,7 @@ export default class NodeLinkViewModel { public scalexy: number; public width: number; public height: number; + public theme: Theme; public radius: number; public visibleAttributes: NodesAttrCollection; public currentHightlightedNodes: NodeType[]; @@ -55,7 +57,8 @@ export default class NodeLinkViewModel { graph: GraphQueryResult, width: number, height: number, - ref: React.RefObject<HTMLDivElement> + ref: React.RefObject<HTMLDivElement>, + theme: Theme ) { this.radius = 5; @@ -99,6 +102,8 @@ export default class NodeLinkViewModel { y: 0, }; + this.theme = theme; + // this becomes true when the nodes are moving due to onDrag being active this.nodesMoving = false; @@ -366,7 +371,7 @@ export default class NodeLinkViewModel { private createNode = (node: NodeType, radius: number, selected?: boolean) => { node.gfx = new PIXI.Graphics(); node.selected = selected; - const lineColour = '#000000'; + const lineColour = selected ? this.theme.palette.custom.nodeHighlightedEdge : this.theme.palette.custom.visBackground; const lineWidth = selected ? 3 : 1.5; node.gfx.lineStyle(lineWidth, Number('0x' + lineColour.replace('#', ''))); //check if not undefined. @@ -777,9 +782,8 @@ export default class NodeLinkViewModel { */ public colour = (num: number) => { //num = num % 4; - // const col = '#000000'; - // return Number('0x' + col.replace('#', '')); - return 0x000000; + const col = this.theme.palette.custom.nodes[num % this.theme.palette.custom.nodes.length]; + return Number('0x' + col.replace('#', '')); }; //MACHINE LEARNING-------------------------------------------------------------------------------------------------- diff --git a/libs/shared/lib/vis/nodelink/nodelinkvis.stories.tsx b/libs/shared/lib/vis/nodelink/nodelinkvis.stories.tsx index 2d161e76a..113e73554 100644 --- a/libs/shared/lib/vis/nodelink/nodelinkvis.stories.tsx +++ b/libs/shared/lib/vis/nodelink/nodelinkvis.stories.tsx @@ -1,10 +1,17 @@ import React from 'react'; -import { Meta } from '@storybook/react'; +import { ComponentStory, Meta } from '@storybook/react'; import { NodeLinkVis } from './nodelinkvis'; -import { assignNewGraphQueryResult, graphQueryResultSlice, resetGraphQueryResults, store } from '../../data-access/store'; +import { + assignNewGraphQueryResult, + colorPaletteConfigSlice, + graphQueryResultSlice, + resetGraphQueryResults, + store, +} from '../../data-access/store'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '../../data-access/theme'; import { big2ndChamberQueryResult, smallFlightsQueryResults, mockLargeQueryResults } from '../../mock-data'; const Component: Meta<typeof NodeLinkVis> = { @@ -17,14 +24,16 @@ const Component: Meta<typeof NodeLinkVis> = { decorators: [ (story) => ( <Provider store={Mockstore}> - <div - style={{ - width: '100%', - height: '100vh', - }} - > - {story()} - </div> + <GraphPolarisThemeProvider> + <div + style={{ + width: '100%', + height: '100vh', + }} + > + {story()} + </div> + </GraphPolarisThemeProvider> </Provider> ), ], @@ -32,6 +41,7 @@ const Component: Meta<typeof NodeLinkVis> = { const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, graphQueryResult: graphQueryResultSlice.reducer, }, }); diff --git a/libs/shared/lib/vis/nodelink/nodelinkvis.tsx b/libs/shared/lib/vis/nodelink/nodelinkvis.tsx index ad633e038..8a4b6aa11 100644 --- a/libs/shared/lib/vis/nodelink/nodelinkvis.tsx +++ b/libs/shared/lib/vis/nodelink/nodelinkvis.tsx @@ -1,4 +1,5 @@ -import { useAppDispatch, useGraphQueryResult } from '../../data-access/store'; +import { changePrimary, useAppDispatch, useGraphQueryResult } from '../../data-access/store'; +import { useTheme } from '@mui/material'; import React, { LegacyRef, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; import ReactJSONView from 'react-json-view'; @@ -59,6 +60,8 @@ export const NodeLinkVis = React.memo((props: Props) => { // }); const graphQueryResult = useGraphQueryResult(); + const dispatch = useAppDispatch(); + const theme = useTheme(); useEffect(() => { console.debug('update nodelink useEffect', graphQueryResult); @@ -75,7 +78,8 @@ export const NodeLinkVis = React.memo((props: Props) => { graphQueryResult, myRef?.current?.clientWidth || 1000, myRef?.current?.clientHeight || 1000, - myRef + myRef, + theme ); nodeLinkViewModelRef.current = nodeLinkViewModel; @@ -127,7 +131,12 @@ export const NodeLinkVis = React.memo((props: Props) => { value={theme.palette.primary.main} /> */} {loading && ( - <div> + <div + style={{ + marginTop: '40px', + paddingLeft: '30px', + }} + > <svg // className={styles.rotating} xmlns="http://www.w3.org/2000/svg" @@ -149,17 +158,33 @@ export const NodeLinkVis = React.memo((props: Props) => { </div> )} {!loading && ( - <div className="h-full overflow-hidden"> - <div className="h-full overflow-hidden" ref={myRef}></div> - {/* <VisConfigPanelComponent> */} - {/* <NodeLinkConfigPanelComponent + <div + className="viscontainer" + style={{ + overflowY: 'auto', + width: '100%', + height: '100%', + }} + > + <div + style={{ + width: '100%', + height: '100%', + overflow: 'hidden', + backgroundColor: theme.palette.custom.visBackground, + }} + className="renderer" + ref={myRef} + ></div> + <VisConfigPanelComponent> + {/* <NodeLinkConfigPanelComponent graph={this.state.graph} nlViewModel={this.nodeLinkViewModel} /> */} - {/*</VisConfigPanelComponent>*/} - {/*<VisConfigPanelComponent isLeft>*/} - {/* <AttributesConfigPanel nodeLinkViewModel={this.nodeLinkViewModel} />*/} - {/* </VisConfigPanelComponent> */} + {/*</VisConfigPanelComponent>*/} + {/*<VisConfigPanelComponent isLeft>*/} + {/* <AttributesConfigPanel nodeLinkViewModel={this.nodeLinkViewModel} />*/} + </VisConfigPanelComponent> </div> )} </> diff --git a/libs/shared/lib/vis/paohvis/components/MakePaohvisMenu.tsx b/libs/shared/lib/vis/paohvis/components/MakePaohvisMenu.tsx index 7c1521543..1d2f2a04e 100644 --- a/libs/shared/lib/vis/paohvis/components/MakePaohvisMenu.tsx +++ b/libs/shared/lib/vis/paohvis/components/MakePaohvisMenu.tsx @@ -8,7 +8,8 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { ChangeEventHandler, ReactElement, useEffect, useMemo } from 'react'; +import { Button, MenuItem, TextField, IconButton } from '@mui/material'; +import React, { ReactElement, useEffect } from 'react'; import { Attribute, AttributeNames, @@ -95,10 +96,6 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { attributeValue: '?', }); - useEffect(() => { - if (state.entityVertical) onChangeEntity(state.entityVertical); - }, [state.entityVertical, state.entitiesFromSchema]); - // // FUNCTIONS // @@ -106,11 +103,11 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { /** * Called when the entity field is changed. * Calculates the `relationNameOptions`, resets the `entityHorizontal`, `relationName` and `attributeName` and sets the new state. + * @param {React.ChangeEvent<HTMLInputElement>} event The event that is given by the input field when a change event is fired. * It has the value of the entity you clicked on. */ - function onChangeEntity(newEntity: string): void { - console.log(newEntity, state.entitiesFromSchema.relationsPerEntity); - + function onChangeEntity(event: React.ChangeEvent<HTMLInputElement>): void { + const newEntity = event.target.value; setState((draft) => { draft.relationNameOptions = []; const relationNames: string[] = state.entitiesFromSchema.relationsPerEntity[newEntity]; @@ -141,8 +138,9 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { draft.relationValue = ''; draft.attributeValue = ''; + draft.entityVertical = newEntity; draft.entityHorizontal = ''; - draft.relationName = draft.relationNameOptions.length > 0 ? draft.relationNameOptions[0] : ''; + draft.relationName = ''; draft.isEntityVerticalEqualToRelationFrom = true; draft.attributeNameAndOrigin = ''; draft.isButtonEnabled = false; @@ -151,25 +149,20 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { }); } - useEffect(() => { - console.log(state.relationName, state.relationNameOptions); - - if (state.relationName) onChangeRelationName(state.relationName); - }, [state.relationName, state.relationNameOptions, state.entityVertical]); /** * Called when the relationName field is changed. * Calculates the possible attribute values, resets the `attributeValue`, sets the `entityHorizontal`. * @param {React.ChangeEvent<HTMLInputElement>} event The event that is given by the input field when a change event is fired. * It has the value of the relation you clicked on. */ - function onChangeRelationName(relationName: string): void { - console.log('onChangeRelationName'); + function onChangeRelationName(event: React.ChangeEvent<HTMLInputElement>): void { setState((draft) => { + draft.relationName = event.target.value; draft.attributeValue = ''; draft.attributeNameAndOrigin = ''; draft.isButtonEnabled = false; - const newRelationSplit = relationName.split(':'); + const newRelationSplit = event.target.value.split(':'); const newRelation = newRelationSplit[0]; // This value should always be there @@ -228,18 +221,17 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { }); } - useEffect(() => { - if (state.attributeValue) onChangeAttributeName(state.attributeValue); - }, [state.attributeValue, state.relationName]); /** * Called when the attributeName field is changed. * Sets the chosen attribute value, enables the "Make" button and sets the state. * @param {React.ChangeEvent<HTMLInputElement>} event The event that is given by the input field when a change event is fired. * It has the value of the attributeName you clicked on. */ - function onChangeAttributeName(newAttribute: string): void { + function onChangeAttributeName(event: React.ChangeEvent<HTMLInputElement>): void { + const newAttribute = event.target.value; setState((draft) => { const isSelectedAttributeFromEntity = newAttribute.split(':')[1] == AttributeOrigin.entity; + draft.attributeValue = newAttribute; // render changes draft.attributeNameAndOrigin = newAttribute; @@ -249,15 +241,13 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { }); } - useEffect(() => { - if (state.sortOrder) onChangeSortOrder(state.sortOrder); - }, [state.sortOrder]); /** * Called when the sort order field is changed. * Sets the state by changing the sort order. + * @param {React.ChangeEvent<HTMLInputElement>} event The event that is given by the input field when a change event is fired. */ - function onChangeSortOrder(value: string): void { - const newSortOrder: NodeOrder = value as NodeOrder; + function onChangeSortOrder(event: React.ChangeEvent<HTMLInputElement>): void { + const newSortOrder: NodeOrder = event.target.value as NodeOrder; const nodeOrders: string[] = Object.values(NodeOrder); if (nodeOrders.includes(newSortOrder)) { unflipReverseIconButton(); @@ -442,31 +432,34 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { // // Retrieve the possible entity options. If none available, set helper message. - let entityMenuItems: ReactElement[] = useMemo(() => { - if (state.entitiesFromQueryResult.length > 0) { - return state.entitiesFromQueryResult.map((entity) => ( - <option key={entity} value={entity}> - {entity} - </option> - )); - } else - return [ - <option key="placeholder" value="" disabled> - No query data available - </option>, - ]; - }, [state.entitiesFromQueryResult]); + let entityMenuItems: ReactElement[]; + if (state.entitiesFromQueryResult.length > 0) { + entityMenuItems = state.entitiesFromQueryResult.map((entity) => ( + <MenuItem key={entity} value={entity}> + {entity} + </MenuItem> + )); + } else + entityMenuItems = [ + <MenuItem key="placeholder" value="" disabled> + No query data available + </MenuItem>, + ]; // Retrieve the possible relationName options. If none available, set helper message. - let relationNameMenuItems: ReactElement[] = useMemo(() => { - if (state.relationNameOptions.length > 0) - return state.relationNameOptions.map((relation) => ( - <option key={relation} value={relation}> - {relation} - </option> - )); - else return []; - }, [state.relationNameOptions]); + let relationNameMenuItems: ReactElement[]; + if (state.relationNameOptions.length > 0) + relationNameMenuItems = state.relationNameOptions.map((relation) => ( + <MenuItem key={relation} value={relation}> + {relation} + </MenuItem> + )); + else + relationNameMenuItems = [ + <MenuItem key="placeholder" value="" disabled> + First select an entity with one or more relations + </MenuItem>, + ]; // Retrieve all the possible attributeName options. If none available, set helper message. let attributeNameMenuItems: ReactElement[] = []; @@ -475,30 +468,35 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { let attributeNameMenuItemsRelation: ReactElement[] = []; if (state.attributeNameOptions['Entity'] && state.attributeNameOptions['Relation']) { attributeNameMenuItemsNoAttribute = state.attributeNameOptions['No attribute'].map((attribute) => ( - <option key={attribute} value={`${attribute}:NoAttribute`}> + <MenuItem key={attribute} value={`${attribute}:NoAttribute`}> {attribute} - </option> + </MenuItem> )); attributeNameMenuItemsEntity = state.attributeNameOptions['Entity'].map((attribute) => ( - <option key={`${attribute}:Entity`} value={`${attribute}:Entity`}> + <MenuItem key={`${attribute}:Entity`} value={`${attribute}:Entity`}> {`${attribute} : Entity`} - </option> + </MenuItem> )); attributeNameMenuItemsRelation = state.attributeNameOptions['Relation'].map((attribute) => ( - <option key={`${attribute}:Relation`} value={`${attribute}:Relation`}> + <MenuItem key={`${attribute}:Relation`} value={`${attribute}:Relation`}> {`${attribute} : Relation`} - </option> + </MenuItem> )); attributeNameMenuItems = attributeNameMenuItemsNoAttribute.concat(attributeNameMenuItemsEntity).concat(attributeNameMenuItemsRelation); - } else attributeNameMenuItems = []; + } else + attributeNameMenuItems = [ + <MenuItem key="placeholder" value="" disabled> + First select an relation with one or more attributes + </MenuItem>, + ]; // make sort order menu items const sortOrderMenuItems: ReactElement[] = Object.values(NodeOrder).map((nodeOrder) => { return ( - <option key={nodeOrder} value={nodeOrder}> + <MenuItem key={nodeOrder} value={nodeOrder}> {nodeOrder} - </option> + </MenuItem> ); }); @@ -514,50 +512,55 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => { } // return the whole MakePaohvisMenu - // TODO! fix inputs to select return ( - <div className="nav card"> - <div className="card-body flex flex-row overflow-y-auto max-w-[60vw]"> - <select - className="select" - id="standard-select-entity" - value={state.entityVertical} - onChange={(e) => setState({ ...state, entityVertical: e.target.value })} - > - {entityMenuItems} - </select> - <select - className={`select ${relationNameMenuItems.length === 0 ? 'select-disabled' : ''}`} - id="standard-select-relation" - value={state.relationName} - onChange={(e) => setState({ ...state, relationName: e.target.value })} - > - {relationNameMenuItems} - </select> - <select - className={`select ${attributeNameMenuItems.length === 0 ? 'select-disabled' : ''}`} - id="standard-select-attribute" - value={state.attributeNameAndOrigin} - onChange={(e) => setState({ ...state, attributeValue: e.target.value })} - > - {attributeNameMenuItems} - </select> - <select - className="select" - id="standard-select-sort-order" - value={state.sortOrder} - onChange={(e) => setState({ ...state, sortOrder: e.target.value as NodeOrder })} - > - {sortOrderMenuItems} - </select> - <button className={'reverseIconButton'} color="inherit" onClick={onClickReverseOrder}> - {reverseIcon} - </button> - - <button id="makeButton" className="btn btn-outline" disabled={!state.isButtonEnabled} onClick={onClickMakeButton}> - <span>Make</span> - </button> - </div> + <div className="makePaohvisMenu"> + <TextField + select + className="textFieldMakePaohvisMenu" + id="standard-select-entity" + label="Entity" + value={state.entityVertical} + onChange={onChangeEntity} + > + {entityMenuItems} + </TextField> + <TextField + select + className="textFieldMakePaohvisMenu" + id="standard-select-relation" + label="Relation" + value={state.relationName} + onChange={onChangeRelationName} + > + {relationNameMenuItems} + </TextField> + <TextField + select + className="textFieldMakePaohvisMenu" + id="standard-select-attribute" + label="Attribute" + value={state.attributeNameAndOrigin} + onChange={onChangeAttributeName} + > + {attributeNameMenuItems} + </TextField> + <TextField + select + className="textFieldMakePaohvisMenu" + id="standard-select-sort-order" + label="Sort order" + value={state.sortOrder} + onChange={onChangeSortOrder} + > + {sortOrderMenuItems} + </TextField> + <IconButton className={'reverseIconButton'} color="inherit" onClick={onClickReverseOrder}> + {reverseIcon} + </IconButton> + + <Button id="makeButton" variant="contained" disabled={!state.isButtonEnabled} onClick={onClickMakeButton}> + <span>Make</span> + </Button> </div> ); }; diff --git a/libs/shared/lib/vis/paohvis/components/PaohvisFilterComponent.tsx b/libs/shared/lib/vis/paohvis/components/PaohvisFilterComponent.tsx index e64495e53..76377ee7d 100644 --- a/libs/shared/lib/vis/paohvis/components/PaohvisFilterComponent.tsx +++ b/libs/shared/lib/vis/paohvis/components/PaohvisFilterComponent.tsx @@ -8,10 +8,11 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { ChangeEventHandler, ReactElement, useState, MouseEventHandler, useEffect, useMemo } from 'react'; +import React, { ChangeEventHandler, ReactElement, useState, MouseEventHandler, useEffect } from 'react'; import styles from './PaohvisFilterComponent.module.scss'; import { AttributeNames, FilterType } from '../Types'; import { useImmer } from 'use-immer'; +import { Button, MenuItem, TextField } from '@mui/material'; import { useGraphQueryResult, useSchemaGraph } from '@graphpolaris/shared/lib/data-access'; import { isNodeLinkResult } from '../../shared/ResultNodeLinkParserUseCase'; import { calculateAttributesAndRelations, calculateAttributesFromRelation } from '../utils/utils'; @@ -100,7 +101,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { * Based on the type of the chosen attribute, a different list with predicates is generated. * @param event that called this eventhandler. */ - function onChangeAttributeName(event: React.ChangeEvent<HTMLSelectElement>): void { + function onChangeAttributeName(event: React.ChangeEvent<HTMLInputElement>): void { const newAttributeNameAndType = event.target.value; const newAttributeSplit = event.target.value.split(':'); const newAttributeType = newAttributeSplit[1]; @@ -134,7 +135,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { * This is called when the value of the predicate is changed in the filter component. * @param event that called this eventhandler. */ - function onChangePredicate(event: React.ChangeEvent<HTMLSelectElement>): void { + function onChangePredicate(event: React.ChangeEvent<HTMLInputElement>): void { const newpredicate = event.target.value; if (!isPredicateValid(newpredicate)) throw new Error('The chosen predicate is invalid'); @@ -156,13 +157,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { function onChangeCompareValue(event: React.ChangeEvent<HTMLInputElement>): void { setState((draft) => { draft.compareValue = event.target.value; - console.log( - containsFilterTargetChosenAttribute(draft.attributeNameAndType), - isPredicateValid(draft.predicate), - isCompareValueTypeValid(draft.compareValue) - ); - - draft.isFilterButtonEnabled = isFilterConfigurationValid(draft); + draft.isFilterButtonEnabled = isFilterConfigurationValid(); return draft; }); } @@ -172,7 +167,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { * It checks if the input is correct and sends the information for the filters to the PaohvisViewModelImpl. */ function onClickFilterPaohvisButton(): void { - if (!isFilterConfigurationValid(state)) throw new Error('Error: chosen attribute of predicate-value is invalid.'); + if (!isFilterConfigurationValid()) throw new Error('Error: chosen attribute of predicate-value is invalid.'); props.filterPaohvis(isTargetEntity, state.filterTarget, state.attributeNameAndType, state.predicate, state.compareValue); } @@ -197,7 +192,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { * Checks if the filter configuration is valid. * @returns {boolean} true if the filter configuration is valid. */ - function isFilterConfigurationValid(state: PaohvisFilterState): boolean { + function isFilterConfigurationValid(): boolean { return ( containsFilterTargetChosenAttribute(state.attributeNameAndType) && isPredicateValid(state.predicate) && @@ -314,81 +309,66 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => { // // Check if the given entity or relation is in the queryResult - let attributeNameMenuItems: ReactElement[] = useMemo(() => { - if (state.attributeNamesOptions.length > 0) { - return state.attributeNamesOptions.map((attributeNameAndType, i) => { - const attributeName = attributeNameAndType.split(':')[0]; - return ( - <option key={attributeName + i} value={attributeNameAndType}> - {attributeNameAndType} - </option> - ); - }); - } else - return [ - <option key="placeholder" value="" disabled> - First select an entity/relation with one or more attributes - </option>, - ]; - }, [state.attributeNamesOptions]); - - let predicateTypeList: ReactElement[] = useMemo(() => { - if (state.predicateTypeList.length > 0) { - return state.predicateTypeList.map((predicate, i) => ( - <option key={predicate + i} value={predicate}> - {predicate} - </option> - )); - } else - return [ - <option key="placeholder" value="" disabled> - First select an attribute - </option>, - ]; - }, [state.predicateTypeList]); + let attributeNameMenuItems: ReactElement[] = []; + if (state.attributeNamesOptions.length > 0) { + attributeNameMenuItems = state.attributeNamesOptions.map((attributeNameAndType) => { + const attributeName = attributeNameAndType.split(':')[0]; + return ( + <MenuItem key={attributeName} value={attributeNameAndType}> + {attributeNameAndType} + </MenuItem> + ); + }); + } else + attributeNameMenuItems = [ + <MenuItem key="placeholder" value="" disabled> + First select an entity/relation with one or more attributes + </MenuItem>, + ]; + + let predicateTypeList: ReactElement[] = []; + if (state.predicateTypeList.length > 0) { + predicateTypeList = state.predicateTypeList.map((predicate) => ( + <MenuItem key={predicate} value={predicate}> + {predicate} + </MenuItem> + )); + } else + predicateTypeList = [ + <MenuItem key="placeholder" value="" disabled> + First select an attribute + </MenuItem>, + ]; return ( - <div className="card w-full"> - <div className="card-body w-full p-4"> - <h2 className="card-title">PAOHVis filters{props.axis}:</h2> - <div> - <p>{state.filterTarget}</p> - <div className="flex flex-col gap-3"> - <div className="form-control"> - <label className="label">Attribute</label> - <select - id="standard-select-entity" - className="select w-full" - value={state.attributeNameAndType} - onChange={onChangeAttributeName} - > - {attributeNameMenuItems} - </select> - </div> - <div className="form-control"> - <label className="label">Relation</label> - <select id="standard-select-relation" className="select w-full" value={state.predicate} onChange={onChangePredicate}> - {predicateTypeList} - </select> - </div> - <div className="form-control"> - <label className="label">Value</label> - <input - id="standard-select-relation" - className="select w-full" - value={state.compareValue} - onChange={onChangeCompareValue} - ></input> - </div> - - <div className="btn-group w-full flex flex-col gap-2"> - <button className="btn btn-primary w-full" disabled={!state.isFilterButtonEnabled} onClick={onClickFilterPaohvisButton}> - Apply filter - </button> - <button className="btn btn-outline w-full" onClick={onClickResetFilter}> - Reset filter - </button> - </div> + <div className={styles.container}> + <p className={styles.title}>PAOHVis filters{props.axis}:</p> + <div className={styles.selectContainer}> + <p className={styles.subtitle}>{state.filterTarget}</p> + <div className={styles.selectGroup}> + <TextField + select + id="standard-select-entity" + label="Attribute" + value={state.attributeNameAndType} + onChange={onChangeAttributeName} + > + {attributeNameMenuItems} + </TextField> + <TextField select id="standard-select-relation" label="Relation" value={state.predicate} onChange={onChangePredicate}> + {predicateTypeList} + </TextField> + <TextField id="standard-select-relation" label="Value" value={state.compareValue} onChange={onChangeCompareValue}> + {} + </TextField> + + <div className={styles.selectButtonGroup}> + <Button variant="contained" disabled={!state.isFilterButtonEnabled} onClick={onClickFilterPaohvisButton}> + <span style={{ fontWeight: 'bold' }}>Apply filter</span> + </Button> + <Button variant="contained" onClick={onClickResetFilter}> + <span style={{ fontWeight: 'bold' }}>Reset filter</span> + </Button> </div> </div> </div> diff --git a/libs/shared/lib/vis/paohvis/paohvis.stories.tsx b/libs/shared/lib/vis/paohvis/paohvis.stories.tsx index f9935803d..a06fae382 100644 --- a/libs/shared/lib/vis/paohvis/paohvis.stories.tsx +++ b/libs/shared/lib/vis/paohvis/paohvis.stories.tsx @@ -1,4 +1,5 @@ -import { assignNewGraphQueryResult, graphQueryResultSlice, schemaSlice, setSchema } from '../../data-access/store'; +import { assignNewGraphQueryResult, colorPaletteConfigSlice, graphQueryResultSlice, schemaSlice, setSchema } from '../../data-access/store'; +import { GraphPolarisThemeProvider } from '../../data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; import { Meta, ComponentStory } from '@storybook/react'; import { Provider } from 'react-redux'; @@ -23,7 +24,9 @@ const Component: Meta<typeof Paohvis> = { height: '95vh', }} > - <Provider store={Mockstore}>{story()}</Provider> + <Provider store={Mockstore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> </div> ), ], @@ -32,6 +35,7 @@ const Component: Meta<typeof Paohvis> = { const Mockstore = configureStore({ reducer: { schema: schemaSlice.reducer, + colorPaletteConfig: colorPaletteConfigSlice.reducer, graphQueryResult: graphQueryResultSlice.reducer, }, }); diff --git a/libs/shared/lib/vis/paohvis/paohvis.tsx b/libs/shared/lib/vis/paohvis/paohvis.tsx index d3c435dcc..4c2ab978d 100644 --- a/libs/shared/lib/vis/paohvis/paohvis.tsx +++ b/libs/shared/lib/vis/paohvis/paohvis.tsx @@ -579,60 +579,63 @@ export const PaohVis = (props: Props) => { // returns the whole PAOHvis visualisation panel return ( <div className={styles.container}> - <MakePaohvisMenu // render the MakePAOHvisMenu - makePaohvis={onClickMakeButton} - /> - <div className="w-full h-full"> - <div className="w-full h-full" onMouseMove={onMouseMoveToolTip}> - {tableMessage} - <div className="w-full h-full"> - <svg - ref={svgRef} - style={{ - width: tableWidthWithExtraColumnLabelWidth, - height: yOffset + (data.rowLabels.length + 1) * props.rowHeight, - }} - > - <RowLabelColumn // render the PAOHvis itself - onMouseEnter={onMouseEnterRow} - onMouseLeave={onMouseLeaveRow} - titles={data.rowLabels} - width={rowLabelColumnWidth} - rowHeight={props.rowHeight} // viewModel.rowHeight? - yOffset={yOffset} - /> - {hyperEdgeRangeColumns} - </svg> + <div className={styles.visContainer}> + <div className={styles.full}> + <div className={styles.full} onMouseMove={onMouseMoveToolTip}> + <MakePaohvisMenu // render the MakePAOHvisMenu + makePaohvis={onClickMakeButton} + /> + {tableMessage} + <div className={styles.visContainerSvg}> + <svg + ref={svgRef} + style={{ + width: tableWidthWithExtraColumnLabelWidth, + height: yOffset + (data.rowLabels.length + 1) * props.rowHeight, + }} + > + <RowLabelColumn // render the PAOHvis itself + onMouseEnter={onMouseEnterRow} + onMouseLeave={onMouseLeaveRow} + titles={data.rowLabels} + width={rowLabelColumnWidth} + rowHeight={props.rowHeight} // viewModel.rowHeight? + yOffset={yOffset} + /> + {hyperEdgeRangeColumns} + </svg> + </div> + <Tooltip /> </div> - <Tooltip /> </div> - <VisConfigPanelComponent> - <PaohvisFilterComponent // render the PaohvisFilterComponent with all three different filter options - axis={FilterType.yaxis} - filterPaohvis={onClickFilterButton} - resetFilter={onClickResetButton} - entityVertical={viewModel.entityVertical} - entityHorizontal={viewModel.entityHorizontal} - relationName={viewModel.chosenRelation} - /> - <PaohvisFilterComponent - axis={FilterType.xaxis} - filterPaohvis={onClickFilterButton} - resetFilter={onClickResetButton} - entityVertical={viewModel.entityVertical} - entityHorizontal={viewModel.entityHorizontal} - relationName={viewModel.chosenRelation} - /> - <PaohvisFilterComponent - axis={FilterType.edge} - filterPaohvis={onClickFilterButton} - resetFilter={onClickResetButton} - entityVertical={viewModel.entityVertical} - entityHorizontal={viewModel.entityHorizontal} - relationName={viewModel.chosenRelation} - /> - </VisConfigPanelComponent> </div> + <VisConfigPanelComponent> + {configPanelMessage} + <PaohvisFilterComponent // render the PaohvisFilterComponent with all three different filter options + axis={FilterType.yaxis} + filterPaohvis={onClickFilterButton} + resetFilter={onClickResetButton} + entityVertical={viewModel.entityVertical} + entityHorizontal={viewModel.entityHorizontal} + relationName={viewModel.chosenRelation} + /> + <PaohvisFilterComponent + axis={FilterType.xaxis} + filterPaohvis={onClickFilterButton} + resetFilter={onClickResetButton} + entityVertical={viewModel.entityVertical} + entityHorizontal={viewModel.entityHorizontal} + relationName={viewModel.chosenRelation} + /> + <PaohvisFilterComponent + axis={FilterType.edge} + filterPaohvis={onClickFilterButton} + resetFilter={onClickResetButton} + entityVertical={viewModel.entityVertical} + entityHorizontal={viewModel.entityHorizontal} + relationName={viewModel.chosenRelation} + /> + </VisConfigPanelComponent> </div> ); }; diff --git a/libs/shared/lib/vis/rawjsonvis/rawjsonvis.stories.tsx b/libs/shared/lib/vis/rawjsonvis/rawjsonvis.stories.tsx index d8ffc3214..70492c16e 100644 --- a/libs/shared/lib/vis/rawjsonvis/rawjsonvis.stories.tsx +++ b/libs/shared/lib/vis/rawjsonvis/rawjsonvis.stories.tsx @@ -2,9 +2,16 @@ import React from 'react'; import { ComponentStory, Meta } from '@storybook/react'; import { RawJSONVis } from './rawjsonvis'; -import { assignNewGraphQueryResult, graphQueryResultSlice, resetGraphQueryResults, store } from '../../data-access/store'; +import { + assignNewGraphQueryResult, + colorPaletteConfigSlice, + graphQueryResultSlice, + resetGraphQueryResults, + store, +} from '../../data-access/store'; import { configureStore } from '@reduxjs/toolkit'; import { Provider } from 'react-redux'; +import { GraphPolarisThemeProvider } from '../../data-access/theme'; import { mockLargeQueryResults } from '../../mock-data/query-result'; const Component: Meta<typeof RawJSONVis> = { @@ -14,11 +21,18 @@ const Component: Meta<typeof RawJSONVis> = { */ title: 'Components/Visualizations/RawJSONVIS', component: RawJSONVis, - decorators: [(story) => <Provider store={Mockstore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; const Mockstore = configureStore({ reducer: { + colorPaletteConfig: colorPaletteConfigSlice.reducer, graphQueryResult: graphQueryResultSlice.reducer, }, }); diff --git a/libs/shared/lib/vis/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/rawjsonvis/rawjsonvis.tsx index a90933c95..302335135 100644 --- a/libs/shared/lib/vis/rawjsonvis/rawjsonvis.tsx +++ b/libs/shared/lib/vis/rawjsonvis/rawjsonvis.tsx @@ -1,4 +1,5 @@ -import { useAppDispatch, useGraphQueryResult } from '../../data-access/store'; +import { changePrimary, useAppDispatch, useGraphQueryResult } from '../../data-access/store'; +import { useTheme } from '@mui/material'; import React, { useEffect, useState } from 'react'; import ReactJSONView from 'react-json-view'; @@ -12,6 +13,7 @@ export interface RawJSONVisProps { export const RawJSONVis = React.memo((props: RawJSONVisProps) => { const graphQueryResult = useGraphQueryResult(); const dispatch = useAppDispatch(); + const theme = useTheme(); console.log('update rawjson'); useEffect(() => { @@ -28,6 +30,12 @@ export const RawJSONVis = React.memo((props: RawJSONVisProps) => { return ( <div className="overflow-scroll"> + <input + onChange={(v) => dispatch(changePrimary({ main: v.currentTarget.value }))} + type="color" + name="head" + value={theme.palette.primary.main} + /> {loading && ( <div style={{ diff --git a/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.stories.tsx b/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.stories.tsx index 57c317575..448b1edf9 100644 --- a/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.stories.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.stories.tsx @@ -1,6 +1,7 @@ -import { assignNewGraphQueryResult, graphQueryResultSlice, schemaSlice, setSchema } from '../../data-access/store'; +import { assignNewGraphQueryResult, colorPaletteConfigSlice, graphQueryResultSlice, schemaSlice, setSchema } from '../../data-access/store'; +import { GraphPolarisThemeProvider } from '../../data-access/theme'; import { configureStore } from '@reduxjs/toolkit'; -import { Meta } from '@storybook/react'; +import { Meta, ComponentStory } from '@storybook/react'; import { Provider } from 'react-redux'; import SemanticSubstrates from './semanticsubstrates'; @@ -15,12 +16,19 @@ const Component: Meta<typeof SemanticSubstrates> = { */ title: 'Components/Visualizations/SemanticSubstrates', component: SemanticSubstrates, - decorators: [(story) => <Provider store={Mockstore}>{story()}</Provider>], + decorators: [ + (story) => ( + <Provider store={Mockstore}> + <GraphPolarisThemeProvider>{story()}</GraphPolarisThemeProvider> + </Provider> + ), + ], }; const Mockstore = configureStore({ reducer: { schema: schemaSlice.reducer, + colorPaletteConfig: colorPaletteConfigSlice.reducer, graphQueryResult: graphQueryResultSlice.reducer, }, }); diff --git a/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.tsx b/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.tsx index 3cf14ed04..b05dcb58c 100644 --- a/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/semanticsubstrates.tsx @@ -1,3 +1,4 @@ +import { useTheme } from '@mui/material'; import { useAppDispatch, useGraphQueryResult, useSchemaGraph } from '@graphpolaris/shared/lib/data-access/store'; import { useEffect, useRef, useState } from 'react'; import { AxisLabel, EntitiesFromSchema, MinMaxType, PlotSpecifications, PlotType, RelationType } from './Types'; @@ -7,6 +8,7 @@ import AddPlotButtonComponent from './subcomponents/AddPlotButtonComponent'; import SVGCheckboxesWithSemanticSubstrLabel from './subcomponents/SVGCheckBoxComponent'; import AddPlotPopup from './subcomponents/AddPlotPopup'; import VisConfigPanelComponent from '../shared/VisConfigPanel/VisConfigPanel'; +import FSSConfigPanel from './configpanel/SemanticSubstrateConfigPanel'; import Plot from './subcomponents/PlotComponent'; import LinesBetweenPlots from './subcomponents/LinesBetweenPlotsComponent'; import Color from 'color'; @@ -74,6 +76,8 @@ const relationScaleCalculation: (x: number) => number = (x: number) => { }; export const SemanticSubstrates = () => { + const dispatch = useAppDispatch(); + const theme = useTheme(); const graphQueryResult = useGraphQueryResult(); const schema = useSchemaGraph(); const [entitiesFromSchema, setEntitiesFromSchema] = useState<EntitiesFromSchema>({ entityNames: [], attributesPerEntity: {} }); diff --git a/libs/shared/lib/vis/semanticsubstrates/subcomponents/AddPlotPopup.tsx b/libs/shared/lib/vis/semanticsubstrates/subcomponents/AddPlotPopup.tsx index 0ea7c200d..d770915c3 100644 --- a/libs/shared/lib/vis/semanticsubstrates/subcomponents/AddPlotPopup.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/subcomponents/AddPlotPopup.tsx @@ -8,6 +8,7 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { Button, MenuItem, Popover, TextField } from '@mui/material'; import React, { ReactElement } from 'react'; import { EntitiesFromSchema } from '../Types'; import OptimizedAutocomplete from './OptimizedAutocomplete'; @@ -124,53 +125,69 @@ export default class AddPlotPopup extends React.Component<AddPlotPopupProps, Add let entityMenuItems: ReactElement[]; if (this.props.entitiesFromSchema.entityNames.length > 0) entityMenuItems = entitiesFromSchema.entityNames.map((entity) => ( - <option key={entity} value={entity}> + <MenuItem key={entity} value={entity}> {entity} - </option> + </MenuItem> )); else entityMenuItems = [ - <option key="placeholder" value="" disabled> + <MenuItem key="placeholder" value="" disabled> No schema data available - </option>, + </MenuItem>, ]; // Retrieve the possible attributeName options. If none available, set helper message. let attributeNameMenuItems: ReactElement[]; if (this.attributeNameOptions.length > 0) attributeNameMenuItems = this.attributeNameOptions.map((attribute) => ( - <option key={attribute} value={attribute}> + <MenuItem key={attribute} value={attribute}> {attribute} - </option> + </MenuItem> )); else attributeNameMenuItems = [ - <option key="placeholder" value="" disabled> + <MenuItem key="placeholder" value="" disabled> First select an entity - </option>, + </MenuItem>, ]; return ( <div> - <dialog open={open} onClose={handleClose} id={'simple-addplot-popover'}> + <Popover + id={'simple-addplot-popover'} + open={open} + anchorEl={anchorEl} + onClose={handleClose} + anchorOrigin={{ + vertical: 'top', + horizontal: 'center', + }} + transformOrigin={{ + vertical: 'top', + horizontal: 'center', + }} + > <div style={{ padding: 20, paddingTop: 10, display: 'flex' }}> - <div> - <label>Entity</label> - <input id="standard-select-entity" style={{ minWidth: 120 }} value={this.state.entity} onChange={this.entityChanged}> - {entityMenuItems} - </input> - </div> - <div> - <label>Attribute</label> - <input - id="standard-select-attribute" - style={{ minWidth: 120, marginLeft: 20, marginRight: 20 }} - value={this.state.attributeName} - onChange={this.attrNameChanged} - > - {attributeNameMenuItems} - </input> - </div> + <TextField + select + id="standard-select-entity" + style={{ minWidth: 120 }} + label="Entity" + value={this.state.entity} + onChange={this.entityChanged} + > + {entityMenuItems} + </TextField> + <TextField + select + id="standard-select-attribute" + style={{ minWidth: 120, marginLeft: 20, marginRight: 20 }} + label="Attribute" + value={this.state.attributeName} + onChange={this.attrNameChanged} + > + {attributeNameMenuItems} + </TextField> <OptimizedAutocomplete currentValue={this.attributeValue} options={this.possibleAttrValues} @@ -178,12 +195,12 @@ export default class AddPlotPopup extends React.Component<AddPlotPopupProps, Add useMaterialStyle={{ label: 'Value', helperText: '' }} /> <div style={{ height: 40, paddingTop: 10, marginLeft: 30 }}> - <button className="btn btn-outline" disabled={!this.state.isButtonEnabled} onClick={this.addPlotButtonClicked}> + <Button variant="contained" disabled={!this.state.isButtonEnabled} onClick={this.addPlotButtonClicked}> <span style={{ fontWeight: 'bold' }}>Add</span> - </button> + </Button> </div> </div> - </dialog> + </Popover> </div> ); } diff --git a/libs/shared/lib/vis/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx b/libs/shared/lib/vis/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx index c9fc977fe..47d3f8c03 100644 --- a/libs/shared/lib/vis/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx @@ -8,7 +8,17 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ - +import { + Autocomplete, + AutocompleteRenderGroupParams, + AutocompleteRenderInputParams, + ListSubheader, + TextField, + Typography, + makeStyles, + useMediaQuery, + useTheme, +} from '@mui/material'; import React from 'react'; import { VariableSizeList, ListChildComponentProps } from 'react-window'; import styles from './OptimizedAutocomplete.module.scss'; @@ -47,13 +57,56 @@ function useResetCache(data: any) { const ListboxComponent = React.forwardRef<HTMLDivElement>(function ListboxComponent(props: any, ref) { const { children, ...other } = props; const itemData = React.Children.toArray(children); + const theme = useTheme(); + const smUp = useMediaQuery(theme.breakpoints.up('sm'), { noSsr: true }); const itemCount = itemData.length; - const itemSize = 36; + const itemSize = smUp ? 36 : 48; + + const getChildSize = (child: React.ReactNode) => { + if (React.isValidElement(child) && child.type === ListSubheader) { + return 48; + } - return <div ref={ref}></div>; + return itemSize; + }; + + const getHeight = () => { + if (itemCount > 8) { + return 8 * itemSize; + } + return itemData.map(getChildSize).reduce((a, b) => a + b, 0); + }; + + const gridRef = useResetCache(itemCount); + + return ( + <div ref={ref}> + <OuterElementContext.Provider value={other}> + <VariableSizeList + itemData={itemData} + height={getHeight() + 2 * LISTBOX_PADDING} + width="100%" + ref={gridRef} + outerElementType={OuterElementType} + innerElementType="ul" + itemSize={(index: number) => getChildSize(itemData[index])} + overscanCount={5} + itemCount={itemCount} + itemKey={(index: number) => 'autolist-key' + index} + > + {renderRow} + </VariableSizeList> + </OuterElementContext.Provider> + </div> + ); }); -const renderGroup = (params: any) => [<div key={params.key}>{params.group}</div>, params.children]; +const renderGroup = (params: AutocompleteRenderGroupParams) => [ + <ListSubheader key={params.key} component="div"> + {params.group} + </ListSubheader>, + params.children, +]; type OptimizedAutocomplete = { currentValue: string; @@ -70,15 +123,35 @@ export default function OptimizedAutocomplete(props: OptimizedAutocomplete) { console.log(props); return ( - <input + <Autocomplete id="optimized-autocomplete" style={{ width: 200 }} + disableListWrap + autoHighlight className={styles.listbox} + ListboxComponent={ListboxComponent as React.ComponentType<React.HTMLAttributes<HTMLElement>>} + renderGroup={renderGroup} + options={props.options} + // groupBy={(option: string) => option[0].toUpperCase()} + renderInput={(params: AutocompleteRenderInputParams) => + props.useMaterialStyle != undefined ? ( + <TextField + {...params} + variant="standard" + // size="small" + label={props.useMaterialStyle.label} + helperText={props.useMaterialStyle.helperText} + /> + ) : ( + <div ref={params.InputProps.ref}> + <input style={{ width: 200 }} type="text" {...params.inputProps} autoFocus /> + </div> + ) + } // defaultValue={props.currentValue} placeholder={props.currentValue} // renderOption={(props, option, state) => <Typography noWrap>{option}</Typography>} - onChange={(e) => { - let value = e.target.value; + onChange={(_: React.ChangeEvent<any>, value: string | null) => { console.log(value); newValue = value || '?'; diff --git a/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotAxisLabelsComponent.tsx b/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotAxisLabelsComponent.tsx index 7a8693d39..e9adc8352 100644 --- a/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotAxisLabelsComponent.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotAxisLabelsComponent.tsx @@ -9,6 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ import React, { ReactElement } from 'react'; +import { Menu, MenuItem } from '@mui/material'; import styles from './PlotAxisLabelStyles.module.css'; /** Props of the axis labels component. */ @@ -68,13 +69,30 @@ export default class PlotAxisLabelsComponent extends React.Component<PlotAxisLab > {yAxisLabel} </text> - <div + <Menu id="simple-menu" + anchorEl={this.state.menuAnchor} + keepMounted // getContentAnchorEl={null} + anchorOrigin={ + this.state.menuOpenForAxis == 'x' ? { vertical: 'bottom', horizontal: 'center' } : { vertical: 'center', horizontal: 'right' } + } + transformOrigin={ + this.state.menuOpenForAxis == 'x' ? { vertical: 'top', horizontal: 'center' } : { vertical: 'center', horizontal: 'left' } + } + open={Boolean(this.state.menuAnchor)} + onClose={() => this.setState({ menuAnchor: null })} + transitionDuration={150} + PaperProps={{ + style: { + maxHeight: 48 * 4.5, // 48 ITEM_HEIGHT + }, + }} > {axisLabelOptions.map((option) => ( - <label + <MenuItem key={option} + selected={option == (this.state.menuOpenForAxis == 'x' ? xAxisLabel : yAxisLabel)} onClick={() => { this.setState({ menuAnchor: null }); @@ -82,9 +100,9 @@ export default class PlotAxisLabelsComponent extends React.Component<PlotAxisLab }} > {option} - </label> + </MenuItem> ))} - </div> + </Menu> </g> ); } diff --git a/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotTitleComponent.tsx b/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotTitleComponent.tsx index c69f9e5e5..6247214dd 100644 --- a/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotTitleComponent.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/subcomponents/PlotTitleComponent.tsx @@ -8,6 +8,7 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ +import { Menu, MenuItem } from '@mui/material'; import Color from 'color'; import React, { ReactElement, useState } from 'react'; import { EntitiesFromSchema } from '../Types'; @@ -171,10 +172,31 @@ export default function PlotTitleComponent(props: PlotTitleProps) { {renderAttributeValue(attrValueOffset)} - <div id="simple-menu"> + <Menu + id="simple-menu" + anchorEl={state.menuAnchor} + keepMounted + // getContentAnchorEl={null} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + transformOrigin={{ vertical: 'top', horizontal: 'center' }} + open={Boolean(state.menuAnchor)} + onClose={() => + setState({ + ...state, + menuAnchor: null, + }) + } + transitionDuration={150} + PaperProps={{ + style: { + maxHeight: 48 * 4.5, // 48 ITEM_HEIGHT + }, + }} + > {state.menuItems.map((option) => ( - <label + <MenuItem key={option} + selected={option == state.menuAnchor?.innerHTML} onClick={() => { setState({ ...state, @@ -186,9 +208,9 @@ export default function PlotTitleComponent(props: PlotTitleProps) { }} > {option} - </label> + </MenuItem> ))} - </div> + </Menu> </g> ); } diff --git a/libs/shared/lib/vis/semanticsubstrates/utils/CalcConnectionLinePositionsUseCase.tsx b/libs/shared/lib/vis/semanticsubstrates/utils/CalcConnectionLinePositionsUseCase.tsx index 4dabbf3e0..1961a6760 100644 --- a/libs/shared/lib/vis/semanticsubstrates/utils/CalcConnectionLinePositionsUseCase.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/utils/CalcConnectionLinePositionsUseCase.tsx @@ -8,7 +8,7 @@ import { RotateVectorByDeg } from '../utils/RotateVec'; import { XYPosition } from 'reactflow'; /** The return type for this usecase. controlPoint is used for the curvature of the line. */ -type ConnectionLinePositions = { +type ConnecionLinePositions = { start: XYPosition; end: XYPosition; controlPoint: XYPosition; @@ -25,9 +25,9 @@ export default class CalcConnectionLinePositionsUseCase { * @param {XYPosition} startNodePos The position of the start node. * @param {XYPosition} endNodePos The position of the end node. * @param {number} nodeRadius The node radius, used to calculate the start and end offset. - * @returns {ConnectionLinePositions} The positions for drawing the curved line. + * @returns {ConnecionLinePositions} The positions for drawing the curved line. */ - public static calculatePositions(startNodePos: XYPosition, endNodePos: XYPosition, nodeRadius: number): ConnectionLinePositions { + public static calculatePositions(startNodePos: XYPosition, endNodePos: XYPosition, nodeRadius: number): ConnecionLinePositions { // Calculate the control point for the quadratic curve path, see https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths const distance = CalcDistance(startNodePos, endNodePos); if (distance == 0) return this.returnStartPosition(startNodePos); @@ -62,7 +62,7 @@ export default class CalcConnectionLinePositionsUseCase { * @param {XYPosition} startNodePos The position of the start node. * @returns {ConnectionLinePosition} The positions for drawing the curved line. */ - private static returnStartPosition(startNodePos: XYPosition): ConnectionLinePositions { + private static returnStartPosition(startNodePos: XYPosition): ConnecionLinePositions { return { start: startNodePos, end: startNodePos, diff --git a/libs/shared/lib/vis/semanticsubstrates/utils/CalcEntityAttrNamesFromResultUseCase.tsx b/libs/shared/lib/vis/semanticsubstrates/utils/CalcEntityAttrNamesFromResultUseCase.tsx index b903d7d81..05dc2909b 100644 --- a/libs/shared/lib/vis/semanticsubstrates/utils/CalcEntityAttrNamesFromResultUseCase.tsx +++ b/libs/shared/lib/vis/semanticsubstrates/utils/CalcEntityAttrNamesFromResultUseCase.tsx @@ -4,6 +4,7 @@ * © Copyright Utrecht University (Department of Information and Computing Sciences) */ +import { SchemaFromBackend } from '@graphpolaris/shared/lib/schema'; import { EntitiesFromSchema } from '../Types'; import { GraphQueryResult } from '@graphpolaris/shared/lib/data-access'; diff --git a/libs/shared/tsconfig.json b/libs/shared/tsconfig.json index a4e0c9802..0f1e0dd82 100644 --- a/libs/shared/tsconfig.json +++ b/libs/shared/tsconfig.json @@ -26,10 +26,10 @@ "noImplicitOverride": false, "paths": { "@graphpolaris/shared/lib/*": ["./lib/*"] - }, - "types": ["node", "vite/client"] + } }, "exclude": ["dist", "build", "node_modules"], "include": ["src", "lib"], + "files": ["./node.d.ts"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/libs/shared/vite.config.ts b/libs/shared/vite.config.ts index 3e62b0fab..2f263c107 100644 --- a/libs/shared/vite.config.ts +++ b/libs/shared/vite.config.ts @@ -40,7 +40,16 @@ export default defineConfig({ resolve: { alias: { '@graphpolaris/shared/lib': path.resolve(__dirname, './lib'), - '@/': path.resolve(__dirname, './lib'), + }, + }, + test: { + environment: 'happy-dom', + deps: {}, + threads: true, + environmentOptions: { + jsdom: { + resources: 'usable', + }, }, }, }); diff --git a/libs/storybook/.storybook/preview.ts b/libs/storybook/.storybook/preview.ts index 99954be9b..8c2a141ca 100644 --- a/libs/storybook/.storybook/preview.ts +++ b/libs/storybook/.storybook/preview.ts @@ -1,6 +1,4 @@ import type { Preview } from '@storybook/react'; -import '../src/tailwind.css'; -import { withThemeByDataAttribute } from '@storybook/addon-styling'; const preview: Preview = { parameters: { @@ -14,16 +12,4 @@ const preview: Preview = { }, }; -export const decorators = [ - withThemeByDataAttribute({ - themes: { - graphpolarisWhite: 'graphpolarisWhite', - light: 'graphpolarisWhite', - dark: 'graphpolaris', - }, - defaultTheme: 'graphpolarisWhite', - attributeName: 'data-mode', - }), -]; - export default preview; diff --git a/libs/storybook/vite.config.ts b/libs/storybook/vite.config.ts index 279e2c0bc..04cdcde5d 100644 --- a/libs/storybook/vite.config.ts +++ b/libs/storybook/vite.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import sassDts from 'vite-plugin-sass-dts'; -import path from 'path'; // https://vitejs.dev/config/ export default defineConfig({ @@ -22,9 +21,4 @@ export default defineConfig({ ], }, }, - resolve: { - alias: { - '@graphpolaris/shared/lib': path.resolve(__dirname, '../../libs/shared/lib'), - }, - }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d998a0f4..73e36f4b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,13 +25,13 @@ importers: version: 8.0.3 prettier: specifier: latest - version: 3.0.1 + version: 3.0.0 turbo: specifier: latest - version: 1.10.12 + version: 1.10.8 vitest: specifier: ^0.29.2 - version: 0.29.4 + version: 0.29.4(happy-dom@8.9.0)(jsdom@21.1.1)(sass@1.59.3) apps/docs: dependencies: @@ -75,15 +75,18 @@ importers: '@graphpolaris/shared': specifier: workspace:* version: link:../../libs/shared + '@mui/base': + specifier: 5.0.0-alpha.118 + version: 5.0.0-alpha.118(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) '@mui/icons-material': specifier: ^5.11.11 version: 5.11.11(@mui/material@5.11.13)(@types/react@18.0.28)(react@18.2.0) + '@mui/material': + specifier: ^5.11.13 + version: 5.11.13(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^1.9.2 version: 1.9.3(react-redux@8.0.5)(react@18.2.0) - config: - specifier: workspace:* - version: link:../../libs/config graphology: specifier: ^0.25.1 version: 0.25.1(graphology-types@0.24.7) @@ -109,24 +112,9 @@ importers: specifier: ^5.3.6 version: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) devDependencies: - '@iconify/json': - specifier: ^2.2.95 - version: 2.2.95 - '@iconify/react': - specifier: ^4.1.1 - version: 4.1.1(react@18.2.0) '@storybook/react': specifier: 7.0.0-rc.5 version: 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) - '@svgr/core': - specifier: ^8.0.0 - version: 8.0.0 - '@svgr/plugin-jsx': - specifier: ^8.0.1 - version: 8.0.1(@svgr/core@8.0.0) - '@tailwindcss/typography': - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.3.1) '@testing-library/react': specifier: 14.0.0 version: 14.0.0(react-dom@18.2.0)(react@18.2.0) @@ -151,15 +139,9 @@ importers: autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.4.21) - daisyui: - specifier: ^3.5.0 - version: 3.5.0(ts-node@10.9.1) graphology-types: specifier: ^0.24.7 version: 0.24.7 - npm: - specifier: ^9.8.1 - version: 9.8.1 postcss: specifier: ^8.4.21 version: 8.4.21 @@ -174,31 +156,13 @@ importers: version: 4.9.5 vite: specifier: ^4.2.0 - version: 4.2.1(@types/node@17.0.12)(sass@1.64.2) + version: 4.2.1(@types/node@17.0.12)(sass@1.59.3) vite-plugin-dts: specifier: ^2.1.0 version: 2.1.0(@types/node@17.0.12)(vite@4.2.1) - vite-plugin-sass-dts: - specifier: ^1.3.2 - version: 1.3.2(postcss@8.4.21)(prettier@2.8.8)(sass@1.64.2)(vite@4.2.1) vitest: specifier: ^0.29.2 - version: 0.29.4(sass@1.64.2) - - libs/config: - devDependencies: - '@tailwindcss/typography': - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.3.1) - daisyui: - specifier: ^3.5.0 - version: 3.5.0(ts-node@10.9.1) - postcss: - specifier: ^8.4.21 - version: 8.4.21 - tailwindcss: - specifier: ^3.3.1 - version: 3.3.1(postcss@8.4.21)(ts-node@10.9.1) + version: 0.29.4(happy-dom@8.9.0)(jsdom@21.1.1)(sass@1.59.3) libs/shared: dependencies: @@ -214,9 +178,21 @@ importers: '@emotion/styled': specifier: ^11.10.6 version: 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0) + '@mui/base': + specifier: 5.0.0-alpha.118 + version: 5.0.0-alpha.118(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) '@mui/icons-material': specifier: ^5.11.11 version: 5.11.11(@mui/material@5.11.13)(@types/react@18.0.28)(react@18.2.0) + '@mui/material': + specifier: ^5.11.9 + version: 5.11.13(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + '@mui/styled-engine-sc': + specifier: ^5.11.9 + version: 5.11.11(@types/styled-components@5.1.26)(styled-components@5.3.9) + '@mui/system': + specifier: ^5.11.9 + version: 5.11.13(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react@18.2.0) '@reactflow/node-resizer': specifier: ^2.0.1 version: 2.1.0(immer@10.0.2)(react-dom@18.2.0)(react@18.2.0) @@ -241,9 +217,6 @@ importers: color: specifier: ^4.2.3 version: 4.2.3 - config: - specifier: workspace:* - version: link:../config core-js: specifier: ^3.28.0 version: 3.29.1 @@ -335,15 +308,12 @@ importers: specifier: ^1.2.0 version: 1.2.0 devDependencies: - '@iconify/json': - specifier: ^2.2.95 - version: 2.2.95 '@storybook/addon-styling': specifier: ^0.3.2 - version: 0.3.2(@storybook/addons@6.5.16)(@storybook/api@6.5.16)(@storybook/components@6.5.16)(@storybook/core-events@6.5.16)(@storybook/manager-api@7.2.1)(@storybook/theming@6.5.16)(react-dom@18.2.0)(react@18.2.0)(sass-loader@13.3.2) + version: 0.3.2(@storybook/addons@6.5.16)(@storybook/api@6.5.16)(@storybook/components@6.5.16)(@storybook/core-events@6.5.16)(@storybook/manager-api@7.0.22)(@storybook/theming@6.5.16)(react-dom@18.2.0)(react@18.2.0)(sass-loader@13.2.2) '@storybook/preset-scss': specifier: ^1.0.3 - version: 1.0.3(css-loader@6.7.3)(sass-loader@13.3.2)(style-loader@3.3.2) + version: 1.0.3(css-loader@6.7.3)(sass-loader@13.2.2)(style-loader@3.3.2) '@storybook/react': specifier: 7.0.22 version: 7.0.22(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) @@ -398,9 +368,6 @@ importers: cytoscape-klay: specifier: ^3.1.4 version: 3.1.4(cytoscape@3.23.0) - daisyui: - specifier: ^3.5.0 - version: 3.5.0(ts-node@10.9.1) eslint: specifier: ^7.32.0 version: 7.32.0 @@ -412,7 +379,7 @@ importers: version: 8.7.0(eslint@7.32.0) eslint-config-turbo: specifier: latest - version: 1.10.12(eslint@7.32.0) + version: 1.10.9(eslint@7.32.0) eslint-plugin-import: specifier: 2.27.5 version: 2.27.5(@typescript-eslint/parser@5.52.0)(eslint-import-resolver-typescript@2.7.1)(eslint@7.32.0) @@ -470,24 +437,18 @@ importers: require-from-string: specifier: ^2.0.2 version: 2.0.2 - tailwindcss: - specifier: ^3.3.1 - version: 3.3.1(postcss@8.4.21)(ts-node@10.9.1) ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.13.0)(typescript@4.9.5) typescript: specifier: ^4.5.2 version: 4.9.5 - unplugin-icons: - specifier: ^0.16.5 - version: 0.16.5 url-loader: specifier: ^4.1.1 version: 4.1.1(webpack@5.77.0) vite: specifier: ^4.1.0 - version: 4.2.1(@types/node@18.13.0)(sass@1.59.3) + version: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) vite-plugin-dts: specifier: ^2.1.0 version: 2.1.0(@types/node@18.13.0)(vite@4.2.1) @@ -508,7 +469,7 @@ importers: version: link:../shared postcss-scss: specifier: ^4.0.6 - version: 4.0.6(postcss@8.4.27) + version: 4.0.6(postcss@8.4.21) react: specifier: ^18.2.0 version: 18.2.0 @@ -520,62 +481,53 @@ importers: version: link:../../apps/web devDependencies: '@storybook/addon-essentials': - specifier: 7.2.1 - version: 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) + specifier: next + version: 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-interactions': - specifier: 7.2.1 - version: 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) + specifier: next + version: 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': - specifier: ^7.2.1 - version: 7.2.1(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.0.22 + version: 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-styling': - specifier: ^1.3.5 - version: 1.3.5(less@4.1.3)(postcss@8.4.27)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.2)(webpack@5.77.0) + specifier: ^1.3.0 + version: 1.3.0(less@4.1.3)(postcss@8.4.21)(react-dom@18.2.0)(react@18.2.0)(sass@1.59.3)(webpack@5.77.0) '@storybook/blocks': - specifier: ^7.2.1 - version: 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.0.22 + version: 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/preset-scss': specifier: ^1.0.3 - version: 1.0.3(css-loader@6.7.3)(sass-loader@13.3.2)(style-loader@3.3.2) + version: 1.0.3(css-loader@6.7.3)(sass-loader@13.2.2)(style-loader@3.3.2) '@storybook/react': - specifier: ^7.2.1 - version: 7.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + specifier: ^7.0.22 + version: 7.0.22(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) '@storybook/react-vite': - specifier: ^7.2.1 - version: 7.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(vite@4.4.8) + specifier: ^7.0.22 + version: 7.0.22(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5)(vite@4.2.1) '@storybook/testing-library': - specifier: 0.2.0 - version: 0.2.0 + specifier: 0.1.0 + version: 0.1.0 '@types/node': - specifier: 20.4.6 - version: 20.4.6 + specifier: 18.13.0 + version: 18.13.0 '@types/react': - specifier: ^18.2.18 - version: 18.2.18 + specifier: ^18.0.28 + version: 18.0.28 '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.7 + specifier: ^18.0.11 + version: 18.0.11 '@vitejs/plugin-react': - specifier: ^4.0.4 - version: 4.0.4(vite@4.4.8) - autoprefixer: - specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.27) - config: - specifier: workspace:* - version: link:../config - daisyui: - specifier: ^3.5.0 - version: 3.5.0(ts-node@10.9.1) + specifier: ^3.1.0 + version: 3.1.0(vite@4.2.1) postcss: - specifier: ^8.4.27 - version: 8.4.27 + specifier: ^8.4.21 + version: 8.4.21 postcss-load-config: specifier: ^4.0.1 - version: 4.0.1(postcss@8.4.27)(ts-node@10.9.1) + version: 4.0.1(postcss@8.4.21)(ts-node@10.9.1) postcss-nesting: - specifier: ^12.0.0 - version: 12.0.0(postcss@8.4.27) + specifier: ^11.2.2 + version: 11.2.2(postcss@8.4.21) postcss-plugin: specifier: ^1.0.0 version: 1.0.0 @@ -583,29 +535,26 @@ importers: specifier: 15.8.1 version: 15.8.1 sass: - specifier: ^1.64.2 - version: 1.64.2 + specifier: ^1.59.3 + version: 1.59.3 sass-loader: - specifier: ^13.3.2 - version: 13.3.2(sass@1.64.2)(webpack@5.77.0) + specifier: ^13.2.2 + version: 13.2.2(sass@1.59.3)(webpack@5.77.0) storybook: - specifier: ^7.2.1 - version: 7.2.1 - tailwindcss: - specifier: ^3.3.3 - version: 3.3.3(ts-node@10.9.1) + specifier: ^7.0.22 + version: 7.0.22 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^4.9.3 + version: 4.9.5 vite: - specifier: ^4.4.8 - version: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + specifier: ^4.2.0 + version: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) vite-plugin-sass-dts: - specifier: ^1.3.9 - version: 1.3.9(postcss@8.4.27)(prettier@3.0.1)(sass@1.64.2)(vite@4.4.8) + specifier: ^1.3.2 + version: 1.3.2(postcss@8.4.21)(prettier@2.8.8)(sass@1.59.3)(vite@4.2.1) vite-tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0(typescript@5.1.6)(vite@4.4.8) + specifier: ^4.0.7 + version: 4.0.7(typescript@4.9.5)(vite@4.2.1) libs/workspace/eslint-config-custom: dependencies: @@ -620,7 +569,7 @@ importers: version: 8.7.0(eslint@7.32.0) eslint-config-turbo: specifier: latest - version: 1.10.12(eslint@7.32.0) + version: 1.10.9(eslint@7.32.0) eslint-plugin-react: specifier: 7.31.8 version: 7.31.8(eslint@7.32.0) @@ -633,11 +582,6 @@ importers: packages: - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: true - /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} @@ -645,19 +589,8 @@ packages: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 - /@antfu/install-pkg@0.1.1: - resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} - dependencies: - execa: 5.1.1 - find-up: 5.0.0 - dev: true - - /@antfu/utils@0.7.5: - resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} - dev: true - - /@aw-web-design/x-default-browser@1.4.126: - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} + /@aw-web-design/x-default-browser@1.4.88: + resolution: {integrity: sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA==} hasBin: true dependencies: default-browser-id: 3.0.0 @@ -666,36 +599,31 @@ packages: /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.18.6 - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + /@babel/code-frame@7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.18.6 /@babel/compat-data@7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.21.3: resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@5.5.0) @@ -705,31 +633,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/core@7.22.9: - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + /@babel/generator@7.21.3: + resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 @@ -743,17 +648,11 @@ packages: dependencies: '@babel/types': 7.22.5 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: - resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 '@babel/types': 7.22.5 dev: true @@ -770,121 +669,78 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.22.9): + /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-create-class-features-plugin@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: true - - /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.22.9): + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.3.2 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.9): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.3): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.1 + semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-explode-assignable-expression@7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 '@babel/types': 7.22.5 + dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: + '@babel/template': 7.20.7 '@babel/types': 7.22.5 - /@babel/helper-member-expression-to-functions@7.21.0: - resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + /@babel/helper-member-expression-to-functions@7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 @@ -896,42 +752,21 @@ packages: dependencies: '@babel/types': 7.22.5 - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-module-imports': 7.18.6 '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} @@ -939,74 +774,46 @@ packages: '@babel/types': 7.22.5 dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.9 + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true - /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} @@ -1014,15 +821,8 @@ packages: '@babel/types': 7.22.5 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 @@ -1039,43 +839,30 @@ packages: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-wrap-function@7.22.9: - resolution: {integrity: sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==} + /@babel/helper-wrap-function@7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 + '@babel/helper-function-name': 7.21.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color dev: true /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - - /@babel/helpers@7.22.6: - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.5 @@ -1088,722 +875,659 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.5 - dev: true - - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.6(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.3) dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.3) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.9): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.3) dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.3): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.3): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.22.9): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.7(@babel/core@7.22.9): - resolution: {integrity: sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.3): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.9): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.3): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.22.9): - resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} + /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.21.3) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.22.9): - resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.3): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.3): + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.3): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.22.5 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.3): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-optional-chaining@7.22.6(@babel/core@7.22.9): - resolution: {integrity: sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.3): + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.21.3): @@ -1816,16 +1540,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.21.3): resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} engines: {node: '>=6.9.0'} @@ -1836,283 +1550,260 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) + '@babel/types': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.3): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.3): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.22.9): + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3): resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.9) + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.3): + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} + /@babel/preset-env@7.21.4(@babel/core@7.21.3): + resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-generator-functions': 7.22.7(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-chaining': 7.22.6(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.3) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.3) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.3) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.3) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.3) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.3) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.3) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.3) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.3) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.3) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.3) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.3) + '@babel/preset-modules': 0.1.5(@babel/core@7.21.3) '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) - core-js-compat: 3.32.0 - semver: 6.3.1 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.3) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.3) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.3) + core-js-compat: 3.29.1 + semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-flow@7.18.6(@babel/core@7.22.9): + /@babel/preset-flow@7.18.6(@babel/core@7.21.3): resolution: {integrity: sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.22.9) + '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.3) dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.9): + /@babel/preset-modules@0.1.5(@babel/core@7.21.3): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.3) '@babel/types': 7.22.5 esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.21.0(@babel/core@7.22.9): + /@babel/preset-typescript@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.22.9) + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3) transitivePeerDependencies: - supports-color dev: true - /@babel/register@7.21.0(@babel/core@7.22.9): + /@babel/register@7.21.0(@babel/core@7.21.3): resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -2130,48 +1821,39 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.3 '@babel/types': 7.22.5 /@babel/traverse@7.21.3(supports-color@5.5.0): resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.3 '@babel/types': 7.22.5 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + /@babel/types@7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} @@ -2392,15 +2074,6 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): - resolution: {integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.13 - dependencies: - postcss-selector-parser: 6.0.13 - dev: true - /@deck.gl/aggregation-layers@8.9.19(@deck.gl/core@8.9.19)(@deck.gl/layers@8.9.19)(@luma.gl/core@8.5.20): resolution: {integrity: sha512-CYZy6dkOSXN+BWuR68YihomrLvEXdcAvUVM3gL5P4Dxi9ajdMKFBNo/34imHG/Bx5ukU2pxghDGrOmBXQ8XybQ==} peerDependencies: @@ -2761,19 +2434,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} - cpu: [arm] + cpu: [arm] os: [android] requiresBuild: true dev: true @@ -2788,15 +2452,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} @@ -2815,15 +2470,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} @@ -2842,15 +2488,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} @@ -2869,15 +2506,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} @@ -2896,15 +2524,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} @@ -2923,15 +2542,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.16.17: resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} @@ -2950,15 +2560,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.16.17: resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} @@ -2977,15 +2578,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} @@ -3004,15 +2596,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} @@ -3031,15 +2614,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} @@ -3058,15 +2632,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} @@ -3085,15 +2650,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} @@ -3112,15 +2668,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} @@ -3139,15 +2686,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} @@ -3166,15 +2704,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} @@ -3193,15 +2722,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} @@ -3220,15 +2740,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} @@ -3247,15 +2758,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} @@ -3274,15 +2776,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} @@ -3301,15 +2794,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} @@ -3328,15 +2812,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3357,34 +2832,6 @@ packages: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} dev: true - /@floating-ui/core@1.4.0: - resolution: {integrity: sha512-x5Ly1Eiyqt9aR38XzhraoWxgtQtvy3mVChWMZIr49XFyvIhNuqUxZKXBRoI5WiMRaaAZezCauJaEISu3z5y8sg==} - dependencies: - '@floating-ui/utils': 0.1.0 - dev: true - - /@floating-ui/dom@1.5.0: - resolution: {integrity: sha512-9jPin5dTlcEN+nXzBRhdreCzlJBIYWeMXpJJ5VnO1l9dLcP7uQNPbmwmIoHpHpH6GPYMYtQA7GfkvsSj/CQPwg==} - dependencies: - '@floating-ui/core': 1.4.0 - '@floating-ui/utils': 0.1.0 - dev: true - - /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.5.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@floating-ui/utils@0.1.0: - resolution: {integrity: sha512-ZSlli/beGZdvoqT3/Y9oOW79XSEpBfxt8UY6vjyWJW0B8d/M+MKlkQ3kBzLKDXaSsB84IVj6QntQfHLzesB4mA==} - dev: true - /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -3398,51 +2845,6 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - /@iconify/json@2.2.95: - resolution: {integrity: sha512-54c4P8Z2Zuvgd3EEhAGV/byNPJ1sjVHO+Sd94376//6heUW73x04TjtNAnYviFdypI8S7SdYCn+ncyW4JhOmiA==} - dependencies: - '@iconify/types': 2.0.0 - pathe: 1.1.0 - dev: true - - /@iconify/react@4.1.1(react@18.2.0): - resolution: {integrity: sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==} - peerDependencies: - react: '>=16' - dependencies: - '@iconify/types': 2.0.0 - react: 18.2.0 - dev: true - - /@iconify/types@2.0.0: - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - dev: true - - /@iconify/utils@2.1.7: - resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==} - dependencies: - '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.5 - '@iconify/types': 2.0.0 - debug: 4.3.4(supports-color@5.5.0) - kolorist: 1.8.0 - local-pkg: 0.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.0.1 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3512,7 +2914,7 @@ packages: chalk: 4.1.2 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.1.6)(vite@4.4.8): + /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@4.9.5)(vite@4.2.1): resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} peerDependencies: typescript: '>= 4.3.x' @@ -3524,9 +2926,9 @@ packages: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.1.6) - typescript: 5.1.6 - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + react-docgen-typescript: 2.2.2(typescript@4.9.5) + typescript: 4.9.5 + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) dev: true /@jridgewell/gen-mapping@0.1.1: @@ -3562,10 +2964,6 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: @@ -3894,7 +3292,7 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.3 - '@types/react': 18.2.18 + '@types/react': 18.0.28 react: 18.2.0 dev: true @@ -3971,6 +3369,30 @@ packages: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true + /@mui/base@5.0.0-alpha.118(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GAEpqhnuHjRaAZLdxFNuOf2GDTp9sUawM46oHZV4VnYPFjXJDkIYFWfIQLONb0nga92OiqS5DD/scGzVKCL0Mw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/is-prop-valid': 1.2.0 + '@mui/types': 7.2.3(@types/react@18.0.28) + '@mui/utils': 5.11.13(react@18.2.0) + '@popperjs/core': 2.11.6 + '@types/react': 18.0.28 + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + dev: false + /@mui/base@5.0.0-alpha.121(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-8nJRY76UqlJV+q/Yzo0tgGfPWEOa+4N9rjO81fMmcJqP0I6m54hLDXsjvMg4tvelY5eKHXUK6Tb7en+GHfTqZA==} engines: {node: '>=12.0.0'} @@ -4069,6 +3491,22 @@ packages: react: 18.2.0 dev: false + /@mui/styled-engine-sc@5.11.11(@types/styled-components@5.1.26)(styled-components@5.3.9): + resolution: {integrity: sha512-6+HsfcKHlhjQklDoEup7Itl+Xgn+BCsqEpIdIIhlxED4YlOZ38xghxIKrx78XFZznTorbhAspUgDDKIaB5vDMg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/styled-components': ^5.1.14 + styled-components: ^5.3.1 + peerDependenciesMeta: + '@types/styled-components': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@types/styled-components': 5.1.26 + prop-types: 15.8.1 + styled-components: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + dev: false + /@mui/styled-engine@5.11.11(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0): resolution: {integrity: sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==} engines: {node: '>=12.0.0'} @@ -4651,13 +4089,6 @@ packages: url: 0.11.0 dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@popperjs/core@2.11.6: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false @@ -4700,454 +4131,21 @@ packages: '@babel/runtime': 7.21.0 dev: false - /@radix-ui/number@1.0.1: - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true - - /@radix-ui/primitive@1.0.1: - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + /@reactflow/background@11.1.0-next.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OXCWt3rKz7/pctEqL2e82ziIJwfxGO9McC2a/JGso75rhCu+b7dWejhESNRS+9rgu1PdQpjDvB/wgQKIQqGoWA==} + peerDependencies: + react: '>=17' + react-dom: '>=17' dependencies: '@babel/runtime': 7.21.0 - dev: true - - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-context@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-direction@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-id@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.18)(react@18.2.0) - dev: true - - /@radix-ui/react-slot@1.0.2(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.18)(react@18.2.0) - '@types/react': 18.2.18 - react: 18.2.0 - dev: true - - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.21.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.18 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true - - /@reactflow/background@11.1.0-next.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OXCWt3rKz7/pctEqL2e82ziIJwfxGO9McC2a/JGso75rhCu+b7dWejhESNRS+9rgu1PdQpjDvB/wgQKIQqGoWA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@babel/runtime': 7.21.0 - '@reactflow/core': 11.4.0-next.1(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.6(immer@10.0.2)(react@18.2.0) - transitivePeerDependencies: - - immer - dev: false + '@reactflow/core': 11.4.0-next.1(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.3.6(immer@10.0.2)(react@18.2.0) + transitivePeerDependencies: + - immer + dev: false /@reactflow/background@11.2.0(immer@10.0.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==} @@ -5367,6 +4365,14 @@ packages: engines: {node: '>=14'} dev: false + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/pluginutils@5.0.2: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} @@ -5440,8 +4446,8 @@ packages: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@storybook/addon-actions@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-YUiKksgRIUm80eZacj/x14BEYCQY5iel1/Wo6mrTP7bVQrUNiCmnINSrup0DObg7lmIaq00h3ow7gKeYJ+x6zw==} + /@storybook/addon-actions@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qEvhnGeFb9c2TXdSgcCm+LQsZC+8yj1xXv+xfXu/maEcf3DoFU7iF4pBQJRsmawLP+m/yNaXujUbg/aty4fSng==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5451,14 +4457,14 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 dequal: 2.0.3 lodash: 4.17.21 polished: 4.2.2 @@ -5468,16 +4474,11 @@ packages: react-inspector: 6.0.1(react@18.2.0) telejson: 7.0.4 ts-dedent: 2.2.0 - uuid: 9.0.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color + uuid-browser: 3.1.0 dev: true - /@storybook/addon-backgrounds@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-F+/eERFnCIjDaOkCbCS0erre1AbjsHoM0IdLu2sGIBwuroFwKYy/ijadSsJ1zk4eBqZFxdyN4CuMN6EsK1Xm+Q==} + /@storybook/addon-backgrounds@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vjuPvgZjM1IFVCMSvbrAPO0piY+xgzh5433JqZuYGnIPOtqLuRpq1/xE7aSMNKC7bXIczukydo184p+rfqUUgw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5487,27 +4488,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true - /@storybook/addon-controls@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ioILEP4wZo6n8ifr1b+o8xCdMVLWyhHqNWoQoBRixxWwpzR4/fHaKo7wBGSkOOWubkhen6wUMUuiJbDdoGyR7g==} + /@storybook/addon-controls@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dV7ljOjZsxtPJ4jlzurnEOQ15opPelKmcEAN6Tl0Id4gW0ouAkb7f++/TfSeI9+BDd0+JPvsw6w3SCCD0t+46A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5517,49 +4513,50 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.2.1 - '@storybook/core-events': 7.2.1 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.2.1 - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/blocks': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.0-rc.5 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.0-rc.5 + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - encoding - supports-color dev: true - /@storybook/addon-docs@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QlUM22wK0cE9glMRt1auP3BccjafdRvcsAnaLvDIL12HRaUqMpH6vvNN3A3MXo6XuzbOmDwAov5mXdCenpz02A==} + /@storybook/addon-docs@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MhxJmZ/Pxi57+SGhpKhrNMxeP4Bj5UM1dmHYk49cwOZBIG0NuWr8lOvMvL8tRjvq7u0jHKqNSa0reSPCBZvvxg==} peerDependencies: + '@storybook/mdx1-csf': '>=1.0.0-0' react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@storybook/mdx1-csf': + optional: true dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.3) '@jest/transform': 29.5.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 7.2.1 - '@storybook/csf-tools': 7.2.1 + '@storybook/blocks': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/csf-plugin': 7.0.0-rc.5 + '@storybook/csf-tools': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.2.1 - '@storybook/postinstall': 7.2.1 - '@storybook/preview-api': 7.2.1 - '@storybook/react-dom-shim': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/mdx2-csf': 1.1.0-next.1 + '@storybook/node-logger': 7.0.0-rc.5 + '@storybook/postinstall': 7.0.0-rc.5 + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/react-dom-shim': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 fs-extra: 11.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5567,53 +4564,46 @@ packages: remark-slug: 6.1.0 ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - encoding - supports-color dev: true - /@storybook/addon-essentials@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+ICPYpuljKOoO1oTRfoax4n+3UD2/xAY8qQmAsRNN3xOBNJfdrsrCocrfY1j74xqoX+Zflvp5V481zq+MpP4XQ==} + /@storybook/addon-essentials@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dfBOZ5odCzki6F7tMcbX9x6fpuGsz4Owxw5iIL7FUCjxUrlClwTMpvwqqZniHPFAEWnISLcKgkPX7D7oRrWCig==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addon-actions': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-highlight': 7.2.1 - '@storybook/addon-measure': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.2.1 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.2.1 - '@storybook/preview-api': 7.2.1 + '@storybook/addon-actions': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-highlight': 7.0.0-rc.5 + '@storybook/addon-measure': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.0-rc.5 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.0-rc.5 + '@storybook/preview-api': 7.0.0-rc.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - encoding + - '@storybook/mdx1-csf' - supports-color dev: true - /@storybook/addon-highlight@7.2.1: - resolution: {integrity: sha512-6nNqpSMImn1mSGmEKF1o+C6o4lWJjduGYnCIO/ouXExaNLMrdcGKUEWrluABLOeDRPcNC9/EkuIEd8IsDnUX4A==} + /@storybook/addon-highlight@7.0.0-rc.5: + resolution: {integrity: sha512-Dx4xObuDMQHJ/Et83HuzXI1g4LDJmw36Zgke09wdNta7CbvJG3eyDyiA+JrHRs+4eXYi1IWDhztpM5uQ/Chtaw==} dependencies: - '@storybook/core-events': 7.2.1 + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.2.1 + '@storybook/preview-api': 7.0.0-rc.5 dev: true - /@storybook/addon-interactions@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-EuQMvigfEfQedNBojZhVs8x2mG8tL2n2yhtuYUsmHCmwAITcVxgPRV0xCgv676B8uRQvUru+cm9/nBIf2rUg/A==} + /@storybook/addon-interactions@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OPAp+0LS+vtFcBvfrY+5/xFyXfihLCWJauFmMI02g0tsHObB4Ua6juAnOYSwNSKdea0uW5GGTkVRxS7zEgqr3Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5623,31 +4613,27 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.0-rc.5 + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/instrumenter': 7.2.1 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/instrumenter': 7.0.0-rc.5 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 jest-mock: 27.5.1 polished: 4.2.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - encoding - supports-color dev: true - /@storybook/addon-links@7.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3UQfOZ1+wGlPsHWWjXjPskq6nsDXuB+8QvOcpqy51mK+5Zv/EQe386hWj9VUpjLNMxXarWETa5CXGfoQdFzJTA==} + /@storybook/addon-links@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3kXBXAgPWIcy+bIFOxt6ZzFaO8bM4aTjtqN7Wdk3QtRY5Yrfpmfx/zmDByvmLZwj50HvvWq05rb/vE2ahtlm2A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5657,22 +4643,22 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.22 + '@storybook/core-events': 7.0.22 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/router': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.22 + '@storybook/router': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.22 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3Rq/B3Iurbo5dZvUN735GHK+9EDm0xw+liK0PdeYvl21/RkXTV+a4aBcWyyeWwwu1S7pdK1B/0WEc9d5Lot8sA==} + /@storybook/addon-measure@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-m9CCcMpSrV7psZ9z6FaekdY0m7XNh+XRpiLLWn/TwQONHrUb0UBQGKloITNKE4QxCSDKpqCOUl/yJTxkCRCsrg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5682,25 +4668,19 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/types': 7.0.0-rc.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tiny-invariant: 1.3.1 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true - /@storybook/addon-outline@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-v2dYDhfSzV8Nsi1pmjcLEOHGJLlUnpnSXlQymb338YJEFKP2G5ylHzKAHG16MmzKeZZd3rthTB0246SFCyf0hg==} + /@storybook/addon-outline@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CkwW6b9gzIqQFw68cdAYbaY15DzLhBSpCRsccl/Mnm83xxm2MeC3Z5yxvi+3fGyuV6iyJxDsyxn4y4MD/Zho9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5710,24 +4690,19 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/types': 7.0.0-rc.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true - /@storybook/addon-styling@0.3.2(@storybook/addons@6.5.16)(@storybook/api@6.5.16)(@storybook/components@6.5.16)(@storybook/core-events@6.5.16)(@storybook/manager-api@7.2.1)(@storybook/theming@6.5.16)(react-dom@18.2.0)(react@18.2.0)(sass-loader@13.3.2): + /@storybook/addon-styling@0.3.2(@storybook/addons@6.5.16)(@storybook/api@6.5.16)(@storybook/components@6.5.16)(@storybook/core-events@6.5.16)(@storybook/manager-api@7.0.22)(@storybook/theming@6.5.16)(react-dom@18.2.0)(react@18.2.0)(sass-loader@13.2.2): resolution: {integrity: sha512-ztKy9uU2yKBtvBp4/Km4LD1JCNNFHpXS33LjbeIfho0toRv100g8tUojrdnoRX1b2KVK6cqep5mJV0z2ak9hIQ==} peerDependencies: '@storybook/addons': ^6.5.8 @@ -5754,68 +4729,59 @@ packages: '@storybook/api': 6.5.16(react-dom@18.2.0)(react@18.2.0) '@storybook/components': 6.5.16(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 6.5.16 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - sass-loader: 13.3.2(sass@1.59.3)(webpack@5.77.0) + sass-loader: 13.2.2(sass@1.59.3)(webpack@5.77.0) dev: true - /@storybook/addon-styling@1.3.5(less@4.1.3)(postcss@8.4.27)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.2)(webpack@5.77.0): - resolution: {integrity: sha512-W0oejixqUEd2yhy3ZAu9urKJZNCLrRFwpz7JD7OgN9HiUefLw3Rn2NHeP7v4Q1oznIxpYcsgYFzv10zX21Mq5w==} - hasBin: true + /@storybook/addon-styling@1.3.0(less@4.1.3)(postcss@8.4.21)(react-dom@18.2.0)(react@18.2.0)(sass@1.59.3)(webpack@5.77.0): + resolution: {integrity: sha512-+Ak9+SysMepRdXGlqDBlhR4cOSDCFEIfGuOW7nyA5eOgHi0IyTg9M+yfBgHVru7dEh+rq47XTVr44UhsWd4xgA==} peerDependencies: - less: ^3.5.0 || ^4.0.0 - postcss: ^7.0.0 || ^8.0.1 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - webpack: ^5.0.0 peerDependenciesMeta: - less: - optional: true - postcss: - optional: true react: optional: true react-dom: optional: true - webpack: - optional: true dependencies: - '@babel/template': 7.22.5 + '@babel/template': 7.20.7 '@babel/types': 7.22.5 '@storybook/api': 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/components': 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.0.22 '@storybook/core-events': 7.0.22 + '@storybook/csf-tools': 7.0.22 '@storybook/manager-api': 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/node-logger': 7.0.22 '@storybook/preview-api': 7.0.22 '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) '@storybook/types': 7.0.22 css-loader: 6.7.3(webpack@5.77.0) - less: 4.1.3 less-loader: 11.1.0(less@4.1.3)(webpack@5.77.0) - postcss: 8.4.27 - postcss-loader: 7.3.0(postcss@8.4.27)(webpack@5.77.0) - prettier: 2.8.8 + postcss-loader: 7.3.0(postcss@8.4.21)(webpack@5.77.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + recast: 0.23.2 resolve-url-loader: 5.0.0 - sass-loader: 13.3.2(sass@1.64.2)(webpack@5.77.0) + sass-loader: 13.2.2(sass@1.59.3)(webpack@5.77.0) style-loader: 3.3.2(webpack@5.77.0) - webpack: 5.77.0(esbuild@0.18.17) transitivePeerDependencies: - encoding - fibers + - less - node-sass + - postcss - sass - sass-embedded - supports-color + - webpack dev: true - /@storybook/addon-toolbars@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SEDj9f0EgifPK/Eyh703N1tbk7SZ7yAZOnNUK8T0mwdKrMa7jskvYuift8iSnJA2ldp1siqwe1Obq+Oielp9hQ==} + /@storybook/addon-toolbars@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GErLxEBVh3HaQEvUNmKlNDcNuEYpGNVT1Nr1Tsc4J8EKG1ivEfQfVu6/5fduPZE8Vt1IUAzrVEp9NYzSELH49Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5825,22 +4791,17 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true - /@storybook/addon-viewport@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aHl3rCh4MNByfWVtjBzkwMtz0iHQHFhatWXVt7mQoTQFBbZHpeynKvLfKBprp+2whK9RoDHqBUjqGTZrECdpRA==} + /@storybook/addon-viewport@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EzjGyi0s6VvwZvCuN6E8zgc6RcIOUz85G1Zt5U59as4GwhvezwiJdM9IjtX0/I17hdKS7vL36Gli67PJZKb/Bw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5850,22 +4811,17 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) memoizerific: 1.11.3 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true /@storybook/addons@6.5.16(react-dom@18.2.0)(react@18.2.0): @@ -5933,23 +4889,57 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/blocks@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1fPsFC6n9R267KwxGHiL80OuIdMDRC9QuIW4sRF0tF/G/yvucbofySYRQl/Y8LjsMJq8D4NpG5xLsneSxMP5cg==} + /@storybook/blocks@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9ZGDExwA6DgR/BsFSk2aCe7p/AIIQAiCemV1W1Djp7lt6OOALWfLZ7r1sFUqY9ZgNkfD1N41JpmqJtPDLXejGQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/channels': 7.0.0-rc.5 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/components': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.0-rc.5 + '@storybook/csf': 0.1.1-next.0 + '@storybook/docs-tools': 7.0.0-rc.5 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.0-rc.5 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 + '@types/lodash': 4.14.191 + color-convert: 2.0.1 + dequal: 2.0.3 + lodash: 4.17.21 + markdown-to-jsx: 7.2.0(react@18.2.0) + memoizerific: 1.11.3 + polished: 4.2.2 + react: 18.2.0 + react-colorful: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + telejson: 7.0.4 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/blocks@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bVOouc2LCkfaQpymPX+PzVSGwlu7Nj52jnqZFBK84aRcX8JDhJdnZ4KCxyEfraBQRuywH36GIMrlhnZCf0w54A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.2.1 - '@storybook/client-logger': 7.2.1 - '@storybook/components': 7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.2.1 + '@storybook/channels': 7.0.22 + '@storybook/client-logger': 7.0.22 + '@storybook/components': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.22 '@storybook/csf': 0.1.0 - '@storybook/docs-tools': 7.2.1 + '@storybook/docs-tools': 7.0.22 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.2.1 - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/manager-api': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.22 + '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.22 '@types/lodash': 4.14.191 color-convert: 2.0.1 dequal: 2.0.3 @@ -5961,30 +4951,26 @@ packages: react-colorful: 5.6.1(react-dom@18.2.0)(react@18.2.0) react-dom: 18.2.0(react@18.2.0) telejson: 7.0.4 - tocbot: 4.21.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - encoding - supports-color dev: true - /@storybook/builder-manager@7.2.1: - resolution: {integrity: sha512-X8B1cUfDaTtsJY3xJNwPy6W4UN7LWXkKktJBoNUGESigQGKpAMvUAmABCZIjZD8GcdGMtU8y/fA7YimUpy/ZKQ==} + /@storybook/builder-manager@7.0.22: + resolution: {integrity: sha512-90u1TP8Z53lbwMUm/JblPMmK8RJxRAWnJnAcVNuMmIxJjbW2EvQMGkNMhetk47kfiDyUJV0n90+wiMc+/DkxKQ==} dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.2.1 - '@storybook/manager': 7.2.1 - '@storybook/node-logger': 7.2.1 + '@storybook/core-common': 7.0.22 + '@storybook/manager': 7.0.22 + '@storybook/node-logger': 7.0.22 '@types/ejs': 3.1.2 '@types/find-cache-dir': 3.2.1 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.17) + '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.17.12) browser-assert: 1.2.1 ejs: 3.1.9 - esbuild: 0.18.17 + esbuild: 0.17.12 esbuild-plugin-alias: 0.2.1 express: 4.18.2 find-cache-dir: 3.3.2 @@ -5996,8 +4982,8 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.2.1(typescript@5.1.6)(vite@4.4.8): - resolution: {integrity: sha512-D/RNcH6WAxMAMmC3w9wwgDbYUJ9SjSwc6NPcxGrKk9o0SWDsKWWx4r6mM0W5FJ7Wh11Ca46LLnPC3cFfEg4YDQ==} + /@storybook/builder-vite@7.0.22(typescript@4.9.5)(vite@4.2.1): + resolution: {integrity: sha512-Il+JtE9TDHxPJ88BmkNBb0DAd1nNShM+tTy2scwDI2GlYQYFVSuo7V0ZqMxztKfS5Wm0mNAnFUvG50uVMwF1Iw==} peerDependencies: '@preact/preset-vite': '*' typescript: '>= 4.3.x' @@ -6011,27 +4997,28 @@ packages: vite-plugin-glimmerx: optional: true dependencies: - '@storybook/channels': 7.2.1 - '@storybook/client-logger': 7.2.1 - '@storybook/core-common': 7.2.1 - '@storybook/csf-plugin': 7.2.1 + '@storybook/channel-postmessage': 7.0.22 + '@storybook/channel-websocket': 7.0.22 + '@storybook/client-logger': 7.0.22 + '@storybook/core-common': 7.0.22 + '@storybook/csf-plugin': 7.0.22 '@storybook/mdx2-csf': 1.0.0 - '@storybook/node-logger': 7.2.1 - '@storybook/preview': 7.2.1 - '@storybook/preview-api': 7.2.1 - '@storybook/types': 7.2.1 - '@types/find-cache-dir': 3.2.1 + '@storybook/node-logger': 7.0.22 + '@storybook/preview': 7.0.22 + '@storybook/preview-api': 7.0.22 + '@storybook/types': 7.0.22 browser-assert: 1.2.1 es-module-lexer: 0.9.3 express: 4.18.2 - find-cache-dir: 3.3.2 fs-extra: 11.1.1 - magic-string: 0.30.2 + glob: 8.1.0 + glob-promise: 6.0.2(glob@8.1.0) + magic-string: 0.27.0 remark-external-links: 8.0.0 remark-slug: 6.1.0 rollup: 3.20.0 - typescript: 5.1.6 - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + typescript: 4.9.5 + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) transitivePeerDependencies: - encoding - supports-color @@ -6059,6 +5046,26 @@ packages: telejson: 7.0.4 dev: true + /@storybook/channel-postmessage@7.0.7: + resolution: {integrity: sha512-XMtYfcaE0UoY/V7K1cTu9PcWETD4iyWb/Yswc4F9VrPw0Ui4UwGS1j4iaAu8DC06yyoJs4XvxYFBMlCQmKja6A==} + dependencies: + '@storybook/channels': 7.0.7 + '@storybook/client-logger': 7.0.7 + '@storybook/core-events': 7.0.7 + '@storybook/global': 5.0.0 + qs: 6.11.1 + telejson: 7.0.4 + dev: true + + /@storybook/channel-websocket@7.0.22: + resolution: {integrity: sha512-oxmUTWrwxzxBALuZhX84fgzc70oyjw2PC4s1OFT2mdm+wHfk72wKPBJxGnwPGFx+CSmDU4u6s+HUtkQYB6WYdw==} + dependencies: + '@storybook/channels': 7.0.22 + '@storybook/client-logger': 7.0.22 + '@storybook/global': 5.0.0 + telejson: 7.0.4 + dev: true + /@storybook/channels@6.5.16: resolution: {integrity: sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==} dependencies: @@ -6075,35 +5082,25 @@ packages: resolution: {integrity: sha512-8mR30xBotnhc24GQpBp14bflvagkOnBXUhCTyiljULvkyo/bK0NE8IeSSto1FAIzPl6+s5/A0sePvLNRuj3gqw==} dev: true - /@storybook/channels@7.2.1: - resolution: {integrity: sha512-3ZogzjwlFG+oarwnI7TTvWvHVOUtJbjrgZkM5QuLMlxNzIR1XuBY8f01yf4K8+VpdNy9DY+7Q/j6tBThfwYvpA==} - dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/core-events': 7.2.1 - '@storybook/global': 5.0.0 - qs: 6.11.1 - telejson: 7.0.4 - tiny-invariant: 1.3.1 + /@storybook/channels@7.0.7: + resolution: {integrity: sha512-Om4ovBLNw8pVrBu83MpOKgAuGO9Dpr1Coh2qp8t64WRPkejX1mxOY9IgH723//zH3igx8LCkf9rvBvcrsyaScQ==} dev: true - /@storybook/cli@7.2.1: - resolution: {integrity: sha512-rPZDUvM0FRHZU4Wcm0ASOr/0xZq/6uySulqpLgoSkeZIC0xLXh/bI6YoDrD9UJV6GIRiqHMWMdxWd1e+TH8XHg==} + /@storybook/cli@7.0.22: + resolution: {integrity: sha512-tSThszrZjI4vffYn8qGImoyM6jtKYlftlJfmh/U55jA+0uMENKIN/3iQhiFhc2UgwSYLeg1dCd/RHNAwiK6Xaw==} hasBin: true dependencies: - '@babel/core': 7.22.9 - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/core': 7.21.3 + '@babel/preset-env': 7.21.4(@babel/core@7.21.3) '@ndelangen/get-tarball': 3.0.7 - '@storybook/codemod': 7.2.1 - '@storybook/core-common': 7.2.1 - '@storybook/core-server': 7.2.1 - '@storybook/csf-tools': 7.2.1 - '@storybook/node-logger': 7.2.1 - '@storybook/telemetry': 7.2.1 - '@storybook/types': 7.2.1 + '@storybook/codemod': 7.0.22 + '@storybook/core-common': 7.0.22 + '@storybook/core-server': 7.0.22 + '@storybook/csf-tools': 7.0.22 + '@storybook/node-logger': 7.0.22 + '@storybook/telemetry': 7.0.22 + '@storybook/types': 7.0.22 '@types/semver': 7.3.13 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 chalk: 4.1.2 commander: 6.2.1 cross-spawn: 7.0.3 @@ -6117,7 +5114,7 @@ packages: get-port: 5.1.1 giget: 1.1.2 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.22.9) + jscodeshift: 0.14.0(@babel/preset-env@7.21.4) leven: 3.1.0 ora: 5.4.1 prettier: 2.8.8 @@ -6125,7 +5122,8 @@ packages: puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 semver: 7.3.8 - simple-update-notifier: 2.0.0 + shelljs: 0.8.5 + simple-update-notifier: 1.1.0 strip-json-comments: 3.1.1 tempy: 1.0.1 ts-dedent: 2.2.0 @@ -6156,26 +5154,25 @@ packages: '@storybook/global': 5.0.0 dev: true - /@storybook/client-logger@7.2.1: - resolution: {integrity: sha512-Lyht/lJg2S65CXRy9rXAZXP/Mgye7jbi/aqQL8z9VRMGChbL+k/3pSZnXTTrD1OVSpCEr4UWA+9bStzT4VjtYA==} + /@storybook/client-logger@7.0.7: + resolution: {integrity: sha512-EclHjDs5HwHMKB4X2orn/KKA0DTIDmp4AXAUJGRfxb5ArpKEb7tXLHsgrRBlaoz1j5LAwKTmEyZOONh9G3etjg==} dependencies: '@storybook/global': 5.0.0 dev: true - /@storybook/codemod@7.2.1: - resolution: {integrity: sha512-R19fdPfslupxfbtyuGcRa2m1nCug2Zm8bS0GhnPtUl7eGBA4glcf4KKwP52pEqgJAsarfiL2cLSnN5wqQGQ/Sw==} + /@storybook/codemod@7.0.22: + resolution: {integrity: sha512-6saK3OtxSCtJEK2qwSBbzRne7VonpbPB4/PABNy431Ia8CHyk9wE2UbyK3g7WNpakkt06Y9yUpV3BGLD8FLa5g==} dependencies: - '@babel/core': 7.22.9 - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/core': 7.21.3 + '@babel/preset-env': 7.21.4(@babel/core@7.21.3) + '@babel/types': 7.21.4 '@storybook/csf': 0.1.0 - '@storybook/csf-tools': 7.2.1 - '@storybook/node-logger': 7.2.1 - '@storybook/types': 7.2.1 - '@types/cross-spawn': 6.0.2 + '@storybook/csf-tools': 7.0.22 + '@storybook/node-logger': 7.0.22 + '@storybook/types': 7.0.22 cross-spawn: 7.0.3 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.22.9) + jscodeshift: 0.14.0(@babel/preset-env@7.21.4) lodash: 4.17.21 prettier: 2.8.8 recast: 0.23.2 @@ -6201,17 +5198,17 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/components@7.0.22(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4cPepDONPY5b7A52atQs2JD3gZ+DYCABWKL9VmNEJtKDVoMs/IKKstnnUQ5QbOGsEIttdheawmyZoa6IWUsoQg==} + /@storybook/components@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zuKQ0+uOtRbmnF0trJ4LpWZ5w9Dzcs5dZjF3Uu4ka4F4vJ/fUWKL2spxAIsRalu2jyk2XVp6/mz/NiWQnrophw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.0.22 - '@storybook/csf': 0.1.0 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/csf': 0.1.1-next.0 '@storybook/global': 5.0.0 - '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.22 + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -6219,29 +5216,22 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/components@7.2.1(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7JuMT2yK9FGPu9hFCo38tC3FDyr/hJ3CQwU6dSR6E5rT9E658dq31Xl3y/fM5OMzl8MX8Off7TWiybHSuwYJTA==} + /@storybook/components@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4cPepDONPY5b7A52atQs2JD3gZ+DYCABWKL9VmNEJtKDVoMs/IKKstnnUQ5QbOGsEIttdheawmyZoa6IWUsoQg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.2.1 + '@storybook/client-logger': 7.0.22 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/icons': 1.1.2(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.22 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - debug - - supports-color dev: true /@storybook/core-client@7.0.0-rc.5: @@ -6258,13 +5248,6 @@ packages: '@storybook/preview-api': 7.0.22 dev: true - /@storybook/core-client@7.2.1: - resolution: {integrity: sha512-ujJdkaY6LXGCA8pqFBYTNMySmawm3GPcORYevkmM2edSbNKlu904+HvheRirajluzV7ropzGxUBZR9TMwgmDGg==} - dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/preview-api': 7.2.1 - dev: true - /@storybook/core-common@7.0.0-rc.5: resolution: {integrity: sha512-YlkcTcDx8bkOq3/STAuBkQOBQB5i0zLj2Zb0LUPzIDDBPZlGb3mJEla0UyJoMbP/E/QCq1K8pA1l9vtTK+ROJQ==} dependencies: @@ -6275,7 +5258,7 @@ packages: chalk: 4.1.2 esbuild: 0.16.17 esbuild-register: 3.4.2(esbuild@0.16.17) - file-system-cache: 2.3.0 + file-system-cache: 2.0.2 find-up: 5.0.0 fs-extra: 11.1.1 glob: 8.1.0 @@ -6303,7 +5286,7 @@ packages: chalk: 4.1.2 esbuild: 0.17.12 esbuild-register: 3.4.2(esbuild@0.17.12) - file-system-cache: 2.3.0 + file-system-cache: 2.0.2 find-up: 5.0.0 fs-extra: 11.1.1 glob: 8.1.0 @@ -6321,36 +5304,6 @@ packages: - supports-color dev: true - /@storybook/core-common@7.2.1: - resolution: {integrity: sha512-g1MQ04lgL16Ct89tPj6RSw72yd+a+ZJ4ceH3Ev+SmnU8efBLPmr6+G5Bx7+rY1W2c6NdpFgtSidjgOGqQ8gppw==} - dependencies: - '@storybook/node-logger': 7.2.1 - '@storybook/types': 7.2.1 - '@types/find-cache-dir': 3.2.1 - '@types/node': 16.18.16 - '@types/node-fetch': 2.6.4 - '@types/pretty-hrtime': 1.0.1 - chalk: 4.1.2 - esbuild: 0.18.17 - esbuild-register: 3.4.2(esbuild@0.18.17) - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.1.1 - glob: 10.3.3 - handlebars: 4.7.7 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.6.9 - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /@storybook/core-events@6.5.16: resolution: {integrity: sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==} dependencies: @@ -6365,33 +5318,33 @@ packages: resolution: {integrity: sha512-T7xiJTlNKrNxRCvJj/5RRukhFFJZqfmfF3DNi+P6YsLBE569GZ6y1eO58IalVzts4lB+LGYLAxkaWssNcZJ6Kg==} dev: true - /@storybook/core-events@7.2.1: - resolution: {integrity: sha512-EUXYb3gyQ2EzpDAWkgfoDl1EPabj3OE6+zntsD/gwvzQU85BTocs10ksnRyS55bfrQpYbf+Z+gw2CZboyagLgg==} + /@storybook/core-events@7.0.7: + resolution: {integrity: sha512-XNsR2RgaL2vBwuqsu+KA1DzGmB1UFfrAhpxhmyWTKDCniwtTLlaXgfKbqwcrOrPu/o1YswgIup/9UHepRHaf4A==} dev: true - /@storybook/core-server@7.2.1: - resolution: {integrity: sha512-jhS918Frl5j6LSB3x7qzHHuRL5e3RXqCkBQe5KtR2zXMgYlalSyGcX5uT8byWFznUsQIjGmUrf6ZIoKdRdslWg==} + /@storybook/core-server@7.0.22: + resolution: {integrity: sha512-RgMKAFtJ4rVUV8fBf1eWFtLliNW1x7T4nf9DzNCkeMkhWSi6hxGGB6WCRzNUIs0oibqul5FxWRGlvc3vJC39qw==} dependencies: - '@aw-web-design/x-default-browser': 1.4.126 + '@aw-web-design/x-default-browser': 1.4.88 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.2.1 - '@storybook/channels': 7.2.1 - '@storybook/core-common': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/builder-manager': 7.0.22 + '@storybook/core-common': 7.0.22 + '@storybook/core-events': 7.0.22 '@storybook/csf': 0.1.0 - '@storybook/csf-tools': 7.2.1 + '@storybook/csf-tools': 7.0.22 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.2.1 - '@storybook/node-logger': 7.2.1 - '@storybook/preview-api': 7.2.1 - '@storybook/telemetry': 7.2.1 - '@storybook/types': 7.2.1 + '@storybook/manager': 7.0.22 + '@storybook/node-logger': 7.0.22 + '@storybook/preview-api': 7.0.22 + '@storybook/telemetry': 7.0.22 + '@storybook/types': 7.0.22 '@types/detect-port': 1.3.2 '@types/node': 16.18.16 + '@types/node-fetch': 2.6.4 '@types/pretty-hrtime': 1.0.1 '@types/semver': 7.3.13 - better-opn: 3.0.2 + better-opn: 2.1.1 chalk: 4.1.2 cli-table3: 0.6.3 compression: 1.7.4 @@ -6401,6 +5354,7 @@ packages: globby: 11.1.0 ip: 2.0.0 lodash: 4.17.21 + node-fetch: 2.6.9 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 @@ -6408,9 +5362,7 @@ packages: semver: 7.3.8 serve-favicon: 2.5.0 telejson: 7.0.4 - tiny-invariant: 1.3.1 ts-dedent: 2.2.0 - util: 0.12.5 util-deprecate: 1.0.2 watchpack: 2.4.0 ws: 8.13.0 @@ -6421,26 +5373,50 @@ packages: - utf-8-validate dev: true - /@storybook/csf-plugin@7.2.1: - resolution: {integrity: sha512-qhxkKOsUjCS/hqsDgwgoM81ZXAXfTNrJJPHCs4Wa1dHoUVUn7rro7VANIO0GVNrRDnha3YR4fEmnD8kklLKmCQ==} + /@storybook/csf-plugin@7.0.0-rc.5: + resolution: {integrity: sha512-sgIEqV1MfhybvODcjtG0Ce/XlzWv2Sg5Prg5Qqsr5sMU7aET+yLHmr1umbM5L8ieRjsXS4CsxZCqZMrY9hDdNw==} dependencies: - '@storybook/csf-tools': 7.2.1 - unplugin: 1.4.0 + '@storybook/csf-tools': 7.0.0-rc.5 + unplugin: 0.10.2 transitivePeerDependencies: - supports-color dev: true - /@storybook/csf-tools@7.2.1: - resolution: {integrity: sha512-QqZOBd6lmhPoIBLutyYYJ3wBwEZF+fUjiL8vhw3lgq+Mrer14lmKrImKDSjd1PsqVbbGQEJZ4TAJHZc3vdQs0w==} + /@storybook/csf-plugin@7.0.22: + resolution: {integrity: sha512-1AipSDkb2qEPXnXeU335nqKm1+po1T2J5MqA8eV7q62y3HOziRZuLKrR2k9XvVrwfzMn+fy/CLE7LVQurOSDBQ==} dependencies: - '@babel/generator': 7.22.9 - '@babel/parser': 7.22.7 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@storybook/csf-tools': 7.0.22 + unplugin: 0.10.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf-tools@7.0.0-rc.5: + resolution: {integrity: sha512-DvcAygIZMZIL30j7WxMXeJ6a+A2/Y/FuatZItmW+3sNv0FK1J9wH2SKw7QjzEw75LsgjvO07lU2cgcsPDFhXoA==} + dependencies: + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/traverse': 7.21.3(supports-color@5.5.0) + '@babel/types': 7.21.4 + '@storybook/csf': 0.1.1-next.0 + '@storybook/types': 7.0.0-rc.5 + fs-extra: 11.1.1 + recast: 0.23.2 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf-tools@7.0.22: + resolution: {integrity: sha512-rRlacX+h5HMXhizlDJy6+ILDZblxLo9uZR1CktlC+FOmbEWlB8WIK036I/t6H64AO0doahqaVwwVExULuHf0SA==} + dependencies: + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/traverse': 7.21.3(supports-color@5.5.0) + '@babel/types': 7.21.4 '@storybook/csf': 0.1.0 - '@storybook/types': 7.2.1 + '@storybook/types': 7.0.22 fs-extra: 11.1.1 - prettier: 2.8.8 recast: 0.23.2 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -6498,70 +5474,44 @@ packages: - supports-color dev: true - /@storybook/docs-tools@7.2.1: - resolution: {integrity: sha512-snRdkqdaxAwlalIEtuElySzC68Lo/0KfrGRR6xSDxWIhjAPNqsRLPHEXlZrJ43Tn/V2oxCRU8eb21pP5/58krw==} - dependencies: - '@storybook/core-common': 7.2.1 - '@storybook/preview-api': 7.2.1 - '@storybook/types': 7.2.1 - '@types/doctrine': 0.0.3 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /@storybook/global@5.0.0: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true - /@storybook/icons@1.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rqbaVL2GoelYJzXWvZfAf8GAQw/IXEHM7baac1AzzsiabZv4ANlFImsWmT12GH8Q7v/B/4FJe0F2FQBd/1IX3w==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=17' - react-dom: '>=17' + /@storybook/instrumenter@7.0.0-rc.5: + resolution: {integrity: sha512-e9AtV1hNTs4ppmqKfst/cInmRnhkK9VcGf3xB/d9Qqm0Sqo+sNXu6ywK5KpAURdCzsUEOPXbJ9H52yTrU4f74A==} dependencies: - '@svgr/core': 5.5.0 - '@svgr/plugin-prettier': 5.5.0 - '@svgr/plugin-svgo': 5.5.0 - axios: 1.4.0 - chalk: 4.1.2 - dotenv: 16.3.1 - figma-api-exporter: 0.0.2 - fs-extra: 11.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - debug - - supports-color + '@storybook/channels': 7.0.0-rc.5 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/core-events': 7.0.0-rc.5 + '@storybook/global': 5.0.0 + '@storybook/preview-api': 7.0.0-rc.5 dev: true - /@storybook/instrumenter@7.2.1: - resolution: {integrity: sha512-eA1xke6JWhqDNhrn/qK3KxeE9yXySyzK1gUhu1jtIt8npenebZsuG5Uu/IzJkSB8se1F419Pmbcpeq0V8GA1lQ==} + /@storybook/instrumenter@7.0.7: + resolution: {integrity: sha512-0zE5lM3laKvCT4GW/XKKw8kakvI4catqK8PObZolRhfxbtGufW4VJZ2E8vXLtgA/+K3zikypjuWE6d45NLbh9w==} dependencies: - '@storybook/channels': 7.2.1 - '@storybook/client-logger': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/channels': 7.0.7 + '@storybook/client-logger': 7.0.7 + '@storybook/core-events': 7.0.7 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.2.1 + '@storybook/preview-api': 7.0.7 dev: true - /@storybook/manager-api@7.0.22(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7tvHZrrxp70zB4PyU+sIcBvBVq/dkhHkCsmuthRPW+OkZoolcXVU2xIbR62shOeaAobLbcJrlx5V2IFrLboZnA==} + /@storybook/manager-api@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MsNj/cPIOlL7HJ8ReYahUvJVfvZDtNfacUYSFuQjQwdnp0u3pbC5mGZPd32tAGj7lLaLzcqqo1yR+NAgwpZUBw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.0.22 - '@storybook/client-logger': 7.0.22 - '@storybook/core-events': 7.0.22 - '@storybook/csf': 0.1.0 + '@storybook/channels': 7.0.0-rc.5 + '@storybook/client-logger': 7.0.0-rc.5 + '@storybook/core-events': 7.0.0-rc.5 + '@storybook/csf': 0.1.1-next.0 '@storybook/global': 5.0.0 - '@storybook/router': 7.0.22(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.22 + '@storybook/router': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.0-rc.5 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -6573,20 +5523,20 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/manager-api@7.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-jRuYTrsNKq+g1u9kbQRvBsRKVITOdiNu9c633MeCH73oBVo8WNnZF/tW/ER86oTnru0H7EmRdgz3v9ft/wS2GQ==} + /@storybook/manager-api@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7tvHZrrxp70zB4PyU+sIcBvBVq/dkhHkCsmuthRPW+OkZoolcXVU2xIbR62shOeaAobLbcJrlx5V2IFrLboZnA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.2.1 - '@storybook/client-logger': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/channels': 7.0.22 + '@storybook/client-logger': 7.0.22 + '@storybook/core-events': 7.0.22 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/router': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 + '@storybook/router': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.22(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.22 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -6598,14 +5548,18 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/manager@7.2.1: - resolution: {integrity: sha512-wD2tRH8gLk2VNFMVcWmGZTXGTMNXdM3rnXiyKtmSVwFzacmOtLzEsCOprwI6WJpZv3v1vHY0s6idN9iadTVMhw==} + /@storybook/manager@7.0.22: + resolution: {integrity: sha512-5FXc5ordSWMVUcGNTWraCROJsA23gAUMraF2ns7KFnr15fMgJ9+/0UP/M7iYaZYZ5AcWwYO80efuogZyf5LrHQ==} dev: true /@storybook/mdx2-csf@1.0.0: resolution: {integrity: sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw==} dev: true + /@storybook/mdx2-csf@1.1.0-next.1: + resolution: {integrity: sha512-ONvFBZySHsBIkUYGrUM8FCG2tDKf663TIErztPSOghOpmBGyFLjSsXJHkNWiRi4c740PoemLqJd2XZZVlXRVLQ==} + dev: true + /@storybook/node-logger@7.0.0-rc.5: resolution: {integrity: sha512-3DpM988ndfbwc/03doFVP/HUJgoCp4eKVFMmSqnKVUd6qWx/dhsrTv+jqLt43wNZCgL/N/8QE+Q+FhVwefh6Tg==} dependencies: @@ -6624,15 +5578,11 @@ packages: pretty-hrtime: 1.0.3 dev: true - /@storybook/node-logger@7.2.1: - resolution: {integrity: sha512-Ywjqi8iAc26RYbZfmpzvzdKbaQZaD1T/IRNfVGReM/jTXnX0VSdsa6P/pfurbyHcQw//D3TSdqRHOMtbp0nIJg==} - dev: true - - /@storybook/postinstall@7.2.1: - resolution: {integrity: sha512-xOzX1MygQ+9xpku6FuODhXvfv/CcKlQPOGpZk8ejE/04Eow0JHluGI1cxdnpqGcCBygkw7DP+xrtQCv75c7Gjg==} + /@storybook/postinstall@7.0.0-rc.5: + resolution: {integrity: sha512-F23wxKEJ2XoVnHT7oAMjCXtANWvNq7M+FmIowgI98b3FT1dxt9fFPKKY+3Lcqp0Xa6Pzezd03KR9vAxXvvK/iQ==} dev: true - /@storybook/preset-scss@1.0.3(css-loader@6.7.3)(sass-loader@13.3.2)(style-loader@3.3.2): + /@storybook/preset-scss@1.0.3(css-loader@6.7.3)(sass-loader@13.2.2)(style-loader@3.3.2): resolution: {integrity: sha512-o9Iz6wxPeNENrQa2mKlsDKynBfqU2uWaRP80HeWp4TkGgf7/x3DVF2O7yi9N0x/PI1qzzTTpxlQ90D62XmpiTw==} peerDependencies: css-loader: '*' @@ -6640,7 +5590,7 @@ packages: style-loader: '*' dependencies: css-loader: 6.7.3(webpack@5.77.0) - sass-loader: 13.3.2(sass@1.59.3)(webpack@5.77.0) + sass-loader: 13.2.2(sass@1.59.3)(webpack@5.77.0) style-loader: 3.3.2(webpack@5.77.0) dev: true @@ -6685,15 +5635,16 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview-api@7.2.1: - resolution: {integrity: sha512-WKecuOdeh9+og6bPR9KoQf/JCeSRPCcfZv9uNfJzAp3IiTnS3UpfCz+HBZzZJQrisgbd7OulNY400HQUmxY2Ag==} + /@storybook/preview-api@7.0.7: + resolution: {integrity: sha512-R5pmGTodpu6hbwEg2RM2ulWtW3d426YzsisHrZJ+FT9lecWauN1y9xHCz7HdNzEFhT8r4YOa24L9ZS3mosZ7hA==} dependencies: - '@storybook/channels': 7.2.1 - '@storybook/client-logger': 7.2.1 - '@storybook/core-events': 7.2.1 + '@storybook/channel-postmessage': 7.0.7 + '@storybook/channels': 7.0.7 + '@storybook/client-logger': 7.0.7 + '@storybook/core-events': 7.0.7 '@storybook/csf': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/types': 7.2.1 + '@storybook/types': 7.0.7 '@types/qs': 6.9.7 dequal: 2.0.3 lodash: 4.17.21 @@ -6704,8 +5655,8 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview@7.2.1: - resolution: {integrity: sha512-5mLNhuaePx3Zv8mO93Y/M+U7ppqV5bS13rPfMHcVmSb7mQ/3hN7zkF6NhPOX6LoBUxetHiAJh5dA5McNE3adLQ==} + /@storybook/preview@7.0.22: + resolution: {integrity: sha512-R33FM3t5UVkq++W3cLqnRNISnOc3CDpCd91wAzwCcnjZ9xCT1iGu/GvzD2NLWCmpdSRm8UHSB0x5xlxkF3pHBw==} dev: true /@storybook/react-dom-shim@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): @@ -6728,39 +5679,28 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-dom-shim@7.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QzQQN2nZkG7c0Mg5HvhfQuH10HjAJEnA8vDlENIFMj3XqtUAq4HE2n73gEcvdFJMXL4G16N58+TgR1e2cFdRKw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@storybook/react-vite@7.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6)(vite@4.4.8): - resolution: {integrity: sha512-sBMlrLf/zUDUk6bWQLu5/tERW82j9spGMD++O1mdum3eVfPwvsqjtGokTVx/eOLUYA9kqQFdUtjLSn0sS84bTQ==} + /@storybook/react-vite@7.0.22(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5)(vite@4.2.1): + resolution: {integrity: sha512-qyfM4fng3UwSNVeERxFWHD6O9EXdCuds78aG5KON8fVHkfD1JKzdj6nAPI7nYaX0gn+7C20z7Y4GMtUdMAHHrw==} engines: {node: '>=16'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.1.6)(vite@4.4.8) - '@rollup/pluginutils': 5.0.2 - '@storybook/builder-vite': 7.2.1(typescript@5.1.6)(vite@4.4.8) - '@storybook/react': 7.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) - '@vitejs/plugin-react': 3.1.0(vite@4.4.8) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@4.9.5)(vite@4.2.1) + '@rollup/pluginutils': 4.2.1 + '@storybook/builder-vite': 7.0.22(typescript@4.9.5)(vite@4.2.1) + '@storybook/react': 7.0.22(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.5) + '@vitejs/plugin-react': 3.1.0(vite@4.2.1) ast-types: 0.14.2 - magic-string: 0.30.2 + magic-string: 0.27.0 react: 18.2.0 react-docgen: 6.0.0-alpha.3 react-dom: 18.2.0(react@18.2.0) - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) transitivePeerDependencies: - '@preact/preset-vite' - encoding - - rollup - supports-color - typescript - vite-plugin-glimmerx @@ -6845,46 +5785,6 @@ packages: - supports-color dev: true - /@storybook/react@7.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): - resolution: {integrity: sha512-WRAVrSQKAtCoypUrrIXWGOvyGRVkrh73hSkKVC0gEqxWDmjZIZJ1uc3VrUd/yHJdLsqNphcAyU8Ahu52yozubg==} - engines: {node: '>=16.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/core-client': 7.2.1 - '@storybook/docs-tools': 7.2.1 - '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.2.1 - '@storybook/react-dom-shim': 7.2.1(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.2.1 - '@types/escodegen': 0.0.6 - '@types/estree': 0.0.51 - '@types/node': 16.18.16 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - escodegen: 2.0.0 - html-tags: 3.2.0 - lodash: 4.17.21 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) - ts-dedent: 2.2.0 - type-fest: 2.19.0 - typescript: 5.1.6 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /@storybook/router@6.5.16(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==} peerDependencies: @@ -6900,26 +5800,26 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/router@7.0.22(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yLKqpOm0zCF0EZcQn7aoV3EeDtg0DnhqBXLKXaiQpaPBV8AH6YJOQ3IiGY2CjeWhl2SIIH1glcQEDsF/6klD1g==} + /@storybook/router@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s23O2OOQ4+CvySk3QC/PXhDJChc4jjyQu/h3gLMKF7bfWx0bd5KR4LnP3rCKLIMkxoJYFPUayPMgwEEeN/ENSw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.0.22 + '@storybook/client-logger': 7.0.0-rc.5 memoizerific: 1.11.3 qs: 6.11.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/router@7.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9Cn5boUS+7yhrKlSy1kt7ruNs/znk3555kclBD6+uuhH/dD84feGeiGYE4GUuLmcKrDFtNF185/Gr1huJ556tA==} + /@storybook/router@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yLKqpOm0zCF0EZcQn7aoV3EeDtg0DnhqBXLKXaiQpaPBV8AH6YJOQ3IiGY2CjeWhl2SIIH1glcQEDsF/6klD1g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.2.1 + '@storybook/client-logger': 7.0.22 memoizerific: 1.11.3 qs: 6.11.1 react: 18.2.0 @@ -6935,27 +5835,30 @@ packages: find-up: 4.1.0 dev: true - /@storybook/telemetry@7.2.1: - resolution: {integrity: sha512-ewYvX+ZzuTCl9a8DUbKkSPD6GhxUStl/+Eni1faE1OEnyduwbJFlse0EBpOa4YZTcghlngrHV3pulEW8qOgNFA==} + /@storybook/telemetry@7.0.22: + resolution: {integrity: sha512-629O0d3pEU8j7nwOqdBZhdRkV6KGN6FuaFOIRJdE+0rCQ78lBp6aqQZFDZ2wCwL9zqLcqY5WHbzCTh5OlccSwg==} dependencies: - '@storybook/client-logger': 7.2.1 - '@storybook/core-common': 7.2.1 - '@storybook/csf-tools': 7.2.1 + '@storybook/client-logger': 7.0.22 + '@storybook/core-common': 7.0.22 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.4 fs-extra: 11.1.1 + isomorphic-unfetch: 3.1.0 + nanoid: 3.3.4 read-pkg-up: 7.0.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@storybook/testing-library@0.2.0: - resolution: {integrity: sha512-Ff6jNnrsosmDshgCf0Eb5Cz7IA34p/1Ps5N3Kp3598kfXpBSccSkQQvVFUXC3kIHw/isIXWPqntZuKqnWUz7Gw==} + /@storybook/testing-library@0.1.0: + resolution: {integrity: sha512-g947f4LJZw3IluBhysMKLJXByAFiSxnGuooENqU+ZPt/GTrz1I9GDBlhmoTJahuFkVbwHvziAl/8riY2Re921g==} dependencies: - '@testing-library/dom': 9.0.1 - '@testing-library/user-event': 14.4.3(@testing-library/dom@9.0.1) + '@storybook/client-logger': 7.0.7 + '@storybook/instrumenter': 7.0.7 + '@testing-library/dom': 8.20.0 + '@testing-library/user-event': 13.5.0(@testing-library/dom@8.20.0) ts-dedent: 2.2.0 dev: true @@ -6973,285 +5876,59 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/theming@7.0.22(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yNpjPW4NnJhrzTyYzqhzGK2bOB5AcW7V9NTdFmE5ZMgcoJLInHubWeCM2ODKE9/YzsKxo1gU8Io4qJ2IKZIoog==} + /@storybook/theming@7.0.0-rc.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OzwybDA2+4FWg85tcTNQkVI0JnHkwCRG9HM1qx9hOZJHNRfxmJFjJePOnBoXM6CjVlz0S1PJUwCmMHNH8OTvEw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) - '@storybook/client-logger': 7.0.22 + '@storybook/client-logger': 7.0.0-rc.5 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/theming@7.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cfnNCLvKmzxjmoYKfLl7Q64gSTouLvd23CtvBAOlWcRYnMJ9v4/7A2tK3xQyVRlJYh9OuXiHFLL8AXbN58Hkzw==} + /@storybook/theming@7.0.22(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yNpjPW4NnJhrzTyYzqhzGK2bOB5AcW7V9NTdFmE5ZMgcoJLInHubWeCM2ODKE9/YzsKxo1gU8Io4qJ2IKZIoog==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) - '@storybook/client-logger': 7.2.1 + '@storybook/client-logger': 7.0.22 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@storybook/types@7.0.0-rc.5: - resolution: {integrity: sha512-gLKUY7EfPYenz0Y1jw90AUAUlKTHOj9p7J3d8GcI5x5buHdU+M7Q1jotPWzDwRFI24y3Ob31oyCBhysIw8S2Aw==} - dependencies: - '@storybook/channels': 7.0.0-rc.5 - '@types/babel__core': 7.20.0 - '@types/express': 4.17.17 - file-system-cache: 2.3.0 - dev: true - - /@storybook/types@7.0.22: - resolution: {integrity: sha512-fzYD3fcgpQw3p0DLMQqlEvTw47qNwrPX8Wdv8pkS12RrM5ycmy6d6fVFVJOB9uWNXD1l34vWclEo6pbtEaBM9A==} - dependencies: - '@storybook/channels': 7.0.22 - '@types/babel__core': 7.20.0 - '@types/express': 4.17.17 - file-system-cache: 2.3.0 - dev: true - - /@storybook/types@7.2.1: - resolution: {integrity: sha512-YwlIY1uyxfJjijbB5x1d1QOKaUUDJnMX8BSb8oGqU4cyT76X/Is4CbGs+vccFsJo0tZu1GfuahYXl0EDT0nnSQ==} - dependencies: - '@storybook/channels': 7.2.1 - '@types/babel__core': 7.20.0 - '@types/express': 4.17.17 - file-system-cache: 2.3.0 - dev: true - - /@svgr/babel-plugin-add-jsx-attribute@5.4.0: - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: - resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: - resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: - resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-svg-dynamic-title@5.4.0: - resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-svg-em-dimensions@5.4.0: - resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-transform-react-native-svg@5.4.0: - resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-plugin-transform-svg-component@5.5.0: - resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} - engines: {node: '>=10'} - dev: true - - /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - dev: true - - /@svgr/babel-preset@5.5.0: - resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} - engines: {node: '>=10'} - dependencies: - '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 - '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 - '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 - '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 - '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 - '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 - '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 - '@svgr/babel-plugin-transform-svg-component': 5.5.0 - dev: true - - /@svgr/babel-preset@8.0.0(@babel/core@7.21.3): - resolution: {integrity: sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.21.3) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.21.3) - dev: true - - /@svgr/core@5.5.0: - resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} - engines: {node: '>=10'} - dependencies: - '@svgr/plugin-jsx': 5.5.0 - camelcase: 6.3.0 - cosmiconfig: 7.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@svgr/core@8.0.0: - resolution: {integrity: sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==} - engines: {node: '>=14'} - dependencies: - '@babel/core': 7.21.3 - '@svgr/babel-preset': 8.0.0(@babel/core@7.21.3) - camelcase: 6.3.0 - cosmiconfig: 8.1.3 - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@svgr/hast-util-to-babel-ast@5.5.0: - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@svgr/hast-util-to-babel-ast@8.0.0: - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} - dependencies: - '@babel/types': 7.22.5 - entities: 4.4.0 - dev: true - - /@svgr/plugin-jsx@5.5.0: - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.21.3 - '@svgr/babel-preset': 5.5.0 - '@svgr/hast-util-to-babel-ast': 5.5.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color + react-dom: 18.2.0(react@18.2.0) dev: true - /@svgr/plugin-jsx@8.0.1(@svgr/core@8.0.0): - resolution: {integrity: sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' + /@storybook/types@7.0.0-rc.5: + resolution: {integrity: sha512-gLKUY7EfPYenz0Y1jw90AUAUlKTHOj9p7J3d8GcI5x5buHdU+M7Q1jotPWzDwRFI24y3Ob31oyCBhysIw8S2Aw==} dependencies: - '@babel/core': 7.21.3 - '@svgr/babel-preset': 8.0.0(@babel/core@7.21.3) - '@svgr/core': 8.0.0 - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color + '@storybook/channels': 7.0.0-rc.5 + '@types/babel__core': 7.20.0 + '@types/express': 4.17.17 + file-system-cache: 2.0.2 dev: true - /@svgr/plugin-prettier@5.5.0: - resolution: {integrity: sha512-mVc+u+eKUmy8sW5UnFpes9NqVtizJfnhasF8Srbi3XdxVTWyU5lmhWlQAgHLhcrsZKowQ0b7xBa4qWHI5Ew/VQ==} - engines: {node: '>=10'} + /@storybook/types@7.0.22: + resolution: {integrity: sha512-fzYD3fcgpQw3p0DLMQqlEvTw47qNwrPX8Wdv8pkS12RrM5ycmy6d6fVFVJOB9uWNXD1l34vWclEo6pbtEaBM9A==} dependencies: - deepmerge: 4.3.1 - prettier: 2.8.8 + '@storybook/channels': 7.0.22 + '@types/babel__core': 7.20.0 + '@types/express': 4.17.17 + file-system-cache: 2.0.2 dev: true - /@svgr/plugin-svgo@5.5.0: - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} + /@storybook/types@7.0.7: + resolution: {integrity: sha512-v9piuwp8FvTiHXIOOi5lEyTEJKhnbcbhVxgJ3VFhhXYFd0DTz6Bst0XIIgkgs21ITb3xhkfPbCRUueMcbXO1MA==} dependencies: - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - svgo: 1.3.2 + '@storybook/channels': 7.0.7 + '@types/babel__core': 7.20.0 + '@types/express': 4.17.17 + file-system-cache: 2.0.2 dev: true /@swc/core-darwin-arm64@1.3.42: @@ -7367,23 +6044,25 @@ packages: tslib: 2.5.0 dev: false - /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1): - resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' + /@testing-library/dom@8.20.0: + resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} + engines: {node: '>=12'} dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.9.1) + '@babel/code-frame': 7.18.6 + '@babel/runtime': 7.21.0 + '@types/aria-query': 5.0.1 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 dev: true /@testing-library/dom@9.0.1: resolution: {integrity: sha512-fTOVsMY9QLFCCXRHG3Ese6cMH5qIWwSbgxZsgeF5TNsy81HKaZ4kgehnSF8FsR3OF+numlIV2YcU79MzbnhSig==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.18.6 '@babel/runtime': 7.21.0 '@types/aria-query': 5.0.1 aria-query: 5.1.3 @@ -7431,13 +6110,14 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.4.3(@testing-library/dom@9.0.1): - resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} - engines: {node: '>=12', npm: '>=6'} + /@testing-library/user-event@13.5.0(@testing-library/dom@8.20.0): + resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} + engines: {node: '>=10', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.0.1 + '@babel/runtime': 7.21.0 + '@testing-library/dom': 8.20.0 dev: true /@tootallnate/once@2.0.0: @@ -7520,7 +6200,7 @@ packages: /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.21.3 '@babel/types': 7.22.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 @@ -7536,7 +6216,7 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.21.3 '@babel/types': 7.22.5 dev: true @@ -7589,12 +6269,6 @@ packages: resolution: {integrity: sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==} dev: false - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} - dependencies: - '@types/node': 17.0.12 - dev: true - /@types/css-font-loading-module@0.0.7: resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==} dev: false @@ -7767,10 +6441,6 @@ packages: resolution: {integrity: sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==} dev: true - /@types/emscripten@1.39.7: - resolution: {integrity: sha512-tLqYV94vuqDrXh515F/FOGtBcRMTPGvVV1LzLbtYDcQmmhtpf/gLYf+hikBbQk8MzOHNz37wpFfJbYAuSn8HqA==} - dev: true - /@types/escodegen@0.0.6: resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} dev: true @@ -7848,7 +6518,7 @@ packages: /@types/hoist-non-react-statics@3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: - '@types/react': 18.2.18 + '@types/react': 18.0.28 hoist-non-react-statics: 3.3.2 /@types/is-function@1.0.1: @@ -7927,10 +6597,6 @@ packages: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true - /@types/node@20.4.6: - resolution: {integrity: sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==} - dev: true - /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -7945,6 +6611,7 @@ packages: /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false /@types/pretty-hrtime@1.0.1: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} @@ -7953,17 +6620,12 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/q@1.5.5: - resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: true - /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true /@types/raf@3.4.0: resolution: {integrity: sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==} - requiresBuild: true dev: false optional: true @@ -7976,12 +6638,6 @@ packages: dependencies: '@types/react': 18.0.28 - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} - dependencies: - '@types/react': 18.2.18 - dev: true - /@types/react-grid-layout@1.3.2: resolution: {integrity: sha512-ZzpBEOC1JTQ7MGe1h1cPKSLP4jSWuxc+yvT4TsAlEW9+EFPzAf8nxQfFd7ea9gL17Em7PbwJZAsiwfQQBUklZQ==} dependencies: @@ -7990,13 +6646,13 @@ packages: /@types/react-is@17.0.3: resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} dependencies: - '@types/react': 18.2.18 + '@types/react': 18.0.28 dev: false /@types/react-transition-group@4.4.5: resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} dependencies: - '@types/react': 18.2.18 + '@types/react': 18.0.28 dev: false /@types/react-window@1.8.5: @@ -8012,13 +6668,6 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.1 - /@types/react@18.2.18: - resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} @@ -8204,7 +6853,7 @@ packages: peerDependencies: vite: ^3.0.0 || ^4.0.0 dependencies: - vite: 4.2.1(@types/node@17.0.12)(sass@1.64.2) + vite: 4.2.1(@types/node@17.0.12)(sass@1.59.3) dev: true /@vitejs/plugin-react-swc@3.2.0(vite@4.2.1): @@ -8213,7 +6862,7 @@ packages: vite: ^4 dependencies: '@swc/core': 1.3.42 - vite: 4.2.1(@types/node@17.0.12)(sass@1.64.2) + vite: 4.2.1(@types/node@17.0.12)(sass@1.59.3) dev: true /@vitejs/plugin-react@3.1.0(vite@4.2.1): @@ -8227,38 +6876,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.3) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.2.1(@types/node@18.13.0)(sass@1.59.3) - transitivePeerDependencies: - - supports-color - dev: true - - /@vitejs/plugin-react@3.1.0(vite@4.4.8): - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.21.3) - '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.3) - magic-string: 0.27.0 - react-refresh: 0.14.0 - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) - transitivePeerDependencies: - - supports-color - dev: true - - /@vitejs/plugin-react@4.0.4(vite@4.4.8): - resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.9) - react-refresh: 0.14.0 - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) transitivePeerDependencies: - supports-color dev: true @@ -8408,32 +7026,16 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.17): + /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.17.12): resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} engines: {node: '>=14.15.0'} peerDependencies: esbuild: '>=0.10.0' dependencies: - esbuild: 0.18.17 + esbuild: 0.17.12 tslib: 2.5.0 dev: true - /@yarnpkg/fslib@2.10.3: - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 - dev: true - - /@yarnpkg/libzip@2.3.0: - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - dependencies: - '@types/emscripten': 1.39.7 - tslib: 1.14.1 - dev: true - /@yomguithereal/helpers@1.1.1: resolution: {integrity: sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg==} dev: true @@ -8461,16 +7063,16 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.10.0 + acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions@1.8.0(acorn@8.10.0): + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.10.0 + acorn: 8.8.2 dev: true /acorn-jsx@5.3.2(acorn@7.4.1): @@ -8495,12 +7097,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -8645,13 +7241,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} - dependencies: - tslib: 2.5.0 - dev: true - /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: @@ -8703,17 +7292,6 @@ packages: es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - /array.prototype.reduce@1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -8798,22 +7376,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer@10.4.14(postcss@8.4.27): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001466 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.27 - postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -8828,44 +7390,17 @@ packages: resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} engines: {node: '>=4'} - /axios@0.19.2: - resolution: {integrity: sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==} - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 - dependencies: - follow-redirects: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: true - - /axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.15.2 - transitivePeerDependencies: - - debug - dev: true - - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: deep-equal: 2.2.0 - /babel-core@7.0.0-bridge.0(@babel/core@7.22.9): + /babel-core@7.0.0-bridge.0(@babel/core@7.21.3): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.3 dev: true /babel-plugin-istanbul@6.1.1: @@ -8890,38 +7425,38 @@ packages: resolve: 1.22.1 dev: false - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.9): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.3): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) - semver: 6.3.1 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.3) + semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.3): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) - core-js-compat: 3.32.0 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.3) + core-js-compat: 3.29.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.9): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.3): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.3) transitivePeerDependencies: - supports-color dev: true @@ -8953,18 +7488,17 @@ packages: /base64-arraybuffer@1.0.2: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} - requiresBuild: true dev: false optional: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + /better-opn@2.1.1: + resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} + engines: {node: '>8.0.0'} dependencies: - open: 8.4.2 + open: 7.4.2 dev: true /big-integer@1.6.51: @@ -9008,10 +7542,6 @@ packages: - supports-color dev: true - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -9047,17 +7577,6 @@ packages: pako: 0.2.9 dev: true - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.482 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: true - /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -9163,11 +7682,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false @@ -9175,10 +7689,6 @@ packages: /caniuse-lite@1.0.30001466: resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==} - /caniuse-lite@1.0.30001519: - resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} - dev: true - /canvg@3.0.10: resolution: {integrity: sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==} engines: {node: '>=10.0.0'} @@ -9348,15 +7858,6 @@ packages: engines: {node: '>=6'} dev: false - /coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.5 - chalk: 2.4.2 - q: 1.5.1 - dev: true - /code-block-writer@11.0.3: resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} dev: true @@ -9404,6 +7905,7 @@ packages: /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: false /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} @@ -9475,7 +7977,7 @@ packages: dev: true /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} /concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -9568,10 +8070,10 @@ packages: is-error: 2.2.2 dev: false - /core-js-compat@3.32.0: - resolution: {integrity: sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==} + /core-js-compat@3.29.1: + resolution: {integrity: sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==} dependencies: - browserslist: 4.21.10 + browserslist: 4.21.5 dev: true /core-js@3.29.1: @@ -9618,6 +8120,7 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false /cosmiconfig@8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} @@ -9661,7 +8164,6 @@ packages: /css-line-break@2.1.0: resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} - requiresBuild: true dependencies: utrie: 1.0.2 dev: false @@ -9673,37 +8175,17 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.27) - postcss-modules-scope: 3.0.0(postcss@8.4.27) - postcss-modules-values: 4.0.0(postcss@8.4.27) + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) + postcss-modules-scope: 3.0.0(postcss@8.4.21) + postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.3.8 webpack: 5.77.0(esbuild@0.17.12) dev: true - /css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: true - - /css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - dev: true - - /css-selector-tokenizer@0.8.0: - resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 - dev: true - /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -9712,27 +8194,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - dev: true - - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: true - - /css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - dev: true - /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true @@ -9743,13 +8204,6 @@ packages: hasBin: true dev: true - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 - dev: true - /cssstyle@3.0.0: resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} engines: {node: '>=14'} @@ -10147,19 +8601,6 @@ packages: lodash: 4.17.21 dev: true - /daisyui@3.5.0(ts-node@10.9.1): - resolution: {integrity: sha512-wSaeXwaYdMv4yURv9wj7kKQQN9Jyumfh/skIpZfCNkCb2jLf/so+iNKSM8l4rDN0TRvB5OccMlAvsf2UAtk2gg==} - engines: {node: '>=16.9.0'} - dependencies: - colord: 2.9.3 - css-selector-tokenizer: 0.8.0 - postcss: 8.4.21 - postcss-js: 4.0.1(postcss@8.4.21) - tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.9.1) - transitivePeerDependencies: - - ts-node - dev: true - /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -10188,17 +8629,6 @@ packages: ms: 2.0.0 dev: true - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -10308,11 +8738,6 @@ packages: core-assert: 0.2.1 dev: false - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - /default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} @@ -10390,10 +8815,6 @@ packages: engines: {node: '>=8'} dev: true - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: true - /detect-package-manager@2.0.1: resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} engines: {node: '>=12'} @@ -10458,25 +8879,10 @@ packages: csstype: 3.1.1 dev: false - /dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - dev: true - /dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dev: true - /domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -10490,20 +8896,6 @@ packages: dev: false optional: true - /domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: true - - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.5.0 - dev: true - /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -10520,11 +8912,6 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - /draco3d@1.5.5: resolution: {integrity: sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q==} dev: false @@ -10561,10 +8948,6 @@ packages: /electron-to-chromium@1.4.330: resolution: {integrity: sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==} - /electron-to-chromium@1.4.482: - resolution: {integrity: sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==} - dev: true - /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} dev: true @@ -10605,10 +8988,6 @@ packages: dependencies: ansi-colors: 4.1.3 - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} @@ -10673,10 +9052,6 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.9 - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: @@ -10745,17 +9120,6 @@ packages: - supports-color dev: true - /esbuild-register@3.4.2(esbuild@0.18.17): - resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4(supports-color@5.5.0) - esbuild: 0.18.17 - transitivePeerDependencies: - - supports-color - dev: true - /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} @@ -10816,36 +9180,6 @@ packages: '@esbuild/win32-x64': 0.17.12 dev: true - /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.17 - '@esbuild/android-arm64': 0.18.17 - '@esbuild/android-x64': 0.18.17 - '@esbuild/darwin-arm64': 0.18.17 - '@esbuild/darwin-x64': 0.18.17 - '@esbuild/freebsd-arm64': 0.18.17 - '@esbuild/freebsd-x64': 0.18.17 - '@esbuild/linux-arm': 0.18.17 - '@esbuild/linux-arm64': 0.18.17 - '@esbuild/linux-ia32': 0.18.17 - '@esbuild/linux-loong64': 0.18.17 - '@esbuild/linux-mips64el': 0.18.17 - '@esbuild/linux-ppc64': 0.18.17 - '@esbuild/linux-riscv64': 0.18.17 - '@esbuild/linux-s390x': 0.18.17 - '@esbuild/linux-x64': 0.18.17 - '@esbuild/netbsd-x64': 0.18.17 - '@esbuild/openbsd-x64': 0.18.17 - '@esbuild/sunos-x64': 0.18.17 - '@esbuild/win32-arm64': 0.18.17 - '@esbuild/win32-ia32': 0.18.17 - '@esbuild/win32-x64': 0.18.17 - dev: true - /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -10907,13 +9241,13 @@ packages: dependencies: eslint: 7.32.0 - /eslint-config-turbo@1.10.12(eslint@7.32.0): - resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} + /eslint-config-turbo@1.10.9(eslint@7.32.0): + resolution: {integrity: sha512-YA5QWxWte/NiRJL0/Cv7aATfIvS5sUAuyD6ZuyTZEzwyU7E6FUXGo44amjf9INkyj96HrJ2nYWoFkCRx3vs6Ag==} peerDependencies: eslint: '>6.6.0' dependencies: eslint: 7.32.0 - eslint-plugin-turbo: 1.10.12(eslint@7.32.0) + eslint-plugin-turbo: 1.10.9(eslint@7.32.0) /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} @@ -11056,8 +9390,8 @@ packages: semver: 6.3.0 string.prototype.matchall: 4.0.8 - /eslint-plugin-turbo@1.10.12(eslint@7.32.0): - resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} + /eslint-plugin-turbo@1.10.9(eslint@7.32.0): + resolution: {integrity: sha512-o8Nga4WFMvzF0lo3d3UyjGli2JOUn/4SRtRdvcf4EA9/TPotU/NUHqO16Cp0SHZJG/tGYIy5LY1O/EO7Mxbd1A==} peerDependencies: eslint: '>6.6.0' dependencies: @@ -11184,7 +9518,7 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.21.3(supports-color@5.5.0) '@babel/types': 7.22.5 c8: 7.13.0 transitivePeerDependencies: @@ -11315,10 +9649,6 @@ packages: strnum: 1.0.5 dev: false - /fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - dev: true - /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -11370,44 +9700,17 @@ packages: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} dev: false - /figma-api-exporter@0.0.2: - resolution: {integrity: sha512-9cCPZPUKVuD0JetpAnp82wSmBQiYDQ0TTBc7+BFHXwPiW+KxirfiPuCPJY+p4rTplKPzn0hkfrCvGpAS9Rehhg==} - dependencies: - axios: 0.19.2 - figma-js: 1.16.0 - figma-transformer: 1.0.0 - fs: 0.0.1-security - ramda: 0.26.1 - rimraf: 3.0.2 - transitivePeerDependencies: - - debug - - supports-color - dev: true - - /figma-js@1.16.0: - resolution: {integrity: sha512-cImQT9DAJp1J0xr6FMUAswXKEnjwrDz4QKAgIBpUyydKAgDS/lm862stjweHp99uco5qLoNv+GbwQWBHyDvDQw==} - engines: {node: '>=8.9'} - dependencies: - axios: 0.21.4 - transitivePeerDependencies: - - debug - dev: true - - /figma-transformer@1.0.0: - resolution: {integrity: sha512-7iSOH1UkuRMAfP7jgmM7ca7v20FjxKgryVzd3qIvNBY2u0vrRLwIVMPqQC6PAy4G8iyJFqEDKX1ezHxrthPXbA==} - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - /file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + /file-system-cache@2.0.2: + resolution: {integrity: sha512-lp4BHO4CWqvRyx88Tt3quZic9ZMf4cJyquYq7UI8sH42Bm2ArlBBjKQAalZOo+UfaBassb7X123Lik5qZ/tSAA==} dependencies: fs-extra: 11.1.1 - ramda: 0.29.0 + ramda: 0.28.0 dev: true /filelist@1.0.4: @@ -11509,25 +9812,6 @@ packages: - encoding dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - - /follow-redirects@1.5.10: - resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} - engines: {node: '>=4.0'} - dependencies: - debug: 3.1.0 - transitivePeerDependencies: - - supports-color - dev: true - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -11541,14 +9825,6 @@ packages: signal-exit: 3.0.7 dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: true - /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -11622,10 +9898,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - dev: true - /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -11686,11 +9958,6 @@ packages: has: 1.0.3 has-symbols: 1.0.3 - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: true - /get-npm-tarball-url@2.0.3: resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==} engines: {node: '>=12.17'} @@ -11790,18 +10057,6 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.2 - minimatch: 9.0.3 - minipass: 7.0.2 - path-scurry: 1.10.1 - dev: true - /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: @@ -12237,13 +10492,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.27): + /icss-utils@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.21 dev: true /ieee754@1.2.1: @@ -12328,10 +10583,9 @@ packages: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} dev: false - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} dev: true /ip@2.0.0: @@ -12620,6 +10874,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + dependencies: + node-fetch: 2.6.9 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + dev: true + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -12630,7 +10893,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.21.3 - '@babel/parser': 7.22.7 + '@babel/parser': 7.21.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -12655,15 +10918,6 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jackspeak@2.2.2: - resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -12768,23 +11022,23 @@ packages: argparse: 2.0.1 dev: true - /jscodeshift@0.14.0(@babel/preset-env@7.22.9): + /jscodeshift@0.14.0(@babel/preset-env@7.21.4): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.22.9 - '@babel/parser': 7.22.7 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.22.9) - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/preset-flow': 7.18.6(@babel/core@7.22.9) - '@babel/preset-typescript': 7.21.0(@babel/core@7.22.9) - '@babel/register': 7.21.0(@babel/core@7.22.9) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.9) + '@babel/core': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.3) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.3) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.3) + '@babel/preset-env': 7.21.4(@babel/core@7.21.3) + '@babel/preset-flow': 7.18.6(@babel/core@7.21.3) + '@babel/preset-typescript': 7.21.0(@babel/core@7.21.3) + '@babel/register': 7.21.0(@babel/core@7.21.3) + babel-core: 7.0.0-bridge.0(@babel/core@7.21.3) chalk: 4.1.2 flow-parser: 0.202.0 graceful-fs: 4.2.11 @@ -12955,10 +11209,6 @@ packages: resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} dev: true - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true - /ktx-parse@0.0.4: resolution: {integrity: sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A==} dev: false @@ -12984,7 +11234,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: app-root-dir: 1.0.2 - dotenv: 16.3.1 + dotenv: 16.0.3 dotenv-expand: 10.0.0 dev: true @@ -13001,7 +11251,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.77.0(esbuild@0.18.17) + webpack: 5.77.0(esbuild@0.17.12) dev: true /less@4.1.3: @@ -13097,10 +11347,6 @@ packages: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - dev: true - /lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} dev: false @@ -13190,17 +11436,6 @@ packages: get-func-name: 2.0.0 dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.5.0 - dev: true - - /lru-cache@10.0.0: - resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} - engines: {node: 14 || >=16.14} - dev: true - /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -13231,13 +11466,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -13302,14 +11530,6 @@ packages: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} dev: true - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: true - - /mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: true - /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -13418,13 +11638,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -13449,11 +11662,6 @@ packages: engines: {node: '>=8'} dev: true - /minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -13490,7 +11698,7 @@ packages: /mlly@1.2.0: resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} dependencies: - acorn: 8.10.0 + acorn: 8.8.2 pathe: 1.1.0 pkg-types: 1.0.2 ufo: 1.1.1 @@ -13543,11 +11751,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -13622,13 +11825,6 @@ packages: - babel-plugin-macros dev: false - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.5.0 - dev: true - /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -13671,10 +11867,6 @@ packages: /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -13710,81 +11902,6 @@ packages: path-key: 3.1.1 dev: true - /npm@9.8.1: - resolution: {integrity: sha512-AfDvThQzsIXhYgk9zhbk5R+lh811lKkLAeQMMhSypf1BM7zUafeIIBzMzespeuVEJ0+LvY36oRQYf7IKLzU3rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dev: true - bundledDependencies: - - '@isaacs/string-locale-compare' - - '@npmcli/arborist' - - '@npmcli/config' - - '@npmcli/fs' - - '@npmcli/map-workspaces' - - '@npmcli/package-json' - - '@npmcli/promise-spawn' - - '@npmcli/run-script' - - abbrev - - archy - - cacache - - chalk - - ci-info - - cli-columns - - cli-table3 - - columnify - - fastest-levenshtein - - fs-minipass - - glob - - graceful-fs - - hosted-git-info - - ini - - init-package-json - - is-cidr - - json-parse-even-better-errors - - libnpmaccess - - libnpmdiff - - libnpmexec - - libnpmfund - - libnpmhook - - libnpmorg - - libnpmpack - - libnpmpublish - - libnpmsearch - - libnpmteam - - libnpmversion - - make-fetch-happen - - minimatch - - minipass - - minipass-pipeline - - ms - - node-gyp - - nopt - - npm-audit-report - - npm-install-checks - - npm-package-arg - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - p-map - - pacote - - parse-conflict-json - - proc-log - - qrcode-terminal - - read - - semver - - sigstore - - ssri - - supports-color - - tar - - text-table - - tiny-relative-date - - treeverse - - validate-npm-package-name - - which - - write-file-atomic - /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -13794,12 +11911,6 @@ packages: set-blocking: 2.0.0 dev: true - /nth-check@1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} - dependencies: - boolbase: 1.0.0 - dev: true - /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true @@ -13852,17 +11963,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 - /object.getownpropertydescriptors@2.1.6: - resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.5 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - safe-array-concat: 1.0.0 - dev: true - /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: @@ -13909,6 +12009,14 @@ packages: mimic-fn: 2.1.0 dev: true + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -14030,7 +12138,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.18.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -14076,14 +12184,6 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 - dev: true - /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true @@ -14122,7 +12222,6 @@ packages: /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - requiresBuild: true dev: false optional: true @@ -14233,18 +12332,6 @@ packages: resolve: 1.22.1 dev: true - /postcss-import@15.1.0(postcss@8.4.27): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.27 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.2 - dev: true - /postcss-js@4.0.1(postcss@8.4.21): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -14255,16 +12342,6 @@ packages: postcss: 8.4.21 dev: true - /postcss-js@4.0.1(postcss@8.4.27): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.27 - dev: true - /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -14301,25 +12378,7 @@ packages: yaml: 2.2.1 dev: true - /postcss-load-config@4.0.1(postcss@8.4.27)(ts-node@10.9.1): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.27 - ts-node: 10.9.1(@types/node@17.0.12)(typescript@4.9.5) - yaml: 2.2.1 - dev: true - - /postcss-loader@7.3.0(postcss@8.4.27)(webpack@5.77.0): + /postcss-loader@7.3.0(postcss@8.4.21)(webpack@5.77.0): resolution: {integrity: sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -14329,50 +12388,50 @@ packages: cosmiconfig: 8.1.3 jiti: 1.18.2 klona: 2.0.6 - postcss: 8.4.27 + postcss: 8.4.21 semver: 7.3.8 - webpack: 5.77.0(esbuild@0.18.17) + webpack: 5.77.0(esbuild@0.17.12) dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.21 dev: true - /postcss-modules-local-by-default@4.0.0(postcss@8.4.27): + /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.27): + /postcss-modules-scope@3.0.0(postcss@8.4.21): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.27): + /postcss-modules-values@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 dev: true /postcss-nested@6.0.0(postcss@8.4.21): @@ -14385,16 +12444,6 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-nested@6.0.1(postcss@8.4.27): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.27 - postcss-selector-parser: 6.0.11 - dev: true - /postcss-nesting@11.2.2(postcss@8.4.21): resolution: {integrity: sha512-aOTiUniAB1bcPE6GGiynWRa6PZFPhOTAm5q3q5cem6QeSijIHHkWr6gs65ukCZMXeak8yXeZVbBJET3VM+HlhA==} engines: {node: ^14 || ^16 || >=18} @@ -14406,17 +12455,6 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-nesting@12.0.0(postcss@8.4.27): - resolution: {integrity: sha512-knqwW65kxssmyIFadRSimaiRyLVRd0MdwfabesKw6XvGLwSOCJ+4zfvNQQCOOYij5obwpZzDpODuGRv2PCyiUw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.27 - postcss-selector-parser: 6.0.13 - dev: true - /postcss-plugin@1.0.0: resolution: {integrity: sha512-w0SKz9cKfp/wN8baHB/JXZUTBSrUP6/mqDiony+aAVlPXOhTkSXmJ8T5IuhZgHYdV4R/HA3P0N26rG1Sp0oP/A==} dependencies: @@ -14430,24 +12468,6 @@ packages: postcss: ^8.4.19 dependencies: postcss: 8.4.21 - dev: true - - /postcss-scss@4.0.6(postcss@8.4.27): - resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.19 - dependencies: - postcss: 8.4.27 - dev: false - - /postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true /postcss-selector-parser@6.0.11: resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} @@ -14457,14 +12477,6 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -14493,15 +12505,6 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true - - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -14524,8 +12527,8 @@ packages: hasBin: true dev: true - /prettier@3.0.1: - resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} engines: {node: '>=14'} hasBin: true dev: true @@ -14596,7 +12599,6 @@ packages: /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true dev: true optional: true @@ -14709,18 +12711,13 @@ packages: /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - requiresBuild: true dependencies: performance-now: 2.1.0 dev: false optional: true - /ramda@0.26.1: - resolution: {integrity: sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==} - dev: true - - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + /ramda@0.28.0: + resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} dev: true /randombytes@2.1.0: @@ -14774,12 +12771,12 @@ packages: universal-cookie: 4.0.4 dev: false - /react-docgen-typescript@2.2.2(typescript@5.1.6): + /react-docgen-typescript@2.2.2(typescript@4.9.5): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 5.1.6 + typescript: 4.9.5 dev: true /react-docgen@6.0.0-alpha.3: @@ -14788,7 +12785,7 @@ packages: hasBin: true dependencies: '@babel/core': 7.21.3 - '@babel/generator': 7.22.9 + '@babel/generator': 7.21.3 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -14941,41 +12938,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.18 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.18)(react@18.2.0) - tslib: 2.5.0 - dev: true - - /react-remove-scroll@2.5.5(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.18 - react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.18)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.18)(react@18.2.0) - tslib: 2.5.0 - use-callback-ref: 1.3.0(@types/react@18.2.18)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.18)(react@18.2.0) - dev: true - /react-resizable@3.0.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-StnwmiESiamNzdRHbSSvA65b0ZQJ7eVQpPusrSmcpyGKzC0gojhtO62xxH6YOBmepk9dQTBi9yxidL3W4s3EBA==} peerDependencies: @@ -15021,23 +12983,6 @@ packages: react-is: 18.2.0 dev: true - /react-style-singleton@2.2.1(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.18 - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.2.0 - tslib: 2.5.0 - dev: true - /react-test-renderer@18.2.0(react@18.2.0): resolution: {integrity: sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==} peerDependencies: @@ -15204,6 +13149,13 @@ packages: tslib: 2.5.0 dev: true + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.1 + dev: true + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -15344,33 +13296,24 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.27 + postcss: 8.4.21 source-map: 0.6.1 dev: true /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - dev: true - - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} @@ -15395,7 +13338,6 @@ packages: /rgbcolor@1.0.1: resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} engines: {node: '>= 0.8.15'} - requiresBuild: true dev: false optional: true @@ -15427,14 +13369,6 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.27.1: - resolution: {integrity: sha512-tXNDFwOkN6C2w5Blj1g6ForKeFw6c1mDu5jxoeDO3/pmYjgt+8yvIFjKzH5FQUq70OKZBkOt0zzv0THXL7vwzQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} dev: true @@ -15448,16 +13382,6 @@ packages: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} dev: false - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - /safe-buffer@5.1.1: resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} dev: true @@ -15480,12 +13404,12 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass-loader@13.3.2(sass@1.59.3)(webpack@5.77.0): - resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} + /sass-loader@13.2.2(sass@1.59.3)(webpack@5.77.0): + resolution: {integrity: sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==} engines: {node: '>= 14.15.0'} peerDependencies: fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 @@ -15499,35 +13423,12 @@ packages: sass-embedded: optional: true dependencies: + klona: 2.0.6 neo-async: 2.6.2 sass: 1.59.3 webpack: 5.77.0(esbuild@0.17.12) dev: true - /sass-loader@13.3.2(sass@1.64.2)(webpack@5.77.0): - resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - dependencies: - neo-async: 2.6.2 - sass: 1.64.2 - webpack: 5.77.0(esbuild@0.18.17) - dev: true - /sass@1.59.3: resolution: {integrity: sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==} engines: {node: '>=12.0.0'} @@ -15537,20 +13438,10 @@ packages: immutable: 4.3.0 source-map-js: 1.0.2 - /sass@1.64.2: - resolution: {integrity: sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - immutable: 4.3.0 - source-map-js: 1.0.2 - dev: true - /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - requiresBuild: true dev: true + optional: true /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -15589,8 +13480,8 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true @@ -15601,14 +13492,6 @@ packages: dependencies: lru-cache: 6.0.0 - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -15692,6 +13575,16 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -15707,22 +13600,17 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 dev: false - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} dependencies: - semver: 7.5.4 + semver: 7.0.0 dev: true /sisteransi@1.0.5: @@ -15749,13 +13637,6 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.5.0 - dev: true - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -15812,11 +13693,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - dev: true - /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -15824,7 +13700,6 @@ packages: /stackblur-canvas@2.5.0: resolution: {integrity: sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==} engines: {node: '>=0.1.14'} - requiresBuild: true dev: false optional: true @@ -15847,11 +13722,11 @@ packages: resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} dev: true - /storybook@7.2.1: - resolution: {integrity: sha512-uNNqJrWUVaxdZdd3GpMTHt9h2EftoUKxtpAWeQlzx20DDvcliVC1yvLT54sLAzY8nlxxN+fBUuBbTSJ1Dx4TPg==} + /storybook@7.0.22: + resolution: {integrity: sha512-d/pMpaVjTB1tSOpWYRpdCamfzg4zcVeOgz8O0k5OblJO8UOdq7numlynntaw4v+p6lusWXX8CSfE/MUUOgzQKw==} hasBin: true dependencies: - '@storybook/cli': 7.2.1 + '@storybook/cli': 7.0.22 transitivePeerDependencies: - bufferutil - encoding @@ -15967,7 +13842,7 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.10.0 + acorn: 8.8.2 dev: true /strnum@1.0.5: @@ -16071,38 +13946,12 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - dev: true - /svg-pathdata@6.0.3: resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} engines: {node: '>=12.0.0'} - requiresBuild: true dev: false optional: true - /svgo@1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - object.values: 1.1.6 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - dev: true - /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true @@ -16156,37 +14005,6 @@ packages: - ts-node dev: true - /tailwindcss@3.3.3(ts-node@10.9.1): - resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} - engines: {node: '>=14.0.0'} - hasBin: 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.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.18.2 - 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.27 - postcss-import: 15.1.0(postcss@8.4.27) - postcss-js: 4.0.1(postcss@8.4.27) - postcss-load-config: 4.0.1(postcss@8.4.27)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.27) - postcss-selector-parser: 6.0.11 - resolve: 1.22.2 - sucrase: 3.32.0 - transitivePeerDependencies: - - ts-node - dev: true - /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -16291,38 +14109,13 @@ packages: webpack: 5.77.0(esbuild@0.17.12) dev: true - /terser-webpack-plugin@5.3.7(esbuild@0.18.17)(webpack@5.77.0): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - esbuild: 0.18.17 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.1 - terser: 5.16.8 - webpack: 5.77.0(esbuild@0.18.17) - dev: true - /terser@5.16.8: resolution: {integrity: sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.10.0 + acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -16343,7 +14136,6 @@ packages: /text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - requiresBuild: true dependencies: utrie: 1.0.2 dev: false @@ -16395,10 +14187,6 @@ packages: deprecated: 'This module is now under the @mapbox namespace: install @mapbox/tilebelt instead' dev: false - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: true - /tinybench@2.4.0: resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} dev: true @@ -16427,10 +14215,6 @@ packages: dependencies: is-number: 7.0.0 - /tocbot@4.21.0: - resolution: {integrity: sha512-vXk8htr8mIl3hc2s2mDkaPTBfqmqZA2o0x7eXbxUibdrpEIPdpM0L9hH/RvEvlgSM+ZTgS34sGipk5+VrLJCLA==} - dev: true - /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -16497,7 +14281,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 17.0.12 - acorn: 8.10.0 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -16552,19 +14336,6 @@ packages: typescript: 4.9.5 dev: true - /tsconfck@2.1.0(typescript@5.1.6): - resolution: {integrity: sha512-lztI9ohwclQHISVWrM/hlcgsRpphsii94DV9AQtAw2XJSVNiv+3ppdEsrL5J+xc5oTeHXe1qDqlOAGw8VSa9+Q==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.1.6 - dev: true - /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -16588,65 +14359,65 @@ packages: tslib: 1.14.1 typescript: 4.9.5 - /turbo-darwin-64@1.10.12: - resolution: {integrity: sha512-vmDfGVPl5/aFenAbOj3eOx3ePNcWVUyZwYr7taRl0ZBbmv2TzjRiFotO4vrKCiTVnbqjQqAFQWY2ugbqCI1kOQ==} + /turbo-darwin-64@1.10.8: + resolution: {integrity: sha512-FOK3qrLZE2Yq7/2DkAnAzghisGQroZJs85Rui3IXM/2e7rTtBADmU9w36d4k0Yw7RHEiOo8U4eAYUl52OWRwJQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.10.12: - resolution: {integrity: sha512-3JliEESLNX2s7g54SOBqqkqJ7UhcOGkS0ywMr5SNuvF6kWVTbuUq7uBU/sVbGq8RwvK1ONlhPvJne5MUqBCTCQ==} + /turbo-darwin-arm64@1.10.8: + resolution: {integrity: sha512-8mbgH8oBycusa8RnbHlvrpHxfZsgNrk6CXMu/KJECpajYT3nSOMK2Rrs+422HqLDTVUw4GAqmTr26nUx8yJoyA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.10.12: - resolution: {integrity: sha512-siYhgeX0DidIfHSgCR95b8xPee9enKSOjCzx7EjTLmPqPaCiVebRYvbOIYdQWRqiaKh9yfhUtFmtMOMScUf1gg==} + /turbo-linux-64@1.10.8: + resolution: {integrity: sha512-eJ1ND3LuILw28gd+9f3Ews7Eika9WOxp+/PxJI+EPHseTrbLMLYqSPAunmZdOx840Pq0Sk5j4Nik7NCzuCWXkg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.10.12: - resolution: {integrity: sha512-K/ZhvD9l4SslclaMkTiIrnfcACgos79YcAo4kwc8bnMQaKuUeRpM15sxLpZp3xDjDg8EY93vsKyjaOhdFG2UbA==} + /turbo-linux-arm64@1.10.8: + resolution: {integrity: sha512-3+pVaOzGP/5GFvQakxuHDMsj43Y6bmaq5/84tvgGL0FgtKpsQvBfdaDs12HX5cb/zUnd2/jdQPNiGJwVeC/McA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.10.12: - resolution: {integrity: sha512-7FSgSwvktWDNOqV65l9AbZwcoueAILeE4L7JvjauNASAjjbuzXGCEq5uN8AQU3U5BOFj4TdXrVmO2dX+lLu8Zg==} + /turbo-windows-64@1.10.8: + resolution: {integrity: sha512-LdryI+ZQsVrW4hWZw5G5vJz0syjWxyc0tnieZRefy+d9Ti1du/qCYLP0KQRgL9Yuh1klbH/tzmx70upGARgWKQ==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.10.12: - resolution: {integrity: sha512-gCNXF52dwom1HLY9ry/cneBPOKTBHhzpqhMylcyvJP0vp9zeMQQkt6yjYv+6QdnmELC92CtKNp2FsNZo+z0pyw==} + /turbo-windows-arm64@1.10.8: + resolution: {integrity: sha512-whHnhM84KIa2Ly/fcw2Ujw2Rr/9wh8ynAdZ9bdvZoZKAbOr3tXKft0tmy50jQ6IsNr6Cj0XD4cuSTKhvqoGtYA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.10.12: - resolution: {integrity: sha512-WM3+jTfQWnB9W208pmP4oeehZcC6JQNlydb/ZHMRrhmQa+htGhWLCzd6Q9rLe0MwZLPpSPFV2/bN5egCLyoKjQ==} + /turbo@1.10.8: + resolution: {integrity: sha512-lmPKkeRMC/3gjTVxICt93A8zAzjGjbZINdekjzivn4g/rOjpHVNuOuVANU5L4H4R1bzQr8FFvZNQeQaElOjz/Q==} hasBin: true requiresBuild: true optionalDependencies: - turbo-darwin-64: 1.10.12 - turbo-darwin-arm64: 1.10.12 - turbo-linux-64: 1.10.12 - turbo-linux-arm64: 1.10.12 - turbo-windows-64: 1.10.12 - turbo-windows-arm64: 1.10.12 + turbo-darwin-64: 1.10.8 + turbo-darwin-arm64: 1.10.8 + turbo-linux-64: 1.10.8 + turbo-linux-arm64: 1.10.8 + turbo-windows-64: 1.10.8 + turbo-windows-arm64: 1.10.8 dev: true /type-check@0.3.2: @@ -16726,12 +14497,6 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /ua-parser-js@0.7.34: resolution: {integrity: sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==} dev: false @@ -16756,6 +14521,10 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -16832,48 +14601,13 @@ packages: engines: {node: '>= 0.8'} dev: true - /unplugin-icons@0.16.5: - resolution: {integrity: sha512-laCCqMWfng1XZgB9yowGfjBdDhtmz8t8zVnhzRNEMhBNdy26QrVewVmdXk/zsiAQYnEWvIxTjvW1nQXrxdd2+w==} - peerDependencies: - '@svgr/core': '>=7.0.0' - '@svgx/core': ^1.0.1 - '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 - vue-template-compiler: ^2.6.12 - vue-template-es2015-compiler: ^1.9.0 - peerDependenciesMeta: - '@svgr/core': - optional: true - '@svgx/core': - optional: true - '@vue/compiler-sfc': - optional: true - vue-template-compiler: - optional: true - vue-template-es2015-compiler: - optional: true - dependencies: - '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.5 - '@iconify/utils': 2.1.7 - debug: 4.3.4(supports-color@5.5.0) - kolorist: 1.8.0 - local-pkg: 0.4.3 - unplugin: 1.4.0 - transitivePeerDependencies: - - supports-color - dev: true - - /unplugin@1.4.0: - resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} + /unplugin@0.10.2: + resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==} dependencies: - acorn: 8.10.0 + acorn: 8.8.2 chokidar: 3.5.3 webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: true - - /unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + webpack-virtual-modules: 0.4.6 dev: true /untildify@4.0.0: @@ -16891,17 +14625,6 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -16937,21 +14660,6 @@ packages: querystring: 0.2.0 dev: false - /use-callback-ref@1.3.0(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.18 - react: 18.2.0 - tslib: 2.5.0 - dev: true - /use-composed-ref@1.3.0(react@18.2.0): resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: @@ -17008,22 +14716,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /use-sidecar@1.1.2(@types/react@18.2.18)(react@18.2.0): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.18 - detect-node-es: 1.1.0 - react: 18.2.0 - tslib: 2.5.0 - dev: true - /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -17035,15 +14727,6 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} - dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.6 - dev: true - /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: @@ -17061,15 +14744,14 @@ packages: /utrie@1.0.2: resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} - requiresBuild: true dependencies: base64-arraybuffer: 1.0.2 dev: false optional: true - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true + /uuid-browser@3.1.0: + resolution: {integrity: sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==} + deprecated: Package no longer supported and required. Use the uuid package or crypto.randomUUID instead dev: true /v8-compile-cache-lib@3.0.1: @@ -17115,33 +14797,10 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.4.8(@types/node@17.0.12)(sass@1.59.3) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite-node@0.29.4(@types/node@17.0.12)(sass@1.64.2): - resolution: {integrity: sha512-sPhnCzGm3rCI1BMgOUHiGJN4MObLUOzdCjrNU5A2miNTat/7k96hmvVLxKXPLb0wjX160oG1ZhLVYBzF80UJlQ==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.4.8(@types/node@17.0.12)(sass@1.64.2) + vite: 4.2.1(@types/node@17.0.12)(sass@1.59.3) transitivePeerDependencies: - '@types/node' - less - - lightningcss - sass - stylus - sugarss @@ -17165,7 +14824,7 @@ packages: kolorist: 1.7.0 magic-string: 0.29.0 ts-morph: 17.0.1 - vite: 4.2.1(@types/node@17.0.12)(sass@1.64.2) + vite: 4.2.1(@types/node@17.0.12)(sass@1.59.3) transitivePeerDependencies: - '@types/node' - rollup @@ -17188,7 +14847,7 @@ packages: kolorist: 1.7.0 magic-string: 0.29.0 ts-morph: 17.0.1 - vite: 4.2.1(@types/node@18.13.0)(sass@1.59.3) + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) transitivePeerDependencies: - '@types/node' - rollup @@ -17208,10 +14867,10 @@ packages: postcss-js: 4.0.1(postcss@8.4.21) prettier: 2.8.5 sass: 1.59.3 - vite: 4.2.1(@types/node@18.13.0)(sass@1.59.3) + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) dev: true - /vite-plugin-sass-dts@1.3.2(postcss@8.4.21)(prettier@2.8.8)(sass@1.64.2)(vite@4.2.1): + /vite-plugin-sass-dts@1.3.2(postcss@8.4.21)(prettier@2.8.8)(sass@1.59.3)(vite@4.2.1): resolution: {integrity: sha512-zClOXVLQHKG//aZ+gsDXMnhLLVKJprrv3x+KQBf/8GD/dM4FHmlK4zMM5JcOr12oq3kTz+DUYCtCEYsFY8eDPQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -17221,47 +14880,14 @@ packages: vite: ^3 || ^4 dependencies: postcss: 8.4.21 - postcss-js: 4.0.1(postcss@8.4.21) - prettier: 2.8.8 - sass: 1.64.2 - vite: 4.2.1(@types/node@17.0.12)(sass@1.64.2) - dev: true - - /vite-plugin-sass-dts@1.3.9(postcss@8.4.27)(prettier@3.0.1)(sass@1.64.2)(vite@4.4.8): - resolution: {integrity: sha512-v8+LJ8yeN+TexjWiJjv6XOIvT382ZEcFi9gY7OB1ydGNv50B+RE5I8/Xx5XJDkNXsDfhdatNMq02Zgu9ue/wXw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - postcss: ^8 - prettier: ^2.7 || ^3 - sass: '*' - vite: ^3 || ^4 - dependencies: - postcss: 8.4.27 - postcss-js: 4.0.1(postcss@8.4.27) - prettier: 3.0.1 - sass: 1.64.2 - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) - dev: true - - /vite-tsconfig-paths@4.0.7(typescript@4.9.5)(vite@4.2.1): - resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4(supports-color@5.5.0) - globrex: 0.1.2 - tsconfck: 2.1.0(typescript@4.9.5) - vite: 4.2.1(@types/node@18.13.0)(sass@1.59.3) - transitivePeerDependencies: - - supports-color - - typescript + postcss-js: 4.0.1(postcss@8.4.21) + prettier: 2.8.8 + sass: 1.59.3 + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) dev: true - /vite-tsconfig-paths@4.2.0(typescript@5.1.6)(vite@4.4.8): - resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + /vite-tsconfig-paths@4.0.7(typescript@4.9.5)(vite@4.2.1): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -17270,14 +14896,14 @@ packages: dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 2.1.0(typescript@5.1.6) - vite: 4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2) + tsconfck: 2.1.0(typescript@4.9.5) + vite: 4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.2.1(@types/node@17.0.12)(sass@1.64.2): + /vite@4.2.1(@types/node@17.0.12)(sass@1.59.3): resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -17307,12 +14933,12 @@ packages: postcss: 8.4.21 resolve: 1.22.1 rollup: 3.20.0 - sass: 1.64.2 + sass: 1.59.3 optionalDependencies: fsevents: 2.3.2 dev: true - /vite@4.2.1(@types/node@18.13.0)(sass@1.59.3): + /vite@4.2.1(@types/node@18.13.0)(less@4.1.3)(sass@1.59.3): resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -17339,6 +14965,7 @@ packages: dependencies: '@types/node': 18.13.0 esbuild: 0.17.12 + less: 4.1.3 postcss: 8.4.21 resolve: 1.22.1 rollup: 3.20.0 @@ -17347,180 +14974,6 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.4.8(@types/node@17.0.12)(sass@1.59.3): - resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 17.0.12 - esbuild: 0.18.17 - postcss: 8.4.27 - rollup: 3.27.1 - sass: 1.59.3 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vite@4.4.8(@types/node@17.0.12)(sass@1.64.2): - resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 17.0.12 - esbuild: 0.18.17 - postcss: 8.4.27 - rollup: 3.27.1 - sass: 1.64.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vite@4.4.8(@types/node@20.4.6)(less@4.1.3)(sass@1.64.2): - resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.4.6 - esbuild: 0.18.17 - less: 4.1.3 - postcss: 8.4.27 - rollup: 3.27.1 - sass: 1.64.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest@0.29.4: - resolution: {integrity: sha512-CJBD3K6klNMfrOoSWhpfKAhGLrQzFx+21QYuXZthUW7cuK9pC9o7yU8MpPs5vwkgKpqhaL62WyoDAS5zgqfm6g==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 17.0.12 - '@vitest/expect': 0.29.4 - '@vitest/runner': 0.29.4 - '@vitest/spy': 0.29.4 - '@vitest/utils': 0.29.4 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4(supports-color@5.5.0) - local-pkg: 0.4.3 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.4.8(@types/node@17.0.12)(sass@1.64.2) - vite-node: 0.29.4(@types/node@17.0.12)(sass@1.64.2) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@0.29.4(happy-dom@8.9.0)(jsdom@21.1.1)(sass@1.59.3): resolution: {integrity: sha512-CJBD3K6klNMfrOoSWhpfKAhGLrQzFx+21QYuXZthUW7cuK9pC9o7yU8MpPs5vwkgKpqhaL62WyoDAS5zgqfm6g==} engines: {node: '>=v14.16.0'} @@ -17572,74 +15025,11 @@ packages: tinybench: 2.4.0 tinypool: 0.4.0 tinyspy: 1.1.1 - vite: 4.4.8(@types/node@17.0.12)(sass@1.59.3) + vite: 4.2.1(@types/node@17.0.12)(sass@1.59.3) vite-node: 0.29.4(@types/node@17.0.12)(sass@1.59.3) why-is-node-running: 2.2.2 transitivePeerDependencies: - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vitest@0.29.4(sass@1.64.2): - resolution: {integrity: sha512-CJBD3K6klNMfrOoSWhpfKAhGLrQzFx+21QYuXZthUW7cuK9pC9o7yU8MpPs5vwkgKpqhaL62WyoDAS5zgqfm6g==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 17.0.12 - '@vitest/expect': 0.29.4 - '@vitest/runner': 0.29.4 - '@vitest/spy': 0.29.4 - '@vitest/utils': 0.29.4 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4(supports-color@5.5.0) - local-pkg: 0.4.3 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.2.1(@types/node@17.0.12)(sass@1.64.2) - vite-node: 0.29.4(@types/node@17.0.12)(sass@1.64.2) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - sass - stylus - sugarss @@ -17691,8 +15081,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + /webpack-virtual-modules@0.4.6: + resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} dev: true /webpack@5.77.0(esbuild@0.17.12): @@ -17710,9 +15100,9 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.10.0 - acorn-import-assertions: 1.8.0(acorn@8.10.0) - browserslist: 4.21.10 + acorn: 8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) + browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 es-module-lexer: 0.9.3 @@ -17735,46 +15125,6 @@ packages: - uglify-js dev: true - /webpack@5.77.0(esbuild@0.18.17): - resolution: {integrity: sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.10.0 - acorn-import-assertions: 1.8.0(acorn@8.10.0) - browserslist: 4.21.10 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(esbuild@0.18.17)(webpack@5.77.0) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} @@ -17868,15 +15218,6 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.0.1 - dev: true - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} -- GitLab